VMD画图工具(公开版)

最后更新于:2023-11-08 00:08:48

一、代码运行环境:

在使用该代码前,请务必安装时频域分析工具箱。(然后再在文末下载相关代码并使用)

工具箱下载路径在这里

下载文件并解压,按照步骤操作即可完成工具箱安装。

已测试MATLAB2016/2018/2019/2020/2021,其他MATLAB版本理论上也可以使用。推荐使用MATLAB2020及以上版本。

二、文件说明

1.testVMD.m

用于测试VMD功能的脚本文件,可以直接运行其中调用了pVMD和pVMDandFFT。

2.pVMD.p

封装好的VMD画图程序,p文件。

函数参数说明:

function [imf,CenFs] = pVMD(y,FsOrT, alpha, K, tol)
% 画信号VMD分解图
% 输入:
% data:待分解的数据(一维)
% FsOrT:采样频率或采样时间向量,如果为采样频率,该变量输入单个值;如果为时间向量,该变量为与y相同长度的一维向量。如果未知采样频率,可设置为1
% alpha   - 惩罚因子
% K       - 指定分解模态数
% tol     - 收敛容差,是优化的停止准则之一,可以取 1e-6~5e-6

% 输出:
% imf:内涵模态分量,统一为n*m格式,其中n为模态数,m为数据点数。例如 imf(1,:)即IMF1,imf(end,:)即为残差
% 注意,为了与其他“类EMD”方法分解出来的imf分量保持一致,本程序内将imf排序进行了翻转
% 即保证imf排列是从高频向低频排列
% CenFs:即CentralFrequencies,各imf分量的中心频率

% 注意:在使用该代码之前,请务必安装工具箱:http://103.118.41.220/docs/index.php/2020/04/09/1/

画图效果如下(参考):

可以同时画出下边这张VMD分解的三维展开图(完整版独有):

3.pVMDandFFT.p

封装好的画图程序,可以绘制出信号VMD分解与各IMF分量频谱对照图,p文件。

函数参数说明:

function [imf,CenFs] = pVMDandFFT(y,FsOrT, alpha, K, tol)
% 画信号VMD分解与各IMF分量频谱对照图
% 输入:
% y:待分解的数据(一维)
% FsOrT: 采样频率或采样时间向量,如果为采样频率,该变量输入单个值;如果为时间向量,该变量为与y相同长度的一维向量。如果未知采样频率,可设置为1
% alpha   - 惩罚因子
% K       - 指定分解模态数
% tol     - 收敛容差,是优化的停止准则之一,可以取 1e-6~5e-6

% 输出:
% imf:内涵模态分量,统一为n*m格式,其中n为模态数,m为数据点数。例如 imf(1,:)即IMF1,imf(end,:)即为残差
% 注意,为了与其他“类EMD”方法分解出来的imf分量保持一致,本程序内将imf排序进行了翻转
% 即保证imf排列是从高频向低频排列
% CenFs:即CentralFrequencies,各imf分量的中心频率

% 例1:(FsOrT为采样频率)
% fs = 100;
% t = 1/fs:1/fs:1;
% y = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pVMDandFFT(y,fs,2000,2,1e-7);
% 例2:(FsOrT为时间向量,需要注意此时FsOrT的长度要与y相同)
% t = 0:0.01:1;
% y = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pVMDandFFT(y,t,2000,2,1e-7);

% 注意:在使用该代码之前,请务必安装工具箱:http://hk.khscience.cn/docs/index.php/2020/04/09/1/

画图效果如下(参考):

4.kVMD.p

整合版VMD函数,整合了第三方VMD和MATLAB自带工具箱的VMD分解方法,并且统一输出格式,配合后续进行希尔伯特-黄变换等无缝衔接。

函数参数说明:

function [imf,CenFs]  = kVMD(data,FsOrT, alpha, K, tol)
% 整合版VMD函数,整合了第三方VMD和MATLAB自带工具箱的VMD分解方法
% 默认设置下按照MATLAB自带库进行
% 并且统一输出格式,配合后续进行希尔伯特-黄变换等无缝衔接
% 输入:
% data:待分解的数据(一维)
% FsOrT:采样频率或采样时间向量,如果为采样频率,该变量输入单个值;如果为时间向量,该变量为与y相同长度的一维向量。如果未知采样频率,可设置为1
% alpha   - 惩罚因子
% K       - 指定分解模态数
% tol     - 收敛容差,是优化的停止准则之一,可以取 1e-6~5e-6

% 输出:
% imf:内涵模态分量,统一为n*m格式,其中n为模态数,m为数据点数。例如 imf(1,:)即IMF1,imf(end,:)即为残差
% 注意,为了与其他“类EMD”方法分解出来的imf分量保持一致,本程序内将imf排序进行了翻转
% 即保证imf排列是从高频向低频排列
% CenFs:即CentralFrequencies,各imf分量的中心频率

% 注意:使用两种库所得到的imf结果会存在差异,这是由两个库自身算法差异导致的,属于正常现象。

5.pFFT.p

封装好的fft计算程序,在pVMDandFFT中调用,一般不需要修改。

三、使用教程

该教学视频是针对“类EMD”画图工具代码(完整版)的使用教程。

视频中是以CEEMD代码为案例讲解的。

其他的“类EMD方法”都可以参考该教程。

视频中4:00开始演示的如何使用自己的数据导入并调用

四、 关于完整版与公开版代码

公开版代码的函数文件为p文件,可以被调用,但无法查看代码。完整版代码中全部为m文件,m文件可以查看源码并自由修改。

如果需要封装好的画图函数(pVMD.m、pVMDandFFT.m、kVMD.m和pFFT.m)的源码,可在下述连接(完整版)获取。

编程不易,感谢支持~

功能完整版公开版
绘制VMD分解图、绘制VMD分解图及其频谱图
绘制VMD分解三维展开图×
软件全部源码(函数m文件)×
可导出中心频率×
根据MATLAB软件版本自动选用vmd库函数版本×
更为精简的入口参数×
可分析数据长度无限制1000个点以内
画图水印无水印有水印

五、获取公开版程序(需使用电脑浏览器打开)

VMD分解画图代码(公开版)

注:公开版代码需使用MATLAB2022a及以上版本

六、获取完整版程序(使用电脑浏览器或者手机浏览器打开)

获取通道一(淘宝):点击此处获取完整版程序

获取通道二(本页面):点击下面“立即支付”按钮,付款后获取完整版代码下载链接和售后联系方式~本通道处于测试阶段,使用该通道可以额外优惠(仅需21.2元)。付款完成后刷新一下本页面即可看到下载链接。

(注意支付跳转失败的话,请使用浏览器打开本页面)

您需要先支付 21.2元 才能查看此处内容!立即支付

七、完整版代码重要更新

20231108 修复了绘制三维图时,当K值设置较大时数据轴不匹配的bug。

20230411 修复了绘制三维图时Y轴可能小于0的bug。

20230409 重要更新:添加了绘制三维展开图的功能。

20211003 重要更新:可以导出中心频率;vmd分解所用库将由程序自动判断选择;精简了入口参数,更方便使用。

20210819 代码初始版本(公开版所在版本)

八、常见问题

问题1:分解出来的各分量没有按照从高频到低频的顺序排列,或者有些信号分解后从高频到低频排列,有些从低频到高频排列。

回答1:这是由于MATLAB版本在2020a以下,程序调用了第三方的vmd函数,该函数在求出imf分量时频率排序不稳定。安装MATLAB2020a及以上版本可以解决该问题,实现imf分量频率从高频到低频的顺序排列。

问题2:参数K和分解出来的数量是什么关系?

回答2:K的值等于IMF数量加1,也就是如果设置K=4,则会分解出3个IMF分量和1个趋势项res。

问题3:K的数值应该怎样选取?

回答3:对于K的取值,可以通过一些评价指标来进行评估,综合研判取值。比如使用中心频率判断、使用相关系数判断、使用峭度值判断等,不过没有放之四海而皆准的方法。在使用VMD算法进行信号分解时,需要综合考虑信号的特性、应用需求和实际效果等因素,来确定k的取值,最简单的方法就是参考研究领域相关论文的常用方法。