资讯详情

如何优雅地进行频谱分析—— 一行代码实现绘制MATLAB频谱、功率谱图

前一篇文章讨论了信号频谱和能量谱的相关理论MATLAB编程实现方法:

Mr.看海:对信号频域分析方法的理解(频谱、能量谱、功率谱、倒频谱、小波分析)

Mr.看海:提取频域特征值MATLAB代码实现(频谱、功率谱、倒频谱)

然而,对于刚刚开始的研究,或者对MATLAB不甚熟悉,抑或者不想花太多时间用在编程这件事上的同学,目前缺少一种足够便捷、高效、可靠的代码。

所以作者想做这样的事:

他今天来了。

一、频谱分析函数的基本用法

首先,我们生成由50生成的测试信号Hz和120Hz两段正弦信号叠加形成:

%% 1.生成仿真信号 Fs = 1000;            % 采样频率           T = 1/Fs;             % 采样间隔     L = 1500;             % 信号长度 t = (0:L-1)*T;        % 时间轴 S = 0.7*sin(2*pi*50*t)   sin(2*pi*120*t); figure('color','w') plot(t,S,'k');xlabel(时间);ylabel(‘幅值’)

测试信号图像如下:

我把这个频谱分析函数命名为

现在调用一下这个函数:

pSpecAnalysis(S,Fs,[]);

此时可以画出上述信号的频谱图:

频谱的主频和振幅值可以完美匹配

所以在调用pSpecAnalysis只需输入时域信号和采样频率够简单了。

要分析自己的信号,只需替换函数的入口参数即可。

二、频谱分析函数的扩展用法-去趋势

但仅仅实现画频谱图是不够的。

细心的同学可能注意到了pSpecAnalysis函数还有第三个入口参数,在上面调用时给出空值。

这是我留下的结构选项options可实现各种扩展功能的参数。

一是去趋势。

先说什么是去趋势。

不知道有没有同学在做频谱分析的时候,发现频谱图在频率为0时有一个很高的尖峰,就像这样:

这是由于信号中包含直流分量造成的。为了更好地提取每个频段的频谱特征,需要从数据中减去平均值或最佳拟合线,即去趋势。

如果要去趋势再画数据频谱,就要用options结构体中的Detrend调用函数时写字段:

options.Detrend = 1; %    options.Detrend :去趋势,设置options.Detrend = 1时,将在做fft前去除data趋势, %                      当画出的频谱图在0频率时出现峰值时,可以将选项置1,可以有效抑制0频率的峰值,默认情况不去趋势 [P1,f1] = pSpecAnalysis(S,Fs,options);

此时再画的频谱图如下:

二、频谱分析函数的扩展用法-绘图形式

这里还设置了绘图形式的可选项。

除了画上面的单个频谱图外,还可以选择将原始信号与频谱图一起画,如下:

此时的函数调用写法是(设置plotType字段):

options.plotType = 2; %    options.plotType :选择绘图类型,当options.plotType = 1:00,只绘制信号频谱图(默认) %                                    当options.plotType = 2时,在同一张图上绘制信号时,域图和频谱图(上下两张) [P1,f1] = pSpecAnalysis(S,Fs,options);

三、频谱分析函数的扩展用法-绘制功率谱

如果要画功率谱,功率谱也很常用:

options.analysisType = 'psd'; %    options.analysisType :当options.analysisType = 'fft'时,傅里叶快速变化FFT %                                        当options.analysisType = 'psd计算功率谱时 [P1,f1] = pSpecAnalysis(S,Fs,options);

画的图是这样的:

此外,在绘制功率谱图时,纵坐标可以改为分贝(dB)表示此时此刻调用:

%    options.analysisType :当options.analysisType = 'fft快速傅里叶变化时,FFT %                                        当options.analysisType = 'psd'时,计算功率谱 options.analysisType = 'psd';  %    options.psdUnit      :功率谱单位,当options.psdUnit = 1时,单位为W/Hz(默认) %                                      当options.psdUnit = 2时,单位为分贝dB options.psdUnit = 1;  [P1,f1] = pSpecAnalysis(S,Fs,options);

图像如下:

当然,在绘制功率谱图时,也可以同时设置去趋势和绘图风格。

四、函数介绍

介绍函数的主要功能后,看函数介绍:

function [p,f] = pSpecAnalysis(data,fs,options) % 对数据进行fft变换 % 输入: % data需要一维实数来分析信号 % fs采样频率,即每秒采样点数 % options是否设置可选选项,采用结构导入,安装自己的需求。具体包括: %    options.Detrend :去趋势,设置options.Detrend = 1时,将在做fft前去除data趋势, %                      当画出的频谱图在0频率时出现峰值时,可以将选项置1,可以有效抑制0频率的峰值,默认情况不去趋势 %    options.analysisType :当options.analysisType = 'fft'时,傅里叶快速变化FFT %                                        当options.analysisType = 'psd计算功率谱时 %    options.psdUnit      :功率谱单位,当options.psdUnit = 1时,单位为W/Hz(默认) %                                      当options.psdUnit = 2时,单位为分贝dB %    options.plotType :选择绘图类型,当options.plotType = 1时,只绘制信号频谱图(默认) %                                    当options.plotType = 2时,在同一上下两张)上绘制信号时域图和频谱图

函数预留了扩展接口,如果学生想添加任何功能,请留言告诉我。

快速绘图程序频谱/功率谱 | 工具箱文档

感谢您的支持,编程并不容易~

最后

一些常用的方法可能会不时封装在后面,作为专栏。

类EMD介绍分解方法后,将开始关注时间序列分析和深度学习。

敬请期待!

标签: 功率变送器gaqj

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台