FT DFT FFT
- 傅里叶变换
- 离散傅里叶变换
- 快速傅里叶变换
傅里叶变换FT
#。 要学习FFT(快速傅里叶变换),首先我们要了解傅里叶变换,所谓傅里叶变换就是将一个时域信号转化为频域信号
-> 时域信号,是我们最常见的信号,就是随时间变化的信号,如下图 ,,,,,,,,,,图1-1,,,,,,,,,,
-> 频域信号, 自变量是频率,即横轴是频率,纵轴是该频率信号的幅度,如下图
,,,,,,,,,,图1-2,,,,,,,,,,
如上图就是频率为2pi的频谱图。
了解了时域与频域,接下来就说傅里叶变换,(任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加),其实傅里叶变换就是将时域信号转化为正弦频域信号(可以理解为将时域转化为频域),其主要就是通过与计算与某一频率的正弦函数的相关性来实现,而傅里叶变化就是通过积分(与要比较的正弦波每点的乘积的累加)的形式来计算相关性,通过公式就更加了解了
其中f(t)是原函数->就是对应的时域函数如图1-1。后半部分是欧拉公式
后半部分可化为( con(ωt) - i * sin(ωt) )就是与原函数进行比较相似度的部分。最后就是将他们相乘再在从负无穷到正无穷进行积分(累加)的到的数值就是原函数与对比部分的相似度即 -> 原函数对应频率的幅值 通过不断调整ω,得到不同频率的幅值,最后得到 频谱图 如上图1-2.
离散傅里叶变换DFT
#。在现实中我们只能测量得到 离散的 有限的 信息,无法得到连续,无穷的信息,于是将傅里叶变换转化为离散数据可处理的公式,如下图
再通过欧拉公式转换为下图公式
公式原理与上傅里叶变换意义基本相同,只是将原公式的积分区间 从负无穷到正无穷, 改变为从0到N-1。将积分改为累加(其实积分本就是累加)。
通过以上方式就将傅里叶变换转化为离散傅里叶变换。
#。但是我们从公式观察理解就会发现有一个很大的不足,就是需要做大量的乘法与加法,很难应用到实际中,于是人们改进出快速傅里叶变换,实现将函数从时域快速转化为频域。下面就来说明快速傅里叶变换。
快速傅里叶变换FFT
#。接下来就要说明FFT了。FFT只是在DFT的基础上进行化简等效。
我们先将DFT原式化为更容易处理的式子 X(k) =
∑
n
=
0
N
−
1
x
(
n
)
(
e
−
j
2
π
k
N
)
n
\sum_{n=0}^{N-1}x(n)(e^{-j\frac{2\pi k}{N}})^{n}
∑n=0N−1x(n)(e−jN2πk)n
再将X(k)中的k用
e
−
j
2
π
k
N
e^{-j\frac{2\pi k}{N}}
e−jN2πk 表示 >> A(
e
−
j
2
π
k
N
e^{-j\frac{2\pi k}{N}}
e−jN2πk) =
∑
n
=
0
N
−
1
x
(
n
)
(
e
−
j
2
π
k
N
)
n
\sum_{n=0}^{N-1}x(n)(e^{-j\frac{2\pi k}{N}})^{n}
∑n=0N−1x(n)(e−jN2πk)n
进一步 >> A(x) =
∑
i
=
0
n
−
1
a
i
x
i
\sum_{i = 0}^{n-1}a_{i}x^{i}
∑i=0n−1aixi =
a
0
+
a
1
x
+
a
2
x
2
+
.
.
.
+
a
n
−
1
x
n
−
1
a_{0} + a_{1}x + a_{2}x^{2} + ... + a_{n-1}x^{n-1}
a0+a1x+a2x2+...+an−1xn−1
这样就化为我们常见的式子了。
#。接着就是FFT的核心了,分解(将A(x)的奇数项和偶数项分开)。
按A(x)下标的奇偶性把A(x)分成两项,并将后式提出一个x
A(x) =
a
0
+
a
2
x
2
+
.
.
.
+
a
n
−
2
x
n
−
2
a_{0} + a_{2}x^{2} + ... + a_{n-2}x^{n-2}
a0+a2x2+...+an−2xn−2
a
1
x
+
a
3
x
3
+
.
.
.
+
a
n
−
1
x
n
−
1
a_{1}x + a_{3}x^{3} + ... + a_{n-1}x^{n-1}
a1x+a3x3+...+an−1xn−1
=>
A
(
x
)
=
A
1
(
x
)
+
A
2
(
x
)
A(x) = A_{1}(x) + A_{2}(x)
A(x)=A1(x)+A2(x)
A
1
(
x
)
=
a
0
+
a
2
x
2
+
a
4
x
4
+
.
.
.
+
a
n
−
2
x
n
−
2
A_{1}(x) = a_{0} + a_{2}x^{2} + a_{4}x^{4} + ... + a_{n-2}x^{n-2}
A1(x)=a0+a2x2+a4x4+...+an−2xn−2
A
2
(
x
)
=
x
(
a
1
+
a
3
x
2
+
a
5
x
4
+
.
.
.
+
a
n
−
1
x
n
−
2
)
A_{2}(x)=x( a_{1} + a_{3}x^{2} + a_{5}x^{4} + ... + a_{n-1}x^{n-2})
A2(x)=x(a1+a3x2+a5x4+...+an−1xn−2)
是不是发现了什么,是的最后结果就是
A
(
x
)
=
A
1
(
x
2
)
+
x
A
2
(
x
2
)
A(x) = A_{1}(x^{2}) +x A_{2}( x^{2})
A(x)=A1(x2)+xA2(x2) (x的范围变为原来的一半)
由上方化简DFT的第2步 x即
e
−
j
2
π
k
N
e^{-\frac{j2\pi k}{N}}
e−Nj2πk (欧拉转换-> con(
2
π
k
N
\frac{2\pi k}{N}
N2πk) -j * sin(
2
π
k
N
\frac{2\pi k}{N}
N2πk)
用
w
n
k
w_{n}^{k}
wnk 来表示上式 (此处用n代表N)。
前一半:
A
(
w
n
k
)
=
A
1
(
w
n
2
k
)
+
x
A
2
(
w
n
2
k
)
(
k
∈
0
−
2
n
)
A(w_{n}^{k}) = A_{1}(w_{n}^{2k}) +x A_{2}(w_{n}^{2k}) (k\in0-{\frac2{n}})
A(wnk)=A1(wn2k)+xA2(wn2k)(k∈0−n2)
后一半:
A
(
w
n
k
+
2
n
)
=
A
1
(
w
n
2
k
+
n
)
+
x
A
2
(
w
n
2
k
+
n
)
(
k
∈
0
−
2
n
)
A(w_{n}^{k + \frac2{n}}) = A_{1}(w_{n}^{2k+n}) +x A_{2}(w_{n}^{2k+n}) (k\in0-{\frac2{n}})
A(wnk+n2)=A1(wn2k+n)+xA2(wn2k+n)(k∈0−n2)
又由于
w
n
k
w_{n}^{k}
wnk 是复数,是周期函数,如图
我们可以利用单位根的性质 对DFT原式进行化简
- w n k = w 2 n 2 k w_{n}^{k}= w_{2n}^{2k} wnk=w2n2k
- w n k + n 2 = − w n 2 k w_{n}^{k+\frac{n}{2}}= -w_{n}^{2k} wnk+2n=−wn2k
代入化简得
A
(
w
n
k
)
=
A
1
(
w
n
2
k
)
+
w
n
2
k
A
2
(
w
n
2
k
)
(
k
∈
0
−
2
n
)
A(w_{n}^{k}) = A_{1}(w_{\frac n{2}}^{k}) + w_{\frac n{2}}^{k} A_{2}(w_{\frac n{2}}^{k}) (k\in0-{\frac2{n}})
A(wnk)=A1(w2nk)+w2nkA2(w2nk)(k∈0−n2)
A
(
w
n
k
+
2
n
)
=
A
1
(
w
n
2
k
)
−
w
n
2
k
A
2
(
w
n
2
k
)
(
k
∈
0
−
2
n
)
A(w_{n}^{k + \frac2{n}}) = A_{1}( w_{\frac n{2}}^{k} ) - w_{\frac n{2}}^{k} A_{2}( w_{\frac n{2}}^{k} ) (k\in0-{\frac2{n}})
A(wnk+n2)=A1(w2nk)−w2nkA2(w2nk)(k∈0−n2)
由此发现,一个较长的DFT可以有两个较短的DFT组成,通过不断的分解直到无法分解,
这样问题最后就分解成许多由两个元素组成的DFT,复杂问题被简化,接下来我们寻找分解规律
再对起止的数分析
很明显最后分解的顺序就是0-n的二进制数的倒序(倒序可以通过位操作轻松处理)
对分解结构化(蝴蝶操作基础)
既然发现最后分解后的顺序,我们可以直接通过蝶形算法不断 复数乘以 旋转因子 然后根据复数加减向上合并,完成FFT。注意:所有和
w
w
w有关的计算全部要使用复数的加减乘法运算法则(
w
w
w的实部与虚部可以提前通过电脑计算出存储在程序中,减少计算量,为再次减少计算量可以通过简化只处理sin部分,不过会丢失相位信息)。