《快速傅立叶变换在数据处理中的应用.docx》由会员分享,可在线阅读,更多相关《快速傅立叶变换在数据处理中的应用.docx(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、快速傅立叶变换FFT在数据处理中的应用1、FFT物理意义FFT是离散傅立叶变换的快速算法,可以将一个时域信号变换到频域。因为有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了。这就是很多信号分析采用FFT变换的原因。另外,FFT可以将一个信号的频谱提取出来,这在频谱分析方面也是经常用的。 虽然很多人都知道FFT是什么,可以用来做什么,怎么去做,但是却不知道FFT之后的结果是什意思、如何决定要使用多少点来做FFT。 传感器采样AD转换数据处理设备原始信号电信号数字信号一个模拟信号,经过AD采样之后,就变成了数字信号。采样定理告诉我们,采样频率要大于信号频率的两倍。图
2、1 数据的采集过程假设采样频率为Fs,信号频率F,采样点数为N。那么FFT之后结果就是一个为N点的复数。每一个点就对应着一个频率点。这个点的模值,就是该频率值下的 幅度特性。具体跟原始信号的幅度有什么关系呢?假设原始信号的峰值为A,那么FFT的结果的每个点除了第一个点直流分量之外的模值就是A的N/2倍。 而第一个点就是直流分量,它的模值就是直流分量的N倍。而每个点的相位就是在该频率下的信号的相位。第一个点表示直流分量即0Hz,而最后一个点 N的再下一个点实际上这个点是不存在的,这里是假设的第N+1个点,可以看做是将第一个点分做两半分,另一半移到最后那么表示采样频率Fs,这中间被 N-1个点平均
3、分成N等份,每个点的频率依次增加。例如某点n所表示的频率为:。由上面的公式可以看出,Fn所能分辨到频率为 Fs/N,如果采样频率Fs为1024Hz,采样点数为1024点,那么可以分辨到1Hz。1024Hz的采样率采样1024点,刚好是1秒,也就是说,采样1秒时间的信号并做FFT,那么结果可以分析到1Hz,如果采样2秒时间的信号并做FFT,那么结果可以分析到0.5Hz。如果要提高频率分辨力,那么必须增加采样点数,也即采样时间。频率分辨率和采样时间是倒数关系。假设FFT之后某点n用复数a+bi表示,那么这个复数的模就是相位就是。根据以上的结果,就可以计算出n点n1,且n=N/2对应的信号的表达式为
4、:S=AnN/2cos(2Fnt+Pn) n1,且n=N/2对于n=1点的信号,是直流分量,幅度即为A1/N。由于FFT结果的对称性,通常我们只使用前半局部的结果,即小于采样频率一半的结果。2、FFT在分析空间路面谱中的应用空间路面谱是一定车速下,路面不平度随时间变化的曲线。很多情况下我们只关心空间路面谱的主频率,其他信息往往不在考虑范围内。如主动悬架技术。主动悬架是跟据不同的路面来调节悬架的阻尼和刚度,从而提高舒适性的一种设备。如平直的路面,适当提高悬架的阻尼和刚度,提高稳定性。颠簸的路面那么相反,适当减少阻尼和刚度,提高舒适性。而路面情况识别的其中一种算法就是跟据路面的频率来确定。路面频率
5、较低时认为是平直路面,路面频率较高时认为是颠簸路面。空间路面谱原始信号的采集一般都使用加速度传感器。将加速度传感器安装到汽车悬架的上方,在汽车行驶的过程中通过采集设备采集加速度传感器的信号。而加速度信号能较好的表达出路面的情况。如果我们采集到如图2那样的原始信号。在不经过处理的情况下很难对其频率进行分析。这时FFT就成为我们很好的工具了。图2 采集到的原始信号由信号处理知识可以知道,任何的信号都可以用正弦波来叠加或逼近。对上图的信号进行FFT后,我们就可以知道它由那些正弦波所叠加,并知道每一个正弦波的峰峰值。这样峰峰值最高的正弦波就可以认为是原始信号的主频率。假设我们的采集频率FS=256。采
6、集点数N256。我们对图2进行256点的FFT,得到的是256个复数,对每个复数求模后结果如图3所示。图3 进行256点FFT后的频谱波形FFT的结果是有对称性的。这上面已经提过。因此我们只分析一半就可以。我们以256Hz的采样率对这个信号进行采样,总共采样256点。按照我们上面的分析,Fn=(n-1)*Fs/N,我们可以知道,每两个点之间的间距就是1Hz,第n个点的频率就是n-1。由上图可知,第51点的模值是最高的,但是这一点所代表的正弦波的频率和峰峰值一眼也很难看出来。我们不仿把上面的图转换为实际的频率和模值。转换的方法在上面已经提过了。图4就是转换过后的结果。要注意的是转换后我们只保存其
7、中一半的信号。图4 转换后的频谱图经过转换后可以清楚的看到,频率为50Hz的正弦波是原始信号中峰值最高的。其峰值为3。因此可以认为此路面的主频为50Hz知道主频后,我们就可以跟据实车的情况调节悬架的阻尼和刚度了。但是实际路面上有可能频谱各点的模值并没有分布得如此明显。主动悬架也不是一两个算法就可以控制得好的,必须多种方法的混合使用。附:MATLAB仿真代码。Fs=256; %采样频率(Hz)N=256; %采样点数%显示原始信号plot(t,S);title(原始信号); figure;Y = fft(S,N); %做FFT变换Ayy = (abs(Y); %取模plot(Ayy(1:N);
8、%显示原始的FFT模值结果title(FFT 模值);figure;Ayy=Ayy/(N/2); %换算成实际的幅度Ayy(1)=Ayy(1)/2;F=(1:N-1)*Fs/N; %换算成实际的频率值plot(F(1:N/2),Ayy(1:N/2); %显示换算后的FFT模值结果title(幅度-频率曲线图);3、利用FFT进行数值的滤波汽车上的信号很容易被干扰,特别是传感器输出的模拟信号。如油门开度传感器,水温传感器,真空度传感器等。图5就是一个被高频信号干扰后的正弦波信号。图5 被高频信号干扰后的正弦波信号由上图可以看得出,正弦波的根本形状还在,但是波形上叠加了很多的高频杂波。这些杂波的存
9、在对数据的分析,甚至是现场的控制都差生很大的影响。而不管是硬件上的电容滤波还是软件上的均值和中值滤波都很难得到很好的滤波效果。下面将介绍一种基于FFT和理想低通滤波器的一种滤波方式。这种方式的滤波能使波形变得光滑。先对波形进行FFT,并取每一点的模。如图6所示高频干扰图6 原始信号的频谱图由上图可以看到,在低频处有一个模值特别高的点,这一点就是就是原信号的数据。这是我们需要保存的点。而在高频局部还有很多模值相对较小的点。这些就是干扰信号。就是我们要去除的数据。对数据进行低通滤波,把高频的信号去掉,得到如图7所示的频谱图。图7 进行低通滤波后的频谱图由上图可以看到,高频局部的杂波已经被去除。这时
10、要看看时域的波形上有什么变化了。对频谱数据进行反傅立叶变换就能得到经过低通滤波后的时域波形了,如图8和图9所示。其中红线是经过滤波后得到的。图9是图8的局部放大图。图8 滤波前后比照图图9 滤波前后比照图局部放大图总结:使用FFT对数据进行滤波的效果还是比拟好的。但是以上的原始波形只是为了演示方便而设计的仿真数据。实际上数据受到的干扰要严重得多,这就需要合理地选择低通滤波器的滤波范围。而且不是所有信号都适合使用FFT进行滤波。如信号中确实有突变的情况下,如果还使用FFT进行滤波就会把信号中的有用局部给滤掉。而且FFT的计算量相对较大,对于一般的嵌入式系统要耗掉大量的时间。因此,要慎重使用。附:
11、 FFT滤波的MATLAB仿真代码close all; %先关闭所有图片Adc=2; %直流分量幅度Fs=256; %采样频率(Hz)N=256; %采样点数t=0:1/Fs:N/Fs; %采样时刻S=3*cos(2*pi*2*t+pi*-30/180)+0.1*cos(2*pi*75*t+pi*90/180)+0.2*cos(2*pi*350*t+pi*30/180) +0.1*cos(2*pi*50*t+pi*30/180)+0.2*cos(2*pi*125*t+pi*30/180);%模拟的原始信号plot(t,S);%显示原始信号title(原始信号);hold onfigure;Y=fft(S,256);%对信号进行256点的FFTAyy=abs(Y);%取模plot(Ayy);%显示取模后的FFT信号RY=real(Y);%提取FFT后数据的实部IY=imag(Y);%提取FFT后数据的虚部RY(10:N-10)=0;%理想低通滤波IY(10:N-10)=0;YY=RY+1i*IY;%滤波后重新组合实部和虚部SS=real(ifft(YY);%进行反傅立叶变换figureplot(SS,r);%显示滤波后的信号,并与原始信号进行比照hold onplot(S)
限制150内