一维离散傅里叶变换的公式为:
如果直接基于该定义进行编程实现,则算法时间复杂度为O(N2)。具体的编程实现我们已经在《C++实现一维离散傅里叶变换》中介绍过了。
当一维信号长度达到几十万个信号时,当前主流4G主频CPU完成一次傅里叶变换需要约几十到几百秒的时间,这样的效率显然是让人无法接受的。
为了解决傅里叶变换的计算效率问题,行业专家们提出了蝶形算法,极大地提升了傅里叶变换的运算效率。
在蝶形算法中,较为流行的是基于时间抽取的基-2快速傅里叶变换算法(以下简称为基-2FFT算法)。
基-2FFT算法要求原始信号长度L=2N,N为正整数。也就是说,信号长度必须为2的整数次方,如4、8、16、32、64、512、1024。这是由蝶形算法的二进分解性质决定的。
设原始信号序列为f(x),长度为L(L=2 N,为2的整数次方),x=0,1,2,3,…,L-1,则傅里叶变换可表达为:
将f(x)按x的奇偶性分成两组:
则式1-1变为:
其中,F1(u)和F2(u)分别为f1(x)和f2(x)的(L/2)点的一维离散傅里叶变换。
例如,对于8个点的信号序列,可先分解两个长度为4的离散傅里叶变换,再将两个长度为4的离散傅里叶变换,各自分解为两个长度为2的离散傅里叶变换。故只需要计算4个长度为2的离散傅里叶变换,就可以递归算出原序列共8个点的dft。更为广泛地,对于长度为L=2N个点的信号序列,只需要计算2N-1个长度为2的离散傅里叶变换,就可以递归算出原序列共2N个点的dft。
现在我们研究信号输入端的输入顺序和变换结果输出端的输出顺序的关系。
8点序列的蝶形运算流程图如下:
(图片来源自百度文库《05-第五章快速傅里叶变换(蝶形运算)》)
观察上图(最左边可视为f(x),最右边视为F(x)),右边输出端的输出顺序为自然顺序,而最左边的输入端则并不是按自然顺序。这是因为序列f(x)在蝶形运算过程中被反复进行奇偶分解,对于长度为L=2N的序列,共分解N-1次,每一次分解,都是按二进制码0和1进行奇偶排列。经观察,发现这是一种二进制码位的倒序重排,例如,对于8点的序列,其码位倒序图为:
(图片来源自百度文库《05-第五章快速傅里叶变换(蝶形运算)》)
至此,对于以2为基的快速傅里叶变换算法,我们可以构思出一条清