学习笔记:快速傅里叶变换(FFT)

引言

  滴!解锁研究生关卡!博主入学已经一个学期了,万万没想到迎来的第一个课题就是与FFT有关的。要知道,本科的时候数字信号处理课程中的FFT、蝶形图就是本人的噩梦,虽然它将对称美发挥到了极致,但是!他喵的我就是学不懂嘛呜呜呜呜。怕什么还真就来什么,没辙,和他交个朋友吧。

一、DFT(Discrete Fouier Transform)

  FFT本质上是DFT的一种快速算法,所以想弄清楚其原理,就必须先明白DFT的内涵。DFT,即离散傅里叶变换,用来将时域序列转换为频域序列,一个N点的DFT变换具体公式如(1-1)所示:
X ( k ) = ∑ n = 0 N − 1 x ( n ) W N n k n , k ∈ [ 0 , N − 1 ] (1-1) {X (k) = \sum _{n=0}^{N-1}x (n)W_{N}^{nk}n,k \in \left[ 0,N-1 \right]} \tag{1-1} X(k)=n=0N1x(n)WNnkn,k[0,N1](1-1)
  在FFT中,常取 N = 2 M N = 2^M N=2M。下面以8点FFT为例,讲解FFT时域抽取和频域抽取的两种算法的基本原理。

二、时域抽取(DIT)

2.1原理

  时域抽取,一般来讲是将序列x[n]按照奇偶划分为两部分,具体分解步骤如下:

step1. 将DFT变换公式按时域序列n的奇偶拆写成两个部分:
X ( k ) = ∑ n = 0 N − 1 x ( n ) W N n k = ∑ n = 0 N / 2 − 1 x ( 2 r ) W N 2 r k + ∑ n = 0 N / 2 − 1 x ( 2 r + 1 ) W N 2 r k W N k = ∑ n = 0 N / 2 − 1 x 1 ( r ) W N / 2 r k + ∑ n = 0 N / 2 − 1 x 2 ( r ) W N / 2 r k W N k = X 1 ( k ) + X 2 ( k ) W N k k = 0 , 1 , . . . , N − 1 \begin{aligned} X (k) &= \sum _{n=0}^{N-1}x(n)W_{N}^{nk}\\ & = \sum _{n=0}^{N/2-1}x (2r)W_{N}^{2rk}+ \sum _{n=0}^{N/2-1}x(2r+1)W_{N}^{2rk}W_{N}^{k}\\ &= \sum _{n=0}^{N/2-1}x_1(r)W_{N/2}^{rk}+ \sum _{n=0}^{N/2-1}x_2(r)W_{N/2}^{rk}W_{N}^{k}\\ & =X_1(k)+X_2(k)W_{N}^{k} \quad{k = 0,1,...,N-1} \end{aligned} X(k)=n=0N1x(n)WNnk=n=0N/21x(2r)WN2rk+n=0N/21x(2r+1)WN2rkWNk=n=0N/21x1(r)WN/2rk+n=0N/21x2(r)WN/2rkWNk=X1(k)+X2(k)WNkk=0,1,...,N1
其中:
X 1 ( k ) = ∑ n = 0 N / 2 − 1 x 1 ( r ) W N / 2 r k = D F T [ x 1 ( r ) ] k = 0 , 1 , . . . , N − 1 X 2 ( k ) = ∑ n = 0 N / 2 − 1 x 2 ( r ) W N / 2 r k = D F T [ x 2 ( r ) ] k = 0 , 1 , . . . , N − 1 \begin{aligned} X_1(k)= \sum _{n=0}^{N/2-1}x_1(r) W_{N/2}^{rk}=DFT[x_1(r) ]\quad{k = 0,1,...,N-1}\\ X_2(k) = \sum _{n=0}^{N/2-1}x_2(r) W_{N/2}^{rk}=DFT[x_2(r)]\quad{k = 0,1,...,N-1} \end{aligned} X1(k)=n=0N/21x1(r)WN/2rk=DFT[x1(r)]k=0,1,...,N1X2(k)=n=0N/21x2(r)WN/2rk=DFT[x2(r)]k=0,1,...,N1
X 1 ( k ) X_1(k) X1(k) X 2 ( k ) X_2(k) X2(k)是以N/2为周期的DFT序列, W N k + N / 2 = − W N k W_{N}^{k+N/2}=-W_{N}^{k} WNk+N/2=WNk,所以频域公式还可以写成:
X ( k ) = X 1 ( k ) + X 2 ( k ) W N k k = 0 , 1 , . . . , N / 2 − 1 X ( k + N / 2 ) = X 1 ( k ) − X 2 ( k ) W N k k = 0 , 1 , . . . , N / 2 − 1 \begin{aligned} X(k) &= X_1(k)+X_2(k)W_{N}^{k}\quad{k = 0,1,...,N/2-1} \\ X(k+N/2) &= X_1(k)-X_2(k)W_{N}^{k}\quad{k = 0,1,...,N/2-1}\\ \end{aligned} X(k)X(k+N/2)=X1(k)+X2(k)WNkk=0,1,...,N/21=X1(k)X2(k)WNkk=0,1,...,N/21
蝶形图:
图一

step 2.将 x 1 ( r ) x_1(r) x1(r)r的奇偶进行分解:
X 1 ( k ) = ∑ n = 0 N / 2 − 1 x 1 ( r ) W N / 2 n k = ∑ n = 0 N / 4 − 1 x 1 ( 2 l ) W N / 2 2 l k + ∑ n = 0 N / 4 − 1 x 1 ( 2 l + 1 ) W N / 2 2 l k W N / 2 k = ∑ n = 0 N / 4 − 1 x 3 ( r ) W N / 4 l k + ∑ n = 0 N / 4 − 1 x 4 ( r ) W N / 4 l k W N / 2 k = X 3 ( k ) + X 4 ( k ) W N / 2 k k = 0 , 1 , . . . , N / 2 − 1 \begin{aligned} X_1(k) &= \sum _{n=0}^{N/2-1}x_1(r)W_{N/2}^{nk}\\ & = \sum _{n=0}^{N/4-1}x _1(2l)W_{N/2}^{2lk}+ \sum _{n=0}^{N/4-1}x_1(2l+1)W_{N/2}^{2lk}W_{N/2}^{k}\\ &= \sum _{n=0}^{N/4-1}x_3(r)W_{N/4}^{lk}+ \sum _{n=0}^{N/4-1}x_4(r)W_{N/4}^{lk}W_{N/2}^{k}\\ & =X_3(k)+X_4(k)W_{N/2}^{k} \quad{k = 0,1,...,N/2-1} \end{aligned} X1(k)=n=0N/21x1(r)WN/2nk=n=0N/41x1(2l)WN/22lk+n=0N/41x1(2l+1)WN/22lkWN/2k=n=0N/41x3(r)WN/4lk+n=0N/41x4(r)WN/4lkWN/2k=X3(k)+X4(k)WN/2kk=0,1,...,N/21
X 3 ( k ) X_3(k) X3(k) X 4 ( k ) X_4(k) X4(k)都是以N/4为周期的序列,即 W N / 2 k + N / 4 = − W N / 2 k W_{N/2}^{k+N/4}=-W_{N/2}^{k} WN/2k+N/4=WN/2k,所以:
X 1 ( k ) = X 3 ( k ) + X 4 ( k ) W N / 2 k k = 0 , 1 , . . . , N / 4 − 1 X 1 ( k + N / 4 ) = X 3 ( k ) − X 4 ( k ) W N / 2 k k = 0 , 1 , . . . , N / 4 − 1 \begin{aligned} X_1(k) & =X_3(k)+X_4(k)W_{N/2}^{k} \quad{k = 0,1,...,N/4-1}\\ X_1(k+N/4) & =X_3(k)-X_4(k)W_{N/2}^{k} \quad{k = 0,1,...,N/4-1}\\ \end{aligned} X1(k)X1(k+N/4)=X3(k)+X4(k)WN/2kk=0,1,...,N/41=X3(k)X4(k)WN/2kk=0,1,...,N/41
同理:
X 2 ( k ) = X 5 ( k ) + X 6 ( k ) W N / 2 k k = 0 , 1 , . . . , N / 4 − 1 X 2 ( k + N / 4 ) = X 5 ( k ) − X 6 ( k ) W N / 2 k k = 0 , 1 , . . . , N / 4 − 1 \begin{aligned} X_2(k) & =X_5(k)+X_6(k)W_{N/2}^{k} \quad{k = 0,1,...,N/4-1}\\ X_2(k+N/4) & =X_5(k)-X_6(k)W_{N/2}^{k} \quad{k = 0,1,...,N/4-1}\\ \end{aligned} X2(k)X2(k+N/4)=X5(k)+X6(k)WN/2kk=0,1,...,N/41=X5(k)X6(k)WN/2kk=0,1,...,N/41

2.2 8点FFT举例

将DFT变换公式按时域序列n的奇偶拆写成两个部分:
x ( n ) = { x ( 0 ) , x ( 1 ) , x ( 2 ) , x ( 3 ) , x ( 4 ) , x ( 5 ) , x ( 6 ) , x ( 7 ) } x(n) =\{x(0),x(1),x(2),x(3),x(4),x(5),x(6),x(7)\} x(n)={x(0),x(1),x(2),x(3),x(4),x(5),x(6),x(7)}

x 1 ( n ) = { x 1 ( 0 ) , x 1 ( 1 ) , x 1 ( 2 ) , x 1 ( 3 ) } = { x ( 0 ) , x ( 2 ) , x ( 4 ) , x ( 6 ) } x_1(n) =\{x_1(0),x_1(1),x_1(2),x_1(3)\}=\{x(0),x(2),x(4),x(6)\} x1(n)={x1(0),x1(1),x1(2),x1(3)}={x(0),x(2),x(4),x(6)}
x 2 ( n ) = { x 2 ( 0 ) , x 2 ( 1 ) , x 2 ( 2 ) , x 2 ( 3 ) } = { x ( 1 ) , x ( 3 ) , x ( 5 ) , x ( 7 ) } x_2(n) =\{x_2(0),x_2(1),x_2(2),x_2(3)\}=\{x(1),x(3),x(5),x(7)\} x2(n)={x2(0),x2(1),x2(2),x2(3)}={x(1),x(3),x(5),x(7)}

x 1 ( n ) = { x 1 ( 0 ) , x 1 ( 1 ) , x 1 ( 2 ) , x 1 ( 3 ) } = { x ( 0 ) , x ( 2 ) , x ( 4 ) , x ( 6 ) } x_1(n) =\{x_1(0),x_1(1),x_1(2),x_1(3)\}=\{x(0),x(2),x(4),x(6)\} x1(n)={x1(0),x1(1),x1(2),x1(3)}={x(0),x(2),x(4),x(6)}

  • x 3 ( n ) = { x 3 ( 0 ) , x 3 ( 1 ) } = { x ( 0 ) , x ( 4 ) } x_3(n) =\{x_3(0),x_3(1)\}=\{x(0),x(4)\} x3(n)={x3(0),x3(1)}={x(0),x(4)}
    • x 7 ( n ) = { x ( 0 ) } x_7(n) =\{x(0)\} x7(n)={x(0)}
    • x 8 ( n ) = { x ( 4 ) } x_8(n) =\{x(4)\} x8(n)={x(4)}

X 7 ( 0 ) = x 3 ( 0 ) = x ( 0 ) X_7(0) =x_3(0)=x(0) X7(0)=x3(0)=x(0)
X 8 ( 0 ) = x 3 ( 1 ) = x ( 4 ) X_8(0) =x_3(1)=x(4) X8(0)=x3(1)=x(4)
X 3 ( 0 ) = X 7 ( 0 ) = x 4 ( 0 ) = x ( 2 ) X_3(0) =X_7(0) =x_4(0)=x(2) X3(0)=X7(0)=x4(0)=x(2)
X 3 ( 1 ) = X 8 ( 0 ) = x 4 ( 1 ) = x ( 6 ) X_3(1) =X_8(0) =x_4(1)=x(6) X3(1)=X8(0)=x4(1)=x(6)

  • x 4 ( n ) = { x 4 ( 0 ) , x 4 ( 1 ) } = { x ( 2 ) , x ( 6 ) } x_4(n) =\{x_4(0),x_4(1)\}=\{x(2),x(6)\} x4(n)={x4(0),x4(1)}={x(2),x(6)}
    • x 9 ( n ) = { x ( 2 ) } x_9(n) =\{x(2)\} x9(n)={x(2)}
    • x 10 ( n ) = { x ( 6 ) } x_{10}(n) =\{x(6)\} x10(n)={x(6)}

X 9 ( 0 ) = x 4 ( 0 ) = x ( 2 ) X_9(0) =x_4(0)=x(2) X9(0)=x4(0)=x(2)
X 10 ( 0 ) = x 4 ( 1 ) = x ( 6 ) X_{10}(0) =x_4(1)=x(6) X10(0)=x4(1)=x(6)
X 4 ( 0 ) = X 9 ( 0 ) = x 4 ( 0 ) = x ( 2 ) X_4(0) =X_9(0) =x_4(0)=x(2) X4(0)=X9(0)=x4(0)=x(2)
X 4 ( 1 ) = X 10 ( 0 ) = x 4 ( 1 ) = x ( 6 ) X_4(1) =X_{10}(0) =x_4(1)=x(6) X4(1)=X10(0)=x4(1)=x(6)

x 2 ( n ) = { x 2 ( 0 ) , x 2 ( 1 ) , x 2 ( 2 ) , x 2 ( 3 ) } = { x ( 1 ) , x ( 3 ) , x ( 5 ) , x ( 7 ) } x_2(n) =\{x_2(0),x_2(1),x_2(2),x_2(3)\}=\{x(1),x(3),x(5),x(7)\} x2(n)={x2(0),x2(1),x2(2),x2(3)}={x(1),x(3),x(5),x(7)}

  • x 5 ( n ) = { x 5 ( 0 ) , x 5 ( 1 ) } = { x ( 1 ) , x ( 5 ) } x_5(n) =\{x_5(0),x_5(1)\}=\{x(1),x(5)\} x5(n)={x5(0),x5(1)}={x(1),x(5)}
    • x 11 ( n ) = { x ( 1 ) } x_{11}(n) =\{x(1)\} x11(n)={x(1)}
    • x 12 ( n ) = { x ( 5 ) } x_{12}(n) =\{x(5)\} x12(n)={x(5)}

X 11 ( 0 ) = x 5 ( 0 ) = x ( 1 ) X_{11}(0) =x_5(0)=x(1) X11(0)=x5(0)=x(1)
X 12 ( 0 ) = x 5 ( 1 ) = x ( 5 ) X_{12}(0) =x_5(1)=x(5) X12(0)=x5(1)=x(5)
X 5 ( 0 ) = X 11 ( 0 ) = x 5 ( 0 ) = x ( 1 ) X_5(0) =X_{11}(0)=x_5(0)=x(1) X5(0)=X11(0)=x5(0)=x(1)
X 5 ( 1 ) = X 12 ( 0 ) = x 5 ( 1 ) = x ( 5 ) X_5(1) =X_{12}(0) =x_5(1)=x(5) X5(1)=X12(0)=x5(1)=x(5)

  • x 6 ( n ) = { x 6 ( 0 ) , x 6 ( 1 ) } = { x ( 3 ) , x ( 7 ) } x_6(n) =\{x_6(0),x_6(1)\}=\{x(3),x(7)\} x6(n)={x6(0),x6(1)}={x(3),x(7)}
    • x 13 ( n ) = { x ( 3 ) } x_{13}(n) =\{x(3)\} x13(n)={x(3)}
    • x 14 ( n ) = { x ( 7 ) } x_{14}(n) =\{x(7)\} x14(n)={x(7)}

X 13 ( 0 ) = x 6 ( 0 ) = x ( 3 ) X_{13}(0) =x_6(0)=x(3) X13(0)=x6(0)=x(3)
X 14 ( 0 ) = x 6 ( 1 ) = x ( 7 ) X_{14}(0) =x_6(1)=x(7) X14(0)=x6(1)=x(7)
X 6 ( 0 ) = X 13 ( 0 ) = x 6 ( 0 ) = x ( 3 ) X_6(0) =X_{13}(0) =x_6(0)=x(3) X6(0)=X13(0)=x6(0)=x(3)
X 6 ( 1 ) = X 14 ( 0 ) = x 6 ( 1 ) = x ( 7 ) X_6(1) =X_{14}(0) =x_6(1)=x(7) X6(1)=X14(0)=x6(1)=x(7)
在这里插入图片描述在这里插入图片描述由于博主电脑上没有绘制蝶形图的软件,所以直接用了之前一篇博文的配图,原博的连接如下link,这篇文章讲述的十分详细,作者的博客还有专栏来介绍FFT和蝶形图,推荐大家阅读。

三、频域抽取(DIF)

  1. 将DFT变换公式的时域序列从中间分成前、后两个部分:
    X ( k ) = ∑ n = 0 N − 1 x ( n ) W N n k = ∑ n = 0 N / 2 − 1 x ( n ) W N n k + ∑ n = N / 2 N x ( n ) W N n k = ∑ n = 0 N / 2 − 1 x ( n ) W N n k + ∑ n = 0 N / 2 − 1 x ( n + N / 2 ) W N ( n + N / 2 ) k = ∑ n = 0 N / 2 − 1 [ x ( n ) + x ( n + N / 2 ) W N ( N / 2 ) k ] W N n k = ∑ n = 0 N / 2 − 1 [ x ( n ) + ( − 1 ) k x ( n + N / 2 ) ] W N n k \begin{aligned} X (k)&= \sum _{n=0}^{N-1}x(n)W_{N}^{nk}\\ & = \sum _{n=0}^{N/2-1}x(n)W_{N}^{nk}+ \sum _{n=N/2 }^{N}x(n)W_{N}^{nk}\\ & = \sum _{n=0}^{N/2-1}x(n)W_{N}^{nk}+ \sum _{n=0 }^{N/2-1}x(n+N/2) W_{N}^{(n+N/2)k}\\ & = \sum _{n=0}^{N/2-1} \left[x(n) +x( n+N/2)W_{N}^{(N/2)k}\right]W_{N}^{nk}\\ & = \sum _{n=0}^{N/2-1}\left[ x(n)+(-1)^kx( n+N/2)\right] W_{N}^{nk}\\ \end{aligned} X(k)=n=0N1x(n)WNnk=n=0N/21x(n)WNnk+n=N/2Nx(n)WNnk=n=0N/21x(n)WNnk+n=0N/21x(n+N/2)WN(n+N/2)k=n=0N/21[x(n)+x(n+N/2)WN(N/2)k]WNnk=n=0N/21[x(n)+(1)kx(n+N/2)]WNnk
    蝶形图:
    在这里插入图片描述

  2. 频域按k的奇偶划分成两个部分,可以写作下式:
    X ( 2 m ) = ∑ n = 0 N / 2 − 1 x [ ( n ) + ( − 1 ) 2 m x ( n + N / 2 ) ] W N 2 m n = ∑ n = 0 N / 2 − 1 [ x ( n ) + x ( n + N / 2 ) ] W N / 2 m n = ∑ n = 0 N / 2 − 1 x 1 ( n ) W N / 2 m n m = 0 , 1 , . . . , N / 2 = D F T [ x 1 ( n ) ] = X 1 ( k ) X ( 2 m + 1 ) = ∑ n = 0 N / 2 − 1 [ x ( n ) + ( − 1 ) ( 2 m + 1 ) x ( n + N / 2 ) ] W N n ( 2 m + 1 ) = ∑ n = 0 N / 2 − 1 [ x ( n ) − x ( n + N / 2 ) ] W N n W N / 2 m n = ∑ n = 0 N / 2 − 1 x 2 ( n ) W N / 2 m n m = 0 , 1 , . . . , N / 2 = D F T [ x 1 ( n ) ] = X 1 ( k ) \begin{aligned} X(2m) &= \sum _{n=0}^{N/2-1}x \left[ (n)+(-1)^{2m}x(n+N/2)\right] W_{N}^{2mn}\\ &= \sum _{n=0}^{N/2-1}\left[x(n) +x(n+N/2)\right] W_{N/2}^{mn}\\ &= \sum _{n=0}^{N/2-1}x_1(n)W_{N/2}^{mn}\quad{m = 0,1,...,N/2}\\ &=DFT[x_1(n)]=X_1(k)\\ X(2m+1) & = \sum _{n=0}^{N/2-1} \left[x(n) +(-1)^{(2m+1)}x(n+N/2)\right] W_{N}^{n(2m+1)}\\ & = \sum _{n=0}^{N/2-1} \left[ x(n) - x( n+N/2)\right]W_{N}^nW_{N/2}^{mn}\\ & = \sum _{n=0}^{N/2-1}x_2 ( n)W_{N/2}^{mn}\quad{m = 0,1,...,N/2}\\ &=DFT[x_1(n)]=X_1(k) \end{aligned} X(2m)X(2m+1)=n=0N/21x[(n)+(1)2mx(n+N/2)]WN2mn=n=0N/21[x(n)+x(n+N/2)]WN/2mn=n=0N/21x1(n)WN/2mnm=0,1,...,N/2=DFT[x1(n)]=X1(k)=n=0N/21[x(n)+(1)(2m+1)x(n+N/2)]WNn(2m+1)=n=0N/21[x(n)x(n+N/2)]WNnWN/2mn=n=0N/21x2(n)WN/2mnm=0,1,...,N/2=DFT[x1(n)]=X1(k)
    其中:
    x 1 ( n ) = [ x ( n ) + x ( n + N / 2 ) ] x 2 ( n ) = [ x ( n ) − x ( n + N / 2 ) ] W N n \begin{aligned} x_1(n) &= \left[ x(n) +x(n+N/2)\right]\\ x_2(n) & = \left[x(n) - x( n+N/2)\right]W_{N}^n \end{aligned} x1(n)x2(n)=[x(n)+x(n+N/2)]=[x(n)x(n+N/2)]WNn
    3.重复上述步骤即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值