FFT来源于DFT离散傅里叶变换,DFT的计算公式为:
X
(
k
)
=
∑
n
=
0
N
−
1
x
(
n
)
W
N
k
n
X(k) = \sum_{n=0}^{N-1} x(n)W_{N}^{kn}
X(k)=n=0∑N−1x(n)WNkn
为什么不直接用DFT计算,而要用FFT的原因在于根据上面的公式计算量会很大。
我们以N等于5为例实际计算一下:
X
(
0
)
=
x
(
0
)
×
W
5
0
+
x
(
1
)
×
W
5
0
+
x
(
2
)
×
W
5
0
+
x
(
3
)
×
W
5
0
+
x
(
4
)
×
W
5
0
X
(
1
)
=
x
(
0
)
×
W
5
0
+
x
(
1
)
×
W
5
1
+
x
(
2
)
×
W
5
2
+
x
(
3
)
×
W
5
3
+
x
(
4
)
×
W
5
4
.
.
.
可以看出来,每算一个X(k)就要计算5次乘法和4次加法,对于计算机来说,乘法运算要比加法运算耗时且更耗资源。也就是说,根据DFT完成一次完整的运算要进行N的2次方次乘法运算,N越大,计算就越困难。FFT能够明显降低运算次数,因此工程中不使用DFT,而用FFT进行计算。
FFT利用了旋转因子的周期性和特殊性,避免了一些不必要的运算,因此FFT执行起来比较快。旋转因子
W
N
k
n
=
e
−
j
(
2
π
/
N
)
k
n
是旋转因子
W_{N}^{k n}=e^{-j(2 \pi / N) k n} \text { 是旋转因子 }
WNkn=e−j(2π/N)kn 是旋转因子
常规的FFT按基分类可以分为基2-FFT、基4-FFT、混合基FFT。一般来讲,基2FFT适用于采样序列的个数是2的N次方的情况,同理基4FFT适用于采样序列的个数是4的N次方的情况,基4FFT的速度要比基2FFT更快。混合基FFT是先用基4FFT处理前4的N次方个数据在处理后面2的N次方的数据。
基 2 FFT 算法利用了旋转因子的以下周期性特性。
W
N
0
=
e
−
j
(
2
π
/
N
)
0
=
e
−
j
(
0
)
=
cos
(
0
)
+
j
sin
(
0
)
=
1
W
N
k
N
/
2
=
e
−
j
(
2
π
/
N
)
k
N
/
2
=
e
−
j
(
π
k
)
=
(
cos
(
−
π
)
+
j
sin
(
−
π
)
)
k
=
(
−
1
)
k
W
N
2
k
n
=
e
−
j
(
2
π
/
N
)
2
k
n
=
e
−
j
(
2
π
/
(
N
/
2
)
)
k
n
=
W
N
/
2
k
n
利用这些特性,可以把 N 点 DFT 分解为以下两个 N/2 点 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
−
1
x
(
n
)
W
N
n
k
=
∑
n
=
0
N
/
2
−
1
[
x
(
n
)
W
N
n
k
+
x
(
n
+
N
/
2
)
W
N
(
n
+
N
/
2
)
k
]
=
∑
n
=
0
N
/
2
−
1
[
x
(
n
)
W
N
n
k
+
x
(
n
+
N
/
2
)
W
N
k
N
/
2
W
N
n
k
]
=
∑
n
=
0
N
/
2
−
1
[
x
(
n
)
W
N
n
k
+
(
−
1
)
k
x
(
n
+
N
/
2
)
W
N
n
k
]
=
∑
n
=
0
N
/
2
−
1
[
x
(
n
)
+
(
−
1
)
k
x
(
n
+
N
/
2
)
]
W
N
n
k
让我们把输出序列 X(k), k= 0,…, N-1 分解成两个序列:
偶数序列和奇数序列
其中偶数序列X(2r),r=0,…,N/2-1
X
(
2
r
)
=
∑
n
=
0
N
/
2
−
1
[
x
(
n
)
+
(
−
1
)
2
r
x
(
n
+
N
/
2
)
]
W
N
2
n
r
=
∑
n
=
0
N
/
2
−
1
[
x
(
n
)
+
x
(
n
+
N
/
2
)
]
W
N
2
n
r
=
∑
n
=
0
N
/
2
−
1
[
x
(
n
)
+
x
(
n
+
N
/
2
)
]
W
N
/
2
n
r
=
D
F
T
N
/
2
(
x
(
n
)
+
x
(
n
+
N
/
2
)
)
基数序列X(2r+1),r=0,…N/2-1
X
(
2
r
+
1
)
=
∑
n
=
0
N
/
2
−
1
[
x
(
n
)
+
(
−
1
)
(
2
r
+
1
)
x
(
n
+
N
/
2
)
]
W
N
n
∗
(
2
r
+
1
)
=
∑
n
=
0
N
/
2
−
1
[
x
(
n
)
−
x
(
n
+
N
/
2
)
]
W
N
n
W
N
2
n
r
=
∑
n
=
0
N
/
2
−
1
{
[
x
(
n
)
−
x
(
n
+
N
/
2
)
]
W
N
n
}
W
N
/
2
n
r
=
D
F
T
N
/
2
(
(
x
(
n
)
−
x
(
n
+
N
/
2
)
)
W
N
n
)
按以上方法反复的分解 N 点 DFT 成 2/N 点 DFT 直到 N=2,使得 N 点傅立叶变换的运算复杂度由
原来的 N2降到 Nlog2N,这是非常显著的改进。这个算法也被称为频域抽取(Decimate-InFrequency, DIF)FFT 算法。。
用一个基2 8 点FFT的图表示上述过程