‘壹’ FFT算法分几种
FFT算法分析FFT算法的基本原理是把长序列的DFT逐次分解为较短序列的DFT。按照抽取方式的不同可分为DIT-FFT(按时间抽取)和DIF-FFT(按频率抽取)算法。按照蝶形运算的构成不同可分为基2、基4、基8以及任意因子(2n,n为大于1的整数),基2、基4算法较为常用。 网上有帮助文档: http://www.5doc.com/doc/123035(右上角有点击下载)
‘贰’ 谁知道DFT和FFT的发展历史啊
DFT/FFT的发展历史
离散傅里叶变换(Discrete Fourier Transform,DFT)是数字信号处理最重要的基石之一,也是对信号进行分析和处理时最常用的工具之一。在200多年前法国数学家、物理学家傅里叶提出后来以他名字命名的傅里叶级数之后,用DFT这个工具来分析信号就已经为人们所知。历史上最伟大的数学家之一。
欧拉是第一个使用“函数”一词来描述包含各种参数的表达式的人,例如:y = f(x)。他是把微积分应用于物理学的先驱者之一。 给出了一个用实变量函数表示傅立叶级数系数的方程; 用三角级数来描述离散声音在弹性媒介中传播,发现某些函数可以通过余弦函数之和来表达。 但在很长时间内,这种分析方法并没有引起更多的重视,最主要的原因在于这种方法运算量比较大。直到1965年,Cooley和Tukey在《计算机科学 》发表着名的《机器计算傅立叶级数的一种算法》论文,FFT才开始大规模应用。
那个年代,有个肯尼迪总统科学咨询委员会。其中有项研究主题是,对苏联核测试进行检测,Tukey就是其中一员。美国/苏联核测试提案的批准,主要取决于不实地访问核测试设施而做出检测的方法的发展。其中一个想法是,分析离海岸的地震计情况,这种计算需要快速算法来计算DFT。其它应用是国家安全,如用声学探测远距离的核潜艇。所以在军事上,迫切需要一种快速的傅立叶变换算法,这也促进了FFT的正式提出。
FFT的这种方法充分利用了DFT运算中的对称性和周期性,从而将DFT运算量从N2减少到N*log2N。当N比较小时,FFT优势并不明显。但当N大于32开始,点数越大,FFT对运算量的改善越明显。比如当N为1024时,FFT的运算效率比DFT提高了100倍。在库利和图基提出的FFT算法中,其基本原理是先将一个N点时域序列的DFT分解为N个1点序列的DFT,然后将这样计算出来的N个1点序列DFT的结果进行组合,得到最初的N点时域序列的DFT值。实际上,这种基本的思想很早就由德国伟大的数学家高斯提出过,在某种情况下,天文学计算(也是现在FFT应用的领域之一)与等距观察的有限集中的行星轨道的内插值有关。由于当时计算都是靠手工,所以产生一种快速算法的迫切需要。 而且,更少的计算量同时也代表着错误的机会更少,正确性更高。高斯发现,一个富氏级数有宽度N=N1*N2,可以分成几个部分。计算N2子样本DFT的N1长度和N1子样本DFT的N2长度。只是由于当时尚欠东风——计算机还没发明。在20世纪60年代,伴随着计算机的发展和成熟,库利和图基的成果掀起了数字信号处理的革命,因而FFT发明者的桂冠才落在他们头上。
之后,桑德(G.Sand)-图基等快速算法相继出现,几经改进,很快形成了一套高效运算方法,这就是现在的快速傅立叶变换(FFT)。这种算法使DFT的运算效率提高1到2个数量级,为数字信号处理技术应用于各种信号的实时处理创造了良好的条件,大大推进了数学信号处理技术。1984年,法国的杜哈梅(P.Dohamel)和霍尔曼(H.Hollamann)提出的分裂基块快速算法,使运算效率进一步提高。
库利和图基的FFT算法的最基本运算为蝶形运算,每个蝶形运算包括两个输入点,因而也称为基-2算法。在这之后,又有一些新的算法,进一步提高了FFT的运算效率,比如基-4算法,分裂基算法等。这些新算法对FFT运算效率的提高一般在50%以内,远远不如FFT对DFT运算的提高幅度。从这个意义上说,FFT算法是里程碑式的。可以说,正是计算机技术的发展和FFT的出现,才使得数字信号处理迎来了一个崭新的时代。除了运算效率的大幅度提高外,FFT还大大降低了DFT运算带来的累计量化误差,这点常为人们所忽略。
分给我吧 哈哈
‘叁’ FFT的公式是什么和算法是怎样实现
二维FFT相当于对行和列分别进行一维FFT运算。具体的实现办法如下:
先对各行逐一进行一维FFT,然后再对变换后的新矩阵的各列逐一进行一维FFT。相应的伪代码如下所示:
for (int i=0; i<M; i++)
FFT_1D(ROW[i],N);
for (int j=0; j<N; j++)
FFT_1D(COL[j],M);
其中,ROW[i]表示矩阵的第i行。注意这只是一个简单的记法,并不能完全照抄。还需要通过一些语句来生成各行的数据。同理,COL[i]是对矩阵的第i列的一种简单表示方法。
所以,关键是一维FFT算法的实现。下面讨论一维FFT的算法原理。
【1D-FFT的算法实现】
设序列h(n)长度为N,将其按下标的奇偶性分成两组,即he和ho序列,它们的长度都是N/2。这样,可以将h(n)的FFT计算公式改写如下 :
(A)
由于
所以,(A)式可以改写成下面的形式:
按照FFT的定义,上面的式子实际上是:
其中,k的取值范围是 0~N-1。
我们注意到He(k)和Ho(k)是N/2点的DFT,其周期是N/2。因此,H(k)DFT的前N/2点和后N/2点都可以用He(k)和Ho(k)来表示
‘肆’ 什么是FFT
计算离散傅里叶变换的一种快速算法,简称FFT(Fast Fourier Transform)。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显着。
FFT 的出现,使信号分析从时域分析向频域分析成为可能,极大地推动了信号分析在各领域的实际应用。
http://ke..com/view/1006229.htm
‘伍’ fft可分解多少级
2的n-1次方级。
FFT算法的实质是把一长序列的DFT计算分割为较短序列的DFT计算,对于基2算法而言,是把序列每次一分为二,最后分割成两点DFT,也可以采用别的分割法,每次一分为三,四,五等,就得到了基3,基4,基5等算法,其中基4算法由于具备某些优点,应用价值较大。
快速傅里叶变换计算离散傅里叶变换的一种快速算法,简称FFT;快速傅里叶变换是1965年由J.W库利和T.W.图基提出的,采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显着。
‘陆’ FFT原理的FFT基本原理
FFT是一种DFT的高效算法,称为快速傅立叶变换(fast Fourier transform)。FFT算法可分为按时间抽取算法和按频率抽取算法,先简要介绍FFT的基本原理。从DFT运算开始,说明FFT的基本原理。
DFT的运算为:
式中
由这种方法计算DFT对于X(K)的每个K值,需要进行4N次实数相乘和(4N-2)次相加,对于N个k值,共需N*N乘和N(4N-2)次实数相加。改进DFT算法,减小它的运算量,利用DFT中
的周期性和对称性,使整个DFT的计算变成一系列迭代运算,可大幅度提高运算过程和运算量,这就是FFT的基本思想。
FFT基本上可分为两类,时间抽取法和频率抽取法,而一般的时间抽取法和频率抽取法只能处理长度N=2^M的情况,另外还有组合数基四FFT来处理一般长度的FFT 设N点序列x(n),,将x(n)按奇偶分组,公式如下图
改写为:
一个N点DFT分解为两个 N/2点的DFT,继续分解,迭代下去,其运算量约为
其算法有如下规律
两个4点组成的8点DFT
四个2点组成的8点DFT
按时间抽取的8点DFT
原位计算
当数据输入到存储器中以后,每一级运算的结果仍然储存在同一组存储器中,直到最后输出,中间无需其它存储器
序数重排
对按时间抽取FFT的原位运算结构,当运算完毕时,这种结构存储单元A(1)、A(2),…,A(8)中正好顺序存放着X(0),X(1),X(2),…,X(7),因此可直接按顺序输出,但这种原位运算的输入x(n)却不能按这种自然顺序存入存储单元中,而是按X(0),X(4),X(2),X(6),…,X(7)的顺序存入存储单元,这种顺序看起来相当杂乱,然而它也是有规律的。当用二进制表示这个顺序时,它正好是“码位倒置”的顺序。
蝶形类型随迭代次数成倍增加
每次迭代的蝶形类型比上一次蝶代增加一倍,数据点间隔也增大一倍 频率抽取2FFT算法是按频率进行抽取的算法。
设N=2^M,将x(n)按前后两部分进行分解,
按K的奇偶分为两组,即
得到两个N/2 点的DFT运算。如此分解,并迭代,总的计算量和时间抽取(DIT)基2FFT算法相同。
算法规律如下:
蝶形结构和时间抽取不一样但是蝶形个数一样,同样具有原位计算规律,其迭代次数成倍减小 时,可采取补零使其成为
,或者先分解为两个p,q的序列,其中p*q=N,然后进行计算。 前面介绍,采用FFT算法可以很快算出全部N点DFT值,即z变换X(z)在z平面单位圆上的全部等间隔取样值。实际中也许①不需要计算整个单位圆上z变换的取样,如对于窄带信号,只需要对信号所在的一段频带进行分析,这时希望频谱的采样集中在这一频带内,以获得较高的分辨率,而频带以外的部分可不考虑,②或者对其它围线上的z变换取样感兴趣,例如语音信号处理中,需要知道z变换的极点所在频率,如极点位置离单位圆较远,则其单位圆上的频谱就很平滑,这时很难从中识别出极点所在的频率,如果采样不是沿单位圆而是沿一条接近这些极点的弧线进行,则在极点所在频率上的频谱将出现明显的尖峰,由此可较准确地测定极点频率。③或者要求能有效地计算当N是素数时序列的DFT,因此提高DFT计算的灵活性非常有意义。
螺旋线采样是一种适合于这种需要的变换,且可以采用FFT来快速计算,这种变换也称作Chirp-z变换。
‘柒’ FFT的最优算法是什么以及其代码(C语言),谢谢!
应该是库利-图基算法和桑德-图基算法吧。这两种算法的时间复杂度是一样的,需要(N/2)log2N次的复数乘法和Nlog2N的复数加法。
当然你要是用基-4的FFT会更快,需要3/8Nlog2N次的复数乘法和Nlog2N次的加法。但这样做的一个很麻烦的事是在做快速傅立叶变换时需要将原数据补足到2或4的整数次方。因此如果数据量合适的话基-4要快,如果数据不合适还是用基-2好。至于C语言代码暂时没有。还有为什么要编C啊?用Matlab不是更好吗?连循环都不用写,甚至还有已经写好的函数fft(),直接看这个函数算法就好了
‘捌’ 试画出信号按时间抽取的基-2FFT算法信号流图,并写出对应过程奇偶分流的公式。
基2算法,序列的长度是为2的幂,序列的DFT为。序列可以由奇序列和偶序列组成,DFT分别为和。 从最后一级往前分解对应的蝶形结构,这些蝶形结构最左边的输入都是序列的DFT值,而分解直到最左边的蝶形结构是两点序列的DFT,此时最左边的值是序列x[k]。
f1=50; %10Hz
f2=100; %100Hz
%抽样频率
Fs=1000; %100Hz
%抽样点数N
L=10;
N=2^L;
%抽样脉冲序列
n = 0:N-1;
t = n./Fs;
% f2 一个周期的采样数
M = floor(Fs/f2);
%被采样信号
x = cos(2*pi*f1.*t)+sin(2*pi*f2.*t);
%采样序列
subplot(311);
stem(t(1:2*M),x(1:2*M));
hold off;
%傅里叶变换
%根据有限长序列的离散傅里叶变换公式计算DFT
n = 0:N-1;
k = 0:N-1;
F = x * exp(-j*2*pi/N).^(n'*k);
subplot(312);
plot(n,abs(F));
subplot(313);
plot(k,angle(F));
(8)图基fft算法扩展阅读:
库利-图基快速傅里叶变换算法是将序列长为N的DFT分区为两个长为N/2的子序列的DFT,因此这一应用只适用于序列长度为2的幂的DFT计算,即基2-FFT。实际上,如同高斯和库利与图基都指出的那样,库利-图基算法也可以用于序列长度N为任意因数分解形式的DFT,即混合基FFT,而且还可以应用于其他诸如分裂基FFT等变种。
尽管库利-图基算法的基本思路是采用递归的方法进行计算,大多数传统的算法实现都将显示的递归算法改写为非递归的形式。另外,因为库利-图基算法是将DFT分解为较小长度的多个DFT,因此它可以同任一种其他的DFT算法联合使用。
‘玖’ FFT的算法
FFT是一种DFT的高效算法,称为快速傅立叶变换(fast Fourier transform),它根据离散傅氏变换的奇、偶、虚、实等特性,对离散傅立叶变换的算法进行改进获得的。FFT算法可分为按时间抽取算法和按频率抽取算法,先简要介绍FFT的基本原理。从DFT运算开始,说明FFT的基本原理。
DFT的运算为:
式中
由这种方法计算DFT对于 的每个K值,需要进行4N次实数相乘和(4N-2)次相加,对于N个k值,共需4N*4N次实数相乘和(4N-2)(4N-2)次实数相加。改进DFT算法,减小它的运算量,利用DFT中 的周期性和对称性,使整个DFT的计算变成一系列迭代运算,可大幅度提高运算过程和运算量,这就是FFT的基本思想。
FFT对傅氏变换的理论并没有新的发现,但是对于在计算机系统或者说数字系统中应用离散傅立叶变换,可以说是进了一大步。
设x(n)为N项的复数序列,由DFT变换,任一X(m)的计算都需要N次复数乘法和N-1次复数加法,而一次复数乘法等于四次实数乘法和两次实数加法,一次复数加法等于两次实数加法,即使把一次复数乘法和一次复数加法定义成一次“运算”(四次实数乘法和四次实数加法),那么求出N项复数序列的X(m),即N点DFT变换大约就需要N^2次运算。当N=1024点甚至更多的时候,需要N2=1048576次运算,在FFT中,利用WN的周期性和对称性,把一个N项序列(设N=2k,k为正整数),分为两个N/2项的子序列,每个N/2点DFT变换需要(N/2)2次运算,再用N次运算把两个N/2点的DFT变换组合成一个N点的DFT变换。这样变换以后,总的运算次数就变成N+2*(N/2)^2=N+(N^2)/2。继续上面的例子,N=1024时,总的运算次数就变成了525312次,节省了大约50%的运算量。而如果我们将这种“一分为二”的思想不断进行下去,直到分成两两一组的DFT运算单元,那么N点的DFT变换就只需要Nlog2N次的运算,N在1024点时,运算量仅有10240次,是先前的直接算法的1%,点数越多,运算量的节约就越大,这就是FFT的优越性。
‘拾’ “DFT、IDFT、FFT、IFFT”各是什么
DFT,即可测试性设计(Design for Testability, DFT)是一种集成电路设计技术,它将一些特殊结构在设计阶段植入电路,以便设计完成后进行测试。电路测试有时并不容易,这是因为电路的许多内部节点信号在外部难以控制和观测。通过添加可测试性设计结构,例如扫描链等,内部信号可以暴露给电路外部。总之,在设计阶段添加这些结构虽然增加了电路的复杂程度,看似增加了成本,但是往往能够在测试阶段节约更多的时间和金钱。
IDFT就是Inverse Discrete Fourier Transform 离散傅里叶逆变换。FFT就是Fast Fourier Transform 快速傅里叶变换。
两者的应用都是将时域中难以处理的信号转换成易于处理的频域信号,分析完成后进行傅里叶反变换即得到原始的时域信号。
两者的异同是:我们知道在数学上用级数来无限逼进某个函数,以便简化计算过程而又不致使误差过大,这样工程上才能应用,否则一些数学模型是无法实现快速求解的。
IDFT:对于有限长的序列我们可以使用离散傅立叶变换,IDFT是对序列傅立叶变换的等距采样。
FFT:并不是与IDFT不相同的另一种变换(即原理是一样的),而是为了减少IDFT运算次数的一种快速算法。它是对IDFT变换式进行一次次的分解,使其成为若干小点数IDFT的组合,从而减小运算量。常用的FFT是以2为基数,它的运算效率高,程序比较简单,使用也十分地方便。
IFFT——Inverse Fast Fourier Transform 快速傅里叶逆变换。
快速傅里叶变换 (fast Fourier transform), 即利用计算机计算离散傅里叶变换(DFT)的高效、快速计算方法的统称,简称FFT。快速傅里叶变换是1965年由J.W.库利和T.W.图基提出的。采用这种算法能使计算机计算离散傅里叶变换所需要的乘法次数大为减少,特别是被变换的抽样点数N越多,FFT算法计算量的节省就越显着。