FFT算法介绍及OAI中FFT的实现
OAI中FFT的实现
FFT介绍
FFT是DFT(离散傅立叶变换)的一种快速算法。
DFT是一种常用的信号处理方式,可以将时域信号转换到频域。它的原理在《信号与系统》课程中有详细阐述。
但是因为DFT的运算复杂度太高,在实际应用中都是采用FFT的快速算法。
快速傅立叶变换算法(FFT)最开始是由库利(T.W.Cooley)和图基(J.W.Tukey)于1965年提出。其基本思想就是分治。从时域或者频域序列中抽取出不同的子序列从而降低计算复杂度。
根据抽取对象的不同又细分为不同的算法:基于时域的数据做抽取的称为DIT(Decimation in Time), 基于频域的抽取就称为DIF(Decimation in Frequency)。
另外一个区分不同FFT算法的标准称为基(radix)。嗯,基无处不在。
基决定FFT算法的最小组成单位,这个最小组成单位一般是用被称为蝶形图的方式来表示的。
图1
图中,(a)表示一个基-2的基本蝶形图,(b)的左半部分表示一个基-4的基本蝶形图。
可以看到,基数决定来基本蝶形图的输入数据数。除了2和4之外,当然也有可能是其他的基数,或者混合使用几种不同的基数。
库利和图基当时提出的就是时域的基-2算法,因此这个算法又被称为库利-图基算法。
下面我们举几个FFT的例子,来形象的理解一下这个伟大的算法。
DIT radix-2 FFT(时域抽取基-2 FFT)
先给出离散傅立叶变换的一般形式:
(1) X [ k ] = ∑ n = 0 N − 1 x [ n ] W N k n , 0 ≤ k ≤ N − 1 X[k]=\sum_{n=0}^{N-1} x[n]W_N^{kn},\qquad \scriptsize 0 \leq k \leq N-1 \normalsize \tag{1} X[k]=n=0∑N−1x[n]WNkn,0≤k≤N−1(1)
其中, N N N是时域离散序列 x [ n ] x[n] x[n]的长度,并且是2的指数倍。 W N = e − j 2 π / N W_N=e^{-j2\pi /N} WN=e−j2π/N称为旋转因子,有如下性质:
1)周期性
W N ( k + N ) n = W N k n = W N k ( n + N ) W_N^{(k+N)n}=W_N^{kn}=W_N^{k(n+N)} WN(k+N)n=WNkn=WNk(n+N)
2)对称性
W N n k + N / 2 = − W N n k W_N^{nk+N/2}=-W_N^{nk} WNnk+N/2=−WNnk
3)可约性
W m N n m k = W N n k W_{mN}^{nmk}=W_N^{nk} WmNnmk=WNnk
所谓radix-2 DIT就是把时域的序列按照奇偶抽取为2个子序列,这2个子序列的长度都是原序列的一半长度,使得计算复杂度减小到原序列的一半。把这个分治过程递归应用到这两个子序列,直到最后剩下2点的DFT。(其实2点DFT还可以继续递归这个过程到1点)
用公式表示,就是把时域序列按照奇偶划分为两个子序列,如下:
(2) X [ k ] = ∑ n = 0 N − 1 x [ n ] W N k n , k = 0 , 1 , . . . , N − 1 = ∑ n   e v e n x [ n ] W N k n + ∑ n   o d d x [ n ] W N k n = ∑ m = 0 N / 2 − 1 x [ 2 m ] W N 2 m k + ∑ m = 0 N / 2 − 1 x [ 2 m + 1 ] W N k ( 2 m + 1 ) X[k] =\sum_{n=0}^{N-1}x[n]W_N^{kn},\qquad \scriptsize k=0,1,...,N-1 \normalsize \\ =\sum_{n \, even}x[n]W_N^{kn} + \sum_{n \, odd}x[n]W_N^{kn} \\ =\sum_{m=0}^{N/2-1}x[2m]W_N^{2mk}+\sum_{m=0}^{N/2-1}x[2m+1]W_N^{k(2m+1)} \tag{2} X[k]=n=0∑N−1x[n]WNkn,k=0,1,...,N−1=neven∑x[n]WNkn+nodd∑x[n]WNkn=m=0∑N/2−1x[2m]WN2mk+m=0∑N/2−1x[2m+1]WNk(2m+1)(2)
(公式没有对齐,LaTex的对齐语法老是提示错误。)
上式中等号右边第一部分是偶数部分,第二部分是奇数部分,两者合起来正好是原时域离散数列。
如果我们令:
f 1 [ m ] = x [ 2 m ] f 2 [ m ] = x [ 2 m + 1 ] f_1[m]=x[2m] \\ f_2[m]=x[2m+1] f1[m]=x[2m]f2[m]=x[2m+1]
再令:
F 1 [ k ] = D F T ( f 1 [ m ] ) F 2 [ k ] = D F T ( f 2 [ m ] ) F_1[k]=DFT(f_1[m]) \\ F_2[k]=DFT(f_2[m]) F1[k]=DFT(f1[m])F2[k]=DFT(f2[m])
那么利用前面提到的旋转因子的性质, ( 2 ) (2) (2)式就可以表示为:
X [ k ] = ∑ m = 0 N / 2 − 1 f 1 [ m ] W N / 2 k m + W N k ∑ m = 0 N / 2 − 1 f 2 [ m ] W N / 2 k m = F 1 [ k ] + W N k F 2 [ k ] , k = 0 , 1 , . . . , N − 1 X[k]=\sum_{m=0}^{N/2-1}f_1[m]W_{N/2}^{km}+W_N^k\sum_{m=0}^{N/2-1}f_2[m]W_{N/2}^{km} \\ =F_1[k]+W_N^kF_2[k], \qquad \scriptsize k=0,1,...,N-1 X[k]=m=0∑N/2−1f