按时间抽取的基2FFT算法分析与MATLAB实现
- 格式:doc
- 大小:108.30 KB
- 文档页数:5
按时间抽取的基2FFT算法分析基2FFT算法是一种快速傅里叶变换算法,它通过将傅里叶变换的计算复杂度从O(n^2)降低到O(nlogn),大大提高了傅里叶变换的效率。
基2FFT算法的核心思想是将一个长度为n的序列分成长度为n/2的两个子序列,并分别做傅里叶变换。
然后将两个子序列的傅里叶变换结果合并起来,得到原始序列的傅里叶变换结果。
具体来说,基2FFT算法的步骤如下:1.如果输入序列长度为1,则返回输入序列作为傅里叶变换结果。
2.将输入序列按奇偶位置分为两个子序列。
3.对两个子序列分别递归地应用基2FFT算法,得到它们的傅里叶变换结果。
4.根据蝶形算法,将子序列的傅里叶变换结果合并起来,得到原始序列的傅里叶变换结果。
基2FFT算法通过不断将序列分成两半的方式,将傅里叶变换的计算复杂度从O(n^2)降低到O(nlogn)。
在每一层递归中,需要进行O(n)次计算,而递归的层数为logn,因此总的时间复杂度为O(nlogn)。
基2FFT算法的关键之一是蝶形算法。
蝶形算法是一种合并子序列傅里叶变换结果的方法。
在每一层递归中,对于每个位置k,需要计算一个长度为n的序列上的k点DFT。
根据蝶形算法,可以将这个计算分成两个部分:计算序列中偶数位置上的点DFT和计算序列中奇数位置上的点DFT,并通过一些乘法和加法操作合并起来。
这样做可以大大减少计算量,提高计算效率。
基2FFT算法还可以通过多线程或并行处理来进一步提高效率。
由于基2FFT算法具有递归结构,可以将不同的递归层分配给不同的线程或处理器来并行进行计算,从而加快计算速度。
基2FFT算法在数字信号处理、图像处理、通信系统和科学计算等领域有着广泛的应用。
它的高效性和快速运算速度使得它成为处理大规模数据的重要工具。
综上所述,基2FFT算法通过将傅里叶变换的计算复杂度从O(n^2)降低到O(nlogn),大大提高了傅里叶变换的效率。
它采用递归分治的思想,通过分解和合并操作来实现傅里叶变换的计算。
FFT 算法程序及分析摘 要:《FFT 的算法程序分析》主要分析了按时间抽取(DIT)的快速傅立叶变换的基2FFT 算法,通过对基2FFT 算法的原理的分析及与DFT 算法运算量的比较,进一步推导出了基rFFT 算法,重点是基rFFT 算法的推导。
在具体的实例中,我们重点分析了FFT 过程中幅值大小与FFT 选用点数N 的关系,验证FFT 变换的可靠性,考察在FFT 中数据样本的长度与DFT 的点数对频谱图的影响。
关键字: 基2FFT 算法,基rFFT 算法,样本长度,选用点数要求:● 学习书上第六节的内容,自己编程实现FFT 算法 . ● 给出典型信号的时域和频域图,并加以分析。
● 可尝试实现分段卷积程序。
● 论文内容含原程序、运行结果,理论分析和典型信号时域图。
一.快速傅立叶变换(FFT )简介离散傅立叶变换(DFT )是信号分析与处理中的一种重要的变换。
因直接计算DFT 的计算量与变换区间长度N 的平方成正比,当N 较大时,计算量太大。
所以在快速傅立叶变换(FFT )出现以前,直接用DFT 算法进行频谱分析和信号的实时处理是不切实际的。
1965年,库利(J.W.Cooley )和图基(J.W.Tukey )在《计算数学》杂志上发表了“机器计算傅立叶级数的一种算法”的文章,这是一篇关于计算DFT 的一种快速有效的计算方法的文章。
它的思路建立在对DFT 运算内在规律的认识之上。
这篇文章的发表使DFT 的计算量大大减少,并导致了许多计算方法的发现。
这些算法统称为快速傅立叶变换(Fast Fourier Transform),简称FFT.1984年,法国的杜哈梅尔(P.Dohamel )和霍尔曼(H.Hollmann )提出的分裂基快速算法,使运算效率进一步提高。
快速傅立叶变换(FFT )不是一种新的变换,而是离散傅立叶变换(DFT )的一种快速算法。
FFT 分成两大类,即按时间抽取(decimation —in —time,缩写为DIT )法和按频率抽取(decimation —in —frequency ,缩写为DIF)法。
按时间抽选的基2FFT算法基2FFT算法(Fast Fourier Transform,快速傅里叶变换)是一种高效的算法,用于在计算机上计算离散傅里叶变换(Discrete Fourier Transform,DFT)。
它的核心思想是利用分治策略和递归操作,在O(nlogn)的时间复杂度下完成离散傅里叶变换。
基2FFT算法的关键步骤如下:1. 将输入的序列划分为两个子序列:偶数位置和奇数位置上的元素分别组成两个子序列。
2. 对这两个子序列分别进行离散傅里叶变换,得到两个新的子序列。
3. 将两个新子序列的元素按照原始顺序交替排列,得到最终的结果。
基于以上步骤,可以利用递归操作来实现基2FFT算法。
具体的实现过程如下:1. 如果输入序列的长度为1,则不需要进行任何操作,直接返回该序列作为结果。
2. 如果输入序列的长度大于1,则按照上述步骤进行分割和计算。
3. 首先将输入序列分为偶数位置和奇数位置上的元素组成的两个子序列。
4. 对这两个子序列分别递归调用基2FFT算法,得到两个新的子序列。
5. 将两个新子序列的元素按照原始顺序交替排列,得到最终的结果。
基2FFT算法的时间复杂度分析如下:假设输入序列的长度为n,则每一层递归的时间复杂度为O(n),总共有logn层递归。
因此,基2FFT算法的总时间复杂度为O(nlogn)。
基2FFT算法在信号处理、图像处理等领域具有广泛的应用。
它可以高效地计算离散傅里叶变换,将时域信号转换为频域信号,从而实现信号分析、频谱分析和频域滤波等操作。
同时,基于基2FFT算法的快速傅里叶变换还能够应用于多项式乘法、高效计算卷积等问题的求解。
总之,基2FFT算法是一种高效的离散傅里叶变换算法,通过利用分治策略和递归操作,能够在O(nlogn)的时间复杂度下完成计算。
它在信号处理和图像处理等领域有着重要的应用价值。
基2FFT算法(Fast Fourier Transform,快速傅里叶变换)是离散傅里叶变换(Discrete Fourier Transform,DFT)的一种高效计算方法。
按时间抽取的基2FFT算法分析及MATLAB实现基2FFT算法是一种快速傅里叶变换(Fast Fourier Transform,FFT)的算法,在信号处理、图像处理等领域有着广泛的应用。
该算法通过将N个输入值分解成两个长度为N/2的DFT(离散傅里叶变换)来实现快速的计算。
本文将对基2FFT算法进行分析,并给出MATLAB实现。
基2FFT算法的主要思路是将输入序列分解成奇偶两个子序列,然后分别对这两个子序列进行计算。
具体步骤如下:1.将输入序列拆分成奇数位和偶数位两个子序列。
比如序列x[0],x[1],x[2],x[3]可以拆分成x[0],x[2]和x[1],x[3]两个子序列。
2. 对两个子序列分别进行DFT计算。
DFT的定义为:X[k] = Σ(x[n] * exp(-i * 2π * k * n / N)),其中k为频率的索引,N为序列长度。
3.对得到的两个DFT结果分别进行合并。
将奇数位子序列的DFT结果和偶数位子序列的DFT结果合并成一个长度为N的DFT结果。
4.重复以上步骤,直到计算结束。
基2FFT算法的时间复杂度为O(NlogN),远远小于直接计算DFT的时间复杂度O(N^2)。
这是因为基2FFT算法将问题的规模逐步减半,从而实现了快速的计算。
下面是MATLAB中基2FFT算法的简单实现:```matlabfunction X = myFFT(x)N = length(x);if N == 1X=x;%递归结束条件return;endeven = myFFT(x(1:2:N)); % 偶数位子序列的FFT计算odd = myFFT(x(2:2:N)); % 奇数位子序列的FFT计算W = exp(-1i * 2 * pi / N * (0:N/2-1)); % 蝶形因子temp = W .* odd; % 奇数位子序列的DFT结果乘以蝶形因子X = [even + temp, even - temp]; % 合并得到一个长度为N的DFT结果end```上述代码中,函数myFFT为基2FFT算法的MATLAB实现。
第四章 快速傅里叶变换有限长序列可以通过离散傅里叶变换(DFT)将其频域也离散化成有限长序列.但其计算量太大,很难实时地处理问题,因此引出了快速傅里叶变换(FFT). 1965年,Cooley 和Tukey 提出了计算离散傅里叶变换(DFT )的快速算法,将DFT 的运算量减少了几个数量级。
从此,对快速傅里叶变换(FFT )算法的研究便不断深入,数字信号处理这门新兴学科也随FFT 的出现和发展而迅速发展。
根据对序列分解与选取方法的不同而产生了FFT 的多种算法,基本算法是基2DIT 和基2DIF 。
FFT 在离散傅里叶反变换、线性卷积和线性相关等方面也有重要应用。
快速傅里叶变换(FFT )是计算离散傅里叶变换(DFT )的快速算法。
DFT 的定义式为)(k X =)()(10k R W n x N N n knN∑-= 在所有复指数值knN W 的值全部已算好的情况下,要计算一个)(k X 需要N 次复数乘法和N -1次复数加法。
算出全部N 点)(k X 共需2N 次复数乘法和)1(-N N 次复数加法。
即计算量是与2N 成正比的。
FFT 的基本思想:将大点数的DFT 分解为若干个小点数DFT 的组合,从而减少运算量。
N W 因子具有以下两个特性,可使DFT 运算量尽量分解为小点数的DFT运算:(1) 周期性:k N n N kn N nN k N W W W )()(++== (2) 对称性:k N N k NW W -=+)2/(利用这两个性质,可以使DFT 运算中有些项合并,以减少乘法次数。
例子:求当N =4时,X(2)的值)()]3()1([)]2()0([)()]3()1([)]2()0([)3()2()1()0()()2(04240464442404324对称性-=周期性W x x x x W x x W x x W x W x W x W x W n x X n n +++++=+++==∑=通过合并,使乘法次数由4次减少到1次,运算量减少。
第四章 快速傅里叶变换有限长序列可以通过离散傅里叶变换(DFT)将其频域也离散化成有限长序列.但其计算量太大,很难实时地处理问题,因此引出了快速傅里叶变换(FFT). 1965年,Cooley 和Tukey 提出了计算离散傅里叶变换(DFT )的快速算法,将DFT 的运算量减少了几个数量级。
从此,对快速傅里叶变换(FFT )算法的研究便不断深入,数字信号处理这门新兴学科也随FFT 的出现和发展而迅速发展。
根据对序列分解与选取方法的不同而产生了FFT 的多种算法,基本算法是基2DIT 和基2DIF 。
FFT 在离散傅里叶反变换、线性卷积和线性相关等方面也有重要应用。
快速傅里叶变换(FFT )是计算离散傅里叶变换(DFT )的快速算法。
DFT 的定义式为)(k X =)()(10k R W n x N N n knN∑-= 在所有复指数值knN W 的值全部已算好的情况下,要计算一个)(k X 需要N 次复数乘法和N -1次复数加法。
算出全部N 点)(k X 共需2N 次复数乘法和)1(-N N 次复数加法。
即计算量是与2N 成正比的。
FFT 的基本思想:将大点数的DFT 分解为若干个小点数DFT 的组合,从而减少运算量。
N W 因子具有以下两个特性,可使DFT 运算量尽量分解为小点数的DFT运算:(1) 周期性:k N n N kn N nN k N W W W )()(++== (2) 对称性:k N N k NW W -=+)2/(利用这两个性质,可以使DFT 运算中有些项合并,以减少乘法次数。
例子:求当N =4时,X(2)的值)()]3()1([)]2()0([)()]3()1([)]2()0([)3()2()1()0()()2(04240464442404324对称性-=周期性W x x x x W x x W x x W x W x W x W x W n x X n n +++++=+++==∑=通过合并,使乘法次数由4次减少到1次,运算量减少。
基于Matlab的时间抽取基2FFT算法基于Matlab的时间抽取基2FFT算法function y=myditfft(x)%本程序对输入序列实现DIT-FFT基2算法,点数取大于等于长度的2的幂次%------------------------------------% Leo's fft program(改编网上的一个程序)%------------------------------------m=log2(2^nextpow2(length(x))); %求的x 长度对应的2的最低幂次mN=2^m;if length(x)<Nx=[x,zeros(1,N-length(x))]; %若长度不是2的幂,补0到2的整数幂endx;%--------------------------------------------------------------------------%对输入序列进行倒序%如果输入序列的自然顺序号I用二进制数(例如n2n1n0)表示%则其倒位序J对应的二进制数就是(n0n1n2),这样,在原来自然顺序时应该放x(I)的%单元,现在倒位序后应放x(J)。
%--------------------------------------------------------------------------%以下程序相当于以下程序:%nxd=bin2dec(fliplr(dec2bin([1:N]-1,m)))+1; %求1:2^m数列的倒序%y=x(nxd);%将倒序排列作为初始值%--------------------------------------------------------------------------NV2=N/2;NM1=N-1;I=0;J=0;while I<NM1if I<JT=x(J+1);x(J+1)=x(I+1);x(I+1)=T;endK=NV2;while K<=JJ=J-K;K=K/2;endJ=J+K;I=I+1;endx;%--------------------------------------------------------------------------%以下程序解释:%第一级从x(0)开始,跨接一阶蝶形,再取每条对称%第二级从x(0)开始,跨接两阶蝶形,再取每条对称%第m级从x(0)开始,跨接2^(m-1)阶蝶形,再取每条对称....%--------------------------------------------------------------------------formm=1:m%将DFT做m次基2分解,从左到右,对每次分解作DFT运算 Nmr=2^mm;u=1;%旋转因子u初始化WN=exp(-j*2*pi/Nmr);%本次分解的基本DFT因子WN=exp(-i*2*pi/Nmr)forn=1:Nmr/2 %本次跨越间隔内的各次碟形运算fork=n:Nmr:N %本次碟形运算的跨越间隔为Nmr=2^mmkp=k+Nmr/2;%确定碟形运算的对应单元下标(对称性)t=x(kp)*u;%碟形运算的乘积项x(kp)=x(k)-t;%碟形运算的加法项x(k)=x(k)+t;endu=u*WN;%修改旋转因子,多乘一个基本DFT因子WNend。
电 子 科 技 大 学实 验 报 告学生姓名: 学 号:2010013080 指导教师一、实验室名称:数字信号处理实验室 二、实验项目名称:FFT 的实现 三、实验原理:一.FFT 算法思想:1.DFT 的定义:对于有限长离散数字信号{x[n]},0 ≤ n ≤ N-1,其离散谱{x[k]}可以由离散付氏变换(DFT )求得。
DFT 的定义为:21[][]N jnk Nn X k x n eπ--==∑,k=0,1,…N-1通常令2jNN eW π-=,称为旋转因子。
2.直接计算DFT 的问题及FFT 的基本思想:由DFT 的定义可以看出,在x[n]为复数序列的情况下,完全直接运算N 点DFT 需要(N-1)2次复数乘法和N (N-1)次加法。
因此,对于一些相当大的N 值(如1024)来说,直接计算它的DFT 所作的计算量是很大的。
FFT 的基本思想在于,将原有的N 点序列分成两个较短的序列,这些序列的DFT 可以很简单的组合起来得到原序列的DFT 。
例如,若N 为偶数,将原有的N 点序列分成两个(N/2)点序列,那么计算N 点DFT 将只需要约[(N/2)2 ·2]=N 2/2次复数乘法。
即比直接计算少作一半乘法。
因子(N/2)2表示直接计算(N/2)点DFT 所需要的乘法次数,而乘数2代表必须完成两个DFT 。
上述处理方法可以反复使用,即(N/2)点的DFT 计算也可以化成两个(N/4)点的DFT (假定N/2为偶数),从而又少作一半的乘法。
这样一级一级的划分下去一直到最后就划分成两点的FFT 运算的情况。
3.基2按时间抽取(DIT )的FFT 算法思想:设序列长度为2L N =,L 为整数(如果序列长度不满足此条件,通过在后面补零让其满足)。
将长度为2L N =的序列[](0,1,...,1)x n n N =-,先按n 的奇偶分成两组:12[2][][21][]x r x r x r x r =+=,r=0,1,…,N/2-1DFT 化为:1/21/212(21)0/21/21221200/21/211/22/2[]{[]}[][2][21][][][][]N N N nk rk r kNNNn r r N N rk k rk NNN r r N N rk k rk N NN r r X k DFT x n x n Wx r Wx r W x r W Wx r W x r WWx r W ---+===--==--=====++=+=+∑∑∑∑∑∑∑上式中利用了旋转因子的可约性,即:2/2rkrkNN W W =。
按时间抽取的基2FFT算法分析与MATLAB实现基2FFT算法(Fast Fourier Transform)是一种高效的离散傅里叶变换(DFT)算法,其时间复杂度为O(NlogN),其中N为输入数据的大小。
该算法利用了DFT的对称性质以及分治的思想,通过将一个大规模的DFT问题分解为若干个规模较小的DFT问题来加快计算速度。
基2FFT算法的实现步骤如下:1.输入N个复数序列x(n),其中n取值范围为0到N-12.如果N为1,直接返回x(n)。
3. 将x(n)分为两个子序列,分别为x_odd(n)和x_even(n),其中x_odd(n)包含所有奇数索引的元素,x_even(n)包含所有偶数索引的元素。
4. 对x_odd(n)和x_even(n)分别进行基2FFT变换,递归地计算它们的DFT结果。
5. 根据DFT的对称性,计算出x(k)的前半部分和后半部分的值,其中k为频率索引,取值范围为0到N/2-1、具体计算方法是将x_odd(k)和x_even(k)与旋转因子W_N^k相乘,可通过以下公式计算:x(k) = x_even(k) + W_N^k * x_odd(k)x(k+N/2) = x_even(k) - W_N^k * x_odd(k)其中W_N^k = e^(-j*2*pi*k/N)为旋转因子。
6.返回x(k)作为输出结果。
基2FFT算法的MATLAB实现如下:```matlabfunction X = myfft(x)N = length(x);if N == 1X=x;%如果序列长度为1,直接返回原始序列returnendx_even = myfft(x(1:2:end)); % 奇数索引的元素序列x_odd = myfft(x(2:2:end)); % 偶数索引的元素序列W_N = exp(-2i * pi / N); % 计算旋转因子X = zeros(1, N); % 保存DFT结果for k = 0:N/2-1X(k+1) = x_even(k+1) + W_N^k * x_odd(k+1);X(k+1+N/2) = x_even(k+1) - W_N^k * x_odd(k+1); endend```该实现使用了递归的方式计算DFT,首先对输入序列进行分解,然后递归地计算子序列的DFT结果,并根据对称性将结果合并到一起。
按时间抽取基2的FFT算法的实现
杜义君
【期刊名称】《塔里木大学学报》
【年(卷),期】2007(19)2
【摘要】详细介绍按时间抽取的傅立叶快速变换算法的基本原理,深入分析其特点,介绍了其程序实现的思想和具体内容.
【总页数】3页(P85-87)
【作者】杜义君
【作者单位】塔里木大学信息工程学院,新疆,阿拉尔,843300
【正文语种】中文
【中图分类】TP314
【相关文献】
1.按频率抽取的基-2FFT算法的矩阵形式 [J], 左大海;常安定;马良
2.基于FPGA的混合基FFT算法设计与实现 [J], 侯晓晨;孟骁;陈昊
3.基于FPGA的混合基FFT算法设计与实现 [J], 侯晓晨;孟骁;陈昊
4.按频率抽取的基4FFT算法在FPGA中实现 [J], 刘学梅;孙志坚
5.一种按时间抽取的混合基实序列高效FFT算法 [J], 张卉;刘永刚;阎跃鹏
因版权原因,仅展示原文概要,查看原文内容请购买。
按时间抽取的基2FFT 算法分析及MATLAB 实现一、DIT-FFT 算法的基本原理基2FFT 算法的基本思想是把原始的N 点序列依次分解成一系列短序列,充分利用旋转因子的周期性和对称性,分别求出这些短序列对应的DFT ,再进行适当的组合,得到原N 点序列的DFT ,最终达到减少运算次数,提高运算速度的目的。
按时间抽取的基2FFT 算法,先是将N 点输入序列x(n)在时域按奇偶次序分解成2个N/2点序列x1(n)和x2(n),再分别进行DFT 运算,求出与之对应的X1(k)和X2(k),然后利用图1所示的运算流程进行蝶形运算,得到原N 点序列的DFT 。
只要N 是2的整数次幂,这种分解就可一直进行下去,直到其DFT 就是本身的1点时域序列。
图1 DIT-FFT 蝶形运算流图二、DIT-FFT 算法的运算规律及编程思想1.原位计算对N=M 2点的FFT 共进行M 级运算,每级由N/2个蝶形运算组成。
在同一级中,每个蝶的输入数据只对本蝶有用,且输出节点与输入节点在同一水平线上,这就意味着每算完一个蝶后,所得数据可立即存入原输入数据所占用的数组元素(存储单元),经过M 级运算后,原来存放输入序列数据的N 个存储单元中可依次存放X(k)的N 个值,这种原位(址)计算的方法可节省大量内存。
2.旋转因子的变化规律N 点DIT ―FFT 运算流图中,每个蝶形都要乘以旋转因子pW N ,p 称为旋转因子的指数。
例如N =8 =32 时各级的旋转因子:第一级:L=1, 有1个旋转因子:pW N =J/4W N =J2L W J=0第二级:L=2,有2个旋转因子:p W N =J /2W N =J2L W J=0,1第三级:L=3,有4个旋转因子:p W N =J W N =J2L W J=0,1,2,3 对于N =M 2的一般情况,第L 级共有1-L 2个不同的旋转因子:pW N =J 2L W J=0,1,2,… ,1-L 2-1L2=M2×M-L 2= N ·M-L 2故: 按照上面两式可以确定第L 级运算的旋转因子3、同一级中,同一旋转因子对应蝶形数目第L 级FFT 运算中,同一旋转因子用在L -M 2个蝶形中; 4、同一级中,蝶形运算使用相同旋转因子之间相隔的“距离” 第L 级中,蝶距:D=L 2; 5、同一蝶形运算两输入数据的距离在输入倒序,输出原序的FFT 变换中,第L 级的每一个蝶形的2个输入数据相距:B=1-L 2。
6、码位颠倒输入序列x(n)经过M 级时域奇、偶抽选后,输出序列X(k)的顺序和输入序列的顺序关系为倒位关系。
将十进制顺序数用I 表示,与之对应的二进制是用IB 表示,十进制倒序数用J 表示,与之对应的二进制是用JB 表示。
十进制顺序数I 增加1,相当于IB 最低位加1且逢2向高位进1,即相当于JB 最高位加1且逢2向低位进1。
JB 的变化规律反映到J 的变化分为两种情况,若JB 的最高位是0(J<N/2),则直接由加1(J ←J+N/2)得到下一个倒序值,若JB 的最高位是1(J ≧N/2),则要先将最高位变0(J ←J-N/2),再在次高位加1(J ←J+N/4),但次高位加1时,同样要判断0、1值,如果是0(J<N/4),则直接加1(J ←J+N/4),否则要先将次高位变0(J ←J-N/4)再判断下一位,依次类推,直到完成最高位加1,逢2向右进位的运算。
I=J 时不需要交换,只对I<J 时的情况进行数据交换即可,数据倒序程序框图如如2。
7、蝶形运算的规律序列经过时域抽选后,存入数组中,如果蝶形运算的两个输入数据相距B 个点,应用原位计算,蝶形运算可表示成如下形式:8、 DIT-FFT 程序框图根据DIT-FFT 原理和过程,DIT-FFT 的完整程序框图如图2:(1)倒序:输入自然顺序序列x(n),根据倒序规律,进行倒序处理;(2)循环层1:确定运算的级数,L=1~M (N=M2);确定一蝶形两输入数据距离B=1-L 2XL -1(J) X L-1 (J+B)XL (J)= XL-1(J)+ WNp ⋅ X L-1 (J+B) X L (J) = X L-1(J)-W N p ⋅ X L-1 (J+B)p=J ×2M-L , J=0,1,2,… ,2L-1-1(3)循环层2:确定L 级的B=1-L 2个旋转因子;旋转因子指数p=J ×L -M 2,J=0~B-1; (4)循环层3:对于同一旋转因子,用于同一级L -M 2个蝶形运算中:k 的取值从J 到N-1,步长为L 2 (使用同一旋转因子的蝶形相距的距离) (5)完成一个蝶形运算。
开 始送入x (n ),MN =2M 倒 序L =1 , M J=0 , B - 1P =2M -L J k = J , N -1 , 2L pN p N W B k X k X B k X W B k X k X k X )()()()()()(+-⇐+++⇐输 出结 束B 2 L -1图2 数据倒序程序框图 图3 DIT-FFT 的完整程序框图三、程序源代码设计函数myDitFFT(xn)完成一个序列的DIT-FFT 运算:function y=myDitFFT(xn) M=nextpow2(length(xn)); N=2^M;disp('调用fft 函数运算的结果:'), fftxn=fft(xn,N); if length(xn)<Nxn=[xn,zeros(1,N-length(xn))]; endfor m=0:N/2-1;%旋转因子指数范围WN(m+1)=exp(-j*2*pi/N)^m;%计算旋转因子enddisp('输入到各存储单元的数据:'),disp(xn);%数据倒序操作J=0;%给倒序数赋初值for I=0:N-1;%按序交换数据和算倒序数if I<J;%条件判断及数据交换T=xn(I+1);xn(I+1)=xn(J+1);xn(J+1)=T;end%算下一个倒序数K=N/2;while J>=K;J=J-K;K=K/2;endJ=J+K;enddisp('倒序后各存储单元的数据:'),disp(xn);% 分级按序依次进行蝶形运算for L=1:M;%分级计算disp('运算级次:'),disp(L);B=2^(L-1);for R=0:B-1;%各级按序蝶算P=2^(M-L)*R;for K=R:2^L:N-2;%每序依次计算T=xn(K+1)+xn(K+B+1)*WN(P+1);xn(K+B+1)=xn(K+1)-xn(K+B+1)*WN(P+1);xn(K+1)=T;endenddisp('本级运算后各存储单元的数据:'),disp(xn);end在主函数中调用myDitFFT(xn)函数实现DIT-FFT并和直接DFT运算结果做对比:xn=[0,1,2,3,4,5,6,7];myDitFFT(xn);调用fft函数运算的结果:1 至 7 列28.0000 + 0.0000i -4.0000 + 9.6569i -4.0000 + 4.0000i -4.0000 + 1.6569i -4.0000 + 0.0000i -4.0000 - 1.6569i -4.0000 - 4.0000i8 列-4.0000 - 9.6569i调用myDitFFT(xn)函数运行的结果:输入到各存储单元的数据:0 1 2 3 4 5 6 7倒序后各存储单元的数据:0 4 2 6 1 5 3 7运算级次:1本级运算后各存储单元的数据:4 -4 8 -4 6 -4 10 -4运算级次:2本级运算后各存储单元的数据:1 至 7 列12.0000 + 0.0000i -4.0000 + 4.0000i -4.0000 + 0.0000i -4.0000 - 4.0000i 16.0000 + 0.0000i -4.0000 + 4.0000i -4.0000 + 0.0000i8 列-4.0000 - 4.0000i运算级次:3本级运算后各存储单元的数据:1 至 7 列28.0000 + 0.0000i -4.0000 + 9.6569i -4.0000 + 4.0000i -4.0000 + 1.6569i -4.0000 + 0.0000i -4.0000 - 1.6569i -4.0000 - 4.0000i8 列-4.0000 - 9.6569i经对比可知DIT-FFT与直接DFT的运行结果完全相同。
四、总结经过验证可发现DIT-FFT较直接DFT运算有着明显的优势,我们可以将这个函数运用在多个领域以简化运算,例如计算离散时间序列的卷积或计算IDFT时都可以应用到DIT-FFT算法,我感受到数字信号处理中科学思想的魅力。
由于对设计思路的缺乏,我在设计程序时,在网络上查找了很多有关DIT-FFT的资料,经过学习他人的解决思路最后才整理出DIT-FFT的程序,在有些地方我自己理解的还不是很透彻,比如在实现数据倒序的程序我认为比较困难;当然即使自己想不到能学习一下别人的思路也是很好的,这个程序的代码量并不大,我自身的能力还很低,要在以后的学习中不断进步才能完成更加复杂的任务。
这次课程设计让我对快速傅里叶变换有了更多的了解,也认识到了科学计算方法的重要性,我感到很充实。
参考文献——百度百科;按时间抽取的基2FFT算法分析及MATLAB实现[J].电子技术,2011(2)数字信号处理(第四版)西安电子科技大学出版社高希全丁玉美编。