数字信号处理3: 快速傅里叶变换(FFT)(含代码)
Posted zuguorui
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字信号处理3: 快速傅里叶变换(FFT)(含代码)相关的知识,希望对你有一定的参考价值。
文章目录
在之前的文章《傅里叶变换》中,我们已经推导了连续傅里叶变换和离散傅里叶变换。由于计算机的发展,离散傅里叶变换(DFT)可谓是信号处理的杀手锏。但是离散傅里叶变换计算量巨大,通常在实时信号处理时是无法使用的,直到快速傅里叶变换(FFT)算法被发现。
与DFT不同,FFT是一种算法而非理论,因此它无法只靠一两个公式就描述出来。接下来我们从DFT出发进行FFT的推导。
当然,大多数人可能来看这个博客就只是为了寻找可用的FFT代码,但是肯定还有一些同学对这个过程会感到好奇,因此我还是先讲推导过程,代码在最后一部分。
1. FFT推导
首先大家应该还记得DFT的公式
X [ k w 0 ] = ∑ n = < N > x [ n ] e − j k w 0 n X[kw_0]=\\sum_n=<N>x[n]e^-jkw_0n X[kw0]=n=<N>∑x[n]e−jkw0n
x [ n ] = 1 N ∑ k = < N > X [ k w 0 ] e j k w 0 n x[n]=\\frac1N\\sum_k=<N>X[kw_0]e^jkw_0n x[n]=N1k=<N>∑X[kw0]ejkw0n
其中, N N N为DFT长度,也就是多少个数据点, w 0 = 2 π / N w_0=2\\pi/N w0=2π/N为基波频率。首先从第一个公式开始。
为了方便表示,用
X
[
k
]
X[k]
X[k]来表示这是DFT的第几个点(毕竟是离散的),对于DFT可以写成更具体的形式:
X
[
k
]
=
∑
n
=
0
N
−
1
x
[
n
]
e
−
j
k
w
0
n
X[k]=\\sum_n=0^N-1x[n]e^-jkw_0n
X[k]=n=0∑N−1x[n]e−jkw0n
这种形式是更符合计算机表示的。
将上式按照
n
n
n的奇偶性分成两部分:
X
[
k
]
=
∑
n
=
0
N
/
2
−
1
x
[
2
n
]
e
−
j
k
w
0
(
2
n
)
+
∑
n
=
0
N
/
2
−
1
x
[
2
n
+
1
]
e
−
j
k
w
0
(
2
n
+
1
)
=
∑
n
=
0
N
/
2
−
1
x
[
2
n
]
e
−
j
k
w
0
(
2
n
)
+
e
−
j
k
w
0
∑
n
=
0
N
/
2
−
1
x
[
2
n
+
1
]
e
−
j
k
w
0
(
2
n
)
=
∑
n
=
0
N
/
2
−
1
x
[
2
n
]
e
−
j
k
2
π
N
/
2
n
+
e
−
j
k
w
0
∑
n
=
0
N
/
2
−
1
x
[
2
n
+
1
]
e
−
j
k
2
π
N
/
2
n
X[k]=\\sum_n=0^N/2-1 x[2n]e^-jkw_0(2n)+\\sum_n=0^N/2-1x[2n+1]e^-jkw_0(2n+1)\\\\ \\space\\\\ =\\sum_n=0^N/2-1 x[2n]e^-jkw_0(2n)+e^-jkw_0\\sum_n=0^N/2-1x[2n+1]e^-jkw_0(2n)\\\\ \\space\\\\ =\\sum_n=0^N/2-1 x[2n]e^-jk\\frac2\\piN/2n+e^-jkw_0\\sum_n=0^N/2-1x[2n+1]e^-jk\\frac2\\piN/2n
X[k]=n=0∑N/2−1x[2n]e−jkw0(2n)+n=0∑N/2−1x[2n+1]e−jkw0(2n+1) =n=0∑N/2−1x[2n]e−jkw0(2n)+e−jkw0n=0∑N/2−1x[2n+1]e−jkw0(2n) =n=0∑N/2−1x[2n]e−jkN/22πn+e−jkw0n=0∑N/2−1x[2n+1]e−jkN/22πn
注意
k
k
k的取值范围仍然是
[
0
,
N
−
1
]
[0, N-1]
[0,N−1],但是由于
e
−
j
(
k
+
N
)
2
π
N
n
=
e
−
j
k
2
π
N
n
⋅
e
−
j
2
n
π
=
e
−
j
k
2
π
N
n
e^-j(k + N)\\frac2\\piNn=e^-jk\\frac2\\piNn\\cdot e^-j2n\\pi=e^-jk\\frac2\\piNn
e−j(k+N)N2πn=e−jkN2πn⋅e−j2nπ=e−jkN2πn
同理
e
−
j
(
k
+
N
/
2
)
2
π
N
/
2
n
=
e
−
j
k
2
π
N
/
2
n
⋅
e
−
j
2
n
π
=
e
−
j
k
2
π
N
/
2
n
e^-j(k + N/2)\\frac2\\piN/2n=e^-jk\\frac2\\piN/2n\\cdot e^-j2n\\pi=e^-jk\\frac2\\piN/2n
e快速傅里叶变化(FFT)含模板
Java快速傅里叶变换FFT的程序实现(时间抽取的基-2FFT倒位计算蝶形运算)