第3章有限长序列离散变换和快速算法 本章讨论有限长离散序列的正交变换,主要关注离散傅里叶变换(DFT),详细讨论DFT的定义和性质以及DFT的快速算法FFT。 DFT及其快速算法FFT是数字信号处理中最重要的工具之一,应用非常广泛。本章集中在DFT的定义和性质、DFT的快速算法FFT。有关DFT的各项应用将在后续章节陆续介绍,第4章集中讨论以DFT为核心的数字频谱分析技术,第5章包括了DFT在滤波器实现中的应用,第6章介绍DFT在FIR滤波器设计中的应用,第8章给出了DFT在滤波器组的应用等。 本章也简要介绍了其他的正交变换,例如离散余弦变换(DCT)等。 3.1离散正交变换 假设x[n]只在0≤nN点的DFT。也就是说,在x[n]后面补上若干零,把x[n]看成是N1长度的序列进行DFT。这样,用N1点DFT系数除了可以计算出x[n]的全部非零值,还会把后面补的零值也计算出来,这在应用中没有什么危害。所以,对于只有N个非零值的序列,通过补零计算更长点数的DFT,是DFT应用中经常采用的一种办法。后续还会看到,DFT的这种灵活性,大大地扩宽了DFT的应用范围。 例3.2.2继续讨论例3.2.1中的x[n]序列,取N1=2N,对x[n]做N1点DFT。为了与上例对比,用x1[n]表示补零后的x[n],用X1[k]表示对x[n]补零后的2N点DFT系数。因此 x1[n]=x[n],0≤nN长的序列,若对该补零序列做N1点DFT,如上反转性质用N1替代N进行描述。 图3.4序列补零做反转 例3.4.2在例3.4.1中,若对序列补上5个零,将序列作为x[n]={5,4,3,2,1,0,0,0,0,0}的N1=2N长序列进行反转,其反转x((-n))10R10[n]如图3.4所示。 性质3对偶性(duality) 如果有限长序列xn的N点DFT为Xk,把Xn看成时域离散序列,则Xn的N点DFT为 DFTXn=∑N-1n=0Xne-j2πNnk=∑N-1n=0∑N-1m=0xme-j2πNmne-j2πNnk =∑N-1m=0xm∑N-1n=0e-j2πNm+kn =Nx-kN 可见,如果xn(时域)和Xk(频域)构成一对离散傅里叶变换对,则Xn(时域)和Nx-kNRN[k]之间构成一对离散傅里叶变换对。 利用对偶性,只要知道了某个有限长序列的DFT,则与其频域序列相同的时域序列的DFT也就得到了,无须再重新计算。 性质4循环位移性 循环位移性表述为下式的形式 DFTx((n-m))NRN[n]=WkmNX[k](3.31) 这里x((n-m))NRN[n]称为循环位移。设m>0,x((n-m))N表示周期化后右移m点,RN[n]取出一个周期。由于x((n-m))N的周期性,不难看出,x((n-m))NRN[n]相当于x[n]依次从0≤n≤N-1的尾部移出一个数据,又从头部移进来,直到移动完m次。这相当于把0≤n≤N-1序列绕在一个圆柱上右移m次,所以称这种移位为循环移位。m<0时是相反的移动,数据从头部移出从尾部移入,是循环左移。不管移动方向如何,循环移位对应DFT系数乘以WkmN=e-j2πNkm的指数项。 图3.5循环位移 例3.4.3序列x[n]=5,4,3,2,1按N=5进行循环位移,位移量m=2的示意图如图3.5所示。 上述移位的过程之所以被称为“循环”移位,因为可以形象地用图3.6来表示。图3.6(a)中有一个圆桶,四周被均匀地划分成N个格,依次刻上有限长序列的值。把序列第一点x0对准0刻度压到一根直线轴上,随着圆桶转动,刻在桶上的序列被复制到直线轴上,就形成了周期延拓后的序列。 循环移位,就是先把圆桶旋转指定的步数,正延迟逆时针旋转,负延迟顺时针旋转,然后再把旋转后的圆桶对准0刻度压下去,随着圆桶转动,刻在桶上的循环移位后的序列被复制到直线轴上,就形成了延迟后的序列的周期延拓。图3.6(b)是延迟为2时的示意图。 图3.6循环移位的圆桶示意图 证明 取x1[n]=x((n-m))NRN[n],直接代入DFT定义运算如下 DFTx1n=∑N-1n=0x1ne-j2πNnk=∑N-1n=0xn-mNe-j2πNnk =∑((m))N-1n=0xn+N-((m))Ne-j2πNnk+∑N-1n=((m))Nxn-((m))Ne-j2πNnk =∑N-1n′=N-((m))Nxn′e-j2πNn′ke-j2πN((m))Nk+∑N-((m))N-1n′=0xn′e-j2πNnke-j2πN((m))Nk =∑N-1n′=0xn′e-j2πNn′ke-j2πNmk=Xke-j2πNmk 这里可能会问,DFT怎样反映自然移位性(即延迟特性),即对N点有限长序列x[n],x[n-m]对应的DFT系数怎样?若x[n]在0≤n≤N-1范围内的取值均非零,由于x[n-m]的部分数据已移出0≤n≤N-1范围,无法直接用N点DFT表示,故无法用N点DFT性质表述自然移位x[n-m]。但是,这并不是说DFT就无法表示自然移位了,可以通过DFT定义的灵活性解决这个问题。 设有一个有限长信号x[n]在0≤n≤N-1范围内的取值均非零。若应用中需要用到mP。取N=L,x1[n]直接做N点DFT,x2[n]补零后也做N点DFT,对X[k]=X1[k]X2[k]做N点IDFT得到x[n]。在这些条件下,通过式(3.35)xL[n]和x[n]的关系示于图3.9中。 图3.9线性卷积和与循环卷积和的关系 如图3.9所示,矩形框住的值就是IDFT的结果x[n],而三角图形表示线性卷积xL[n]和它的各移位求和项。在该情况下,式(3.35)中只有xL[n]和xL[n+N]两项对矩形窗内的值有影响,两个三角形重叠的区域x[n]的取值由xL[n]和xL[n+N]混合而成。观察图3.9发现,x[n]在0≤n≤P-2范围内的P-1个值是混叠结果,而x[n]在P-1≤n≤N-1范围内的L-P+1个值是与线性卷积相等的。这种情况说明,当x1[n]和x2[n]长度不等时,若以长序列的点数做DFT,利用IDFT计算得到的循环卷积中保留了线性卷积的部分正确结果,即P-1≤n≤N-1范围内循环卷积保留了线性卷积的部分正确值。这个结论在FIR滤波器计算时会得到应用。 第二种情况,仍设x1[n]长度为L,x2[n]长度为P。取N≥L+P-1,对x1[n]和x2[n]均补零,做N点DFT,计算X[k]=X1[k]X2[k]的IDFT,得到循环卷积x[n]。在这种条件下,因满足 x[n]=∑+∞r=-∞xL[n-rN]RN[n]=xL[n] 循环卷积等于线性卷积。由此,对于有限长序列,用循环卷积计算线性卷积的步骤为取N≥L+P-1,计算如下: (1) x1[n]在P~N-1补零,做N点DFT; (2) x2[n]在L~N-1补零,做N点DFT; (3) X[k]=X1[k]X2[k],0≤k≤N-1; (4) xL[n]=x[n]=IDFTX[k],0≤n≤N-1。 用循环卷积计算线性卷积有其实际意义。若把上述讨论中的x1[n]换作一个离散LTI系统的单位抽样响应,把x2[n]看作系统的输入信号,则线性卷积就是系统的输出。利用循环卷积也可计算系统的输出。由于DFT存在快速算法FFT,一定条件下用DFT计算系统输出可能更经济。 在实际应用中还会遇到LTI系统的单位抽样响应是有限长的,即FIR系统,但系统输入信号是无限长序列。这种情况下,可将输入序列分成有限长的段进行处理,具体算法将在第5章进一步讨论。 图3.10循环卷积 例3.4.5有两个信号,x1[n]=1,1,1,1,1,x2[n]=5,4,3,2,1,取N=5,进行循环卷积,首先利用式(3.33)的定义直接计算循环卷积,计算过程的示意图如图3.10所示,记循环卷积的结果为y[n],显然y[n]=15,15,15,15,15。 图3.10(c)是x2((-k))5,注意到 y[0]=∑4k=0x1[k]x2((-k))5=15 对于1≤n<5,图3.10(c)进行循环位移,得到x1[k]x2((n-k))5并进行求和,但由于x1[k]=1,所以循环卷积结果总是x2[n]非零值之和,恒为15。 以上结果同样可以通过DFT求得。N=5时,例3.2.1已得到x1[k]的DFT系数为: 只有X1[0]=5非零,故也只需要求出X2[0]=15,因此 X1[k]X2[k]=75,0,0,0,0 求IDFT为 y[n]=15∑4k=0X1[k]X2[k]W-kn5=15×75W05=15 例3.4.6离散序列与例3.4.5相同,本例取N=10进行循环卷积,补零后两个信号为 x1[n]=1,1,1,1,1,0,0,0,0,0,x2[n]=5,4,3,2,1,0,0,0,0,0 直接计算循环卷积,示意图如图3.11所示。图3.11(b)和图3.11(c)给出了x2((n-k))10在n=0和n=2的示意图,图3.11(d)是循环卷积的结果。可见对本例,取N=10时,计算得到的循环卷积等于线性卷积。本例满足循环卷积等于线性卷积的最小N值是9。 同样的结果,可通过DFT求得,做N=10点DFT,得 X1[k]={5, 1 -j 3.0777, 0, 1 -j 0.7265, 0, 1, 0, 1 + j0.7265, 0, 1 +j 3.0777} X2[k]={15, 7.7361 -j 7.6942, 2.5 -j 3.4410, 3.2639 -j 1.8164i, 2.5 -j 0.8123i3, 2.5 +j 0.8123, 3.2639 + j1.8164, 2.5 +j 3.4410, 7.7361 +j 7.6942} 相乘后做IDFT得 y[n]=IDFTX1[k]X2[k]={5,9,12,14,15,10,6,3,1,0} 图3.11补零后循环卷积等于线性卷积的例子 性质7频域卷积性 设序列x[n]=x1[n]x2[n],其中x[n]、x1[n]、x2[n]均为N点有限长序列,并分别做N点DFT,则 X[k]=DFTx[n]=∑N-1l=0X1[l]X2((k-l))N 性质8共轭性质 DFTx*[n]=X*[N-k] 证明 DFTx*[n]=∑N-1n=0x*[n]e-j2πNkn=∑N-1n=0x[n]e-j2πN(-k)n* =∑N-1n=0x[n]e-j2πN((-k))Nn*=∑N-1n=0x[n]e-j2πN(N-k)n*=X*[N-k] 性质9DFT的对称性 利用有限长序列的周期延拓,定义有限长序列的周期共轭对称性为 xep((n))NRN[n]=x*ep((-n))NRN[n] 记住,除零点自身互共轭(一定是实数)外,周期共轭对称关系可简写为 xep[n]=x*ep[N-n] 类似地,周期共轭反对称分量简写为 xop[n]=-x*op[N-n] 对于一个任意序列x[n],可分解为周期共轭对称序列和周期共轭反对称序列之和。周期共轭对称序列和周期共轭反对称序列与x[n]的关系为 xep[n]=12x[n]+x*[N-n] xop[n]=12x[n]-x*[N-n] 如果x[n]的DFT分别写成其实部和虚部之和,即X(k)=XR(k)+jXI(k),则有 XR[k]=DFTxep[n] jXI[k]=DFTxop[n] 对偶的关系表述为: 若x[n]=xr[n]+jxi[n]为复序列,xr[n]是实部,xi[n]为虚部,则 DFTxr[n]=Xep[k]=12X[k]+X*[N-k] DFTjxi[n]=Xop[k]=12X[k]-X*[N-k] 例3.4.7利用对称性可以简化DFT的计算。例如,有两个实值信号x1[n]和x2[n],用它们分别作为实部和虚部构成一个复信号x[n]=x1[n]+jx2[n]。直接计算得到复信号的DFT X[k],利用对称性得到x1[n]和x2[n]的DFT为 X1[k]=DFTx1[n]=Xep[k]=12X[k]+X*[N-k] X2[k]=DFTx2[n]=1jXop[k]=12jX[k]-X*[N-k] 性质10实序列DFT的对称性 这是性质9的特例,因为重要,故单独列为一条性质。若离散信号是实值信号,其信号自身就是其实部。这说明,实值信号的DFT自身满足周期共轭对称性,即 X[k]=X*[N-k](3.37) 也就是说,实值有限长序列的DFT系数满足X[0]=X*[0],故X[0]是实值; 其他DFT系数在1≤k≤N-1范围内,满足式(3.37)的周期共轭对称性质。若N是偶数,也可确定X[N/2]=X*[N/2]是实数。 对一个N点实序列,其N点DFT系数存在共轭对称性,仅由X[0]、X[N/2]和1≤k≤N/2-1的系数即可确定全部系数。这样,可以用N/2个复数存储单元即可存储N点实序列的DFT系数。由于存储一个复数需要两个实数存储单元,因此存储实序列和存储其DFT系数需要相同数目的存储单元。 性质11帕塞瓦尔定理 如果有限长序列xn的N点DFT为Xk,帕塞瓦尔定理(Parsevals Theorem)反映变换前后序列的能量关系 ∑N-1n=0xn2=1N∑N-1k=0Xk2 证明 ∑N-1n=0xn2=∑N-1n=0xnx*n=∑N-1n=01N∑N-1k=0Xkej2πNnkx*n =1N∑N-1k=0Xk∑N-1n=0xne-j2πNnk*=1N∑N-1k=0XkX*k =1N∑N-1k=0Xk2 DFT有许多性质,其中一些性质很独特。灵活使用DFT的各种性质,可以极大地方便DFT的各类应用。 3.5用DFT计算相关序列 如果一有限长离散信号x[n],在0≤n≤N-1内非零,根据自相关的定义,自相关序列为 rxx[k]=∑+∞n=-∞x[n]x*[n-k]=∑N-1n=kx[n]x*[n-k],0≤k≤N-1 ∑N-1+kn=0x[n]x*[n-k],-N+1≤k<0 0,k≥N 对于有限长序列来讲,信号总是能量有限的,故用如上的能量信号的自相关定义。自相关取值不为零的区间为k≤N-1,非零长度为2N-1。 第2章已经详细研究了自相关的DTFT,假设 Exx(ejω)=DTFTrxx[k]=X(ejω)2 由于自相关是2N-1长度的,只要取L≥2N-1,在ωk=2πLk对Exx(ejω)=X(ejω)2进行采样,由采样值可重构自相关序列。故得到用DFT计算自相关序列的算法如下。 算法1: (1) 取L≥2N-1,离散信号x[n]补零,得到 xL[n]=x[n],0≤n≤N-1 0,N≤n≤L-1 (2) 对xL[n]做L点DFT,得到XL[k],0≤k≤L-1; (3) 计算Exx[k]=XL[k]2,0≤k≤L-1; (4) 计算IDFT,得到rL[n]=IDFTXL[k]2,0≤n≤L-1; (5) 得到自相关序列为 rxx[k]=rL[k],0≤k≤N-1 rL[L+k],-N+1≤k<0 0,k≥N 可通过类似的讨论,给出互相关的计算步骤如下。 算法2: (1) 取L≥2N-1,离散信号x[n]、y[n]补零,得到 xL[n]=x[n],0≤n≤N-1 0,N≤n≤L-1 yL[n]=y[n],0≤n≤N-1 0,N≤n≤L-1 (2) 对xL[n]做L点DFT,得到XL[k],0≤k≤L-1,对yL[n]做L点DFT,得到YL[k],0≤k≤L-1; (3) 计算Exy[k]=XL[k]Y*L[k],0≤k≤L-1; (4) 计算IDFT,得到rxyL[n]=IDFTExy[k],0≤n≤L-1; (5) 得到互相关序列为 rxy[k]=rxyL[k],0≤k≤N-1 rxyL[L+k],-N+1≤k<0 0,k≥N 在研究了DFT的快速算法FFT后,自相关和互相关计算中的DFT和IDFT都采用FFT算法高效实现。 3.6DFT的快速计算方法 由DFT的定义 X[k]=∑N-1n=0x[n]WnkN(3.38) 计算每一个DFT系数需要N次复数乘法和N-1次复数加法,本节不加说明时,乘法和加法次数均指复数运算。这样计算所有的DFT系数需要N2次复数乘法和N(N-1)次复数加法。一次复数乘法需要四次实数乘法和两次实数加法,一次复数加法需要2次实数加法。所以,直接计算DFT所需要的实数乘法次数为4N2,所需要的实数加法次数为N4N-2。这样的算法复杂度我们称为N2量级的,简记为ON2。在数据采集速率比较高,N取值较大时,实时计算DFT的运算量仍是很可观的。本节研究DFT的快速计算方法: 快速傅里叶变换(FFT)。 DFT定义中的WnkN项,有许多性质可用于简化DFT的计算。首先,一些特殊值可节省运算,如W0N=WkNN=1,WN/2N=-1,这些项都节省乘法运算; 另外一些项如WN/4N=-j,W3N/4N=j在复数乘法运算时,并不需要实际做乘法,只是交换实部和虚部,可统计为0次乘法,这些特殊项均可节省乘法次数。另外一些性质,主要是周期性、齐次性和对称性,与序列分解结合可显著节省运算量。 周期性为 WnkN=W(N+n)kN=Wn(k+N)N 齐次性为 WkN=Wk/mN/m 变换基的对称性表现为复共轭对称性(complex conjugate symmetry) W(N-n)kN=W-nkN=WnkN* 利用变换基的周期性和对称性可以从一定程度上提高计算效率,但是并不是数量级上的改进。提高DFT计算效率的另一类方法是把长序列分解成短序列,先做短序列的DFT,然后再在此基础上进一步得到长序列的DFT。 应用变换基的这些性质可方便地将长序列分解为短序列进行计算。那些可直接节省乘法运算次数的项,对于长序列DFT的直接计算来讲,节省的乘法次数并不明显,但对于短序列可以明显节省乘法次数。例如N=2或N=4时,可不需要任何乘法运算。为了看清楚这一点,列出如下几个短序列直接做DFT的计算公式。 2点DFT的直接计算,不需要乘法,只需要两次加法,计算如下 X[k]=∑1n=0x[n]Wnk2=x[0]W02+x[1]Wk2,k=0,1 计算两个系数的矩阵形式为 X[0] X[1]=W02W02 W02W12x[0] x[1]=11 1-1x[0] x[1]=x[0]+x[1] x[0]-x[1] 这个计算过程可表示为图3.12的蝶形结构。 3点DFT的计算如下 X[k]=∑2n=0x[n]Wnk3=x[0]W03+x[1]Wk3+x[2]W2k3,k=0,1,2 矩阵形式为 X[0] X[1] X[2]=W03W03W03 W03W13W23 W03W23W43x[0] x[1] x[2]=111 1W13W23 1W23W13x[0] x[1] x[2] 3点DFT的蝶形结构示于图3.13。 4点DFT计算为 X[k]=∑3n=0x[n]Wnk4=x[0]W04+x[1]Wk4+x[2]W2k4+x[3]W3k4,k=0,1,2,3 图3.122点DFT的蝶形计算 图3.133点DFT的蝶形计算 矩阵形式为 X[0] X[1] X[2] X[3]=W04W04W04W04 W04W14W24W34 W04W24W44W64 W04W34W64W94x[0] x[1] x[2] x[3]=1111 1-j-1j 1-11-1 1j-1-jx[0] x[1] x[2] x[3] 当DFT算法要求的变换点数N为组合数时,既然N为组合数,比如N=N1N2,那么n可以表示为 n=n2N1+n1,n1=0,1,…,N1-1;n2=0,1,…,N2-1 此时 WnkN=W(n2N1+n1)kN=Wn2N1kNWn1kN 而 Wn2N1kN=e-j2πNn2N1k=e-j2πN2n2k=Wn2kN2 是N2点DFT变换的基。变换基的以上性质对k同样适用。 利用这种组合数性质,可以把N点长序列的变换基转变成N1或N2点短序列的变换基。经过适当的分解与合成,将对长序列的DFT计算问题转换为计算短序列的DFT然后再组合,这样做可能大大降低运算量。尤其是短序列因子Ni为2或4时,运算效率更高。这类算法统称为快速傅里叶变换(fast fourier transform,FFT)。注意,FFT不是一类新变换,而是DFT快速计算算法的总称。 快速傅里叶变换可以把DFT的计算量减少到ONlgN量级。由于计算量小,FFT得到广泛应用。 但是标准FFT算法必须要把所有Xk都计算出来,对于某些只需要一部分谱的应用来说,特别是当点数N比较大时,FFT算法在效率方面并没有优势。此时采用卷积实现DFT的线性调频z变换(chirpz)算法可以减少无效计算。 在对序列做滑窗(slidingwindow)分析时,如果上次的FFT结果已知,则分析窗滑动一步,只有一个最老的值被滑出窗外,同时只有一个新值被滑进窗内,此时可以利用上次FFT结果递推得到新的FFT结果。这种算法可以把每一段变换的计算量减小到ON。 3.6.1按时间抽取基2FFT算法 既然目的是将长序列分解成短序列,先进行短序列的DFT,将短序列的DFT合成为长序列的DFT,很自然的一种分解方法是将序列分成两部分,偶数序号为一个新的短序列,奇数序号组成第二个短序列,即 e[n]=x[2n], f[n]=x[2n+1],0≤n≤N2-1 (3.39) 这里e[n]和f[n]都是N/2点序列,对其分别DFT,记为E[k]和F[k],均为N/2点DFT。考虑到利用短序列DFT合成长序列DFT时,序号k在0≤k≤N-1范围取值,利用DFT隐含的周期性,用E((k))N/2和F((k))N/2分别表示E[k]和F[k]的周期延拓。这样 X[k]=∑N-1n=0x[n]WnkN =∑N2-1r=0x[2r]W2rkN+∑N2-1r=0x[2r+1]W(2r+1)kN =∑N2-1r=0e[r]WrkN/2+WkN∑N2-1r=0f[r]WrkN/2 =E((k))N/2+WkNF((k))N/2(3.40) 上式第三行是N/2点DFT,考虑到k在0≤k≤N-1范围取值,第四行用了N/2点DFT E[k]和F[k]的周期延拓形式。 式(3.40)给出了用短序列变换合成长序列变换的公式,为了方便,取0≤k≤N2-1,重写式(3.40)最后一行为 X[k]=E[k]+WkNF[k], Xk+N2=E[k]-WkNF[k],0≤k≤N2-1(3.41) 由式(3.41)更清楚地看到,由于WkNF(k)只需要计算一次,若已经计算出N/2点DFT E[k]和F[k],由E[k]和F[k]得到X[k],0≤k≤N-1,仅需要N次加法和N/2次乘法。图3.14中,以N=8为例,画出了由两个N/2点DFT E[k]和F[k]合成得到X[k]的示意图。 图3.148点序列第一次分解流图 图3.14中看到,只有奇序列的变换F[k]输出端需要乘因子WkN,该因子称为旋转因子。一次分解后总运算量为 乘法次数 2N22+N2=N2N+1≈N22 加法次数 2N2N2-1+N=N22 乘法次数里的近似符号对大的N成立,可以看到一次分解获得的效果是大约降低了一半的乘法次数和加法次数,因此,这种分解可以继续进行下去,将e[n]和f[n],按照奇偶继续划分为 a[n]=e[2n]=x[4n], b[n]=e[2n+1]=x[4n+2], c[n]=f[2n]=x[4n+1], d[n]=f[2n+1]=x[4n+3],0≤n≤N4-1 对以上序列分别做N/4点DFT,类似式(3.41)的推导,得到 E[k]=A[k]+WkN/2B[k]=A[k]+W2kNB[k], Ek+N4=A[k]-WkN/2B[k]=A[k]-W2kNB[k],0≤k≤N4-1(3.42) F[k]=C[k]+WkN/2D[k]=C[k]+W2kND[k], Fk+N4=C[k]-WkN/2D[k]=C[k]-W2kND[k],0≤k≤N4-1(3.43) 以N=8为例,图3.15画出第二次分解后的示意图。 图3.158点序列第二次分解流图 这个分解过程一直进行下去。若取N=2m,经过m-1次分解后,序列已经变成2点序列。2点序列的DFT只需要2次加法,直接实现,不需要再分解。对于N=8的情况,最后的2点DFT直接用图3.12的蝶形图实现,最后得到的完整图形如图3.16所示。图3.16中最左侧的蝶形中的旋转因子W0N是为保持图中各级运算单元的一致性加入的。 图3.168点序列按时间抽取FFT流图 图3.16中,每一级的基本运算单元都是一致的,是一种蝶形运算单元,重新画在图3.17中。每个蝶形运算单元需要1次乘法和2次加法运算。在N=2m的情况下,总共有 m级运算,每一级由N/2个蝶形运算单元构成。故总运算量为 乘法次数 mc=m×N2=N2log2(2m)=N2log2(N)(3.44) 加法次数 ac=m×N=Nlog2(2m)=Nlog2(N)(3.45) 图3.17按时间抽取FFT的蝶形计算结构 观察图3.16的计算流程图,发现图中最左侧信号的输入不再是自然的顺序。图中所示的这种顺序称为倒位序。为了理解倒位序的一般性顺序,需分析序号的二进制表示。设N=2m为有限长信号的长度,需要用m位二进制数表示样本的序号n,n的二进制表示为 n=bm-1bm-2…b1b02=bm-12m-1+bm-22m-2+…+b121+b020 上式中,bi只取0和1。序号n的倒位序 n-记为 n-=b0b1…bm-2bm-12=b02m-1+b12m-2+…+bm-221+bm-120 从二进制表示来讲,倒位序是由原序号的二进制表示按位进行次序反转得到。 不难验证,图3.16输入端的排列次序是3位二进制数的倒位序。例如4=1002,其倒位序为0012=1,这正是图中x[4]的位置。另一例子5=1012,其倒位序取值不变。 不难理解为什么按时间抽取FFT算法的输入顺序是倒位序排列。在序号的二进制表示中,最低位决定奇偶性,最高位决定前一半和后一半。在按时间抽取的分解时,用最低位(序号的奇偶性)决定了被分到上一半还是下一半,因此实际上由最低位和最高位进行了交换; 在下一次分解时,原最高位和最低位都不再起作用,次高位和次低位交换; 当分解过程一直进行下去,到最后一级时,二进制位完成了倒位序过程。 注意到,在分解过程中,FFT的输出顺序保持原来的顺序,称为正位序。 在用数字系统实现FFT时,有一些专用处理器内部带有进行倒位序运算的单元,方便FFT的编程实现。在用通用计算机编程实现FFT运算时,可以通过编写一个专用子程序巧妙地实现倒位序运算。 3.6.2按频率抽取基2FFT算法 与时间抽取FFT的推导不同,换一种思路,将长序列的前后各一半分开,观察会得到什么结果 X[k]=∑N2-1n=0x[n]WnkN+∑N-1n=N2x[n]WnkN =∑N2-1n=0x[n]WnkN+∑N2-1n=0xn+N2Wn+N2kN(3.46) =∑N2-1n=0x[n]+xn+N2(-1)kWnkN 在式(3.46)中,仅考虑k=2r的偶数序号DFT系数,得到 X[2r]=∑N2-1n=0x[n]+xn+N2WrnN2=∑N2-1n=0e[n]WrnN2=E[r](3.47) 仅考虑k=2r+1的奇数序号DFT系数,得到 X[2r+1]=∑N2-1n=0x[n]-xn+N2WnNWrnN2=∑N2-1n=0f[n]WrnN2=F[r](3.48) 在式(3.47)和式(3.48)中,对偶数序号和奇数序号DFT系数的计算,相当于先定义如式(3.49)和式(3.50)所表示的两个N/2点长的序列,然后做N/2点DFT,即 e[n]=x[n]+xn+N2,0≤n