如何优雅地进行频谱分析—— 一行代码实现绘制MATLAB频谱、功率谱图
之前的文章里讲了关于信号频谱、能量谱的相关理论和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频谱、功率谱图相关推荐
- Python一行代码即可绘制和弦图
步骤 1.和弦图简介 1.1.和弦图构成 1.2.和弦图应用场景 2.和弦图Python库 3.chord的安装及使用 1.和弦图简介 和弦图(chord Diagram),是一种显示矩阵中数据间相互 ...
- python分形曲线代码_Python:绘制L-System的分形图
# -*- coding: utf-8 -*- #L-System(Lindenmayer system)是一种用字符串替代产生分形图形的算法 from math import sin, cos, p ...
- 25条实用的Python一行代码,你用过哪些?
自从我用Python编写第一行代码以来,就被它的简单性.出色的可读性和特别流行的一行代码所吸引. 在下面,我将给大家介绍并解释一些非常实用Python一行程序. 可能有些你还不知道,但对你未来的Pyt ...
- 一行代码实现Okhttp,Retrofit,Glide下载上传进度监听
2019独角兽企业重金招聘Python工程师标准>>> 发表上篇文章 我一行代码都不写实现Toolbar!你却还在封装BaseActivity? 已是一个月前的事情~ 上篇文章的研究 ...
- 一行代码快速搞定Flowable断点下载(上)
一行代码快速搞定Flowable断点下载(上) 之前我们大致讲了讲,到底怎么完全将disposable相关代码完全隐藏. 然后到了这里,可能有些杠精就会说了,你那个方式,我们不是完全不能拿到Flowa ...
- python代码大全p-如何写出优雅又地道的Python代码?【转载】
在Python社区文化的浇灌下,演化出了一种独特的代码风格,去指导如何正确地使用Python,这就是常说的pythonic.一般说地道(idiomatic)的python代码,就是指这份代码很pyth ...
- 一行代码搞定 R 语言模型输出!(使用 stargazer 包)
引言 使用stargazer包可以将 R 构建的模型结果以LATEX.HTML和ASCII格式输出,方便我们生成标准格式的表格. 再结合rmarkdown,你就可以轻轻松松输出一篇优雅的文章啦~ 本文 ...
- datatables 一行数据生成两行_一行代码搞定分组回归
写 在前面 在目前为止所有小伙伴们向大猫请教过的R问题中,大猫总结了最常遇见同时也是比较难的三个问题,分别是(1)事件研究法:(2)分组回归:(3)滚动回归.事件研究法在第一期中已经讲述,本期我们就来 ...
- 我就改了一行代码,为什么就全超时了?
Xargin:今年 6 月的 GopherChina,我去做一次会前培训,性能优化相关的主题,之前的社区分享没有讲的一些细节会展开来详细说.感兴趣的同学可以了解一下- 下面是宣传文: 为什么我只改了一 ...
最新文章
- 关于RAID与SCSI的一些基本概念(转)
- Git 安装及常用操作配置
- 第二十四章:页面导航(五)
- leetcode------Remove Duplicates from Sorted Array II
- 【Android】如何查看android cpu是32位还是64位
- Eclipse使用TODO标签管理任务及自定义TODO标签
- linux向上翻页_Linux下vim编辑器命令大全
- 多重操作系统安装全解析
- java多线程知识点之wait和sleep的区别
- 微pe工具箱具体分区教程
- 超级搜索术5-商业变现/生活便捷
- PDF编辑技巧2:删除页面和添加页面
- JavaScript-射击比赛成绩单编程
- linux nginx进程占用80端口杀不掉
- 宏观调控利于粮食安全,调控与市场关系需理顺
- R语言实战 第2版 中文目录
- 怎么用Python测网速?
- win10系统mongodb 5.0安装配置+自动启动
- 周志华机器学习——聚类算法。
- es是什么,能做什么?
热门文章
- 英特尔®傲腾™持久内存+MemVerge软硬结合发挥极致性能
- MySQL报2003错误
- SpringBoot之----yaml语法详解
- 点击添加MSN机器人小新,为您收听下载MSDN中文网络广播课程加油助力
- 【华为OJ】【107-24点运算】
- 优思学院|六西格玛黑带和带级的的由来|原创文章
- AMD APU A10-5800K, Debian Wheezy, 系统安装ATI闭源驱动
- android nmea 工具,Android模拟GPS数据生成kml和nmea文件
- 记一次服务器“挖矿“处理
- MapReduce 自定义计数器