信号处理(一)获取信号频谱——傅里叶变换


前言

本文主要介绍傅里叶变换的思想及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(t)+jsin(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)=ejnω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)×ej2π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实现,傅里叶变换能够将时域信号转换为频域信号,从而获取频谱信息,这是信号处理最基础也最有用的方法。

  • 3
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
《数字信号处理——基于计算机的方法(第四版)》是托马斯·布罗科克(Tomas Broek)编写的一本经典教材,该教材介绍了数字信号处理的基本理论和方法。与传统的信号处理相比,数字信号处理采用计算机来进行信号的采样、量化、编码和处理,能够更加灵活和高效地处理各种类型的信号。 书中给出了很多基于MATLAB的源程序,以帮助读者更好地理解和应用所学的知识。这些源程序覆盖了信号的采样和重建、离散傅里叶变换、滤波器设计、窗函数、频谱分析等多个领域。通过运行这些源程序,读者可以直观地感受到信号处理的过程和结果,加深对理论的理解,提高实际应用的能力。读者也可以根据自己的需求和兴趣,对源程序进行修改和扩展,实现更加复杂的信号处理算法。 通过学习这本书和使用其中的MATLAB源程序,读者可以系统地掌握数字信号处理的基本原理和方法,了解各种常用的信号处理技术,培养信号处理的思维方式和实践能力。同时,读者还可以利用这些源程序进行信号处理算法的仿真和实验,根据实际情况进行参数调整和算法优化,提高信号处理的效果和性能。 总之,《数字信号处理——基于计算机的方法(第四版)》提供了丰富的MATLAB源程序,帮助读者更好地理解和应用数字信号处理的知识。通过学习和实践,读者可以掌握信号处理的基本理论和技术,为实际工程和科研应用打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值