学习笔记:快速傅里叶变换(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=0∑N−1x(n)WNnkn,k∈[0,N−1](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=0∑N−1x(n)WNnk=n=0∑N/2−1x(2r)WN2rk+n=0∑N/2−1x(2r+1)WN2rkWNk=n=0∑N/2−1x1(r)WN/2rk+n=0∑N/2−1x2(r)WN/2rkWNk=X1(k)+X2(k)WNkk=0,1,...,N−1
其中:
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=0∑N/2−1x1(r)WN/2rk=DFT[x1(r)]k=0,1,...,N−1X2(k)=n=0∑N/2−1x2(r)WN/2rk=DFT[x2(r)]k=0,1,...,N−1
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/2−1=X1(k)−X2(k)WNkk=0,1,...,N/2−1
蝶形图:
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=0∑N/2−1x1(r)WN/2nk=n=0∑N/4−1x1(2l)WN/22lk+n=0∑N/4−1x1(2l+1)WN/22lkWN/2k=n=0∑N/4−1x3(r)WN/4lk+n=0∑N/4−1x4(r)WN/4lkWN/2k=X3(k)+X4(k)WN/2kk=0,1,...,N/2−1
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/4−1=X3(k)−X4(k)WN/2kk=0,1,...,N/4−1
同理:
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/4−1=X5(k)−X6(k)WN/2kk=0,1,...,N/4−1
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)
-
将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=0∑N−1x(n)WNnk=n=0∑N/2−1x(n)WNnk+n=N/2∑Nx(n)WNnk=n=0∑N/2−1x(n)WNnk+n=0∑N/2−1x(n+N/2)WN(n+N/2)k=n=0∑N/2−1[x(n)+x(n+N/2)WN(N/2)k]WNnk=n=0∑N/2−1[x(n)+(−1)kx(n+N/2)]WNnk
蝶形图:
-
频域按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=0∑N/2−1x[(n)+(−1)2mx(n+N/2)]WN2mn=n=0∑N/2−1[x(n)+x(n+N/2)]WN/2mn=n=0∑N/2−1x1(n)WN/2mnm=0,1,...,N/2=DFT[x1(n)]=X1(k)=n=0∑N/2−1[x(n)+(−1)(2m+1)x(n+N/2)]WNn(2m+1)=n=0∑N/2−1[x(n)−x(n+N/2)]WNnWN/2mn=n=0∑N/2−1x2(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.重复上述步骤即可。