在专栏之前的文章里对EMD进行了一系列的介绍。在实际中也见到不少同学将该方法应用于各个领域,除了博主研究的故障诊断方向,还有用作去噪、图像处理以及金融分析的。同时也不断有同学想了解诸如EEMD、VMD等类似于EMD分解方法的信号分解方法。所以从今天开始,准备梳理一下各种“类EMD”方法,帮助准备研究这个方向的同学们理一理头绪。

关于为何要进行信号分离研究,有一篇讲的很好的文章[1],不过我这里再赘述几句吧:

对于我们采集到的信号/数据,其中可能会蕴含着非常复杂的物理过程或经济过程,以及各种类型的干扰信息,而对于这些信息我们可能没有相关认知或者只有定性的了解。为了更清晰地分析对象的组成,我们要“把一个信号从一个整体,从它原始的采样表示变成在一组有意义的基上,或者是有特定意义的 '描述'上进行展开,而这种展开能够提供更加丰富的信号里面的信息和结构。这就是所谓信号的分离。”

也就是说,我们总是希望把一个信号写成一系列的子信号的组合,然后加上一个性质不同的信号,所谓的残差信号或者剩余信号。【1】

今天从EMD的最常见的一个衍生方法讲起:EEMD。

1. EEMD(集合经验模态分解)的概念

EEMD(Ensemble Empirical Mode Decomposition)是最常见的一种EMD改进方法。他的优势主要是解决EMD方法中的模态混叠现象。

说到模态混叠,顾名思义就是不同模态的信号混叠在一起,一般有两种情况:一是不同特征尺度的信号在一个IMF分量中出现,另一种是同一个特征尺度的信号被分散到不同的IMF分量中。

EEMD是怎样解决这个问题的呢:

EEMD主要的改进思路是:利用白噪声均值为0的特性,通过在分解的过程中多次引入均匀分布的白噪声,将信号本身的噪声通过多次人为添加的噪声掩盖过去,从而得到更加精准的上下包络线。同时对分解结果进行平均处理,平均处理次数越多,噪声给分解带来的影响就越小。[2,3]

下图展示的很明白了,EEMD分解主要分为4步:

(1)设定原始信号的处理次数m

(2)给这m个原始信号分别添加不同幅值的随机白噪声,组成一系列新的信号

(3)对这一系列的新信号分别进行EMD分解,得到一系列的IMF分量

(4)对相应模态的IMF分量分别求均值,得到EEMD分解结果

相较于EMD的(几乎)无参数傻瓜式自适应分解,EEMD就有一些参数需要调试了:分别是用于平均处理的次数M、添加的白噪声的幅值。其中白噪声的幅值通常用“白噪声幅值的标准差与原始信号幅值标准差之比”来表征。

2. EEMD的编程实现

截至目前的MATLAB版本(2020b),MATLAB还没有把eemd的函数纳入到官方库中,所以我们需要使用中央大学数据研究中心提供EMD代码工具箱(后文有获取方法)。

下面我们来测试一下EEMD相对于EMD的优越性,首先生成一段由正弦信号与间断性高频脉冲合成的信号如下:

%% 1.生成仿真信号
fs = 400;  %采样频率
t = 0:1/fs:0.75; %时间轴
x = sin(2*pi*4*t); %低频正弦信号
y = 0.5*sin(2*pi*120*t); %高频正弦信号
for i = 1:length(t) %将高频信号处理成间断性if mod(t(i),0.25)>0.11&&mod(t(i),0.25)<0.12elsey(i) = 0;end
end
sig = x+y; %信号叠加
figure('color','white')
plot(t,sig,'k') %绘制原始信号

混合信号

分别对该信号进行EMD分解和EEMD分解,得到的结果如下:

EMD分解结果,IMF1中有严重的模态混叠

EEMD分解结果

EEMD分解的IMF1、IMF2和IMF3是含有高频的正弦间歇性信号,IMF2和IMF3可以看做IMF1很小的能量损失,分析高频信号时,可以将IMF1、2、3叠加起来作为重构的高频信号,会得到更好的分析效果。IMF4也很好地提取了信号中的低频分量。

相比之下,EMD的分解结果存在着严重的模态混叠,失去使用的意义了。

上图中进行EEMD分解的程序如下:

Nstd = 0.2; %Nstd为附加噪声标准差与Y标准差之比
NE = 100;   %NE为对信号的平均次数
imf = pEEMD(sig,t,Nstd,NE);
% function imf = pEEMD(data,FsOrT,Nstd,NE)
% 画信号EEMD分解图
% 输入:
% y为待分解信号
% FsOrT为采样频率或采样时间向量,如果为采样频率,该变量输入单个值;如果为时间向量,该变量为与y相同长度的一维向量。如果未知采样频率,可设置为1
% Nstd为附加噪声标准差与Y标准差之比
% NE为对信号的平均次数
% 输出:
% imf为经eemd分解后的各imf分量值
% 例1:(FsOrT为采样频率)
% fs = 100;
% t = 1/fs:1/fs:1;
% data = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pEEMD(data,fs,0.2,100);
% 例2:(FsOrT为时间向量,需要注意此时FsOrT的长度要与y相同)
% t = 0:0.01:1;
% data = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pEEMD(data,t,0.2,100);

上述程序中的pEEMD是笔者经过再次封装的eemd程序,在中央大学提供的eemd函数中,返回的imf中带着原始信号,且行列方向与其他工具箱的分解函数也不一致,为了与其他信号分解方法的结果保持统一,在封装程序里对其进行了处理。此时imf即为eemd分解后的各分量信号。同时EEMD分解的图也可以画出来。

对于有些应用场景,还需要对各imf分量的频谱进行分析,就需要如下这样的图:

EEMD分解及其频谱图

画这个图也同样封装成了一行代码就可以实现的形式:

%% 3.EEMD分解及频谱图
imf = pEEMDandFFT(sig,fs,Nstd,NE);% 画信号EEMD分解与各IMF分量频谱对照图
% function imf = pEEMDandFFT(y,FsOrT,Nstd,NE)
% 输入:
% y为待分解信号
% FsOrT为采样频率或采样时间向量,如果为采样频率,该变量输入单个值;如果为时间向量,该变量为与y相同长度的一维向量
% Nstd为附加噪声标准差与Y标准差之比
% NE为对信号的平均次数
% 输出:
% imf为经eemd分解后的各imf分量值
% 例1:(FsOrT为采样频率)
% fs = 100;
% t = 1/fs:1/fs:1;
% y = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pEEMDandFFT(y,fs,0.2,100);
% 例2:(FsOrT为时间向量,需要注意此时FsOrT的长度要与y相同)
% t = 0:0.01:1;
% y = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pEEMDandFFT(y,t,0.2,100);

上边的测试代码,包括工具箱都可以在下面链接中获取:

EEMD画图工具(公开版) | 工具箱文档

EMD以及HHT相关的程序也有,编程不易,感谢支持~关于EMD和HHT的相关介绍可以看这里:

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

Mr.括号:希尔伯特谱、边际谱、包络谱、瞬时频率/幅值/相位——Hilbert分析衍生方法及MATLAB实现

3. 更多

后续还会逐渐补充CEEMD、MEEMD、VMD、LMD以及小波分解、小波包分解、SWT、EWT等等“信号分解方法”,把这一系列做的尽量全面一些。有其他想让博主补充的也可以在评论区留言,合适的话会一起加入该系列豪华大餐哦~

【1】 aresmiki:信号分离研究内容--2

【2】李晨亮. 基于EEMD_LSTM模型的沪深300指数预测研究[D].

【3】王少君. 基于EEMD的滚动轴承微弱故障特征提取方法研究[D].

类EMD的“信号分解方法”及MATLAB实现(第一篇)——EEMD相关推荐

  1. 类EMD的“信号分解方法”及MATLAB实现(第七篇)——EWT

    这是"类EMD"方法系列的第7篇,前几篇分别是EEMD.CEEMD.CEEMDAN.VMD.ICEEMDAN.LMD,想要看前几种方法的点击链接可以跳转. 经验小波变换(empir ...

  2. 类EMD的“信号分解方法”及MATLAB实现(第六篇)——LMD

    继续完善"类EMD"方法系列,本篇是继EEMD.CEEMD.CEEMDAN.VMD.ICEEMDAN后的第6篇,想要看前几种方法的点击链接可以跳转. LMD(local mean ...

  3. 类EMD的“信号分解方法”及MATLAB实现(第四篇)——VMD

    重头戏来了. 在以往的应用经验里,VMD方法在众多模态分解方法中可以说是非常好的.从催更力度上看,这个方法也是格外受关注.笔者决定加快进度快一些写完这个方法,十月份了有些同学要开始做毕设,希望这篇文能 ...

  4. 基于ITD实现的轴承故障信号分解并附Matlab源码

    基于ITD实现的轴承故障信号分解并附Matlab源码 轴承是旋转机械中重要的支撑部件,其状态的健康程度对设备运行的性能和寿命有着至关重要的影响.因此,轴承状态监测和故障诊断成为了研究热点.本文基于IT ...

  5. 【轴承故障分解】基于matlab ITD轴承故障信号分解【含Matlab源码 1871期】

    ⛄一.ITD轴承故障信号分解简介 滚动轴承局部损伤故障振动信号多为非平稳的多分量调制信号, 采用合适的时频分析方法将故障信号分解为若干个单分量AM-FM信号, 再对其包络解调是轴承故障诊断的常用手段. ...

  6. 【轴承故障分解】ITD轴承故障信号分解【含Matlab源码 1871期】

    ⛄一.ITD轴承故障信号分解简介 滚动轴承局部损伤故障振动信号多为非平稳的多分量调制信号, 采用合适的时频分析方法将故障信号分解为若干个单分量AM-FM信号, 再对其包络解调是轴承故障诊断的常用手段. ...

  7. “类EMD”算法分解后要怎样使用(1)——内涵模态分量IMF的方差贡献率、平均周期、相关系数的计算及MATLAB代码实现

    之前我们有了十几篇文章讲述了EMD算法的基础理论.IMF的含义.EMD的MATLAB实现方法,EEMD.CEEMD.CEEMDAN.VMD.ICEEMDAN.LMD.EWT的理论及代码实现,还讲到了H ...

  8. 信号分解(如 EMD,ITD)应用于时间序列预测时是否存在问题

    类似EMD的信号分解方法用于预测前的预处理是否存在原理上问题 很多学者利用种种信号分解方法来分解信号后,再进行时间序列预测,常用方法有EMD(Empirical Mode Decomposition) ...

  9. 【信号分解】LMD算法及其应用

    目录 一.LMD算法 1.基本原理 2.算法的优缺点 二.LMD应用+MATLAB代码 1.去噪 2.特征提取 3.改进VMD分解 参考文献 局部均值分解(local meanvdecompositi ...

  10. 通过JAVA的反射调用类中的公有私有方法

    文章来源http://lavasoft.blog.51cto.com/62575/61002及http://blog.csdn.net/sunyujia/article/details/2501709 ...

最新文章

  1. JDBC Driver常用连接方法列表
  2. Hadoop集群的NameNode的备份
  3. Oracle 10G 全新创建数据库过程(暂记)
  4. Walle 瓦力 web部署系统
  5. 按home键退出的activity可以不进入stop模式码_用了几年的iPhone,竟然不知道苹果手机还有“游戏模式”?...
  6. kk服务器信息及端口,kk服务器设置
  7. 刷新tabpanel中的子项目内容
  8. mysql 按周分组_如何在MySQL中按周分组?
  9. 无法支持python程序的编辑运行和调试_python程序的调试方法
  10. leetcode两数之和,三数之和,四数之和问题
  11. Pycharm2018 汉化
  12. 通吃AD和宽带 TP-LINK无线路由猫评测
  13. netmeeting 英文开源实例
  14. 最通俗PLC教程—源自Koyo光洋PLC自学总结(1)
  15. latex----目录格式设置
  16. VC 关于CEdit基本用法
  17. Jenkins docker下JNLP slave节点远程连接报错port not reachable的解决
  18. Java 对接 阿里云 的短信服务完成短信的发送与查询
  19. 五类千万不要吃的动物部位
  20. 算法题 - 卡牌游戏问题 - Python

热门文章

  1. 计算机应用基础学科计划,《计算机应用基础》教学计划
  2. docker部署案例
  3. 将MP4视频和MP4音频合并成MP4文件
  4. 软件开发流程知识概括
  5. WinRar去除广告弹窗
  6. 腾讯云推出“版权音乐助手”让音乐版权使用“按量付费“
  7. AMD ROCm 硬件支持情况
  8. 前端|Ant Design介绍
  9. 服务器字体放在服务器什么位置,服务器缺少字体如何查看与添加
  10. 移动平台前端开发总结