fft变换并不是什么新的算法,它只是为了加速dft运算的一种方法,dft的表达式如下:
很显然求出N点的X(k)需要
N
2
N^{2}
N2次复数乘法和N*(N - 1)次复数加法;我们都知道实现一次复数乘法需要四次实数乘两次实数加,实现一次复数加法需要两次实数加;那么当N很大的时候,计算量就会相当的大。dft作为信号处理中最为常用的算法,这么大的计算量显然是不能在实际中得到很好的应用,为此fft就出现了;fft是如何进行的呢?下面将进行详细的介绍。
视频请戳
1、基于时间的抽取(DIT)基2fft算法
对于下式
令
N
=
x
M
N = x^{M}
N=xM,
M
M
M为正整数,将
x
(
n
)
x(n)
x(n)按照奇偶分成两组,基令
n
=
2
r
n=2r
n=2r以及
n
=
2
r
+
1
n=2r+1
n=2r+1,而
r
=
0
,
1
,
.
.
.
,
N
/
2
−
1
r = 0,1,...,N/2 - 1
r=0,1,...,N/2−1,于是有
令
则有
A
(
k
)
和
B
(
k
)
A(k)和B(k)
A(k)和B(k)都是
N
/
2
N/2
N/2点的dft,
X
(
k
)
X(k)
X(k)是N点dft,因此上式中
X
(
k
)
X(k)
X(k)不是完全形式,但是
所以
A
(
k
)
,
B
(
k
)
A(k),B(k)
A(k),B(k)可以完全表示
X
(
k
)
X(k)
X(k),当
N
=
8
N = 8
N=8,
A
(
k
)
,
B
(
k
)
以
及
X
(
k
)
A(k),B(k)以及X(k)
A(k),B(k)以及X(k)的关系可以用下图表示
上面推到出的结果
A
(
k
)
,
B
(
k
)
仍
然
是
高
复
合
数
(
N
/
2
)
A(k),B(k)仍然是高复合数(N / 2)
A(k),B(k)仍然是高复合数(N/2)的dft,可以按照上述方法继续进行分解,分别令
r
=
2
l
,
r
=
2
l
+
1
,
l
=
0
,
1
,
.
.
.
,
N
/
4
−
1
r = 2l,r = 2l + 1,l = 0,1,...,N / 4 - 1
r=2l,r=2l+1,l=0,1,...,N/4−1,则
A
(
k
)
和
B
(
k
)
A(k)和B(k)
A(k)和B(k)可分别表示为
令
则有
同样的道理,令
同理有
如果
N
=
8
N = 8
N=8,那么
C
(
k
)
,
D
(
k
)
,
E
(
k
)
,
F
(
k
)
C(k),D(k),E(k),F(k)
C(k),D(k),E(k),F(k)都是两点dft,无需继续进行展开,则有
如果
N
=
16
,
32
或
者
是
2
的
更
高
次
幂
N = 16,32或者是2的更高次幂
N=16,32或者是2的更高次幂,可以按照上述方法继续进行展开;上述方法均是将时间n按照奇偶进行展开的,所以称为时间抽取DIT,上述方法的8点DFT可以表示为下图:
基本运算单元如下: