引入
在离散时间Fourier变换(DTFT) 中,我们将时域转变到离散的数字域的同时,求得的频谱仍然是连续函数,而连续函数是不可存储的
因此,我们需要对DTFT的结果在频域进一步离散化,得到的就是离散Fourier变换(DFT)
离散Fourier变换 (DFT)
DTFT的频谱是周期性的,其周期为一个Nyquist区间[−π,π]的长度2π
为了离散地保存DTFT频谱,我们将[0,2π]区间分成N份,即保留以下频率点上的频谱值:
ωk=0+kN2π, k=0,1,...,N−1
我们直接将连续DTFT频谱在频域对ωk采样,得到的就是DFT的算法:
X(ωk)=n=0∑L−1x(n)e−jωkn=n=0∑L−1x(n)e−jN2πnk
为了表示方便,令
WN:=e−jN2π
X(k):=X(ωk)
则DFT可以表示为
X(k)=n=0∑L−1x(n)WNnk, k=0,1,...,N−1
DFT的矩阵化
注意到我们采取的是有限长序列的DTFT,得到的频谱亦是一个有限长序列
即:这是一个向量到向量的映射F:RL→RN
事实上,这是一个线性映射,其矩阵为
F=WN0WN0⋮WN0WN0WN1⋮WNN−1⋯⋯⋱⋯WN0WNL−1⋮WN(N−1)(L−1)N×L, fkn=WNkn
则DFT的矩阵形式为
X=Fx
DFT的方阵化
在讨论和使用DFT时,往往规定L=N,则F是方阵FN
即:我们根据希望得到的频域向量的维数N来约束时域向量维数L,即使本身L=N,也要通过某些操作把原始序列x(n)加工成N长度的x~(n)
这种方法的可行性体现在:
-
若L=N,则无需操作
-
若L<N,则对序列进行补零:
x~(n)={x(n)0n<LL≤n<N
-
若L>N,则对序列进行回绕:
x~(n)=m=0∑⌊(L−n−1)/N⌋x(mN+n), n=0,1,...,N−1
证明:对于L>N的情形,回绕序列x~(n)和原序列x(n)的DFT相同
根据定义,有
X~=FN×Nx~
于是
X=FN×Lx
不妨假设L=qN,否则可以通过补零来得到(其实是有余数的情形我懒得写)
=WN0WN0⋮WN0WN0WN1⋮WNN−1⋯⋯⋮⋯WN0WNqN−1⋮WN(N−1)(qN−1)x
=[FN×NWNNFN×NWN2NFN×N⋯WN(q−1)NFN×N]x0→N−1xN→2N−1x2N→3N−1⋮x(q−1)N→qN−1
=FN×N(x0→N−1+WNNxN→2N−1+⋯+WN(q−1)Nx(q−1)N→qN−1)
然而
WNN=e−2πj=1
于是
X=FN×Nm=0∑q−1xmN→(m+1)N−1=FN×Nx~=X~
注意:试图使L=N的意义在于
- 稍后会提到的快速Fourier变换(FFT) 算法对N=2p的情形有效,因此我们往往事先要求N是某个2的幂
- 但L是根据采样频率和采样序列时长得到的实际量,并不能精确控制
- 因此我们希望让L的值去适应N的取值
注意:从上面证明的结论可以看出,以N长度回绕后得到相同序列的不同原始序列,其DFT是相同的,在DFT的角度无法区分
IDFT
x~(n)=N1k=0∑N−1X(k)WN−kn, n=0,1,...,N−1
注意:这里的n的最大值是N−1,即IDFT只能得到回绕后的N长序列,无法得到原始的L长序列
上述算法的矩阵表示为
FN−1=N1WN0WN0⋮WN0WN0WN1⋮WNN−1⋯⋯⋱⋯WN0WNN−1⋮WN(N−1)2=N1FN∗
DFT的性质
- 频谱是离散的、周期的(只记录一个周期)
- 实序列的DFT是共轭对称的:X(k)=X∗(N−k)
- DFT的线性变换(矩阵!)
- Parseval定理:n=0∑N−1∣x(n)∣2=N1k=0∑N−1∣X(k)∣2
- 反褶、共轭:
- 时域反褶,频域反褶
- 时域共轭,频域共轭反褶
- 时域共轭反褶,频域共轭
- 频移:X(k−l)=DFT[x(n)WN−nl]
- 时移:DFT[x(n−m)]=e−jmωkX(ωk)=WNmkX(k)
- 时域卷积:DFT[x(n)∗y(n)]=DFT[x(n)]⋅DFT[y(n)]
- 频域卷积:DFT[x(n)y(n)]=N1X(k)⊗Y(k)
- 其中的离散圆卷积定义为x(n)⊗y(n)=m=0∑N−1x(m)y((n−m)modN)