快速傅里叶变换(FFT)的推导过程(DIT)

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=0N1x(n)WNnk

其中 W N = e − j 2 π N W_{N}=e^{-j\frac{2\pi}{N}} WN=ejN2π

容易证明:

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)nr为整数

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=WmNmnkWNnk=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(Nk)n=WN(Nn)k=WNnk

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,...,2N1

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为偶数)N1x(n)WNnk+n=0(n为奇数)N1x(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=02N1x(2r)WN2rk+r=02N1x(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=02N1x1(r)WN/2rk+WNkr=02N1x2(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=02N1x1(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=02N1x2(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,...,2N1,也就是说,这只是 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,...,2N1(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(N1)

利用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

  • 15
    点赞
  • 54
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值