类EMD的“信号分解方法”及MATLAB实现(第三篇)——CEEMDAN

来帮忙填坑了。

今天接着之前讲过的EEMDCEEMD,来介绍一下“类EMD”分解方法的第三篇。

1. CEEMDAN(自适应噪声完备集合经验模态分解)的概念

CEEMDAN[1](Complete Ensemble Empirical Mode Decomposition with Adaptive Noise)的中文名称是自适应噪声完备集合经验模态分解,要注意这个方法并不是在CEEMD方法上改进而来的,而是从EMD的基础上加以改进,同时借用了EEMD方法中加入高斯噪声和通过多次叠加并平均以抵消噪声的思想。

在试图理解CEEMDAN算法流程之前,强烈建议先搞清楚EEMD算法的流程,然后对比一下EEMD和CEEMDAN的算法流程。请仔细对照下边两张流程图:

EEMD分解方法流程图

CEEMDAN方法流程图

流程图展示地很清楚了,简单地描述EEMD与CEEMDAN的区别大概是:

EEMD方法是将添加白噪声后的M个信号直接做EMD分解,然后相对应的IMF间直接求均值;

CEEMDAN方法是每求完一阶IMF分量,又重新给残值加入白噪声(或白噪声的IMF分量)并求此时的IMF分量均值,并逐次迭代。

点明几个需要注意的地方:

1.如果最终rk也算一个IMF分量的话,上图总共分解出了K+1个IMF分量;
2.图中Ek​(∗)为利用EMD算法产生的第k阶IMF分量,所以每次迭代添加都是最初始的那些白噪声的IMF分量(第一次迭代添加的是原始白噪声)。
3.上述流程图的理论依据是[1],加入白噪声部分的方法可能会与其他论文乃至代码不同(这些方法中第一次迭代添加的是白噪声的第1阶分量,依次类推),不过鉴于论文[1]是方法提出者所写,故采用。

CEEMDAN作为EEMD方法的改进型,它的优势主要体现在以下几个方面[1]

1.完备性,即把分解后的各个分量相加能够获得原信号的性质。CEEMDAN在较小的平均次数下就可以有很好的完备性;而对于EEMD方法,较小的平均次数会导致较差的完备性,也即CEEMD那篇文章里提到的重构误差会很大。
2.更快的计算速度,正是由于上一条,相较于EEMD该方法不需要太多的平均次数,可以有效提升程序运算速度。
3.更好的模态分解结果,EEMD分解可能会出现多个幅值很小的低频IMF分量,这些分量对于信号分析意义不大,CEEMDAN方法可以减少这些分量数目。

2. CEEMDAN的编程实现

该方法的代码在网上是可以找到的[2],不过鉴于专栏前期将“类EMD”方法的代码做了统一格式的封装,提升了调用格式的延续性和代码易用性,实现便捷画图,所以这次也对CEEMDAN的代码做了类似处理。封装后的函数有两个。

测试信号同样使用前两篇文章中的正弦信号与间断性高频脉冲合成的信号:

%% 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.12
    else
        y(i) = 0;
    end
end
sig = x+y; %信号叠加
figure('color','white')
plot(t,sig,'k') %绘制原始信号

混合信号

(一)时域分解图

function imf = pCEEMDAN(data,FsOrT,Nstd,NE,MaxIter)
% 画信号CEEMDAN分解图
% 输入:
% data为待分解信号
% FsOrT为采样频率或采样时间向量,如果为采样频率,该变量输入单个值;如果为时间向量,该变量为与y相同长度的一维向量。如果未知采样频率,可设置为1
% Nstd为附加噪声标准差与Y标准差之比
% NE为对信号的平均次数
% MaxIter:最大筛选迭代次数
% 输出:
% imf为经CEEMDAN分解后的各imf分量值
% 例1:(FsOrT为采样频率)
% fs = 100;
% t = 1/fs:1/fs:1;
% data = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pCEEMDAN(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 = pCEEMDAN(data,t,0.2,100);

画出的图是这样的:

(二)时域分解图及对应频谱图

function imf = pCEEMDANandFFT(y,FsOrT,Nstd,NE,MaxIter)
% 画信号CEEMDAN分解与各IMF分量频谱对照图
% 输入:
% y为待分解信号
% FsOrT为采样频率或采样时间向量,如果为采样频率,该变量输入单个值;如果为时间向量,该变量为与y相同长度的一维向量
% Nstd为附加噪声标准差与Y标准差之比
% NE为对信号的平均次数
% MaxIter:最大筛选迭代次数
% 输出:
% imf为经CEEMDAN分解后的各imf分量值
% 例1:(FsOrT为采样频率)
% fs = 100;
% t = 1/fs:1/fs:1;
% y = sin(2*pi*5*t)+2*sin(2*pi*20*t);
% imf = pCEEMDANandFFT(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 = pCEEMDANandFFT(y,t,0.2,100);

画出的图是这样的:

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

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

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

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

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

Mr.括号:类EMD的“信号分解方法”及MATLAB实现(第一篇)——EEMD

Mr.括号:类EMD的“信号分解方法”及MATLAB实现(第二篇)——CEEMD

3. 更多

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

参考

  1. ^ab Mar´ıa E. Torres ★, Marcelo A. Colominas ★, Gasto´n Schlotthauer ★, et al. A complete ensemble empirical mode decomposition with adaptive noise[C]// IEEE International Conference on Acoustics. IEEE, 2011.
  2. ^http://bioingenieria.edu.ar/grupos/ldnlys/metorres/re_inter.htm
  • 16
    点赞
  • 182
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
emd(Empirical Mode Decomposition,经验模态分解)是一种信号分解方法,旨在将非线性和非平稳信号分解为一系列局部振荡函数,即固有模态函数(Intrinsic Mode Functions,IMFs)。这些IMFs具有不同的频率和幅度特征,可以近似表示原始信号emd信号分解步骤如下: 1. 将原始信号进行辅助函数处理,使其满足emd的两个前提条件:信号的均值为零且极值点数目不少于交叉点数目。 2. 根据原始信号的极值点,找出上包络线和下包络线,通过平均两条包络线得到信号的局部平均函数。 3. 通过原始信号减去局部平均函数得到细节函数,并检验细节函数是否满足emd的两个前提条件。 4. 若细节函数满足条件,则它即为第一次提取得到的IMF,将其从原始信号中减去,得到新的原始信号。 5. 重复以上步骤,直到剩余的信号无法再提取出IMF,此时得到的IMF为最后一个。 在matlab中,可以使用emd函数来实现emd信号分解方法。使用该函数时,需要将原始信号作为输入参数,并设置合适的停止条件来停止分解过程。emd函数会返回分解得到的IMFs和剩余的信号。 以下是使用matlab实现emd信号分解的示例代码: ```matlab % 原始信号 signal = [2, 5, 4, 3, 6, 8, 7, 7, 10, 8]; % 设置emd函数的停止条件 stop_criteria = 0.01; % 使用emd函数进行信号分解 [imfs, residual] = emd(signal, 'stoppingcriterion', stop_criteria); % 输出分解得到的IMFs和剩余信号 disp("IMFs:"); disp(imfs); disp("Residual:"); disp(residual); ``` 以上代码中,我们定义了一个原始信号和停止条件,然后使用emd函数对原始信号进行分解,并将得到的IMFs和剩余信号输出。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr.看海

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值