傅里叶变换的学习
一直以来对傅里叶变换的理解不够深入,对于用计算机实现采集到的离散信号进行频谱分析也没有实际操作过。信号采集的硬件部分我已经基本掌握,在上课所做的ppt中也有所体现,而对采集到的信号进行软件处理,我却做得很少,所以希望利用本次课的机会把离散傅里叶变换学会。下面首先根据阅读的书籍阐述对傅里叶变换的理解,然后利用matlab和LabVIEW对一个信号进行了FFT变换。
对于信号处理我们是做傅里叶变换,对于系统的数学模型处理我们是做拉普拉斯变换,将s换成jω就是系统的频率特性,频率特性我们用Bode图可以研究系统的稳定性。这些都已经学过。那么系统进行时域向复数域或者频域变换的目的是研究系统的稳定性等特性,信号的傅里叶变换的目的是在变换之后能够看到该信号由哪些频率的信号组成,而对于机械系统都有其固有频率,所以对分辨系统组成等问题提供了很好的解决方法。
傅里叶提出:任何连续周期信号可以由一组适当的正弦曲线组合而成。这是傅里叶变换的根本所在,这句话揭示了信号的本质组成,也可以说级数(如泰勒级数和傅里叶级数等)可以近似或者说在无穷的情况下等于某种函数。谐波信号是我们研究和认识最清楚的一类信号,从谐波信号的表达式中我们可以很清楚的看到频率、相位和幅值信息。所以傅里叶的想法实在是非常的绝,这是伟大的创造。此处需指出一个问题,就是傅里叶变换跟函数变换是不同的,通常意义上的函数变换是映射,而傅里叶变换不是映射,是无穷序列的和与函数值的近似。
连续周期信号用傅里叶级数展开,连续非周期信号用傅里叶变换,离散周期信号用离散傅里叶变换,离散非周期信号用离散时域傅里叶变换,如图1所示。这些我们都知道,而且在本科阶段就已经学习过。但机械专业的学生很多学校都没有开设实验课或者没有讲解离散傅里叶变换,导致像我这样的学生就一直没有理解离散傅里叶变换,也不会用软件在工程实际中去实现离散信号的频谱分析。
图1 信号与傅里叶变换方法对应关系
傅里叶级数表达式:
傅里叶变换表达式:
dt e t f j F ⎰∞
∞--=t  j )()(ωω
从以上两个表达式我们可以看到两个问题:第一,连续周期信号的频谱是离散的,连续非周期信号的频谱是连续的,这是因为以上两个计算公式的原因,一个是离散的和,一个是积分,这很容易理解;第二,他们在时间上都是无穷大的。
离散傅里叶变换表达式:
1
0()(),0,1,,1N kn N n X k x n W k N -===⋅⋅⋅-∑
上式中k 相当于ω,但并不等于,有一个换算关系,后面再详细叙述。N 是采样点的个数,W N =e −j2π/N ,也就是相当于e −jω,求和相当于积分。我们很容易发现离散傅里叶变换与连续傅里叶变换的一个不同之处,那就是积分区间不是无穷大的。原因是离散傅里叶变换是在计算机上去做,计算机无法处理无穷的数据,只能是有限的数据。那么这就相当于给原始信号加了矩形窗,而加窗处理不可
避免的带来能量的泄漏,使得频谱幅值变小,精度降低。这就导致很多人研究离散傅里叶变换的校正问题。此处我们先不谈这个问题。
由于DFT (Discrete Fourier Transform, DFT )存在对复数计算量大的问题,人们就提出了快速傅里叶变换FFT (Fast Fourier Transform, FFT )。至于快速傅里叶变换的算法有很多种,在此不要叙述,因为我不是要去研究快速傅里叶变换的方法,我是要用FFT 。下面对Matlab 中傅里叶变换函数的具体用法作介绍,这也就是我学习FFT 的重点所在。
采样得到的数字信号,就可以做FFT 变换了。N 个采样点,经过FFT 之后,就可以得到N 个点的FFT 结果。为了方便进行FFT 运算,通常N 取2的整数次方。假设采样频率为Fs ,信号频率F ,采样点数为N 。那么FFT 之后结果就是一个为N 点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A ,那么FFT 的结果的每个点(除了第一个点直流分量之外)的模值就是A 的N/2倍。而第一个点就是直流分量,它的模值就是直流分量的N 倍。而每个点的相位呢,就是在该频率下的信号的相位。第一个点表示直流分量(即0Hz ),而最后一个点N 的再下一个点(实际上这个点是不存在的,这里是假设的第N+1个点,也可以看做是将第一个点分做两半分,另一半移到最后)则表示采样频率Fs ,这中间被N-1个点平均分成N 等份,每个点的频率依次增加。例如某点n 所表示的频率为:Fn=(n-1)*Fs/N 。由上面的公式可以看出,Fn 所能分辨到频率为为Fs/N ,如果采样频率Fs 为1024Hz ,采样点数为1024点,
则可以分辨到1Hz 。1024Hz 的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT ,则结果可以分析到1Hz ,如果采样2秒时间的信号并做FFT ,则结果可以分析到0.5Hz 。如果要提高频率分辨力,则必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。 下面以一个实际的信号来做说明。假设我们有一个信号,它含有2V 的直流分量,频率为50Hz 、相位为-30度、幅度为3V 的交流信号,以及一个频率为75Hz 、相位为90度、幅度为  1.5V 的交流信号。用数学表达式就是如下:x (t)=2+3sin (100πt −30°)+
1.5sin (150πt +90°)。式中cos 参数为弧度,所以-30度和90度要分别换算成弧度。我们以256Hz 的采样率对这个信号进行采样,总共采样256点。按照我们上面的分析,Fn=(n-1)*Fs/N ,我们可以知道,每两个点之间的间距就是1Hz ,第n 个点的频率就是n-1。我们的信号有3个频率:0Hz 、50Hz 、75Hz ,应该分别在第1个点、第51个点、第76个点上出现峰值,其它各点应该接近0。实际情况如何呢?我们来看看FFT 的结果如图2所示。图3为幅频谱。
图2 频谱图图3 幅频谱
程序为:
t=0:1/256:1;
x=2+3*sin(2*pi*50*t-30*pi/180)+1.5*sin(2*pi*75*t+90*pi/180);
xfft=fft(x,257);
absxfft=abs(xfft);
figure
plot(t,x);
grid on;
figure
plot(0:256,xfft);
grid on;
figure
plot(0:256,absxfft);
grid on;
matlab求傅里叶变换从图中我们可以看到,在第1点、第51点、和第76点附近有比较大的值。我们分别将这三个点附近的数据拿上来细看:
1点:514+0i
51点:32.9 – 358.5i
76点:98.8 +1 35.5i
分别计算这三个点的模值,结果如下:
1点:514
50点:57.42
51点:360
52点:89.59
75点:39.6
76点:167
77点:67.5
按照公式,可以计算出直流分量为:514/N=514/256=2.008;50Hz信号的幅度为:360/(N/2)=360/(256/2)=2.81;75Hz信号的幅度为167/(N/2)=167/(256/2)=1.3。可见,从频谱分析出来的幅度跟真实幅度是有差别的。
LabVIEW中也可以实现对该信号的频谱分析,其幅频谱如图3所示,程序如图4所示。
图3 LabVIEW中幅频谱
图4 LabVIEW程序框图

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。