基2DIT-FFT的MATLAB实现.ppt
基2DIT-FFT的MATLAB实现,,基2DIT-FFT的MATLAB实现,DFT是信号分析与处理中的一种重要变换。但直接计算DFT的计算量与变换区间长度N的平方成正比,当N较大时,计算量太大,直接用DFT算法进行谱分析和信号的实时处理是不切实际的。 1965年发现了DFT的一种快速算法,使DFT的运算效率提高1-2个数量级,为数字信号处理技术应用于各种信号的实时处理创造了条件,推动了数字处理技术的发展。 1984年,提出了分裂基快速算法,使运算效率进一步提高;,基2FFT算法,1、直接计算DFT 长度为N的有限长序x(n)的DFT为:2、减少运算量的思路和方法 思路:N点DFT的复乘次数等于N2。把N点DFT分解为几个较短的DFT,可使乘法次数大大减少。另外,旋转因子WmN具有周期性和对称性。,考虑x(n)为复数序列的一般情况,对某一个k值,直接按上式计算X(k)值需要N次复数乘法,(N-1)次复数加法。,基2FFT算法,方法:分解N为较小值:把序列分解为几个较短的序列,分别计算其DFT值,可使乘法次数大大减少;利用旋转因子WNk的周期性、对称性进行合并、归类处理,以减少DFT的运算次数。周期性:对称性: 3、FFT算法思想 不断地把长序列的DFT分解成几个短序列的DFT,并利用旋转因子的周期性和对称性来减少DFT的运算次数。,基2FFT算法,时域抽取法基2FFT基本原理 FFT算法基本上分为两大类:时域抽取法FFT(简称DIT-FFT)和 频域抽取法FFT(简称DIF―FFT)。 1、时域抽取法FFT的算法思想:将序列x(n)按n为奇、偶数分为x1(n)、x2(n)两组序列;用2个N/2点DFT来完成一个N点DFT的计算。设序列x(n)的长度为N,且满足: (1) 按n的奇偶把x(n)分解为两个N/2点的子序列,基2FFT算法,(2)用N/2点X1(k)和X2(k)表示序列x(n)的N点DFT X(k),注意:这里的k的取值范围为0,1,…N-1,基2FFT算法,由于X1(k)和X2(k)均以N/2为周期,且 , X(k)又可表示为:对上式的运算用下图所示的流图符号来表示,完成一个蝶形运算需要一次复数乘和两次复数加法运算,经过一次分解后,共需要复数乘和复数加的次数为2(N/2)2+N/2和N2/2,基2FFT算法,蝶形运算符号,基2FFT算法,N=8点的DIT-2FFT(时域抽取图)一次分解图,基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/4x6(l) = x2(2l+1) ; 同理得,基2FFT算法,N=8点DFT的二次时域抽取分解图,k=0,1,…,N/4-1 ;,基2FFT算法,再次分解,对N=8点,可分解三次。,基2FFT算法,基2FFT算法,DIT―FFT算法与直接计算DFT运算量的比较 1、直接DFT运算N点运算:复数乘次数:N×N复数加次数:N×(N-1) 2、 用DIT-FFT作N点运算:复数乘次数:M×N/2=N/2×log2N;复加次数: 2 ×N/2×M= N×log2N。 可见FFT大大减少了运算次数,提高了运算速度。,整个运算流图中有M级蝶形,每一级运算流图中有N/2个蝶形,每个蝶形需一次复乘和两次复数加运算。,基2FFT算法,4 DIT―FFT的运算规律及编程思想 1.原位计算 序列长为N=2M点的FFT,有M级蝶形,每级有N/2个蝶形运算。同一级中,每个蝶形的两个输入数据只对本蝶形有用,每个蝶形的输入、输出数据节点在用一条水平线上。这样,当计算完一个蝶形后,所得的输出数据可立即存入原输入数据所占用的存储单元。经过M级运算后,原来存放输入序列数据的N个存储单元中可依次存放X(k)的N个值。 原位计算:利用同一存储单元存储蝶形计算输入、输出数据的方法。 优点:节约存储空间、降低设备成本。,基2FFT算法,2.旋转因子的变化规律 N点DIT―FFT运算流图中,每个蝶形都要乘以旋转因子WpN,p称为旋转因子的指数。N=8 =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对于N=2M 的一般情况,第L级共有2L-1个不同的旋转因子:WNp =W2LJ J=0,1,2,… ,2L-1-1 2L =2LM2M = N2LM故: 按照上面两式可以确定第L级运算的旋转因子。,基2FFT算法,3、同一级中,同一旋转因子对应蝶形数目第L级FFT运算中,同一旋转因子用在2M-L个蝶形中; 4、同一级中,蝶形运算使用相同旋转因子之间相隔的“距离”第L级中,蝶距:D=2L。 5、同一蝶形运算两输入数据的距离 在输入倒序,输出原序的FFT变换中,第L级的每一个蝶形的2个输入数据相距:B=2L-1。 6、码位颠倒输入序列x(n)经过M级时域奇、偶抽选后,输出序列X(k)的顺序和输入序列的顺序关系为倒位关系。,基2FFT算法,7、蝶形运算的规律序列经过时域抽选后,存入数组中,如果蝶形运算的两个输入数据相距B个点,应用原位计算,蝶形运算可表示成如下形式:,基2FFT算法,8、 DIT-FFT程序框图 根据DIT-FFT原理和过程,DIT-FFT的完整程序框图包括以下几部分: (1)倒序:输入自然顺序序列x(n),根据倒序规律,进行倒序处理; (2)循环层1:确定运算的级数,L=1M (N=2M);确定一蝶形两输入数据距离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)完成一个蝶形运算。,基2FFT算法,程序源代码,function y=myditfft(x) %本程序对输入序列实现DIT-FFT基2算法,点数取大于等于长度的2的幂次 m=nextpow2(length(x)); %求的x长度对应的2的最低幂次m N=2^m; if length(x)Nx=[x,zeros(1,N-length(x))]; %若的长度不是2的幂,补0到2的整数幂 end nxd=bin2dec(fliplr(dec2bin([1:N]-1,m)))+1; %求1:2^m数列的倒序 y=x(nxd); %将倒序排列作为的初始值 for L=1:m %将DFT做m次基2分解,从左到右,对每次分解作DFT运算D=2^L;u=1; %旋转因子u初始化WN=exp(-1i*2*pi/D); %本次分解的基本DFT因子WN=exp(-i*2*pi/Nmr)for j=1:D/2 %本次跨越间隔内的各次碟形运算for k=j:D:N %本次碟形运算的跨越间隔为Nmr=2^mmkp=k+D/2; %确定碟形运算的对应单元下标t=y(kp)*u; %碟形运算的乘积项y(kp)=y(k)-t; %碟形运算的加法项y(k)=y(k)+t;endu=u*WN; %修改旋转因子,多乘一个基本DFT因子WNend end;,非连续时间信号的傅里叶变换结果,myditfft实现,幅频特性,相频特性,fft实现,正弦信号的傅里叶变换,ffT变换,myditfft变换,相频,幅频,方波信号的傅里叶变换,ffT变换,myditfft变换,相频,幅频,,?,