这篇文章能让你明白经验模态分解(EMD)——EMD在MATLAB中的实现方法

很多同学留言要EMD的代码,这篇文章就写一下吧。

一、使用MATLAB自带函数

如果你的MATLAB版本是2018a及更新版本,那么是可以直接调用emd函数的。

以下代码在MATLAB2019a中编写,未在其他版本中测试。

load('sinusoidalSignalExampleData.mat','X','fs')  %载入数据
t = (0:length(X)-1)/fs;
plot(t,X)                       %绘制原始信号图
xlabel('Time(s)') 
emd(X,'Interpolation','pchip')  %emd分解

得到原始信号图如下图,它是由不同的振幅和频率的正弦信号叠加得到的。

原始信号

得到的EMD分解图为:

EMD分解结果

从title中可以看到,一种有9个IMF分量,而图中只显示了其中的IMF1~IMF3,如果要显示其他分量,在图片的空白处点击右键:

然后选择“IMF Selector”,打开如下界面:

从IMF Selector中可以选择在图片中显示的IMF分量、原始信号和残差值。

使用新版MATLAB的简单emd的使用方法就是这样,如果想要进一步使用emd的分解结果,可以查看MATLAB的官方文档:Empirical mode decomposition - MATLAB emd - MathWorks 中国

具体的内容这里不展开讲了,提示两个地方:

  1. emd函数的返回值主要包括imf,residual,info这三个,imf即各模态分量值;residual为残差值;info中包括了该次分解的一些信息,比如imf数量、各分量的过零点数、各分量的极值数等,这些信息可能在有些应用中有着重要的作用。
  2. 通过“名称-属性”设置emd分解属性。比如上个例子中的'Interpolation','pchip',代表使用pchip的插值方法。除了设置插值方法,还可以设置筛选迭代的最大次数、IMF数量的最大值、残差值中极值的最大数量等等参数。这部分属于更高阶的设置,同学们可以根据需要进行选择。

二、使用EMD工具箱

有一个常用的EMD工具箱,由G-Rilling提供,在MATLAB2017及以下的版本中可以使用。当然在新版本的MATLAB中同样可以安装使用。

安装方法:

  1. 首先下载工具箱(package_emd,下载方式见文末)。
  2. 将该文件夹放在MATLAB安装路径的toolbox文件夹中(例如D:\Program Files\MATLAB\R2018a\toolbox)。
  3. 打开MATLAB软件,将当前文件夹设置为package_emd。如下图

4. 右键点击install_emd.m,选择“运行”。等待安装完成。

使用方法:

该工具箱与MATLAB自带的emd函数相比,可以说各有千秋。在我们最常用的emd分解上来说,该工具箱不像自带函数那样有丰富的设置。其典型调用形式如下:

imf = emd(varargin)

相比新版MATLAB自带函数来讲,似乎有些简陋,只能返回各分量的分解结果,无法自动画图。不过没关系,没有枪没有炮我们自己造。

fs = 100;  %采样频率
t = 0:1/fs:10;
x = sin(20*pi*t);
y = 2*sin(1*pi*t);
sig = x+y;
PlotEMDandFFT(sig,fs)

其中PlotEMDandFFT是由笔者编写的函数,输入原始信号和采样频率,可以得到下图:

EMD分解结果及各分量对应的频谱

使用这个函数可以得到各IMF分量图和对应的频谱图。由于加入了频谱,从某中程度上来看这个图比MATLAB自带函数画图还要更好用一些。

三、如何获得工具箱和代码

如果你的MATLAB版本不是2018或者2019,那么可以使用第二种方法实现emd的功能。

如果想要获取工具箱和PlotEMDandFF函数等代码,关注我的公众号“括号的城堡”,微信号为“khscience”,回复“EMD”就能拿到啦,公众号里可能还会有更多有趣的东西分享。

 

欢迎持续关注我的专栏与信号处理有关的那些东东

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值