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

缩写为CEEMD的方法其实不止一种,包括互补集合经验模态分解方法[1](Complementary Ensemble Empirical Mode Decomposition,2010)和完全集合经验模态分解方法[2](Complete Ensemble Empirical Mode Decomposition,2011)。本文中所探讨的是上述第一种方法。

1. CEEMD(互补集合经验模态分解)的概念

上一篇我们介绍了EMD的一种最常见的衍生方法EEMD,这次要讲到的CEEMD是从EEMD方法进一步优化而来的,既然是优化那就必有所针对,CEEMD针对的就是EEMD的“残余辅助噪声”。

为什么会有残余辅助噪声呢?因为EEMD的前提是认为“多组白噪声的叠加近似等于0”。然而当处理的次数不够多的时候,白噪声往往不能被降低到忽略不计的程度。

反过来讲,如果使用EEMD方法时想要获得残余噪声较小的结果,就需要增加平均处理的次数,这样无疑会增加计算量。

为了解决这个问题,CEEMD的解决思路是:

CEEMD:将一对互为相反数的正负白噪声作为辅助噪声加入源信号当中,以消除原来 EEMD 方法分解后重构信号当中残留的多余的辅助白噪声,同时减少分解时所需的迭代次数,降低计算成本。 [3]

具体的方法可以说是非常简单直接了:与EEMD相比,CEEMD的区别仅仅在于添加白噪声的方式上。EEMD添加的是相互独立的白噪声;CEEMD添加的是成对的、互为相反数的白噪声序列。

为了对比残余噪声,我们分别计算使用EEMD和CEEMD方法对信号分解再重构之后的残余量[1]:

EEMD方法的重构残余量

CEEMD方法的重构残余量

可以看出CEEMD方法的残余辅助噪声比EEMD要低十几个数量级。Yeh展示了在某段信号下两种方法处理后的白噪声残余随叠加次数M的变化趋势(下图),EEMD方法要在将近10000次累加之后才能将残余量降到CEEMD方法的水平,而CEEMD则在个位数的处理次数下就能达到这个水平。

2. CEEMD的编程实现

ceemd函数没有出现在MATLAB的官方库中(截至MATLAB 2020b),不过这个方法的编程并不难,因为它的处理流程与eemd方法基本一致,网上也可以找到从eemd基础上改造而来的程序,不过笔者还是部分地修改了一些。修改后的ceemd代码与eemd相同,需要调试的参数有两个,分别是用于平均处理的次数M、添加的白噪声的幅值(白噪声的幅值通常用“白噪声幅值的标准差与原始信号幅值标准差之比”来表征)。

现在我们再来验证一下CEEMD方法相对于EEMD的优越性,还是采用上一篇文章相同的测试信号。

待分解的测试信号

优越性有两个方面:1.相同的累加次数下,CEEMD的白噪声残余更小。2.CEEMD使用更少的计算资源(即更小的累加次数)即可得到理想的分解结果。第一个优越性上一节已经演示过了,不再赘述。

在累加次数为8,白噪声幅值为0.2时,CEEMD分解的结果为:

CEEMD分解结果

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

而在相同的参数设置(M=8,nstd=0.2)下,EEMD的分解结果为:

EEMD分解结果

可以看到IMF1、IMF2、IMF3中,混入的噪声明显更大。如果想得到像CEEMD类似的处理结果,则累加次数要增加到100以上了。由此可见CEEMD方法可以大大节省计算资源。

上述中进行CEEMD分解的程序如下:

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

上述程序中的pCEEMD是笔者经过再次封装的ceemd画图程序。因为本专栏计划将“类EMD”方法统一起来,所以对诸如emd/eemd/ceemd以及后边可能会讲到的vmd等方法全部统一格式,以解决各代码来源不同(比如来自MATLAB官方库、第三方库和一些零散的程序)的问题。上边imf即为ceemd分解后的各分量信号,调用函数时CEEMD分解的图也可以画出来。

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

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

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

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

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

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

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

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

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

3. 更多

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

[1] Yeh J R , Shieh J S , Huang N E . Complementary Ensemble Empirical Mode Decomposition: a Novel Noise Enhanced Data Analysis Method.[J]. Advances in Adaptive Data Analysis, 2010, 2(2):-.

[2] 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.

[3] 汪一飞. 基于全矢CEEMD的滚动轴承故障诊断研究[D].郑州大学,2019.

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和剩余信号输出。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mr.看海

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

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

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

打赏作者

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

抵扣说明:

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

余额充值