回忆DFT定义:
X(k)=n=0∑N−1x(n)WNnk
则计算每个X(k),需要N次复数乘法、N−1次复数加法,总复杂度为O(N2)
整体复杂度较高,可以采用分治的做法进行优化
快速Fourier变换 (FFT)
基础性质
WN本质是第−1个N次单位根:
WN=e−jN2π
因此,WN有一些显然的性质:
WNnk+N=WNnk
WNnk+N/2=−WNnk
原理
设N是偶数,采用分治策略,试图将N阶DFT转换为N/2阶DFT
于是,将奇数项的计算和偶数项的计算分开:
X(k)=r=0∑N/2−1x(2r)WN(2r)k+r=0∑N/2−1x(2r+1)WN(2r+1)k
=r=0∑N/2−1x(2r)WN/2rk+WNkr=0∑N/2−1x(2r+1)WN/2rk
令偶数项序列为g(r)=x(2r),奇数项子序列为h(r)=x(2r+1),则
X(k)=G(k)+WNkH(k)
注意,其中G(k)和H(k)的周期为N/2,对k≥N/2的项需要进行周期延拓
于是,我们把N阶DFT分为了两个N/2阶DFT计算,这一过程是可以递归使用的,之后对其加权求和,加权求和步骤的复杂度为O(N)
则总复杂度的递推式为
T(N)=2T(2N)+O(N)
根据主定理,有
T(N)=O(NlogN)
矩阵解读
考虑一个4阶的Fourier矩阵:
F4=11111−j−1j1−11−11j−1−j
交换中间两列,使偶数列和奇数列分离:
F4=11111−11−11−j−1j1j−1−j1111
=F2F2[1−j]F2[−1j]F21111
=11111−1−jj[F2F2]1111
=[I2I2D2−D2][F2F2]P4
于是,我们把F4拆成了两个F2和一些简单矩阵
我们推广到FN,N为偶数的情形,则有:
FN=[IN/2IN/2DN/2−DN/2][FN/2FN/2]PN
下面我们将上面的矩阵式解读为算法
PN是一个置换矩阵,它将所有偶数元素排列在前方,所有奇数元素排列在后方,即
PNxN=[gN/2hN/2]
这一步实际上不产生任何运算量(我们并不需要真的在内存上交换奇数项和偶数项的位置)
之后乘以右数第二个矩阵:
[FN/2FN/2]PNxN=[GN/2HN/2]
这一步为分别对g(n)和h(n)进行DFT
再乘以最左侧的矩阵,则
XN=[IN/2IN/2DN/2−DN/2][GN/2HN/2]=[GN/2+DN/2HN/2GN/2−DN/2HN/2]
其中
DN/2=WN0WN1WN2⋱WNN/2−1
由于
WNk+N/2=WNk
上面的矩阵式实际上和之前的非矩阵式等价