离散傅里叶变换

闲谈:按道理来说,离散傅里叶变换只涉及有限点运算,应该比无限点的 DTFT 好学,但学起来却晕得不行😵 究其原因,我在学习时是从 DTFT 入手的,遇到一些不同之处老是转不过来。

所以,我在网上找到了一份很详细的英语资料,从另一个方向学习 DFT。下面我就写写我学习过程中的笔记。

DFT 概述

对于长度为 N 的序列 x[n],其离散傅里叶变换 DFT 定义为:

X[k]n=0N1x[n]ejωkn=n=0N1x[n]ej2πkn/N

DFT 的引入

从几何引入 DFT

  我们可以将长度为 N 的信号看做一个 N 维向量 x=[x0,x1,,xN1],每一个 n 对应一个维度。

  我们可以定义向量的内积:

u,vn=0N1u[n]v[n]

  我们可以很容易得出向量内积的几个性质:

  • u,u=Eu (能量)
  • 共轭对称性:u,v=v,u
  • 线性性:
    • αu+βv,w=αu,w+βv,w
    • u,αv+βw=αu,v+βu,w

  我们可以用内积定义向量的范数:

uu,u=n=0N1u[n]u[n]

  有了内积和范数,就可以得到向量的投影:

Px(y)y,xx2x

  上式表示向量 yx 上的投影。有了投影,我们就可以得到信号的正交分解:

x=n=0N1αnsnαn=Psn(x)

  其中,{sn} 是一组正交基,满足:

Psk(sl)sl,sksk2sk={0,lksk,l=k

  我们都知道不同频率的正弦信号在一个周期内相互正交(如果时长不是整周期,则不正交),比如:

x1[n]=A1sin(2πk1Nn)x2[n]=A2sin(2πk2Nn)k1,k2Z0k1,k2<N
x1,x2=n=0N1x1x2=A1A2n=0N1sin(2πk1Nn)sin(2πk2Nn)=A1A22n=0N1[cos(2πk1Nn2πk2Nn)cos(2πk1Nn+2πk2Nn)]=A1A22n=0N1{cos[2πN(k1k2)n]cos[2πN(k1+k2)n]}={0,k1k2A1A2N2,k1=k2

  如果我们以 fsx(t) 采样得到 Nx[n],根据上面的证明,我们能取的谐波频率只能是:

fk=kNfs,k=0,1,2,,N1

  于是我们构造如下一组正交基(从正弦推广到e指数):

sk[n]ejωknT=ej2πkn/Nωk2πfk=2πkfsNT=1fs

  为了偷懒,我们定义 WN=ej2π/N,因此 sk=WNk。有趣的是,这一组正交基正好均分复平面上的单位圆(如下图所示)。

  我们可以证明这是一组正交基:

sk,sln=0N1sk[n]sl[n]=n=0N1ej2π(kl)n/N=1ej2π(kl)1ej2π(kl)/N={0klNk=l

  我们进一步对 sk 进行正则化:

s~k[n]sk[n]Ns~k,s~l={0kl1k=l

  信号在 s~k 上的投影就是 NDFT(Normalized DFT),信号在 sk 上的投影的 N 倍就是 DFT:

X[k]x,skn=0N1x[n]sk[n]k=0,1,,N1sk[n]ej2πkn/N

   xsk 上的投影为:

x,sksk2=X[k]N

  要从投影恢复回原信号,我们只需要将分解后的向量相加,注意到DFT实际是投影的 N 倍,所以还需要除以 N

x[n]=1Nk=0N1X[k]ej2πkn/N

从抽样引入 DFT

  回忆我们对模拟信号进行采样的过程,经过采样后,频域进行了周期性延拓。同理,如果我们对频域进行采样,那么时域也进行周期性延拓,证明如下:我们先求解 δ[nkN] 的离散时间傅里叶变换:

ak=1Nn=Nδ[nkN]ejkω0n=1Nn=0N1δ[nkN]ejkω0n=1N
X(ejω)=k=+2πakδ(ω2πkN)=2πNk=+δ(ω2πkN)

  由于时域卷积对应频域相乘,故如果在频域上 [0,2π] 内取 N 点,则时域上会以 N 为周期。结合离散时间傅里叶变换(DTFT):

X(ejω)=n=+x[n]ejωnx[n]=12π2πX(ejω)ejωndω

  我们可以得到离散傅里叶变换(DFT):

X[k]n=0N1x[n]ej2πkNnx[n]=1Nk=0N1X[k]ej2πkNn

  把 ω 替换成 2πkN 的过程就相当于在频域取样。为了偷懒,我们定义 WN=ej2π/N,并改写为:

X[k]n=0N1x[n]WNknx[n]=1Nk=0N1X[k]WNkn

  从 X[k] 恢复成 X(ejω) 则是通过插值来实现:

X(ejω)=n=0N1{1Nk=0N1X[k]WNkn}ejωn=1Nk=0N1X[k]n=0N1ej2πkNnejωn
n=0N1ej2πkNnejωn=1ej(ωN2πk)1ej(ω2πk/N)=ej[(ωN2πk)/2]ej[(ωN2πk)/2N]sin(ωN2πk2)sin(ωN2πk2N)=sin(ωN2πk2)sin(ωN2πk2N)ej[ω(2πk/N)][(N1)/2]

我们定义插值函数为 Φ(ω)

Φ(ω)=sin(ωN2)Nsin(ω2)ejω[(N1)/2]Φ(ω)|ω=2πk/N={1,k=00,1kN1

则插值过程能表示成:

X(ejω)=k=0N1X[k]Φ(ω2πkN)

频谱泄露

  从采样的角度去理解的话,对于那些介于采样点之间的频率,从直觉上来讲是无法得到的,但并非如此。

  我们可以假设任意一个正弦信号:x[n]=ejωxnT,将它与正交基做内积:

X(ωk)=x,sk=0N1ejωxnTejωknT=0N1ej(ωxωk)nT=1ej(ωxωk)NT1ej(ωxωk)T=ej(ωxωk)(N1)T/2sin[(ωxωk)NT/2]sin[(ωxωk)T/2]

  显然,当 ωx=ωk 时,X(ωk)=N;而当 ωxωk 时,有:

|X(ωk)|=|sin[(ωxωk)NT/2]sin[(ωxωk)T/2]|

  我们之前定义过:

ωk2πkfsN=2πk1TN,k=0,1,,N1

我们不妨取 N=16x=N/5(也就是 ωx=2πN5fsN),作出图像:

我们可以看到,最靠近 N/5 的谱线,也就是 k=N/4=4 的谱线是最高的,另外,其他谱线也有一定的值。这就叫 频谱泄露

  上面是通过公式推导得到的,我们可以用 matlab 来进行验证,最终画出来的图像是一样的。

fs=1;
N=16;
x=N/5;
wx=2*pi*x*fs;
n=[0:N-1];
xn=exp(j*wx*n);
wn=2*pi*n/N;
stem(wn,abs(fft(xn)));

常见 DFT 变换对

k=δ[n+Nk]={1, if n=0,±N,±2N,0, else.DFT1(periodN)
ej2πk0n/NDFTNδ[kk0N]
cos(2πNk0n)DFTN2(δ[kk0N]+δ[kk0N])

DFT 的性质

线性性

αg[n]+βh[n]DFTαG[k]+βH[k]

这个没啥好说的,证明方法和之前傅里叶变换一样。

圆周时移

  由于 DFT 本质上是对原信号在时域上进行周期延拓,那么当信号进行时移变换时,实际上是在进行“圆周平移”。

g[nn0N]DFTWNkn0G[k]

  当然,我们也可以简单证明一下:

n=0N1x[nn0N]WNkn=n=0N1x[nn0N]WNk(nn0+n0)=WNkn0n=0N1x[nn0N]WNk(nn0)=WNkn0X[k]

圆周频移

WNk0ng[n]DFTG[kk0N]

对称性

序列DFT
x[n]=xre[n]+jxim[n]X[k]=Xre[k]+jXim[k]
x[n]X[kN]
x[nN]X[k]
xre[n]Xcs=12{X[k]+X[kN]}
jxim[n]Xca[k]=12{X[k]X[kN]}
xcs[n]Xre[k]
xca[n]jXim[k]

乍一看好像很复杂,我们来看看看第 2 条式子的证明👀:

n=0N1x[n]e2πknN={n=0N1x[n]e2πkn/N}={n=0N1x[n]e2π(k)n/N}={n=0N1x[n]e2πkNn/N}=X[kN]

第 3 条也是类似的。然后由 2、3 就能推导出后面的。

对称性可以用于简化某些特殊的 DFT 计算,考试中比较喜欢考的就是:有一个 2N 长的实序列,要求用 N 长的 FFT 进行计算(可以用其他简单的辅助运算),过程如下:

圆周卷积定理

g[n]h[n]DFTG[k]H[k]

直接证明太麻烦了,可以从 DTFT 的卷积性质推导,然后再采样就行。总而言之,凡是看到“圆周”,就要想到对周期信号进行采样。

调制定理

g[n]h[n]DFT1N=0NG[]H[kN]

上一条定理的对偶定理。

对偶定理

g[n]DFTG[k]G[n]DFTNg[kN]

这个证起来不难,我就说个大概吧(其实是想偷懒

  • G[n] 进行 DFT
  • 先代入 g[n]
  • 再交换求和顺序
  • 变量代换(引入了圆周时反)
  • 化简,化简时会用到一条关系式(引入了 N):
n=0N1WNkn={N,k=00,k0
懒得自己算的同学请点击展开
n=0N1G[n]WNkn=n=0N1{m=0N1g[m]WNnm}WNkn=m=0N1{n=0N1g[m]WNn(m+k)}(=m+k)==0N1{n=0N1g[kN]WNn}=N[kN]

Parseval 定理

n=0N1g[n]h[n]=1Nk=0N1G[k]H[k]n=0N1|g[n]|2=1Nk=0N1|G[k]|2

证明方法嘛,先将 h[n]H[k] 表示(这一步引入了 1/N),然后利用共轭使得 WNkn 变为 WNkn,然后交换求和顺序,再把 g[n] 变成 G[k]

习题

Tip

5.8 求长度为 N 的如下序列的 N 点 DFT:
(a)xa[n]=cos(2πn/N)
(b)xb[n]=sin2(2πn/N)
(c)xc[n]=sin3(2πn/N)

Note

解:由于是三角函数,所以首先想到的是写成 e 指数的形式再求解。

xa[n]=12(ej2πn/N+ej2πn/N)xb[n]=1cos(2π2n/N)2=112(ej2π2n/N+ej2π2n/N)2xc[n]=14[3sin(2πn/N)sin(2π3n/N)]=14[32j(ej2πn/Nej2πn/N)12j(ej2π3n/Nej2π3n/N)]

根据常用 DFT 变换对 ej2πk0n/NDFTNδ(kk0N),可以直接写出:

Xa[k]=N2[δ(k1N)+δ(k+1N)]Xb[k]=1N2[δ(k2N)+δ(k+2N)]2xc[k]=14[32j(δ(k1N)δ(k+1N))12j(δ(k3N)δ(k+3N))]

Tip

5.14 设 X[k] 是长为 N 的序列 x[n]N 点 DFT,N 为偶数。定义两个长度为 N2 的序列为:

g[n]=12(x[2n]+x[2n+1])h[n]=12(x[2n]x[2n+1])0nN21


g[n],h[n]N/2 点 DFT 分别是 G[n],H[n],请用 G[n],H[n]X[n]

[!NOTE] 解:这题显然是考 DIT-FFT,根据 DIT-FFT 的公式,可以写出:

X[k]=r=0N/21x[2r](WN2)kr+WNkr=0N/21x[2r+1](WN2)kr=r=0N/21x[2r]WN/2kr+WNkr=0N/21x[2r+1]WN/2kr=(G[k]+H[k])+WNk(G[k]H[k])k=0,1,,N1
X[k+N2]=(G[k]+H[k])WNk(G[k]H[k])k=0,1,,N1

[!TIP] 5.48 序列 {x[n]}={2,3,1,4}0n3,与下面定义在 0n3 进行 4 点圆周卷积:

{h1[n]}={1,4,2,3}{h2[n]}={5,44,1,3}{h3[n]}={2,5,2,4}{h4[n]}={3,2,3,4}

计算结果如下:

{ya[n]}={16,24,27,25}{yb[n]}={13,5,1,7}{yc[n]}={30,20,29,17}{yd[n]}={25,6,27,8}

不计算圆周卷积,将结果与圆周卷积配对。

[!NOTE] 解:可以通过求 DFT 来求圆周卷积,不过太麻烦了。可以进行求和:

n=0N1x[n]=4n=0N1h1[n]=0n=0N1ya[n]=12n=0N1h2[n]=3n=0N1yb[n]=0n=0N1h3[n]=1n=0N1yc[n]=4n=0N1h4[n]=0n=0N1yd[n]=0

由于 xh2=yaxh3=yc,所以我们可以判断出:

xh2=yaxh3=yc

还有俩个判断不了,我们可以进行交替求和:

n=0N1(1)nx[n]=2n=0N1(1)nh1[n]=2n=0N1(1)nyb[n]=24n=0N1(1)nh4[n]=12n=0N1(1)nyd[n]=4

由于 (1)nx(1)nh1=(1)nyd(1)nx(1)nh4=(1)nyb,所以我们可以判断出:

xh1=ydxh4=yb

[!TIP] 5.51 偶数长 x[n] 的 DFT 为 X[k],用 X[k] 表示下列序列的 N 点 DFT

u[n]=x[n]x[nN2N]v[n]=x[n]+x[nN2N]y[n]=(1)nx[n]

Note

解:考察的是 DFT 的性质。

U[k]=X[k](1)kX[k]V[k]=X[k]+(1)kX[k]Y[k]=X[kN2N]