之前的文章里讲了关于信号频谱、能量谱的相关理论和MATLAB编程实现方法:

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

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

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

所以笔者想做这样一件事:编写一个函数,同学们只需要导入自己要分析的数据,并按照自己的需求设置部分选项,调用一行代码就可以实现绘制频谱图/功率谱图。

今天他来了。

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

首先我们生成一段测试信号,它是由50Hz和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

现在调用一下这个函数:

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时,只绘制信号频谱图(默认)
%                                    当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时,绘制信号时域图和频谱图在同一张图上(上下两张)

函数预留了扩展接口,如果同学们还想要加入什么功能可以留言告诉我。

上边的测试代码和pSpecAnalysis函数,可以在下边链接获取:

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

编程不易,感谢支持~

最后

后边可能会不定期地将一些常用方法封装一下,作为专栏的番外了。

类EMD分解方法介绍完之后,将开始重点讲时间序列分析和深度学习。

敬请期待!

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

  1. Python一行代码即可绘制和弦图

    步骤 1.和弦图简介 1.1.和弦图构成 1.2.和弦图应用场景 2.和弦图Python库 3.chord的安装及使用 1.和弦图简介 和弦图(chord Diagram),是一种显示矩阵中数据间相互 ...

  2. python分形曲线代码_Python:绘制L-System的分形图

    # -*- coding: utf-8 -*- #L-System(Lindenmayer system)是一种用字符串替代产生分形图形的算法 from math import sin, cos, p ...

  3. 25条实用的Python一行代码,你用过哪些?

    自从我用Python编写第一行代码以来,就被它的简单性.出色的可读性和特别流行的一行代码所吸引. 在下面,我将给大家介绍并解释一些非常实用Python一行程序. 可能有些你还不知道,但对你未来的Pyt ...

  4. 一行代码实现Okhttp,Retrofit,Glide下载上传进度监听

    2019独角兽企业重金招聘Python工程师标准>>> 发表上篇文章 我一行代码都不写实现Toolbar!你却还在封装BaseActivity? 已是一个月前的事情~ 上篇文章的研究 ...

  5. 一行代码快速搞定Flowable断点下载(上)

    一行代码快速搞定Flowable断点下载(上) 之前我们大致讲了讲,到底怎么完全将disposable相关代码完全隐藏. 然后到了这里,可能有些杠精就会说了,你那个方式,我们不是完全不能拿到Flowa ...

  6. python代码大全p-如何写出优雅又地道的Python代码?【转载】

    在Python社区文化的浇灌下,演化出了一种独特的代码风格,去指导如何正确地使用Python,这就是常说的pythonic.一般说地道(idiomatic)的python代码,就是指这份代码很pyth ...

  7. 一行代码搞定 R 语言模型输出!(使用 stargazer 包)

    引言 使用stargazer包可以将 R 构建的模型结果以LATEX.HTML和ASCII格式输出,方便我们生成标准格式的表格. 再结合rmarkdown,你就可以轻轻松松输出一篇优雅的文章啦~ 本文 ...

  8. datatables 一行数据生成两行_一行代码搞定分组回归

    写 在前面 在目前为止所有小伙伴们向大猫请教过的R问题中,大猫总结了最常遇见同时也是比较难的三个问题,分别是(1)事件研究法:(2)分组回归:(3)滚动回归.事件研究法在第一期中已经讲述,本期我们就来 ...

  9. 我就改了一行代码,为什么就全超时了?

    Xargin:今年 6 月的 GopherChina,我去做一次会前培训,性能优化相关的主题,之前的社区分享没有讲的一些细节会展开来详细说.感兴趣的同学可以了解一下- 下面是宣传文: 为什么我只改了一 ...

最新文章

  1. 关于RAID与SCSI的一些基本概念(转)
  2. Git 安装及常用操作配置
  3. 第二十四章:页面导航(五)
  4. leetcode------Remove Duplicates from Sorted Array II
  5. 【Android】如何查看android cpu是32位还是64位
  6. Eclipse使用TODO标签管理任务及自定义TODO标签
  7. linux向上翻页_Linux下vim编辑器命令大全
  8. 多重操作系统安装全解析
  9. java多线程知识点之wait和sleep的区别
  10. 微pe工具箱具体分区教程
  11. 超级搜索术5-商业变现/生活便捷
  12. PDF编辑技巧2:删除页面和添加页面
  13. JavaScript-射击比赛成绩单编程
  14. linux nginx进程占用80端口杀不掉
  15. 宏观调控利于粮食安全,调控与市场关系需理顺
  16. R语言实战 第2版 中文目录
  17. 怎么用Python测网速?
  18. win10系统mongodb 5.0安装配置+自动启动
  19. 周志华机器学习——聚类算法。
  20. es是什么,能做什么?

热门文章

  1. 英特尔®傲腾™持久内存+MemVerge软硬结合发挥极致性能
  2. MySQL报2003错误
  3. SpringBoot之----yaml语法详解
  4. 点击添加MSN机器人小新,为您收听下载MSDN中文网络广播课程加油助力
  5. 【华为OJ】【107-24点运算】
  6. 优思学院|六西格玛黑带和带级的的由来|原创文章
  7. AMD APU A10-5800K, Debian Wheezy, 系统安装ATI闭源驱动
  8. android nmea 工具,Android模拟GPS数据生成kml和nmea文件
  9. 记一次服务器“挖矿“处理
  10. MapReduce 自定义计数器