1、1快速傅立叶变换(FFT)个人日记 2010-04-16 12:24:48 阅读 163 评论 0 字号:大中小 订阅 近十多年来数字信号处理技术同数字计算机、大规模集成电路等先进技术一样,有了突飞猛进的发展,日新月异,已经形成了一门具有强大生命力的技术科学。由于它本身具有一系列的优点,所以能有效地促进各工程技术领域的技术改造和学科发展,应用领域也更加广泛、深入,越来越受到人们的重视。在数字信号处理中,离散傅里叶变换(Discrete Fourier Transform,DFT)是常用的变换方法,它在各种数字信号处理系统中扮演着重要的角色。傅里叶变换已有一百多年的历史了,我们知道频域分析常常比
2、时域分析更优越,不仅简单,且易于分析复杂信号。但用较精确的数字方法,即 DFT 进行谱分析,在 FFT 出现以前是不切实际的。这是因为 DFT 计算量太大。直到 1965 年出现了 DFT运算的一种快速方法以后,情况才发生了根本的变化。快速傅里叶变换Fast Fourier Transfonn,FFT并不是与离散傅里叶变换不同的另一种变换,而是为了减少 DFT 计算次数的一种快速有效的算法。当时 Garwin 在自己的研究中极需要一个计算傅立叶变换的快速方法,而 L.W.Tukey 正在写有关傅里叶变换的文章,Tukey 概括地对Garwin 介绍了一种方法,它实质上就是后来著名的 Coole
3、y-Tukey 算法。在 Garwin 的迫切要求下,1963 年,IBM 公司的 Cooley 根据 Tukey 的想法编写了第一个 FFT 算法程序。在 FFT 算法中,Tukey 主要利用了旋转因子的周期性和对称性。这两个性质使 DFT运算中的某些项可以合并,使 DFT 运算尽量分解为更少点数的 DFT 运算。因为 DFT 的运算量与 Pow(N,2)成比例,所以如果将一个大点数的 DFT 分解为若干个小点数的 DFT 的组合,将有效地减少运算量。Cooley 在计算机上实现该算法时,为节省存储空间和减少寻址时间,采用了 3 维标号映射方法和在算法内部的循环结构,这些结构和技巧对后来的
4、FFT 算法研究及实现同样产生了很大影响。1965 年,Cooley 和 Tukey 在计算数学上发表了著名的论文,并立即引起了广泛注意。FFT 算法将运算量从 O (N2)减少为2O( N logN),运算时间减少 1-2 个数量级,从理论上解决了数字信号处理运算量大的问题,是数字信号处理发展史上的块里程碑。以计算 l024 点的序列为例,FFT 将计算时间缩短为原来的 1/100,从而使数字信号处理从一个计算数学的分支变为一门应用科学,逐步走向实用技术.在 Cooley-Tukey 算法提出之后,Sande 提出了按照频率抽取的 FFT 算法,它可以作为按照时间抽取的 Cooley-Tuk
5、ey 算法的对偶形式。Bergland 提出了采用高基数结构的算法,如基-4 或基-8 算法能够达到更高的计算效率。增大基数虽然可以减少计算量,但同时每个计算单元的结构也更复杂。基 4 算法比基 2 算法所需的乘法次数减少了约 1/4。当采用高于 4 的基数 r 时,虽然总的乘法次数更少,但比基 4 算法中所需的复乘次数减少得并不显著,并且 r 点的 DFT 中将包含乘法运算,因此实际应用中多采用基 4 算法。Bergland 对任意因子的 FFT 算法也作了研究,提出了统一的 FFT 方法,即任意因子的 FFT 运算都可以由 r(r 是基数)点的 DFT 运算和与旋转因子相乘的运算来实现,C
6、ooley-Tukey 算法和 Sande-Tukey 算法都可以看作统一的 FFT 算法的特例,即基数 r 都相同。对于输入数据是实数情况,可以将 N 点的 DFT 运算转换为 N/2 点的 DFT 运算,或者同时计算两个实序列的 DFT,都可以采用 FFT算法。从七十年代中期开始,基于素因子分解的 FFT 算法重新得到了重视。事实上,在 Cooley-Tukey 算法提出之前,Good 就提出用点数互素的短点数 DFT 运算组合来实现长点数 DFT 运算,并且这种实现方式不会引入附加的乘旋转因子的运算。在素因子算法中利用了数论中的中国余数定理,将一维 DFT 运算映射为标准的多维 DFT
7、运算,而各素因子的 DFT 运算可以通过循环卷积算法完成。在素因子算法中,由于避免了乘旋转因子的运算,因此比 Cooley-Tukey 算法的乘法运算次数要少得多,而加法次数与之相当。基于素因子分解的另一种快速算法是由 IBM 公司的 Winograd 博士提出的,可以称为 WFTA 算法。WFTA 算法有两个主要思想:一是用Rader 提出的方法将小 N 点 DFT 转换为循环卷积,利用多项式理论使卷积计算具有尽可能少的乘法次数;二是将小 N 点 DFT 运算进行嵌套来完成大 N 点的 DFT 运算。WFTA 算法比素因子算法的乘法次数更少,而加法次数差别不大。但 WFTA 算法也有一些突出
8、的问题,如算法不能采用原位运算,需要占用较大的存储空间,更重要的是,随着变换点数 N 的不同,为使运算所需的加法次数最少,要求采用不同的运算次序,这导致运算过程的规则性较差,且控制过程复杂。在素因子算法和WFTA 算法出现的初期,人们都寄以厚望。但后来发现它们在实际应用中并不理想,尽管在理论上仍是有意义的进展。因此 FFT 的研究重点重又回到了带有与旋转因子相乘运算的共因子算法上,主要的研究成果包括 Rader 和 Brenner 提出的余割因子算法,王中德提出的对称分解法,Matens 提出的割园分解法,Vetlerli 和 Nussbaumer 提出的 DFT DCT 算法等,其中最具代表
9、性的是法国的Duhamel 和 Hollman 提出的分裂基算法。分裂基算法的特点是将基-2 分解与基-4 分解揉和在一起,对序列的不同部分分别实施基-2算法和基-4 算法。分裂基算法的运算结构与 Cooley-Tukey 算法相似,并且对于长度为 N=2M 的变换,这一算法已达到了 DFT 运算的最小运算量,所需要的乘法和加法次数为。乘法:a=N(M 3)+4加法:A=3N(M1)+4对于具体实现而言,算法的运算量只是一个方面,而算法的复杂性、规则性、模块性往往是更重要的。Cooley-Tukey 算法运算过程2的每一级都是由 r(r 是基数)点的 DFT 和与旋转因子的相乘构成,算法规则,
10、且具有良好的模块性,并且可以实现原位计算,对输入数据以及旋转因子的抽取具有规律性。这一算法相对简单、规则,且所有的运算单元均相同,具有良好的模块性,易于实现。WFTA算法的地址产生可以根据其计算公式或嵌套形式的算法流图来实现,该算法不能采用原位运算,需要占用较大的存储空间。为使运算所需的加法次数最少,随着变换点数 N 的不同,要求采用不同的运算次序,这导致运算过程的规则性较差,控制过程复杂。同时各“小 N”,也各不相同,导致运算单元的模块性不好。对于 PFA 算法,由于没有与旋转因子相乘的运算,因此避免了对旋转因子的求取,但由于指标映射造成的地址表达式中具有乘、加及求模运算,而这些运算又不易采
11、用简单的方法实现,因此 PFA 算法的控制单元要比 Cooley-Tukey 算法的复杂。另一方面,由于 PFA 算法中短点数 DFT 的变换长度各不相同,要求每一个 DFT 都采用不同的运算单元。虽然不同长度的短点数 DFT 运算单元可以采用统一的通用结构,但这不仅降低硬件的效率,同时影响运算单元的速度。可见 PFA 算法同样存在着模块性不好的问题。对于分裂基算法,由于不同地址中的数据分别输入到 2 点、4 点 DFT 运算模块以及与旋转因子相乘的单元进行运算,模块性同样较差,对于程序控制来说比较困难。综上所述,各种 DFT 的快速算法,都利用了 nkNW的周期性和对称性,通过将一个大点数
12、N 的 DFT 分解为若干小点数的 DFT 的组合,来减少运算量。对于变换点数 N 为 2 的整数次幕的情况,分裂基算法的乘法次数比基-2、基-4 算法更少。当 N 可以分解为若千个互素因子的乘积时,可以采用素因子算法,当素因子属于 2,3,4,5,7,8,9,16 等“小 N”时,也可以采用 Winograd“小 N”算法。二者都是通过指标映射,将一维 DFT 转化为多维DFT,同时避免了与旋转因子相乘的运算,因此都有更少的运算次数。虽然 Cooley-Tukey 算法的运算次数要多于其它几种算法,但由于其算法规则,各运算单元相同,可实现原位计算,具有良好的模块性,因此更容易实现。(原创)快
13、速傅里叶变换(FFT)(图)信息科学札记 2009-08-10 22:42:01 阅读 3822 评论 19 字号:大中小 订阅 上一回说到,为了节省电脑的计算时间,实现数字信号的实时处理,科学界千方百计减少离散傅里叶变换(DFT)的计算量。1965 年,库利(T.W.Cooley)和图基(J.W.Tukey)发表一个复数傅立叶级数之机械计算算法 论文,首次提出了 DFT 运算的一种快速算法。此后科学界创造出了各种各样的 DFT 快速算法,逐渐发展完善形成了一整套行之有效的算法设计思想和方法。这就是快速傅立叶变换(Fast Fouier Transform),简称 FFT。可见所谓的快速傅里叶
14、变换(FFT),并不是一种新的傅立叶分析理论,而是减少 DFT 计算量的算法设计思想和 DFT 各种快速算法的统称。上一回我们知道了:DFT 的计算量与点数 N 的平方成正比。DFT 的变换因子(也叫旋转因子):(1)具有周期性和对称性。也就是说:1、以 N 为周期,即:(2)2、复共轭对称性(关于实轴对称),即:(3)3、中心对称性(关于原点对称),即:3(4)FFT 算法设计的基本思想,就是充分利用 DFT 的周期性和对称性,减少重复的计算量;并把 N 点长序列分成几个短序列,减少每个序列长度,可大大减少计算量。实践中使用最多的 FFT 是“基 2”算法。所谓“基 2”,就是令 DFT 的
15、点数 N 满足(5)FFT 基 2 算法分为时域抽取法(Decimation In Time)和频域抽取法(Decimation In Frequency)两大类。本文重点介绍其中的时域抽取法快速傅里叶变换(DIT FFT ),算法设计思想要点如下:1、把长度为 N 的时域序列 x(n)按 n 的奇偶分为两组,变成两个序列,长度均为 N/2。即(6)其中一个 N/2 点的 DFT 为(7)另一个 N/2 点的 DFT 为(8)2、不难推出原序列 x(n)的 N/2 点 DFT 为(9)注意:上式仅是 X(k)的前一半即 N/2 点运算,整个 N 点 DFT 结果还要加上后一半计算。如果老老实实
16、计算后一半 N/2 点DFT,则并没有减少任何计算量。但考虑可利用 DFT 及其变换因子的周期性和对称性,并利用前一半计算结果,后一半计算可表示为4(10)这种“一分为二”的 DFT 算法叫做蝶形运算。可以看出其计算量为(11)和(12)与普通的 DFT 相比,计算量减少了一半!3、同理,如果把式(6 )表示的时间序列“ 二分为四”,长度均为 N/4,同时把式(9)、(10 )中的 N/2 点 DFT 分解为 N/4 点的 DFT,反复使用蝶形运算的方法,即(13)后一半 DFT 为(14)而(15)后一半 DFT 为(16)计算量可在式(11)和(12)的基础上再减少一半!4、依此类推,直到
17、把长度为 N 的序列细分成 N/2 个 2 点序列为止,循环使用蝶形运算的方法,即把 N 点 DFT 分解成 N/2 个2 点 DFT 运算。这样,计算量大大减少。由式(5)知5(17)则复数乘法总次数从原来的 N2 减少为:(18)复数加法总次数从原来的约 N2 减少为:(19)假设 N=1024,复数乘法从原来直接 DFT 计算的 104 万次,减少为 5120 次,计算速度提高约 200 倍!综上所述,快速傅里叶变换(FFT)大大降低了数字信号处理中的运算量,它的价值在于节省了 CPU 的处理时间,使得更多更复杂的数字信号得以快速的处理,为实现信息的实时处理开辟了广阔的发展前景。因此,FFT 是数字信号处理技术发展史上的一个重要里程碑。作为其快速算法设计思想精髓的典型代表,基 2 算法的时域抽取法快速傅里叶变换(DIT FFT )中的蝶形运算式(9)、(10)和( 13)、( 14)、(15)、(16)等公式,被英国科学期刊物理世界2004 年 10 月号公布为读者选出的“ 科学界历来最伟大的公式”之一,并且名列第九。同期推选出的“科学界历来最伟大的公式”还有许多,有兴趣的朋友们请查阅周法哲的博文科学的皇后栏目。