做信号处理的人,大概都绕不开EMD这条线。我从轴承故障诊断入坑,最开始用原始EMD,被模态混叠折磨得够呛;后来换EEMD,收敛了混叠,但残留噪声和分解层数不齐的问题又跳出来;再后来接触CEEMDAN,觉得终于有个"完全分解+可重构"的方案了;直到有一次在副载波提取任务里,CEEMDAN前几阶IMF明显带噪,我才认真去读了Colominas那篇ICEEMDAN的论文。这篇文章把我前后对比测试的完整过程、代码实现和选型经验整理出来,给正在这两个方法之间犹豫的人一个参考。无论你是做机械故障诊断、心电信号分析,还是打算把时频分解接进深度学习预测模型,这篇都适用。
1. 从EMD到ICEEMDAN:这十几年到底在改什么
1.1 原始EMD的痛点:模态混叠不止是"叠加"这么简单
EMD(经验模态分解)的核心思想很朴素:把一段非平稳、非线性信号,通过"筛选"过程逐层剥离出若干个本征模态函数(IMF),每个IMF本身满足两个条件——极值点数量与过零点数量之差最多为1,且上下包络的局部均值处处为0。具体操作是对信号找极值、用三次样条拟合上下包络、求均值、减去均值,然后对残差重复操作。这个思路不依赖任何基函数,甚至不需要预先假设信号的频率结构,这是它比傅里叶变换和小波变换更吸引人的地方。
但实际操作起来,EMD有个非常头疼的问题叫模态混叠:一个IMF里时而出现两个不同频带的成分,或者同一个物理成分被拆到相邻两个IMF里。最典型的是间歇性高频脉冲。我在齿轮箱振动信号上做过测试——原始信号里有一个转速相关的啮合频率分量,叠加了一个周期性冲击成分。EMD分解结果里,冲击成分不仅出现在高频IMF,还污染了低频IMF的局部区间,时频图上变成一团糊。这个问题不是简单滤波能解决的,因为EMD本身就是数据驱动的,某个区间的极值分布一旦被高频扰动改变,包络均值就会被"带偏",筛选过程也就跟着错。
1.2 EEMD用噪声对冲止血,但留下了新问题
EEMD(集合经验模态分解)的思路很聪明:既然噪声会导致极值分布不稳定,那就主动加入白噪声,让噪声去填充频域的空隙,让混叠成分不再粘连。具体来说,对信号加入多次不同的白噪声序列,对每次加噪后的信号分别做EMD,最后把所有试验中对应阶次的IMF取平均。
这个方案确实有效,但代价也很直接。第一,白噪声的平均值只有当试验次数趋于无穷时才严格为零,有限次试验必然在平均后的IMF里留下残余噪声,这个残差大约按试验次数的平方根反比衰减。也就是说,如果你想要把残余噪声压到足够低,试验次数通常要放大到几百次,计算开销直线上升。第二,每次试验分解出的IMF个数不一定一样,尤其是对短信号或信噪比低的信号,对齐阶次本身就变成了一个主观操作。第三,EEMD并不是"完全分解",各IMF加总后并不严格等于原始信号,重构误差对后续做定量特征提取的场景是个隐患。我当时用EEMD做轴承故障特征提取,为了平衡残余噪声和运算时间,试验次数调到500,单条信号处理耗时几十秒,批量处理数据时非常被动。
1.3 CEEMDAN和ICEEMDAN的改进主线
CEEMDAN(完全自适应噪声集合经验模态分解)是Torres等人在2011年提出的,它把噪声注入方式从"一次性加到原始信号"改为"在每一阶残差上自适应加入噪声",并且每次只提取第一阶IMF做平均。这样做的好处有两个:一是分解过程是完备的,所有IMF相加可以重构原始信号;二是试验次数不再需要几百次,通常几十次就能得到稳定的结果,因为噪声在每个阶段都被"消化"掉了。
ICEEMDAN(改进的CEEMDAN)是Colominas等人在2014年发表的,它的名字起得很谦虚,但其实改动是根本性的。它不再直接往信号里加白噪声,而是加白噪声经过EMD分解后的某一阶IMF分量;同时不再用"直接提取IMF再平均"的方式定义分解结果,而是改用"局部均值残差"来定义模态。这两个改动解决的是CEEMDAN的两大遗留问题:高频IMF里残留的噪声成分,以及早阶段出现的一些伪模态。一句话概括两代方法的差异:CEEMDAN是"聪明地加噪声",ICEEMDAN是"加聪明的噪声"。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. CEEMDAN与ICEEMDAN的算法机制对照
2.1 CEEMDAN:在残差上做"配平"
CEEMDAN的完整流程可以这样拆解。假设原始信号为x(t),每个试验加入的白噪声为w^(i)(t),噪声幅值为ε0。第一步,构造加噪信号x^(i)(t) = x(t) + ε0·w^(i)(t),对所有试验分别做EMD,取各自第一阶IMF的平均值,作为CEEMDAN的第一阶IMF1(t)。然后计算第一残差r1(t) = x(t) − IMF1(t)。
从第二阶开始,不再重新对原始信号加噪,而是对残差加噪。设E1(·)表示对白噪声做EMD后提取第一阶IMF的操作。对第k阶,构造r_{k-1}(t) + ε_{k-1}·E_{k-1}(w^(i)(t)),再对这组信号做EMD,取各自第一阶IMF的平均,得到第k阶IMF。之后更新残差r_k(t) = r_{k-1}(t) − IMF_k(t)。循环直到残差不再适合继续分解(比如极值点数量不超过2个)。
这中间的"自适应"体现在哪里?每次加噪的幅值ε是按照当前残差的标准差来取值的,也就是说,哪个频段还有能量,就在哪个频段附近注入对应强度的噪声。相比EEMD对所有频段一刀切地加同样白噪声,CEEMDAN的噪声是经过前一阶分解"校准"过的。这也是它用更少试验次数就能获得稳定结果的原因。
2.2 ICEEMDAN:给噪声加"滤波",给残差换"定义"
ICEEMDAN的改进需要从算子层面理解。定义M(·)为对信号求上下包络局部均值的运算,E_k(·)为对信号做EMD后提取第k阶IMF的运算。注意,这里的M(·)不是"直接输出IMF",而是包络均值,它是EMD筛选过程中间产物。
第一步,构造加噪信号x^(i)(t) = x(t) + β0·E_1(w^(i)(t)),这里的E_1(w^(i))是白噪声的第一阶IMF,而不是白噪声本身。对加噪
