前言
本文主要介绍傅里叶变换的思想及matlab实现,旨在用简单的语言讲清楚。由于傅里叶变换的原理涉及大量数学推导,因此不过多介绍。
一、傅里叶变换是什么?
1.信号分解
在高中,我们知道,对于一个向量 a = ( x , y ) a = (x, y) a=(x,y),可以用二维平面上的一个有向箭头来表示,并且,这个有向箭头可以被分解到x轴和y轴上,即
( x , y ) = x ( 1 , 0 ) + y ( 0 , 1 ) (x, y) = x(1, 0) + y(0, 1) (x,y)=x(1,0)+y(0,1)
这个过程就是将向量分解成最简单的向量的过程,而这“最简单的向量”,数学上称之为“基”。对于信号,我们也希望能够将其分解为简单的函数之和,因此,信号分解就是寻找“基函数”,并确定每个基函数的幅值大小的过程。
2.简谐运动
自然界中,当物体发生振动时,最简单最基本的振动类型即为简谐运动,用数学函数来表达简谐运动,会发现其实质就是正弦运动,用三角函数表达。
x = A × s i n ( ω × t + ϕ ) x = A \times sin(ω \times t + \phi) x=A×sin(ω×t+ϕ)
而在高数中,我们知道三角函数是正交的。因此,三角函数系能够作为信号的正交基函数。
3.傅里叶级数
对于时域上的连续周期信号 x ( t ) x(t) x(t),可以将其分解成多个三角函数之和。
x ( t ) = ∑ n = − ∞ ∞ C n × e j n ω t x(t)= \sum_{n=-{\infty}}^{\infty} C_n\times e^{jn\omega t} x(t)=∑n=−∞∞Cn×ejnωt
e j n ω t = cos ( n ω t ) + j sin ( n ω t ) e^{jn\omega t}=\cos(n\omega t) + j\sin(n\omega t) ejnωt=cos(nωt)+jsin(nωt)
以上分解过程即为傅里叶级数,可以这么说,傅里叶级数以三角函数系为正交基函数,将输入信号 x ( t ) x(t) x(t)分解成一组三角函数。那么这组三角函数中,谁占的比例(权重)最大呢?这就需要通过权重系数 C n C_n Cn来确定。
C n = 1 T 0 ∫ < T 0 > x ( t ) × ( e j n ω t ) ∗ d t C_n=\frac{1}{T_0}\int_{<T_0>}x(t)\times(e^{jn\omega t})^*dt Cn=T01∫<T0>x(t)×(ejnωt)∗dt
( e j n ω t ) ∗ = e − j n ω t (e^{jn\omega t})^*=e^{-jn\omega t} (ejnωt)∗=e−jnωt
如何理解上述公式呢?在数学中,使用内积变换来衡量两个函数的相似性,相似性越大,说明该函数在 x ( t ) x(t) x(t)中的权重也就越大。由于 e j n ω t e^{jn\omega t} ejnωt是复数,因此在求内积时需要乘以其共轭复数。
总结一下,傅里叶级数就是将输入信号分解为一系列三角函数,并且通过内积变换算出每个三角函数和 x ( t ) x(t) x(t)之间的相似性,从而确定权重系数 C n C_n Cn。
4.傅里叶变换
对于时域上的连续非周期信号,无法通过傅里叶级数将信号进行分解,因此,才有了傅里叶变换。同样地,傅里叶变换也是将输入信号分解成一系列三角函数之和,公式如下。
X ( f ) = ∫ − ∞ ∞ x ( t ) × e − j 2 π f t d t X(f)=\int_{-\infty}^{\infty}x(t)\times e^{-j2\pi ft}dt X(f)=∫−∞∞x(t)×e−j2πftdt
这个公式跟傅里叶级数中
C
n
C_n
Cn的计算公式有点像,区别在于此时积分区间是不同的,可以看成
T
⇒
∞
T\Rightarrow\infty
T⇒∞ 时的情况。
得到
X
(
f
)
X(f)
X(f)后,就能根据
(
f
,
∣
X
(
f
)
∣
)
(f,|X(f)|)
(f,∣X(f)∣)画出信号的频谱图。
二、Matlab实现
1.Matlab代码
实际操作中,使用快速傅里叶(Fast Fourier Transform,FFT)算法来求信号的频谱,具体代码如下。
fs = 1000;
t = (1:fs)/fs;
y = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
figure;
plot(t, y)
title('Origin signal')
xlabel('Time(s)')
ylabel('Amplitude')
L = length(y);
Y = fft(y);
P2 = abs(Y/L);
P1 = P2(1:floor(L/2)+1);
P1(2:end-1) = 2*P1(2:end-1);
f = fs * (0:L/2)/L;
figure
plot(f, P1)
title('frequency spectrum')
xlabel('frequency(Hz)')
ylabel('Amplitude')
2.输出图片
总结
本文简单介绍了傅里叶变换的思想及matlab实现,傅里叶变换能够将时域信号转换为频域信号,从而获取频谱信息,这是信号处理最基础也最有用的方法。