FFT是一种快速计算DFT的算法。按时间抽选的基-2FFT推导过程如下:
首先给出DFT的计算公式:
X ( k ) = D F T [ x ( n ) ] = ∑ n = 0 N − 1 x ( n ) W N n k X(k)=DFT[x(n)]=\sum^{N-1}_{n=0}x(n)W^{nk}_{N} X(k)=DFT[x(n)]=n=0∑N−1x(n)WNnk
其中 W N = e − j 2 π N W_{N}=e^{-j\frac{2\pi}{N}} WN=e−jN2π
容易证明:
W N n k = W N ( n + r N ) k = W N ( k + r N ) n , r 为整数 W_N^{nk}=W_N^{(n+rN)k}=W_N^{(k+rN)n},r为整数 WNnk=WN(n+rN)k=WN(k+rN)n,r为整数
W N n k = W m N m n k , W N n k = W N / m n k / m W_N^{nk}=W_{mN}^{mnk},W_N^{nk}=W_{N/m}^{nk/m} WNnk=WmNmnk,WNnk=WN/mnk/m
因此,可以得出一些特殊值:
W N N / 2 = − 1 W_N^{N/2}=-1 WNN/2=−1
W N k + N 2 = − W N k W_N^{k+\frac{N}{2}}=-W_N^k WNk+2N=−WNk
W N ( N − k ) n = W N ( N − n ) k = W N − n k W_N^{(N-k)n}=W_N^{(N-n)k}=W_N^{-nk} WN(N−k)n=WN(N−n)k=WN−nk
FFT的主要思想就是利用这些性质将DFT中的某些项合并。
设序列的长度为 N = 2 L N=2^L N=2L,将其分成奇偶两组:
\begin{equation}
\left{
\begin{array}
x(2r)=x_1® \
x(2r+1)=x_2®
\end{array}
\right.\tag{1}
\end{equation}
其中 r = 0 , 1 , . . . , N 2 − 1 r=0,1,...,\frac{N}{2}-1 r=0,1,...,2N−1
则 X ( k ) = ∑ n = 0 ( n 为偶数 ) N − 1 x ( n ) W N n k + ∑ n = 0 ( n 为奇数 ) N − 1 x ( n ) W N n k X(k)=\sum_{n=0(n为偶数)}^{N-1}x(n)W_N^{nk}+\sum_{n=0(n为奇数)}^{N-1}x(n)W_N^{nk} X(k)=n=0(n为偶数)∑N−1x(n)WNnk+n=0(n为奇数)∑N−1x(n)WNnk
X ( k ) = ∑ r = 0 N 2 − 1 x ( 2 r ) W N 2 r k + ∑ r = 0 N 2 − 1 x ( 2 r + 1 ) W N ( 2 r + 1 ) k X(k)=\sum_{r=0}^{\frac{N}{2}-1}x(2r)W_N^{2rk}+\sum_{r=0}^{\frac{N}{2}-1}x(2r+1)W_N^{(2r+1)k} X(k)=r=0∑2N−1x(2r)WN2rk+r=0∑2N−1x(2r+1)WN(2r+1)k
X ( k ) = ∑ r = 0 N 2 − 1 x 1 ( r ) W N / 2 r k + W N k ∑ r = 0 N 2 − 1 x 2 ( r ) W N / 2 r k X(k)=\sum_{r=0}^{\frac{N}{2}-1}x_1(r)W_{N/2}^{rk}+W_N^k\sum_{r=0}^{\frac{N}{2}-1}x_2(r)W_{N/2}^{rk} X(k)=r=0∑2N−1x1(r)WN/2rk+WNkr=0∑2N−1x2(r)WN/2rk
令 X 1 ( k ) = ∑ r = 0 N 2 − 1 x 1 ( r ) W N / 2 r k X_1(k)=\sum_{r=0}^{\frac{N}{2}-1}x_1(r)W_{N/2}^{rk} X1(k)=r=0∑2N−1x1(r)WN/2rk
X 2 ( k ) = ∑ r = 0 N 2 − 1 x 2 ( r ) W N / 2 r k X_2(k)=\sum_{r=0}^{\frac{N}{2}-1}x_2(r)W_{N/2}^{rk} X2(k)=r=0∑2N−1x2(r)WN/2rk
则 X ( k ) = X 1 ( k ) + W N k X 2 ( k ) (2) X(k)=X_1(k)+W_N^{k}X_2(k)\tag{2} X(k)=X1(k)+WNkX2(k)(2)
X 1 ( k ) , X 2 ( k ) X_1(k),X_2(k) X1(k),X2(k)分别是 x 1 ( r ) 和 x 2 ( r ) x_1(r)和x_2(r) x1(r)和x2(r)的 N / 2 N/2 N/2点DFT。
这样我们就可以把一个 N N N点DFT分解为两个 N / 2 N/2 N/2点DFT,并通过 ( 2 ) (2) (2)式组合成 N N N点DFT。
但是式中的 k , r = 0 , 1 , . . . , N 2 − 1 k,r=0,1,...,\frac{N}{2}-1 k,r=0,1,...,2N−1,也就是说,这只是 X ( k ) X(k) X(k)的前一半序列。
可以应用周期性求解 X ( k ) X(k) X(k)的后一半序列。
易证:
X 1 ( N 2 + k ) = X 1 ( k ) X 2 ( N 2 + k ) = X 2 ( k ) W N k + N 2 = − W N k X_1(\frac{N}{2}+k)=X_1(k) \\ X_2(\frac{N}{2}+k)=X_2(k) \\ W_N^{k+\frac{N}{2}}=-W_{N}^{k} X1(2N+k)=X1(k)X2(2N+k)=X2(k)WNk+2N=−WNk
因此: X ( k + N 2 ) = X 1 ( k ) − W N k X 2 ( k ) , k = 0 , 1 , . . . , N 2 − 1 (3) X(k+\frac{N}{2})=X_1(k)-W_N^k X_2(k),k=0,1,...,\frac{N}{2}-1 \tag{3} X(k+2N)=X1(k)−WNkX2(k),k=0,1,...,2N−1(3)
通过 ( 2 ) (2) (2)式和 ( 3 ) (3) (3)式,就可以通过两个 N / 2 N/2 N/2点DFT序列组合出一个完整的 N N N点DFT序列。
附运算次数(序列的长度为 N N N):
直接DFT:
复数乘法
N
2
N^2
N2次
复数加法
N
(
N
−
1
)
N(N-1)
N(N−1)次
利用FFT求解DFT:
复数乘法
N
2
l
o
g
2
N
\frac{N}{2}log_2{N}
2Nlog2N次
复数加法
N
l
o
g
2
N
N log_2{N}
Nlog2N次