《快速傅里叶变换FFT.ppt》由会员分享,可在线阅读,更多相关《快速傅里叶变换FFT.ppt(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、本章主要内容引言 基2FFT算法进一步减少运算量的措施第4章 快速傅里叶变换(FFT)DFT是信号分析与处理中的一种重要变换。但直接计算DFT的计算量与变换区间长度N的平方成正比,当N较大时,计算量太大,直接用DFT算法进行谱分析和信号的实时处理是不切实际的。1965年发现了DFT的一种快速算法,使DFT的运算效率提高12个数量级,为数字信号处理技术应用于各种信号的实时处理创造了条件,推动了数字处理技术的发展。1984年,提出了分裂基快速算法,使运算效率进一步提高;4.1 引言 4.2.1 直接计算DFT的特点及减少运算量的基本途径 1.直接计算DFT长度为N的有限长序列x(n)的DFT为:2
2、、减少运算量的思路和方法思路:N点DFT的复乘次数等于N2。把N点DFT分解为几个较短的DFT,可使乘法次数大大减少。另外,旋转因子WmN具有周期性和对称性。4.2 基2FFT算法考虑x(n)为复数序列的一般情况,对某一个k值,直接按上式计算X(k)值需要N次复数乘法、(N-1)次复数加法。方法:分解N为较小值:把序列分解为几个较短的序列,分别计算其DFT值,可使乘法次数大大减少;利用旋转因子WNk的周期性、对称性进行合并、归类处理,以减少DFT的运算次数。周期性:对称性:3、FFT算法思想不断地把长序列的DFT分解成几个短序列的DFT,并利用旋转因子的周期性和对称性来减少DFT的运算次数。4
3、.2 基2FFT算法 4.2.2 时域抽取法基2FFT基本原理 FFT算法基本上分为两大类:时域抽取法FFT(简称DIT-FFT)和 频域抽取法FFT(简称DIFFFT)。1、时域抽取法FFT的算法思想:将序列x(n)按n为奇、偶数分为x1(n)、x2(n)两组序列;用2个N/2点DFT来完成一个N点DFT的计算。设序列x(n)的长度为N,且满足:(1)按n的奇偶把x(n)分解为两个N/2点的子序列4.2 基2FFT算法为自然数(2)用N/2点X1(k)和X2(k)表示序列x(n)的N点DFT X(k)4.2 基2FFT算法偶数奇数注意:这里的k的取值范围为0,1,N-1由于X1(k)和X2(
4、k)均以N/2为周期,且 ,X(k)又可表示为:对上式的运算用下图所示的流图符号来表示4.2 基2FFT算法这样将N点DFT分解为两个N/2点的DFTX1(k)X2(k)X1(k)+WNkX2(k)X1(k)WNkX2(k)WNk图:蝶形运算符号完成一个蝶形运算需要一次复数乘和两次复数加法运算,经过一次分解后,共需要复数乘和复数加的次数为2(N/2)2+N/2和N2/24.2 基2FFT算法N/2点DFTN/2点DFTx(0)x(2)x(4)x(6)x(1)x(3)x(5)x(7)X1(0)X1(1)X1(2)X1(3)X2(0)X2(1)X2(2)X2(3)WN0WN1WN2WN3X(0)X
5、(1)X(2)X(3)X(4)X(5)X(6)X(7)N=8点的DIT-2FFT(时域抽取图)一次分解图(3)第二次分解:将x1(r)按r取奇、偶可分解成2个长度为N/4的子序列 x3(l)=x1(2l)、x4(l)=x1(2l+1),根据上面推导可得:X1(k)=X3(k)+WN/2kX4(k),k=0,1,N/2-1将x2(r)按r取奇、偶可分解成2个长N/4的子序列 x5(l)=x2(2l),l=0,1,,N/4 x6(l)=x2(2l+1);同理得4.2 基2FFT算法l=0,1,,N/4-1;X1(k+N/2)=X3(k)WN/2kX4(k),k=0,1,N/4-1;X1(k)=X3
6、(k)+WN/2kX4(k),k=0,1,N/4-1;X2(k)=X5(k)+WN/2kX6(k),k=0,1,N/4-1 ;X2(k+N/2)=X5(k)WN/2kX6(k),k=0,1,N/4-1;4.2 基2FFT算法N/4点DFTx(0)x(4)x(2)x(6)x(1)x(5)x(3)x(7)X1(0)X1(1)X1(2)X1(3)X2(0)X2(1)X2(2)X2(3)WN0WN1WN2WN3X(0)X(1)X(2)X(3)X(4)X(5)X(6)X(7)N/4点DFTN/4点DFTN/4点DFTX3(0)X3(1)X4(0)X4(1)X5(0)X5(1)X6(0)X6(1)WN/2
7、0WN/21WN/21WN/20N=8点DFT的二次时域抽取分解图 X1(k+N/2)=X3(k)WN/2kX4(k)X1(k)=X3(k)+WN/2kX4(k)X2(k)=X5(k)+WN/2kX6(k)X2(k+N/2)=X5(k)WN/2kX6(k)k=0,1,N/4-1 ;再次分解,对N=8点,可分解三次。4.2 基2FFT算法X(5)N=8点DIT-FFT运算流图x(0)x(4)x(2)x(6)x(1)x(5)x(3)X1(1)X1(2)X1(3)X2(0)X2(1)X2(2)X2(3)WN0WN1WN2WN3X(0)X(1)X(2)X(3)X(4)X(6)X3(1)X4(0)X4(
8、1)X5(0)X5(1)X6(0)X6(1)WN/20WN/21WN/20WN0WN0WN0 x(7)WN/21WN0L=1级L=2L=3X(7)X3(0)X1(0)4.2 基2FFT算法N=8点DIT-FFT运算流图x(0)x(4)x(2)x(6)x(1)x(5)x(3)WN0WN1WN2WN3X(0)X(1)X(2)X(3)X(4)X(5)X(6)WN0WN2WN0WN0WN0WN0 x(7)WN2WN0L=1级L=2L=3X(7)4.2.3 DITFFT算法与直接计算DFT运算量的比较1、直接DFT运算N点运算:复数乘次数:NN 复数加次数:N(N-1)2、用DIT-FFT作N点运算:复
9、数乘次数:MN/2=N/2log2N;复加次数:2 N/2M=Nlog2N。可见FFT大大减少了运算次数,提高了运算速度。4.2 基2FFT算法整个运算流图中有M级蝶形,每一级运算流图中有N/2个蝶形,每个蝶形需一次复乘和两次复数加运算。4.2.4 DITFFT的运算规律及编程思想1.原位计算序列长为N=2M点的FFT,有M级蝶形,每级有N/2个蝶形运算。同一级中,每个蝶形的两个输入数据只对本蝶形有用,每个蝶形的输入、输出数据节点在用一条水平线上。这样,当计算完一个蝶形后,所得的输出数据可立即存入原输入数据所占用的存储单元。经过M级运算后,原来存放输入序列数据的N个存储单元中可依次存放X(k)
10、的N个值。原位计算:利用同一存储单元存储蝶形计算输入、输出数据的方法。优点:节约存储空间、降低设备成本。4.2 基2FFT算法2.旋转因子的变化规律N点DITFFT运算流图中,每个蝶形都要乘以旋转因子WpN,p称为旋转因子的指数。N8 23 时各级的旋转因子 第一级:L=1,有1个旋转因子:WNp=WN/4J=W2LJ J=0 第二级:L=2,有2个旋转因子:WNp=WN/2J=W2LJ J=0,1 第三级:L=3,有4个旋转因子:WNp=WNJ=W2LJ J=0,1,2,3 对于N2M 的一般情况,第L级共有2L-1个不同的旋转因子:WNp=W2LJ J=0,1,2,2L-11 2L=2LM
11、2M=N2LM 故:按照上面两式可以确定第L级运算的旋转因子。4.2 基2FFT算法JJ2M-LWNp=W2LJ=WN2L-M=WNp=J2M-L,J=0,1,2,2L-113、同一级中,同一旋转因子对应蝶形数目 第L级FFT运算中,同一旋转因子用在2M-L个蝶形中;4、同一级中,蝶形运算使用相同旋转因子之间相隔的“距离”第L级中,蝶距:D=2L。5、同一蝶形运算两输入数据的距离 在输入倒序,输出原序的FFT变换中,第L级的每一个蝶形的2个输入数据相距:B=2L-1。6、码位颠倒 输入序列x(n)经过M级时域奇、偶抽选后,输出序列X(k)的顺序和输入序列的顺序关系为倒位关系。4.2 基2FFT
12、算法7、蝶形运算的规律 序列经过时域抽选后,存入数组中,如果蝶形运算的两个输入数据相距B个点,应用原位计算,蝶形运算可表示成如下形式:4.2 基2FFT算法XL-1(J)X L-1(J+B)XL(J)=XL-1(J)+WNp X L-1(J+B)XL(J)=XL-1(J)WNp X L-1(J+B)WNpp=J2M-L,J=0,1,2,2L-118、DIT-FFT程序框图根据DIT-FFT原理和过程,DIT-FFT的完整程序框图包括以下几部分:(1)倒序:输入自然顺序序列x(n),根据倒序规律,进行倒序处理;(2)循环层1:确 定 运 算 的 级 数,L=1M(N=2M);确定一蝶形两输入数据
13、距离B=2L-1(3)循环层2:确定L级的(B=)2L-1个旋转因子;旋转因子指数p=2M-LJ,J=0B-1;(4)循环层3:对于同一旋转因子,用于同一级2M-L个蝶形运算中:k的取值从J到N-1,步长为2L(使用同一旋转因子的蝶形相距的距离)(5)完成一个蝶形运算。4.2 基2FFT算法9.序列的倒序 N=2M,用M位二进制数(nM-1nM-2n1n0)2表示序列的序号n.M次偶奇时域抽选过程为:对最低位按0、1分为偶、奇两组,次低位也按0、1分组,依此类推,M次分解后形成倒序图倒序图为:4.2 基2FFT算法二进制数(N=8)分解倒序图10041015110611170000001101
14、020113倒序前00111015011311170000100401021106倒序后可见,只要将顺序数的二进制位倒置可得到对应的二进制倒序值。10n20101n100010n0111(n2n1n0)2思考题:已知N=16点,在DIT-FFT运算中,序数为2的二进制经数倒序后为多少?4.2 基2FFT算法顺序数增加1,是在顺序数的二进制数的最低位加1,向左进位到序数是在M位二进制数的最高位加 1,向 右进位(0010-0100)顺序和倒序二进制数对照表 N=2M,用M位二进制数表示,则从左至右的十进制权值为:N/2N/2、N/4N/4、N/8,N/8,、2,12,1 对倒序数J,其下一个序数
15、是在该序数J的二进制首位码加1,相当于十进制运算J+N/2+N/2。计算机上倒序数的实现过程为:4.2 基2FFT算法JN/2?JN/4输入当前倒序数十进制数值JNYNYJN/2MNY结束J=J-N/2倒序数的十进制运算规律倒序程序框图 为了实现原位运算,以节约存贮空间,提高运算速率。在倒序数 J 形成后,需将原存储器中存放的输入序列重新排列。下面先分析N=8点的倒序规律。4.2 基2FFT算法x(0)A(0)x(1)A(1)x(2)A(2)x(3)A(3)x(4)A(4)x(5)A(5)x(6)A(6)x(7)A(7)A(0)A(1)A(2)A(3)A(4)A(5)A(6)A(7)输入序列数
16、组分析上图N=8点倒序规律,顺序数I与倒序数J 存在关系:I=J时,不交换;I J时,不交换,直接更新序数值;IJx(0)x(2)x(4)x(1)x(5)x(6)x(3)x(7)计算倒序值交换数组中的数据不交换数据,避免再次调换前面调换过的一对数据,计算下一个倒数值。4.2.5 频域抽取法FFT(DIFFFT)在基2快速算法中,频域抽取法FFT也是一种常用的快速算法。1、算法思想和运算过程 设序列x(n)长度为N=2M,将序列x(n)前后对半分为x1(n)、x2(n)两组序列,用2个N/2点DFT来完成一个N点DFT的计算。4.2 基2FFT算法nk=偶数,k=奇数 4.2 基2FFT算法将X
17、(k)分解成偶数组与奇数组,当k取偶数(k=2r,r=0,1,N/2-1)时 当k取奇数(k=2r+1,r=0,1,N/2-1)时:将x1(n)和x2(n)分别代入上式,可得x1(n)x2(n)表明:X(k)按奇偶k值分为两组:偶数组是x1(n)的N/2点DFT 奇数组是x2(n)的N/2点DFTn=0,1,N/2-1那么对序列x1(n)、x2(n)和x(n)可用蝶形运算符号表示4.2 基2FFT算法x(n)x1(n)=x(n)+x(n+N/2)x2(n)=x(n)x(n+N/2)WNnWNnx(n+N/2)DIF-FFT蝶形运算流图符号N=8时第1次分解的运算流图X(3)N/2点DFTN/2
18、点DFTx(0)x(1)x(2)x(3)x(4)x(5)x(6)x(7)x1(0)x1(1)x1(2)x1(3)x2(0)x2(1)x2(2)x2(3)WN0WN1WN2WN3X(0)X(2)X(4)X(6)X(1)X(5)X(7)N=2M,N/2仍是偶数,继续将N/2点进行分解。将输入序列x1(n)、x2(n)分别按前、后对半分解成4个长N/4的子序列,其n=0,1,,N/4-14.2 基2FFT算法x3(n)=x1(n)+x1(n+N/4)x4(n)=x1(n)-x1(n+N/4)WN/2n x5(n)=x2(n)+x2(n+N/4)x6(n)=x2(n)-x2(n+N/4)WN/2nN/
19、4 点DFTWN0WN1WN2WN3x(0)x(1)x(2)x(3)x(4)x(5)x(6)x(7)X(0)X(4)X(2)X(6)X(1)X(5)X(3)X(7)WN0WN2WN0WN2N/4 点DFTN/4 点DFTN/4 点DFTx1(0)x1(1)x1(2)x1(3)x2(0)x2(1)x2(2)x2(3)x3(0)x3(1)x4(0)x4(1)x5(0)x5(1)x6(0)x6(1)DIFFFT二次分解运算流图(N=8)经过三次分解后,DIFFFT运算流图(N=8)为:4.2 基2FFT算法x(0)x(1)x(2)x(3)x(4)x(5)x(6)x(7)x1(0)x1(1)x1(2)
20、x1(3)x2(0)x2(1)x2(2)x2(3)WN0WN1WN2WN3X(0)X(4)X(2)X(6)X(1)X(5)X(3)X(7)x3(0)x3(1)x4(0)x4(1)x5(0)x5(1)x6(0)x6(1)WN0WN2WN0WN2WN0WN0WN0WN02、DIF-FFT运算规律 DIF-FFT算法也可采用原位计算;N=2M时,共有M级运算,每级共有N/2个蝶形,DIT与DIF算法的运算次数相同。DIT与DIF不同的是:DIF-FFT算法输入序列为自然序列,输出为倒序序列。因此,在M级运算完成后,需对输出数据进行倒序才能得到自然顺序的X(k)。蝶形运算符号不同:DIT-FFT蝶形是
21、先相乘,后加/减;而DIF-FFT蝶形是先加/减,后相乘。4.2 基2FFT算法DIT-FFT蝶形运算符号X1(k)X2(k)X1(k)+WNkX2(k)X1(k)WNkX2(k)WNkx2(n)=x(n)x(n+N/2)WNnx(n)x1(n)=x(n)+x(n+N/2)WNnx(n+N/2)DIF-FFT蝶形运算流图符号3、其它形式的DIT-FFT运算流图 通过改变输入/输出节点,中间节点的排列顺序,可以得到不同变形的FFT运算流图。因此,前面介绍的DIT-FFT和DIF-FFT运算流图都不是唯一的。4.2 基2FFT算法X(0)X(4)X(2)X(6)X(1)X(5)X(3)X(7)X3
22、(0)X5(0)X4(0)X6(0)X3(1)X5(1)X4(1)X6(1)WN0 x(0)x(1)x(2)x(3)x(4)x(5)x(6)x(7)WN0WN0WN0WN2WN1WN3X1(0)X2(0)X1(2)X2(2)X1(1)X2(1)X1(3)X2(3)WN0WN0WN0WN2WN2输出序列输入序列DIT-FFT的一种变形运算流图(输入顺序,输出倒序)用同样的方法可得DIT-FFT的另外一种变形运算流图,输入和输出均为顺序排列,但不能采用原位计算。4.2 基2FFT算法DITFFT的一种变形运算流图4.2.6 IDFT的高效算法1 DFT和IDFT的公式比较上述FFT算法流图也可以用
23、于离散傅里叶逆变换IDFT根据运算公式可以看出,只需将DFT的系数WNkn变为WN-kn,最后结果乘以1/N,就是IDFT的运算公式。第4章 快速傅里叶变换(FFT)X(k)n2 用FFT流图实现IDFT快速算法将DIT-FFT或DIF-FFT蝶形运算流图中旋转因子WNp改为WN-p在IDFT快速算法的最后结果输出前,乘以1/N常数;如要防止溢出,可在每一级运算中,输出支路分别乘以1/2,实现系数分级分担。在IDFT快速算法中,输入序列为X(k),而输出序列为x(n)。节点对应关系:DIT-FFT对应DIF-IFFT DIF-FFT对应DIT-IFFT第4章 快速傅里叶变换(FFT)第4章 快速傅里叶变换(FFT)DITIFFT运算流图 第4章 快速傅里叶变换(FFT)DITIFFT运算流图(防止溢出)3、直接调用FFT程序实现IFFT的计算 对FFT流程作一些修改后,调用FFT程序实现IFFT的快速计算。具体实现方法:先将X(k)取共轭,得到X*(k);直接调用FFT子程序计算出DFTX*(k)的值;对输出序列取共轭,并乘以1/N常数。虽然2次用了取共轭运算,但可以和FFT共用一个子程序,实现方便。第4章 快速傅里叶变换(FFT)*本章作业本章第一次作业习题 1习题 2本章第二次作业习题 3习题 4
限制150内