CEEMDAN-小波阈值联合去噪:原理与MATLAB实现 简介本资源是一套面向信号处理初学者与工程实践者的联合去噪MATLAB实现方案聚焦于非平稳、非线性含噪信号的高质量重构问题适用于机械故障诊断、生物医学信号分析及传感器数据预处理等场景。压缩包共4个文件3个.m主程序脚本1个.mat测试数据总大小仅39KB轻量易部署其中ceemdan.m实现自适应噪声完备集合经验模态分解CEEMDAN_Wavelet.m为主控流程emd.m提供辅助EMD对比功能y.mat包含典型含噪仿真信号供即开即用。已有7991人学习下载说明其在教学演示与算法验证中具备较强实用性。用户可直接运行主程序观察CEEMDAN分解过程、高频IMF的小波阈值去噪细节及最终信号重构效果配套代码注释清晰、逻辑分层明确便于理解联合去噪机制、调试参数并迁移至实际项目。 最近在整理信号处理项目归档时翻到了这个CEEMDAN—小波阈值联合去噪.rar的压缩包。这是前两年帮一个振动监测项目做信号预处理时留下的完整方案里面包含了完整的 MATLAB 实现、仿真数据和调参记录。今天把这个包里的思路拆开结合当时的选型过程和踩过的坑整理成一篇可以直接照着落地的方法总结希望能帮到正在处理非线性、非平稳信号的读者。1. 内容整体设计与思路拆解1.1 为什么单用 CEEMDAN 还不够用先说 CEEMDAN 本身。它的全称是 Complete Ensemble Empirical Mode Decomposition with Adaptive Noise中文一般叫“自适应噪声完备集合经验模态分解”。如果只是简单理解它是在 EMD 基础上解决模态混叠问题的第三代改进算法。第一代 EMD 的问题很明显信号里如果存在间歇性高频分量或噪声干扰分解出来的 IMF本征模态函数会互相混叠一个 IMF 里既有高频成分又有低频趋势后面的希尔伯特谱分析就全乱了。第二代 EEMD 的思路是往信号里反复加白噪声、做多次 EMD 再平均用噪声的统计特性把不同尺度的分量“逼”到正确的频带上但代价是分解结果里会有残余噪声而且重构后的信号不是严格完备的。CEEMDAN 改进了这个思路它不是在每次分解前重新加白噪声而是在每一阶分解的残余信号上自适应地加入经过 EMD 分解后的噪声分量这样得到的 IMF 是完备的且集合平均次数比 EEMD 少很多计算效率高一个量级。但这里有一个实际使用中很容易忽略的问题CEEMDAN 分解出来的高频 IMF比如 IMF1、IMF2仍然含有大量随机噪声成分。很多人以为分解完直接把前几阶 IMF 扔掉就行这个操作对强噪声场景非常危险。因为有用信号的瞬态冲击特征往往也分布在高频 IMF 中一刀切地丢弃会把故障特征一并删掉。这也是我在这套方案里坚持要接一个小波阈值去噪步骤的根本原因CEEMDAN 负责把信号按频率尺度拆开小波阈值负责在“保留瞬态冲击”和“压制随机噪声”之间做精细平衡。1.2 联合去噪的整体架构这套联合去噪方法的整体逻辑可以概括为三步先分解、再筛选、后精修。第一步用 CEEMDAN 把原始信号分解成若干个从高频到低频排列的 IMF 分量第二步通过相关系数或能量占比等指标判断哪些 IMF 是噪声主导、哪些是信号主导第三步对需要处理的 IMF 做小波阈值去噪然后把处理后的 IMF 和未处理的低频趋势项重构回干净信号。这个架构的设计思路和“先粗分离、再细处理”的工程理念是一致的。CEEMDAN 相当于一个自适应滤波器组它不需要预先设定通带和阻带能把信号中隐藏的调频、调幅特征自动分离出来小波阈值去噪则是对每一个 IMF 内部的频段做二次处理。两者结合的优势用一句话来概括CEEMDAN 解决了小波去噪中基函数固定、自适应差的问题小波阈值解决了 CEEMDAN 无法有效去除 IMF 内部白噪声的问题。很多论文里对比单一算法和联合算法的信噪比提升结论基本都是联合方案在低信噪比条件下优势更明显这正是因为两个算法互相互补了对方的短板。1.3 这套方案适合哪些场景从应用角度看这套联合去噪方法主要面向机械故障诊断轴承振动、齿轮箱振动、结构健康监测、地震信号处理、脑电与心电等生理信号分析。这些信号的共同特点是非平稳、非线性且有用信号往往叠加在强背景噪声中。比如轴承早期故障信号里故障特征频率的幅值可能只有噪声幅值的十分之一不去噪直接做包络谱的话特征频率完全被噪声淹没。用这套联合方法处理后再做希尔伯特包络解调特征频率的谱线会清晰很多。此外这套方法也适合信号本身的信噪比非常低、且频率成分复杂到传统带通滤波无法处理的情况。如果用带通滤波你得预先知道有用信号的频带但在很多实际采集场景里有用信号的频带是随工况变化的。CEEMDAN 分解不需要这个先验信息它能根据信号自身的极值点分布自适应地把频带切分出来。2. CEEMDAN 分解核心细节与参数要点2.1 CEEMDAN 的分解流程与关键参数CEEMDAN 的实现流程可以简化为以下几步对原始信号加噪构建待分解序列这是与 EEMD 不同的关键点加噪在每阶残余信号中自适应进行。对加噪序列进行 EMD取第一个 IMF 做集合平均得到 CEEMDAN 的第一个 IMF。从原始信号中减去第一个 IMF得到第一阶残余信号。对残余信号继续加自适应噪声重复上述分解直到残余信号极值点少于两个或满足停止条件。整个流程里最重要的参数有三个噪声幅值系数 Nstd、集合平均次数 NR、最大筛迭代次数 MaxIter。先说 Nstd。这个参数控制加入白噪声的标准差占原始信号标准差的比例。取值一般在 0.01 到 0.5 之间。如果是高信噪比信号Nstd 可以取小一点比如 0.05 或 0.1如果是低信噪比信号Nstd 需要适当加大到 0.2 到 0.4 之间因为噪声太小不足以激发不同尺度的模态分离。我在仿真实验里测试过一组对比Nstd 取 0.05 时模态混叠现象依然存在调到 0.2 以后分解出的相邻 IMF 在频谱上就分得比较干净了。但也不是越大越好超过了 0.5 以后加噪本身就成了主要干扰残余噪声明显增大重构信号失真也随之增加。再说 NR也就是集合平均次数。它的作用是让多次加噪分解的结果在平均后相互抵消理论上次数越多噪声抵消越彻底但计算量成倍增加。实际工程中 NR 取 100 到 500 就足够了。CEEMDAN 相比 EEMD 的优势在这里体现得非常明显EEMD 通常需要几百到上千次集合平均才能得到稳定结果CEEMDAN 在相同精度下需要的次数能少一个数量级。不过如果信号特别复杂或者噪声特别重NR 低于 100 时分解结果会不太稳定每次运行得到的 IMF 会有一点差异。然后是 MaxIter它控制每个 IMF 筛选的迭代次数。默认值通常设为 500 到 1000。这个参数主要影响分解的精度和运行时间。迭代太少IMF 可能不满足正交性要求迭代太多计算时间成倍增加而且可能出现过度筛选把原本有效的信息抹平。2.2 分解层数与筛选策略CEEMDAN 的分解层数是自适应的理论上会一直分解到残余分量变成单调趋势为止。但实际应用中并不是分解层数越多越好分解层数偏多会带来两个问题一是计算时间上升二是低阶低频 IMF 可能与信号趋势项产生混叠。因此在实际使用中我会通过两个指标判断分解是否合适。第一个指标是 IMF 与原始信号的互相关系数。对每个 IMF 计算它和原始信号的皮尔逊相关系数如果某个 IMF 的相关系数出现明显的大幅跌落说明从这一阶开始往后的 IMF 主要是噪声项信号成分很弱。这个“跌落点”通常就是信号主导 IMF 和噪声主导 IMF 的分界线。第二个指标是连续均方误差CMSE方法它计算相邻两个 IMF 之间的能量突变点。当分解到某一阶时相邻 IMF 的能量发生突变说明信号的主要振荡模态已经提取完毕再往下分解的往往是低频缓变趋势和噪声。实际操作中我发现对大多数机械振动信号分解得到的 IMF 数量在 8 到 12 个之间比较常见。前两到三个 IMF 通常是噪声主导中间三到五个是信号主导最后几个是低频趋势。当然这并非绝对规律具体信号的采样频率、噪声强度不同分界点差异很大。最可靠的做法是先把分解结果画出来逐个观察每个 IMF 的时域波形和频谱形态再结合定量指标做判断。2.3 筛选后的小波阈值处理对象经过相关性和能量分析后接下来的操作需要根据 IMF 的类型分别对待对噪声主导的高频 IMF这一批分量是整个联合去噪方案的关键处理对象直接丢弃损失信息不处理则噪声残留。处理方式是小波阈值去噪。对信号主导的 IMF基本保留原始形态不做处理或仅做非常温和的平滑。对低频趋势项直接参与重构不做任何处理因为它本身已经比较平滑再去噪也没有实际收益。这种分而治之的策略避免了过去“一刀切”丢弃高频 IMF 带来的信息损失。我最开始做这个联合方案时也参考过直接用 CEEMDAN 分解后剔除噪声 IMF 的做法但对比后发现在强噪声背景下剔除 IMF 后的重构信号会明显“变瘦”峰值被削掉一层时域波形看起来不够自然。改成小波阈值处理高频 IMF 后峰值保真度明显提升。3. 小波阈值联合去噪的实现要点3.1 小波阈值去噪的原理小波阈值去噪的基本假设是有效信号经过小波变换后其小波系数的幅值较大且数量较少而随机噪声经过小波变换后系数幅值均匀分布于各个尺度且幅值较小。基于这个差异我们设置一个阈值把小于阈值的系数置零或压缩保留大于阈值的系数再做小波逆变换重构信号。这个说法大家应该很熟了但实际里面有三个选择直接影响去噪效果小波基函数、分解层数和阈值策略。这三个选择相互影响没有一套固定参数能适应所有信号。下面挨个说。3.2 小波基函数怎么选小波基函数的选择原则可以概括为波形相似性、支撑长度、正交性和消失矩。工程中最常用的是 Daubechiesdb系列和 Symletsym系列。db 系列的小波是紧支撑正交小波实现简单计算效率高sym 系列是 db 系列的改进版对称性更好能减少重构时的相位失真。对于振动信号这类非平稳冲击信号我个人推荐优先尝试 sym8 或 db8。这两个小波的消失矩为 8能较好地表征信号的细节特征同时支撑长度适中不会因为过长而引入过多边界效应。很多朋友会问为什么不用 haar 小波或 coif 小波。haar 小波是最简单的小波但它不连续重构后的信号会有明显的阶梯效应对振动信号这种需要保真的场景不够理想。coif 小波的对称性和消失矩也不错但它倾向于过平滑对突发冲击特征的保留能力不如 sym8。实际选型时可以做一个简单实验把同一段含噪信号用不同的基函数处理看重构后信号的信噪比和时域波形数值和图像都能看出来的差距往往是信噪比差 1 到 2 个 dB而时域波形可能差异不大这时就选计算速度快的。3.3 小波分解层数如何确定小波分解层数本质上决定了对信号的频带划分粒度。层数太少噪声与信号在频带上分离不彻底层数太多不仅计算量增大而且深层逼近系数里也会混入噪声导致阈值处理失去意义。经验上采样频率为 1kHz 到 10kHz 的振动信号分解层数取 3 到 5 层是常见的选择。如果信号的噪声主要分布在较宽的频带上可以取到第 5 层如果信号频带本身就比较窄第 3 层就够了。更精确的做法是根据小波熵或能量分布来自适应确定分解层数从第 1 层一直分解到第 N 层计算每层细节系数占总能量的比例如果到某一层后比例不再发生明显变化就可以停止分解。我在做仿真时发现分解层数取少了的典型表现是重构信号虽然平滑了但信噪比提升有限取多了的典型表现是重构信号出现“过平滑”故障冲击的峰值被明显压低。这一点在轴承故障数据上特别明显因为故障信号的能量集中在很窄的频带内分解层数一旦多了冲击特征就会被削掉一圈。3.4 阈值与阈值函数的选取细节阈值选择是决定小波去噪效果的核心。MATLAB 里常用的阈值规则包括 rigrsure无偏风险估计、heursure启发式阈值、sqtwolog固定阈值和 minimaxi极大极小阈值。sqtwolog 固定阈值的计算公式是sqrt(2 * log(N))其中 N 是信号长度。这个阈值最简洁但在短信号上容易过平滑。rigrsure 使用无偏风险估计对短信号的适应性好但噪声明显时效果不稳定。heursure 是前两者的折中噪声强时偏向 sqtwolog噪声弱时偏向 rigrsure。minimaxi 是极值估计思想比 sqtwolog 更保守对弱信号的保护更好。我的使用经验是低信噪比环境SNR 小于 10dB用heursure效果比较好信噪比较高的场景可以用rigrsure保留更多信号细节。阈值还要做一个缩放乘上sigma / 0.6745的估计值其中 sigma 是第 1 层细节系数的绝对中位差。这一步是很多初学教程里不会强调的但不做这个缩放阈值就等于没有考虑噪声强度去噪效果会大打折扣。阈值函数分为硬阈值和软阈值。硬阈值是保留超过阈值的系数原样软阈值是对超过阈值的系数做了幅值收缩。硬阈值优点是信号幅值保真度高缺点是重构后可能出现局部振荡软阈值重构后信号比较平滑但幅值会整体偏小。工程上我一般会做一个折中对冲击类信号偏硬阈值对平稳随机噪声偏软阈值。如果想更精细也可以使用改进的阈值函数例如在软硬阈值之间加一个可调参数兼顾幅值保真和平滑性。4. 实操过程与核心环节实现4.1 完整处理流程梳理这里我把整套联合去噪的完整流程整理成一个可复现的步骤清单每一步都附上我当时调试的结论和参数依据。读入原始信号做去均值和归一化预处理。注意这一步不是可选的CEEMDAN 对信号幅值比较敏感如果原始信号有直流偏置分解出的第一个 IMF 大概率是直流分量会影响后续判断。设置 CEEMDAN 参数Nstd 取 0.2NR 取 500MaxIter 取 5000。这个组合在仿真信号和实测轴承信号上表现都比较稳定。执行 CEEMDAN 分解得到 IMF 分量和残余项。将每个 IMF 分别画出时域波形和频谱做初次直观判断。计算每个 IMF 与原始信号的相关系数从高到低排列确定信号主导 IMF 和噪声主导 IMF 的分界位置。对噪声主导的高频 IMF 做小波阈值去噪。小波基函数选 sym8分解层数为 5 层阈值规则按含噪强度选择。如果输入信号长度较短分解层数改为 3 层。把去噪后的高频 IMF、未处理的信号主导 IMF、残余趋势项求和得到重构信号。计算去噪前后的评价指标包括信噪比、均方根误差、互相关系数并对比时域波形图。4.2 仿真信号的搭建与效果对比为了验证方案的有效性我当时构造了一个模拟轴承故障的仿真信号由三部分组成一个 20Hz 的低频趋势项、一个 80Hz 的调幅周期性冲击成分以及一个 500Hz 左右的高频载波调制成分。然后叠加白噪声把信号信噪比压到 5dB 左右。这个仿真信号的复杂性在于三个频率成分分布在很宽的频带上带通滤波很难同时保留这三部分。用上述流程处理后原始噪声信号的信噪比从 5dB 提升到了 14.8dB均方根误差从 0.58 降到了 0.21。对比只用 CEEMDAN直接剔除高频 IMF的方案后者的信噪比只提升到了 10.3dB说明小波阈值处理确实保留了更多有效信号成分。4.3 核心代码实现MATLAB下面是这套联合去噪方案里几个关键环节的核心代码段使用的环境是 MATLAB R2020a 和第三方工具箱CEEMDAN 工具箱。%% 1. CEEMDAN 分解 Nstd 0.2; NR 500; MaxIter 5000; imfs ceemdan(x, Nstd, NR, MaxIter); % imfs 的最后一行是残余趋势项 %% 2. 计算各IMF与原始信号的相关系数 corr_coefs zeros(size(imfs, 1), 1); for i 1:size(imfs, 1) r corrcoef(x, imfs(i, :)); corr_coefs(i) r(1, 2); end %% 3. 对高频IMF做小波阈值去噪 wname sym8; level 5; thr_type heursure; thr_mode soft; processed_imfs imfs; for i 1:cutoff_index [thr, sorh, keepapp] ddencmp(den, wv, imfs(i, :)); % 使用基于噪声强度的缩放阈值 sigma median(abs(detail_coeffs(imfs(i, :), wname, level))) / 0.6745; thr thr * sigma; processed_imfs(i, :) wdencmp(gbl, imfs(i, :), wname, level, thr, sorh, keepapp); end %% 4. 重构信号 clean_signal sum(processed_imfs, 1);需要说明的是上面代码中的detail_coeffs和cutoff_index是辅助函数的示意实际使用时需要先做小波分解拿细节系数再基于相关系数阈值确定截断索引。ddencmp函数是 MATLAB 默认的阈值估计器可以结合之前的缩放思路做一个自定义阈值函数效果更稳定。4.4 参数选择的经验表格我整理了一张参数速查表对快速调参会比较实用参数推荐初始值调参方向适用场景说明CEEMDAN Nstd0.20.05 ~ 0.4信噪比越高取值越小冲击成分明显时取 0.2~0.3CEEMDAN NR500100 ~ 1000信号长时用 500 足够短信号可增大到 800小波基sym8db8 约等于 coif4冲击信号优先 sym/db 系列对称性优先选 sym小波分解层数53 ~ 6依据采样频率和信号有效频带宽度确定阈值规则heursurerigrsure高SNR低信噪比优先 heursure高信噪比优先 rigrsure阈值函数软阈值折中阈值冲击强冲击特征用硬阈值或可调折中函数这一组参数初始值并不一定最优但它们在绝大多数测试信号上不会跑出很不合理的结果。在这个基础上再微调会比从零开始调要高效得多。5. 常见问题与排查技巧实录5.1 分解结果出现端部飞翼和失真这是我使用 CEEMDAN 时遇到最多的一个问题。信号的两端在分解时会因为边界条件处理不当产生大幅度震荡这种“端部效应”会随着分解层数加深而向内传播污染整段信号。排查思路首先检查信号长度是否过短。经验上小于 1000 个采样点的信号很容易出现端部飞翼。其次是采用镜像延拓或极值延拓方法对信号边界做预处理。MATLAB 的 CEEMDAN 工具箱通常内置了边界延拓选项但默认的延拓方法不一定适合所有信号。我当时用过一个比较实用的技巧在信号两端各拼接一段对称镜像信号做完 CEEMDAN 分解后再把两端的处理结果截掉。这样虽然增加了一点计算量但端部效应明显改善。对于实测的短信号这个技巧比任何参数调优都有效。5.2 集合平均次数与运算时间的矛盾NR 取到 1000 以上时耗时增长很显著。信号长度在几万点以上时一次 CEEMDAN 分解可能要跑几分钟甚至更久。这时可以采用一个策略先用较低的 NR 跑一遍观察分解结果是否稳定。如果多次运行的结果中IMF 的形态基本一致说明 NR 已经足够不需要再往上加。如果每次运行出来的 IMF 差异明显说明 NR 偏低需要增加。另一个优化手段是把整段信号切分成重叠块分别做 CEEMDAN 和小波去噪再通过重叠相加的方式拼接回整段信号。这个方法在处理超长实测数据时非常有效可以显著减少运行时间但需要特别注意重叠区域的处理否则拼接处会出现不连续的跳变。5.3 小波阈值处理后信号反而变差这个问题的排查重点是阈值是否过大或过小。阈值过大时有效信号的小波系数被大量压缩重构信号波形虽然光滑但峰值被削掉。阈值过小时噪声没有得到充分抑制重构信号和原始噪声信号差别不大。另一个容易被忽略的原因是分解层数选错。我曾经在处理一段 2kHz 采样、有效频带集中在 100~300Hz 的信号时默认用了第 5 层分解结果重构信号的高频部分被压得非常过分后来把层数改到 3 层效果马上改善。所以当去噪效果异常时优先调整分解层数而不是反复调阈值。5.4 常见问题速查表现象可能原因排查与处理方法重构信号两端大幅振荡端部效应做镜像延拓处理后再截断多次运行结果不一致NR 偏低增大集合平均次数到 800信号过度平滑冲击特征丢失阈值过大或软阈值过度改用硬阈值或折中阈值调低缩放系数噪声残留明显分解层数过少或阈值偏小增加分解层数到 5微调阈值倍率高频 IMF 处理后频谱变形小波基函数支撑过长换成 db4 或 sym4低频 IMF 也出现振荡信号包含强趋势项先做高通滤波或去趋势预处理这套方案在实际工程中已经验证过多次包括我自己处理的轴承故障数据和网上公开数据。相比单一算法它在信噪比提升、冲击特征保留和时间稳定性方面都有明显优势非常适合对信号保真度要求较高的场景。如果你们手头也有类似的项目建议先用仿真信号把整体流程跑通再迁移到实测数据上踩坑调整。最后说一个我自己的技巧在调试阶段不要只看信噪比这个数值指标一定要同时观察重构信号和原始信号的时域波形叠加图。很多参数虽然让信噪比提升了几个分贝但波形上的畸变是肉眼可见的这类所谓“提升”在实际应用中往往是有害的。把数值指标和时域波形结合起来判断是这套联合去噪方案能够真正落地到项目中的关键。本文还有配套的精品资源点击获取