NRBO-FMD联合小波阈值降噪在滚动轴承故障诊断中的应用

发布时间:2026/9/7 22:44:30
NRBO-FMD联合小波阈值降噪在滚动轴承故障诊断中的应用 做机械设备状态监测的朋友一定体会过“降噪不够彻底、故障特征被噪声淹没”的无奈。尤其在滚动轴承、齿轮箱这种复杂振动环境下单独使用一个全局小波阈值、或者单一分解方法很难把微弱的周期冲击从强背景噪声里捞出来。我最近在项目里把NRBO-FMD牛顿拉夫逊算法优化的特征模态分解、皮尔逊相关系数筛选、小波阈值降噪和信号重构组合成一条完整的MATLAB处理链路实测下来无论对仿真信号还是实际轴承故障信号都比单独使用其中某一种方法更稳。做故障诊断、信号处理或者正在写相关论文的同学可以直接照着本文的思路改代码把降噪效果和特征提取能力同时提上去。这套联合降噪的思路本质上解决的是三个问题第一分解算法参数怎么自动确定而不是靠肉眼试参第二分解出的若干分量哪些值得保留哪些是纯噪声需要一个客观筛选标准第三保留下来的分量里仍有残余噪声怎么用二次降噪把故障冲击再“擦亮”一点。下面我从原理到代码一步步拆争取让新手也能顺利跑通。1. 方法架构与原理拆解三个模块各自解决什么问题1.1 FMD不靠经验拆模态靠滤波器组和循环平稳性很多刚接触信号分解的同学第一反应是用EMD经验模态分解但EMD在强噪声环境下的模态混叠问题非常突出经常一个IMF里既有真实冲击、又有大量噪声毛刺。VMD变分模态分解虽然把问题放到了变分框架里理论上更严谨但需要提前设定模态个数K和惩罚因子α这两个参数一旦选不好分解结果会直接从“过分解”变成“欠分解”。FMDFeature Mode Decomposition特征模态分解是近几年提出的新方法它和EMD、VMD的思路有本质区别。FMD的基本思想是先构造一组特征模态滤波器组把原始信号滤波成多个窄带子信号然后利用峭度、循环平稳性等指标从子信号中评估哪些频带真正含有特征成分并据此迭代更新滤波器系数。经过多轮迭代最终得到一系列在频带上具有明确物理含义的特征模态。我个人的理解是FMD特别适合旋转机械故障信号因为滚动轴承、齿轮的局部故障会产生周期性冲击这种信号天然具有循环平稳特性而FMD的更新准则恰好利用了这一点。相比EMD靠极值包络递归筛选FMD在抗模态混叠和计算效率上更有优势相比VMDFMD不需要预先猜测太多超参数对非平稳信号的适应性也更好。1.2 NRBO把“试参”变成自动寻优少调参数还能收敛快FMD虽然好但它的核心参数——模态数K和滤波器长度L——依然需要提前设定。这两个参数对分解效果影响极大K设小了真实的故障特征可能会被合并到一个过宽的模态里K设大了又容易把噪声单独拆成一个虚假模态。L决定频带分辨率L太小时频带划分粗糙L太大时计算量上去了还容易出现边界效应。做实际信号时不同转速、不同故障类型下的最优参数完全不一样靠人工试凑非常痛苦。NRBONewton-Raphson-based Optimizer基于牛顿拉夫逊的优化算法就是用来解决这个问题的。它是一种较新的元启发式优化算法核心是把牛顿-拉夫逊迭代思想引入到种群进化中。具体来说NRBO的每个个体在更新时同时参考牛顿-拉夫逊搜索规则NRSR和陷阱规避算子TAONRSR利用梯度相关的搜索方向加速收敛TAO帮助种群跳出局部最优区域。相比粒子群PSO需要调惯性权重、学习因子遗传算法GA需要调交叉概率、变异概率NRBO需要人工干预的参数更少在FMD参数寻优这种目标函数有大量局部极值的场景下实测比PSO更容易找到稳定解。1.3 皮尔逊系数和小波阈值在流程中扮演什么角色FMD分解后我们手里会得到K个模态分量但并不是每个模态都值得保留。有的模态包含真实故障冲击和大部分信号能量有的模态则基本由噪声构成。这里引入皮尔逊相关系数就是计算每个模态与原始信号的线性相关程度相关系数越高说明该模态携带的有效信息越多相关系数很低的模态大概率是噪声主导的虚假分量可以直接剔除。那为什么有了皮尔逊系数筛选还不够还要加小波阈值降噪因为保留下的“有效模态”只是说它含有较多有效信息并不代表它里面没有噪声。很多情况下真实冲击和残余噪声在同一个频带内叠加直接重构出来包络谱里仍会有杂散谱线。小波阈值降噪的作用就是对保留模态再做一次精细化处理小波变换后真实冲击的能量会集中到少数较大系数上而噪声能量分散到大量小系数上设定一个合理阈值把小于阈值的小波系数收缩或置零就能二次压掉噪声。2. 核心参数设计与优化目标效果好不好的关键全在这2.1 FMD中需要重点把握的参数做NRBO-FMD联合降噪之前得先弄清楚FMD本身有哪些参数会影响最终结果。这里我按实际经验整理一下模态数K是最核心的参数它决定分解出多少个特征模态。对滚动轴承信号工程上我一般把K的寻优范围设在2到15如果是齿轮箱这种多啮合频率、多调制边带的复杂信号模态数可能要更多上限可以放宽到20。滤波器长度L同样关键常见范围是20到200。L越大频带划分越细理论上能分辨更窄的共振频带但带来的问题是计算时间长、边界效应明显。实际做的时候如果信号长度只有几千点L取100以上就要格外小心重构时两端容易出现畸变。除了K和LFMD内部还有迭代停止条件、滤波器更新策略等参数这些在公开的FMD实现里一般都有默认值不需要额外优化。真正需要NRBO去寻优的就是K和L两个参数把它们作为优化变量搜索维度低收敛压力也小。有人可能会问为什么不把FMD内部所有参数都交个NRBO我的建议是没必要。优化变量越多目标函数曲面越复杂NRBO虽然收敛能力强但也容易陷入局部最优。只优化敏感度最高的K和L其他参数保持默认效果已经很明显。2.2 适应度函数为什么选“包络熵最小化”NRBO是优化算法必须有一个明确的适应度函数来评价“这组K和L好不好”。在轴承故障诊断里最常用的评价指标就是包络熵。包络熵的核心思想是对信号求Hilbert包络把包络归一化后计算香农熵。如果信号里存在清晰、稀疏的周期性冲击包络会呈现明显的尖峰形态熵值较小如果信号是杂乱噪声包络波动没有规律熵值相对较大。因此包络熵越小说明该模态的瞬态冲击特征越突出分解质量越高。在NRBO-FMD框架中适应度函数定义为在当前参数K,L下做FMD分解得到K个IMF计算每个IMF的包络熵取平均值作为适应度值。NRBO不断搜索参数组合使这个平均包络熵最小化。这里的关键代码逻辑可以写得很简洁function fitness FMD_EnvelopeEntropyCost(x, K, L) imfs FMD(x, K, L); % 执行FMD分解 K_actual size(imfs, 2); entropies zeros(1, K_actual); for i 1:K_actual env abs(hilbert(imfs(:, i))); env env / sum(env); entropies(i) -sum(env .* log(env eps)); end fitness mean(entropies); end注意如果FMD实际分解出的模态数少于设定K代码要用实际返回的K_actual否则后面索引越界。NRBO迭代完成后适应度最小的那一组K和L就是当前信号下的最优分解参数。实测中我常用种群规模N30、最大迭代次数T50搜索范围K∈[2,15]、L∈[20,200]。因为NRBO本身带有随机性稳妥起见每次寻优可以连续运行3次取适应度最低的一组结果避免单次随机性带来的偏差。2.3 皮尔逊系数阈值与小波参数的工程经验值分解完成之后皮尔逊相关系数该怎么算、阈值怎么取这是很多同学容易卡住的地方。计算方法不复杂MATLAB里直接调用corr或corrcoef就行但要注意取绝对值for i 1:K R(i) abs(corr(x, imfs(:, i))); end阈值选择上我踩过不少坑简单粗暴地固定取0.3或0.5不太可靠。不同信号能量分布不一样有的信号最高相关系数只有0.4有的能达到0.85。固定的绝对阈值很容易误杀有效分量或者把噪声分量放进来。我目前比较推荐的方案是相对阈值法先找到所有模态里最大的相关系数然后取它的0.3到0.5倍作为筛选阈值。比如最大相关系数是0.72那阈值就取0.22到0.36之间这样能保留与原始信号相关性相对较强的模态同时剔除低相关噪声分量。如果懒得调比例也可以把所有模态的相关系数从大到小排列看是否存在明显的“陡坡”从陡坡处截断这种做法更直观适合一次性的数据分析任务。确定保留模态后小波阈值降噪的参数也要注意。小波基函数我习惯选db8或sym8这两个基函数对冲击类信号有较好的匹配效果分解层数一般取4到6层超过6层容易把有用的冲击细节也抹掉。阈值规则方面MATLAB自带的thselect函数支持rigrsure、heursure、sqtwolog、minimaxi四种规则。我的经验是信噪比特别低、故障冲击微弱时用rigrsure或minimaxi更温和不容易误删真实冲击信噪比已经不错、只想进一步平滑噪声时可以用sqtwolog。阈值函数的选择同样有讲究软阈值平滑但会压低冲击峰值硬阈值保幅但重构后容易产生伪吉布斯振荡实际工程里我经常用软硬阈值折中形式即把小于阈值的系数乘以一个折中因子而不是直接置零这样既能降噪又不会牺牲冲击幅值。下表是我常用的小波参数组合可以作为起点再微调场景小波基分解层数阈值规则阈值函数微弱故障、强背景噪声db85rigrsure软阈值或折中阈值中等强度故障sym84minimaxi硬阈值信噪比较高、噪声平稳db45sqtwolog软阈值多分量复杂调制信号db106heursure折中阈值3. MATLAB实操从NRBO寻优到重构的完整实现3.1 整体程序架构与运行环境这一节的代码我按“主脚本 - 寻优 - 分解 - 筛选 - 小波降噪 - 重构评估”的顺序来组织。运行环境方面MATLAB R2020a以上版本即可需要Signal Processing Toolbox和Wavelet Toolbox。如果你的机器上装了2022b或2025b工具箱更全直接用就行。整体流程可以概括为加载或仿真生成原始振动信号x编写适应度函数调用NRBO搜索最优K和L用最优参数执行FMD分解得到模态矩阵imfs计算各模态与原始信号的皮尔逊相关系数筛选有效模态对保留模态分别做小波阈值降噪将降噪后的模态叠加重构得到最终降噪信号计算SNR、RMSE、相关系数等指标并绘制时域、频谱、包络谱对比图。主脚本的结构大概是这样%% 1. 输入信号 x load(bearing_signal.mat); % 替换成你的数据 x x.signal(:); %% 2. NRBO寻优FMD参数 N 30; T 50; lb [2, 20]; ub [15, 200]; [bestK, bestL] NRBO_FMD_Opt((params)FMD_Cost(params, x), lb, ub, N, T); %% 3. FMD分解 imfs FMD(x, bestK, bestL); %% 4. 皮尔逊系数筛选 R zeros(size(imfs, 2), 1); for i 1:size(imfs, 2) R(i) abs(corr(x, imfs(:, i))); end thr max(R) * 0.4; validIdx find(R thr); %% 5. 小波阈值降噪 重构 x_denoised zeros(size(x)); wname db8; level 5; for i 1:length(validIdx) imf imfs(:, validIdx(i)); [C, L] wavedec(imf, level, wname); sigma median(abs(C)) / 0.6745; thr_w sigma * sqrt(2 * log(length(C))); C_new wthresh(C, s, thr_w); x_denoised x_denoised waverec(C_new, L, wname); end这里单独说明一下FMD_Cost是一个把K和L封装成输入参数的函数内部对K向下取整、对L取偶数再调用FMD分解并返回平均包络熵。这样做是为了让NRBO在连续空间搜索时也能匹配FMD对整数参数的要求。3.2 NRBO-FMD参数寻优实现细节NRBO本身写起来不复杂但有几个实现细节需要注意。初始种群要在搜索空间内均匀随机生成。对每一代每个个体先把候选解取整后再计算适应度。更新位置时核心公式包含两类信息一类是当前个体与全局最优个体之间的差异另一类是随机扰动项用来维持种群多样性。实际编码时不必完全复现论文里的所有算子只要保留NRSR和TAO的等价逻辑FMD参数寻优场景下效果就能稳定。为了方便大家快速使用我把关键迭代部分的伪代码贴出来核心步骤是计算适应度、更新最优解、按NRSR规则向最优解靠拢、按概率执行TAO扰动for iter 1:T for i 1:N params population(i, :); fit feval(costFunc, params); if fit bestFitness bestFitness fit; bestParams params; end end for i 1:N r1 rand; if rand 0.5 population(i, :) population(i, :) ... r1 * (bestParams - population(i, :)) ... randn(1, 2) .* (population(i, :) - population(randi(N), :)); else population(i, :) bestParams ... (population(i, :) - bestParams) * (1 randn); end population(i, :) min(max(population(i, :), lb), ub); % 边界约束 end end这段伪代码在实现上比完整NRBO简化了一些但保留了核心逻辑。如果用这种简化版搜索建议把种群数调到50代、迭代跑到100代稳定性会更好。3.3 小波阈值降噪的真正注意点别把冲击幅值削平筛选完模态之后小波降噪这一步大家最容易出问题的地方是“过度降噪”。有时候设置软阈值加6层分解处理完的IMF变得很光滑但包络谱里的故障特征幅值也明显变小了甚至比降噪前还难识别。我之前遇到过类似情况后来排查发现原因有两个。一个是小波阈值算得过大用sqtwolog规则配合默认阈值系数时阈值偏大把真实冲击的系数也压缩了。另一个是分解层数过高层数越高低频逼近部分占的权重越大细节部分被压得越狠冲击特征自然被抹掉。改进的字段做法是先对每个IMF单独计算噪声标准差再根据这个噪声级缩放阈值系数。标准做法是用median(abs(C))/0.6745估计噪声标准差然后乘以一个可调因子比如0.8到1.2。如果处理完发现冲击幅值下降太多就把阈值因子调小或者改用minimaxi规则。小波系数处理时硬阈值直接置零会导致重构信号出现人为突变尤其在冲击边缘。折中方案是function y softHardThresh(C, thr, alpha) y zeros(size(C)); idx1 abs(C) thr; idx2 abs(C) thr abs(C) thr * alpha; y(idx1) C(idx1) - sign(C(idx1)) * thr * alpha; y(idx2) 0; end这种折中阈值函数在thr和alpha之间保留了部分过渡系数既不像硬阈值那样突兀也不像软阈值那样过度压缩。我实测下来alpha取0.5时效果最均衡。3.4 重构后如何评估降噪效果重构之后不能只看时域波形平不平滑要定量评估。如果用的是仿真信号真实无噪信号是已知的可以计算SNR和RMSESNR_in 10 * log10(sum(x_ref.^2) / sum((x_ref - x_noisy).^2)); SNR_out 10 * log10(sum(x_ref.^2) / sum((x_ref - x_denoised).^2)); RMSE_out sqrt(mean((x_ref - x_denoised).^2));如果是实测信号没有无噪参考就不要硬套SNR了。我通常看三个东西一是降噪信号包络谱里故障特征频率那一根谱线的高度二是特征频率幅值与周围噪声底值的比值三是降噪前后的时域波形里冲击是否更密集、更清晰。很多时候包络谱里故障特征频率及其倍频明显突出比单纯看SNR更有说服力。我最近处理一组滚动轴承内圈故障数据时采样率12kHz转速约1750r/min内圈故障特征频率约156Hz。原始信号信噪比较低直接做Hilbert包络谱156Hz附近几乎被噪声淹没。NRBO寻优得到的参数是K8、L130FMD分解后最大相关系数为0.72按0.4倍阈值保留了4个模态。这4个模态再做小波阈值降噪后重构包络谱里156Hz以及2倍频、3倍频的谱线非常明显噪声底也明显降下来了。这个案例说明联合流程确实能提升故障特征的可辨识度。4. 常见问题与排查技巧实录4.1 分解模态混叠严重怎么办表现是某个IMF的频谱里同时出现好几个明显频带或者各IMF中心频率分布不均匀。最常见原因是K设置偏小导致多个特征频带挤在一个模态里。排查思路是看适应度迭代曲线如果最终包络熵还挺高说明搜索空间里可能存在较差的局部最优。这种情况下我会把K的上限从15提高到20同时把NRBO种群数从30提高到50迭代次数从50提高到100。如果计算资源允许连续跑5次取全局最优混叠问题基本能解决。4.2 皮尔逊阈值筛选后有效分量太少或太多有效分量太少通常是阈值设得偏高。我遇到过最大相关系数只有0.45的情况如果硬按0.5绝对阈值去筛一个模态都保不住重构出来只剩接近零的残差。有效分量太多则可能是阈值偏低把噪声模态也放进来了。我的解决建议是双保险先按最大相关系数的0.3到0.5倍做初筛再对保留模态逐个做包络谱分析看里面是否存在明显的故障特征频率谱峰。如果某个模态包络谱里只有均匀噪声底没有特征谱峰即使相关系数不低也应该剔除。相关系数只衡量整体线性相关性不能完全代表“有没有故障特征”所以需要结合包络谱来确认。4.3 小波降噪后重构信号两端畸变这个问题主要出在FMD滤波器长度L偏大、边界效应叠加小波重构边界效应的场景。信号首尾在滤波过程中会被污染小波分解重构又会放大这种端部异常。解决手段有两个。第一个是预处理延拓在FMD分解之前把信号用wextend做对称延拓处理完重构后裁剪掉延拓部分。第二个是限制L的搜索范围不用非得让NRBO去搜到200我一般把L上限定到150既保证频带分辨率又降低边界风险。如果信号本身较短少于2000点L上限定到100更安全。4.4 NRBO寻优结果不稳定每次跑出来的K和L不一样这是所有随机优化算法的固有特性NRBO本身无法完全避免。遇到这种情况不用慌可以采取“多次寻优投票机制”连续跑5次NRBO得到5组K,L取出现次数最多的一组作为最终参数。如果5次结果分散很大说明适应度函数对参数不够敏感也就是该信号在不同参数下分解质量差异不大这时可以适当放宽寻优精度手动选择一个折中参数。另一个实用技巧是记录每次NRBO的迭代收敛曲线。正常情况下收敛曲线应该是快速下降后趋于平稳如果曲线在迭代后期仍然大幅跳变说明种群多样性太高或陷阱规避算子触发过频可以用减少TAO触发概率的方式稳定寻优结果。4.5 分解结果正常但重构后故障特征反而变弱这种情况我在实际项目里碰到过不少次原因大多是“过度处理”。原始信号虽然噪声大但真实冲击仍保留一定的幅值特征。我们既做模态筛选、又做小波阈值降噪中间任何一步参数不合适都会把有效幅值削掉。遇到这种问题时我会做一个“减法对比实验”来定位是哪一步出了问题只做FMD分解重构对比原始信号和重构信号再做FMD皮尔逊筛选重构最后加上小波阈值降噪。每一级对比都能看出指标变化谁引入的失真大就针对谁调整参数。多数情况下问题出在小波阈值把阈值系数调小一档、或者改用折中阈值函数就能恢复不少冲击幅值。5. 一点经验总结与后续扩展这套“NRBO-FMD皮尔逊系数小波阈值”联合降噪流程我从仿真信号验证到实际轴承故障数据最大的体会是联合方法的优势不在于某一个环节有多强而在于每个模块把各自擅长的事做好。FMD负责把信号按特征频带拆开NRBO负责解除人工试参的痛苦皮尔逊系数负责客观淘汰噪声分量小波阈值负责对残留噪声做精细清理。四个环节配合起来才能在强噪声背景下兼顾“降噪充分”和“特征保留”。如果你后续想把这套方法用得更顺我还有两个建议。一个是优化阶段可以放到离线批处理中在线实时监测时直接用已经寻优好的参数跑FMD和阈值降噪这样实时性会好很多。另一个是可以把包络谱特征频率幅值比作为一个输出指标做成自动诊断报告这样不只是降噪连故障类型判断也一起自动化了。最后再分享一个小技巧对于一批相似工况下的信号不需要每段都重新寻优。取一段代表性信号做NRBO寻优得到稳定的K和L后整批数据都用同一组参数处理既节省时间又能保证处理结果之间具有可比性。这个方法在做批量数据分析和写论文实验对比时特别实用。