回忆DFT定义:

X(k)=n=0N1x(n)WNnkX(k)=\sum\limits_{n=0}^{N-1}x(n)W_N^{nk}

则计算每个X(k)X(k),需要NN次复数乘法、N1N-1次复数加法,总复杂度为O(N2)\mathcal{O}(N^2)

整体复杂度较高,可以采用分治的做法进行优化

快速Fourier变换 (FFT)

基础性质

WNW_N本质是第1-1NN次单位根:

WN=ej2πNW_N=e^{-j\frac{2\pi}{N}}

因此,WNW_N有一些显然的性质:

WNnk+N=WNnkW_N^{nk+N}=W_N^{nk}

WNnk+N/2=WNnkW_N^{nk+N/2}=-W_N^{nk}

原理

NN是偶数,采用分治策略,试图将NN阶DFT转换为N/2N/2阶DFT

于是,将奇数项的计算和偶数项的计算分开:

X(k)=r=0N/21x(2r)WN(2r)k+r=0N/21x(2r+1)WN(2r+1)kX(k)=\sum\limits_{r=0}^{N/2-1}x(2r)W_N^{(2r)k}+\sum\limits_{r=0}^{N/2-1}x(2r+1)W_N^{(2r+1)k}

=r=0N/21x(2r)WN/2rk+WNkr=0N/21x(2r+1)WN/2rk=\sum\limits_{r=0}^{N/2-1}x(2r)W_{N/2}^{rk}+W_N^k\sum\limits_{r=0}^{N/2-1}x(2r+1)W_{N/2}^{rk}

令偶数项序列为g(r)=x(2r)g(r)=x(2r),奇数项子序列为h(r)=x(2r+1)h(r)=x(2r+1),则

X(k)=G(k)+WNkH(k)X(k)=G(k)+W_N^kH(k)

注意,其中G(k)G(k)H(k)H(k)的周期为N/2N/2,对kN/2k\geq N/2的项需要进行周期延拓

于是,我们把NN阶DFT分为了两个N/2N/2阶DFT计算,这一过程是可以递归使用的,之后对其加权求和,加权求和步骤的复杂度为O(N)\mathcal{O}(N)

则总复杂度的递推式为

T(N)=2T(N2)+O(N)T(N)=2T\left(\frac{N}{2}\right)+\mathcal{O}(N)

根据主定理,有

T(N)=O(NlogN)T(N)=\mathcal{O}(N\log N)

矩阵解读

考虑一个44阶的Fourier矩阵:

F4=[11111j1j11111j1j]\mathbf{F}_4=\begin{bmatrix} 1 & 1 & 1 & 1\\ 1 & -j & -1 & j\\ 1 & -1 & 1 & -1\\ 1 & j & -1 & -j \end{bmatrix}

交换中间两列,使偶数列和奇数列分离:

F4=[111111jj111111jj][1111]\mathbf{F}_4=\begin{bmatrix} 1&1&1&1\\ 1&-1&-j&j\\ 1&1&-1&-1\\ 1&-1&j&-j \end{bmatrix}\begin{bmatrix} 1 & & &\\ &&1&\\ &1&&\\ &&&1 \end{bmatrix}

=[F2[1j]F2F2[1j]F2][1111]=\begin{bmatrix} \mathbf{F}_2 & \begin{bmatrix}1&\\&-j\end{bmatrix}\mathbf{F}_2\\ \mathbf{F}_2 & \begin{bmatrix}-1&\\&j\end{bmatrix}\mathbf{F}_2 \end{bmatrix}\begin{bmatrix} 1 & & &\\ &&1&\\ &1&&\\ &&&1 \end{bmatrix}

=[111j111j][F2F2][1111]=\begin{bmatrix}1&&1&\\&1&&-j\\1&&-1&\\&1&&j\end{bmatrix} \begin{bmatrix}\mathbf{F}_2&\\&\mathbf{F}_2\end{bmatrix}\begin{bmatrix} 1 & & &\\ &&1&\\ &1&&\\ &&&1 \end{bmatrix}

=[I2D2I2D2][F2F2]P4=\begin{bmatrix}\mathbf{I}_2&\mathbf{D}_2\\\mathbf{I}_2&-\mathbf{D}_2\end{bmatrix} \begin{bmatrix}\mathbf{F}_2&\\&\mathbf{F}_2\end{bmatrix} \mathbf{P}_4

于是,我们把F4\mathbf{F}_4拆成了两个F2\mathbf{F}_2和一些简单矩阵

我们推广到FN\mathbf{F}_NNN为偶数的情形,则有:

FN=[IN/2DN/2IN/2DN/2][FN/2FN/2]PN\mathbf{F}_N=\begin{bmatrix} \mathbf{I}_{N/2}&\mathbf{D}_{N/2}\\ \mathbf{I}_{N/2}&-\mathbf{D}_{N/2} \end{bmatrix} \begin{bmatrix} \mathbf{F}_{N/2}&\\&\mathbf{F}_{N/2} \end{bmatrix} \mathbf{P}_N


下面我们将上面的矩阵式解读为算法

PN\mathbf{P}_N是一个置换矩阵,它将所有偶数元素排列在前方,所有奇数元素排列在后方,即

PNxN=[gN/2hN/2]\mathbf{P}_N\mathbf{x}_N= \begin{bmatrix} \mathbf{g}_{N/2}\\\mathbf{h}_{N/2} \end{bmatrix}

这一步实际上不产生任何运算量(我们并不需要真的在内存上交换奇数项和偶数项的位置)

之后乘以右数第二个矩阵:

[FN/2FN/2]PNxN=[GN/2HN/2]\begin{bmatrix}\mathbf{F}_{N/2}&\\&\mathbf{F}_{N/2}\end{bmatrix}\mathbf{P}_N\mathbf{x}_N= \begin{bmatrix}\mathbf{G}_{N/2}\\\mathbf{H}_{N/2}\end{bmatrix}

这一步为分别对g(n)g(n)h(n)h(n)进行DFT

再乘以最左侧的矩阵,则

XN=[IN/2DN/2IN/2DN/2][GN/2HN/2]=[GN/2+DN/2HN/2GN/2DN/2HN/2]\mathbf{X}_N=\begin{bmatrix} \mathbf{I}_{N/2}&\mathbf{D}_{N/2}\\ \mathbf{I}_{N/2}&-\mathbf{D}_{N/2} \end{bmatrix}\begin{bmatrix}\mathbf{G}_{N/2}\\\mathbf{H}_{N/2}\end{bmatrix}=\begin{bmatrix} \mathbf{G}_{N/2}+\mathbf{D}_{N/2}\mathbf{H}_{N/2}\\ \mathbf{G}_{N/2}-\mathbf{D}_{N/2}\mathbf{H}_{N/2} \end{bmatrix}

其中

DN/2=[WN0WN1WN2WNN/21]\mathbf{D}_{N/2}=\begin{bmatrix} W_N^{0} &&&&\\ & W_N^{1} &&&\\ && W_N^2 &&\\ &&& \ddots &\\ &&&& W_N^{N/2-1} \end{bmatrix}

由于

WNk+N/2=WNkW_N^{k+N/2}=W_N^{k}

上面的矩阵式实际上和之前的非矩阵式等价