MatLab学习笔记之-------fft频谱分析 2019.12.13
为什么要进行fft频谱分析
1.
在当今生活中,控制与我们息息相关。但是控制好坏与我们对数据的处理程度又有着密不可分的联系。在信号处理方面,对于传感器的滤波起着至关重要的作用。一般情况下我们通过一些类似于上位机这样的平台来获取传感器传回来的数据,并且通过传回来的数据实时将图像反映在上位机上。但是我们只能获取到时域上的信号,却没有能够在频域上来审视波形。自然而然,我们对数据的滤波也达不到一个比较完美的效果。
2.
现在我们对数据的滤波处理算法一般是递推平均滤波、中位值滤波、加权递推平均滤波、一阶互补滤波等等比较简单的算法。其适用的也一般是控制系统不怎么复杂的环境。一旦遇到比较复杂的环境或者该系统对数据的准确性比较苛刻的,以上的算法就不再适用。这时候就会涉及到卡尔曼滤波了(关于卡尔曼我以后有机会会写这方面的文章),但是卡尔曼滤波严格意义上不能称作滤波,只能是针对误差来进行最优估计和延时修正罢了。
3.
我们接下来讲的这fft频谱分析主要是针对于对于加速度计和陀螺仪的二阶巴特沃斯滤波(关于这方面我以后也会进行讲述),如果不知道输入该控制系统的信号有哪些频段的噪声,那自然而然我们在控制该系统的时候,也达不到我们想要达到的效果。所以对于数据信号的fft频谱分析是非常有必要,并且需要借助matlab这个非常强大的工具。
fft分析需要掌握的几个要点
1.采样定理
只要采样频率大于或等于有效信号最高频率的两倍,采样值就可以包含原始信号的所有信息,被采样的信号就可以不失真的还原原始信号。
2.通带
对于幅频特性,能够通过的信号频率范围
3.幅频、相频特性
幅频特性:输出信号的幅值与输入信号的幅值之比。
相频特性:输出信号的相角与输入信号的相角之比。
4.频谱特性
频谱关于中间位置对称,只需要观察(N/2 + 1)个频率点。
时域采集N个点,频域只需要观察(N/2 + 1)个点。
5.幅值修正
因为我们用matlab仿真之后得到的信号幅值是在频域上的,而我们需要知道的是时域上的幅值。转换公式如下:
6.频率分辨率
那么有了上面的频率分辨率了,我们就可以知道频谱图上某点n所表示的频率为
那么我们如果想要提高频率分辨率,则必须减少采样点数即采样时间。
7.求时域上的相位角
FFT之后某点n用复数a+bi表示,那么这个复数的模就是An=根号aa+bb,相位就是Pn=atan2(b,a)。根据以上的结果,就可以计算出n点(n≠1,且n<=N/2)对应的信号的表达式为:An/(N/2)cos(2piFnt+Pn),即2An/Ncos(2piFn*t+Pn)。
对于n=1点的信号,是直流分量,幅度即为A1/N。
MatLab示例代码
Fs = 1000; %采样频率
T = 1/Fs; %采样间隔
L = 1000; %信号长度
t = (0:L-1)*T; %时间向量
figure;
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t); %产生正弦合成信号
y =x + 2*randn(size(t)); %添加白噪声
plot(Fs*t(1:50),y(1:50))
title('原始信号')
xlabel('time (ms)')
figure;
NFFT = 2^nextpow2(L);
Y = fft(y,NFFT)/L;
f = Fs/2*linspace(0,1,NFFT/2+1);
plot(f,2*abs(Y(1:NFFT/2+1)))
title('幅值谱')
xlabel('Frequency (HZ)')
ylabel('|Y(f)|')
MatLab效果图
原始信号效果图
幅值谱效果图
总结
可以借助matlab这个工具来对输入系统的信号进行fft频谱分析,能够得出在此信号频段中掺杂的噪声,并且根据自己所写的滤波算法将固定频段的噪声去掉,达到滤波的作用。
好了,以上就是我对于FFT频谱分析的理解,可能会有理解不对的地方,如果有,希望大家批评指正,谢谢!!!
上一篇: eeprom驱动的移植