很多同学留言要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 中国
具体的内容这里不展开讲了,提示两个地方:
- emd函数的返回值主要包括imf,residual,info这三个,imf即各模态分量值;residual为残差值;info中包括了该次分解的一些信息,比如imf数量、各分量的过零点数、各分量的极值数等,这些信息可能在有些应用中有着重要的作用。
- 通过“名称-属性”设置emd分解属性。比如上个例子中的'Interpolation','pchip',代表使用pchip的插值方法。除了设置插值方法,还可以设置筛选迭代的最大次数、IMF数量的最大值、残差值中极值的最大数量等等参数。这部分属于更高阶的设置,同学们可以根据需要进行选择。
二、使用EMD工具箱
有一个常用的EMD工具箱,由G-Rilling提供,在MATLAB2017及以下的版本中可以使用。当然在新版本的MATLAB中同样可以安装使用。
安装方法:
- 首先下载工具箱(package_emd,下载方式见文末)。
- 将该文件夹放在MATLAB安装路径的toolbox文件夹中(例如D:\Program Files\MATLAB\R2018a\toolbox)。
- 打开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”就能拿到啦,公众号里可能还会有更多有趣的东西分享。
欢迎持续关注我的专栏与信号处理有关的那些东东