十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

NRBO-FMD结合小波阈值降噪的振动信号处理与MATLAB实现

NRBO-FMD结合小波阈值降噪的振动信号处理与MATLAB实现 大概一个月前我拿到一批现场采集的滚动轴承振动数据。信号里既有显著的周期性冲击又叠着一层白噪声用普通的小波阈值降噪处理完冲击尖峰明显被削圆了换VMD分解又卡在模态个数怎么选上。折腾了一圈后我把FMD特征模态分解和基于牛顿-拉夫逊思想的NRBO优化器组合到一起分解之后先用皮尔逊相关系数把有效模态筛出来再对每个有效模态做小波阈值降噪最后重构信号。这套流程跑下来信噪比比单一方法高出一截关键冲击特征也保住了。如果你也正在做机械故障诊断、结构监测或者生物信号分析经常被噪声干扰搞到头疼这篇文章可以给你一条完整的解决路径NRBO-FMD优化分解、皮尔逊系数筛选、小波阈值降噪、信号重构以及对应的MATLAB代码框架我都会逐个讲清楚。1. 为什么是NRBO-FMD两个算法耦合的逻辑1.1 FMD分解的本质与参数痛点FMD是特征模态分解Feature Mode Decomposition的缩写这几年在非平稳信号处理里出镜率不低。它做的事情和VMD、EMD类似都是把一个复杂信号按频率和时域特征拆成多个模态分量。但FMD在设计上更注意冲击特征提取所以在滚动轴承、齿轮箱这类故障信号里往往比VMD更容易分离出有用的瞬态成分。问题在于FMD不是开箱即用的黑盒。实际使用中至少有三个参数需要提前确定模态数K、惩罚因子alpha、滤波长度L。其中K的影响最直接K设小了不同频率成分会挤在同一个模态里转频分量和冲击分量互相污染K设大了噪声被拆成一堆虚假模态后面你根本分不清哪个是物理信号、哪个是纯随机噪音。alpha则控制模态的平滑程度太大容易把冲击尖峰磨平太小又可能让模态包含大量毛刺。至于滤波长度L和信号的采样率、冲击周期强相关选不好直接导致分解不稳定。以前我习惯手动试参先试一组K看分解结果不行再换一组。但不同工况下的信号差异太大上一段信号K5合适换一段数据K6可能更好而且K和alpha之间还有耦合关系——手动调参基本靠运气。这时候就需要一个优化算法自动搜索参数组合。NRBO就是用来干这件事的。1.2 NRBO优化器如何介入FMD参数寻优NRBO的全称是Newton-Raphson-Based Optimizer也就是基于牛顿-拉夫逊思想的优化算法。传统牛顿法利用导数信息快速逼近极值点收敛速度快但容易陷入局部最优NRBO在保留牛顿方向更新机制的同时引入了种群协作和随机扰动让算法既快又能跳出局部陷阱。放在FMD参数寻优里NRBO的任务就是在参数空间里找一组能使FMD分解结果最“干净”的K和alpha等参数。整体优化流程不复杂首先初始化一个种群每个个体代表一组候选参数比如[K, alpha, L]对每个个体执行一次FMD分解得到一组模态分量根据适应度函数计算这组分量的好坏NRBO根据适应度值更新种群位置迭代若干次收敛后输出最优个体作为FMD的正式分解参数。这里最关键的其实是“适应度函数怎么定义”因为NRBO并不知道什么是好的分解结果它只能根据你给的数学评价来搜索。如果适应度函数定义得有问题优化器就会往错误方向跑。1.3 适应度函数包络熵与相关性加权常见做法是用包络熵最小化作为目标。所谓包络熵就是先把模态信号做Hilbert解调得到包络然后计算包络的信息熵。包络熵越小表示信号越稀疏、冲击性越强一般认为这就是有用的故障特征反过来包络熵大的模态往往噪声主导。如果你只想追求“信号尽可能稀疏”可以直接把FMD所有模态的平均包络熵作为适应度。但我强烈不建议只用包络熵。原因很简单强白噪声的包络在某些情况下也会表现出低熵特性特别是当优化器把模态数调得很高时噪声被切成了若干窄带分量每一段都显得很“规则”包络熵自然偏低。这样NRBO会误以为K越大越好最后给你分解出一堆碎片。我目前比较稳的做法是让适应度函数同时考虑包络熵和皮尔逊相关系数fitness mean(包络熵) / (mean(皮尔逊相关系数绝对值) 0.1)其中皮尔逊相关系数是每个模态与原始信号的线性相关度。有效模态通常和原始信号有较强相关纯噪声模态相关度很低。分母上加一个小常数是为了防止除零。这样NRBO会去搜索一组参数让分解出的模态既稀疏、又和原始信号有足够关联能有效避免过分解。这段逻辑理解清楚之后你会发现NRBO-FMD整体框架并不神秘优化器负责找参数FMD负责分解适应度函数负责告诉优化器什么方向是对的。2. 皮尔逊系数在中间层扮演的筛选角色2.1 计算方式与阈值依据NRBO-FMD分解完成后我们依然会得到一堆模态分量。理想情况下有效模态只占一部分其他模态是噪声主导的伪分量。如果把这堆伪分量全部拿去重构降噪效果会被严重稀释。所以需要有一个客观标准来筛选模态。皮尔逊相关系数是衡量两个变量线性相关程度的经典指标取值在-1到1之间。在模态筛选里我们通常取绝对值某模态与原始信号的相关系数越接近1说明该模态在原始信号中占了显著比重越接近0说明它可能只是随机噪声。MATLAB里直接用corrcoef函数就能算tmp corrcoef(x(:), modes(i,:)); R(i) abs(tmp(1,2));那阈值取多少没有万能数字我的经验是目标偏特征保留时阈值取0.3~0.4比较稳妥噪声很强时有效模态的相关系数会被整体拉低可以放宽到0.2。但尽量不要低于0.2不然噪声模态很容易混进来。如果知道自己有干净的参考信号还可以用显著性检验来辅助判断比如要求p0.05。2.2 模态筛选的工程实现要点筛选这个步骤看起来只有一行代码实际工程里还是有几个容易踩的细节。第一必须用绝对值。负相关也代表有效信号成分只是相位相反而已不能因为R-0.5就扔掉。第二计算相关性之前最好先对信号去趋势。实测信号经常带有直流偏置或缓慢漂移这种趋势项会让所有模态的相关系数普遍偏高筛选就失效了。可以先用detrend(x)把趋势去掉再做FMD分解和相关性计算。第三保存筛选后的索引而不是直接修改模态矩阵。因为你后面还需要知道是哪几个模态被保留下来方便可视化。第四如果多个模态相关系数都超过0.8往往意味着模态混叠——两个模态在频带上高度重叠。此时不要简单地把它们全部保留建议先看看频谱必要时调整FMD参数重新分解或者在重构时对重叠模态做权重归一化。筛选代码很简短validIdx find(R 0.3);但这一步之后你的信号质量已经能提升一大截因为噪声主导的模态被剔除了。3. 小波阈值降噪的补刀有效模态里还有残余噪声3.1 小波阈值降噪原理与参数选择FMD分解加皮尔逊筛选之后信号里的大噪声已经被去掉了大半但不要高兴得太早。有效模态内部依然存在少量宽带噪声尤其是那些包含瞬态冲击的高频模态噪声和冲击在时域上混在一起。这时候再上小波阈值降噪属于精准补刀。小波阈值降噪的原理一句话就能说清信号经小波变换后有用成分能量集中在少数幅值大的小波系数上而噪声分散在大部分幅值小的系数上。设置一个阈值把大于阈值的系数保留或收缩小于阈值的系数置零再做小波逆变换噪声就被削掉了。MATLAB里常用wdencmp或wden来实现。需要关心四个参数小波基常用db4、sym8、coif5db4对冲击特征比较友好sym8更平滑。分解层数一般取4~6层。层数太少噪声清理不干净层数太多会导致信号整体失真。阈值估计方法rigrsure基于Stein无偏风险估计适合中等噪声heursure是启发式阈值sqtwolog是通用阈值minimaxi倾向于保留细节。我在降噪场景里用heursure或rigrsure比较多。软硬阈值硬阈值保留幅值但不连续软阈值更平滑但会压缩冲击幅值。如果想保住冲击特征软阈值更安全。可以简单记成下表参数推荐值适用场景小波基db4 / sym8冲击特征/平滑信号分解层数4~6根据噪声强度调整阈值方法heursure / rigrsure中等强度噪声阈值类型软阈值保留瞬态冲击3.2 按模态降噪再重构的做法这里我建议对每个有效模态单独做小波阈值降噪而不是把所有有效模态相加后再做整体小波去噪。原因是FMD已经把信号拆到了不同频带每个模态内部的小波系数分布各不相同。单独降噪可以让高频冲击模态用比较保守的阈值平稳谐波模态用稍强一些的阈值做到“因模态施策”。实现很简单循环每个有效模态clean zeros(size(signal)); for i 1:length(validIdx) m modes(validIdx(i), :); [thr, sorh] ddencmp(den, wv, m); clean clean wdencmp(gbl, m, db4, 4, thr, sorh); endddencmp会自动估计阈值和确定性阈值方式如果你对自己信号足够了解也可以用thselect自己指定阈值。注意最后一次重构时直接相加就好不需要再做幅值修正因为小波阈值降噪本质是线性的重构相加后的幅值能保持和原始模态一致。如果FMD本身还有一个残差分量可以看情况加回来如果残差主要是噪声就放弃它。4. 从目标函数到重构MATLAB实现的一步步细节4.1 主程序按什么顺序组织最省事代码组织会直接影响排查效率。我习惯按下面这个顺序写主程序读入信号x和采样率fs设置NRBO的搜索边界、种群数量、迭代次数编写FMD目标函数内部完成FMD分解并计算适应度调用NRBO输出最优参数用最优参数重新执行FMD得到完整模态矩阵计算各模态与原始信号的相关性筛选有效模态对有效模态逐个做小波阈值降噪重构并计算评价指标。其中第4步和第5步要分开写。第4步的目标函数里虽然也做了FMD但那是为了算适应度不应该把中间结果直接拿来做后续分析。NRBO收敛后再用最优参数干净地跑一次FMD保证模态矩阵完整稳定。4.2 NRBO寻优的参数范围NRBO不是“无参数优化器”你给它的搜索边界太大它容易在无关区域浪费时间边界太小又会漏掉最优解。我通常这样设置参数下界上界说明模态数K210取整数超过10容易过分解惩罚因子alpha1005000连续值需归一化滤波长度L20200先按采样率估算冲击周期再收紧种群大小2030维度不高20就够最大迭代次数3050NRBO收敛较快如果你已经能大致判断信号里有哪些频率成分可以把K的上限再缩小到6或7让NRBO专注搜索更合理的K值。整数参数在执行FMD前要round取整连续参数建议在NRBO内部用归一化坐标更新后再映射到真实范围。4.3 关键代码骨架目标函数、优化调用与重构先给一个目标函数示例。这里myFMD表示你手头的FMD实现函数不同版本的输入输出格式略有差异需要自己对齐。function fitness objFMD(x, signal) K round(x(1)); L round(x(2)); alpha x(3); modes myFMD(signal, K, alpha, L); if size(modes, 1) K fitness 1e10; return; end envEntropy zeros(K, 1); R zeros(K, 1); for i 1:K env abs(hilbert(modes(i, :))); p env / sum(env); envEntropy(i) -sum(p .* log(p eps)); tmp corrcoef(signal(:), modes(i, :)); R(i) abs(tmp(1, 2)); end fitness mean(envEntropy) / (mean(R) 0.1); end然后调用NRBOlb [2, 20, 100]; ub [10, 200, 5000]; [bestX, bestF] NRBO((x) objFMD(x, signal), 3, lb, ub, 30, 20); K_best round(bestX(1)); L_best round(bestX(2)); alpha_best bestX(3);这里的NRBO函数需要自己实现或引用公开发表的代码核心迭代公式不复杂关键是牛顿方向更新和边界处理。最后是降噪重构modes myFMD(signal, K_best, alpha_best, L_best); R zeros(size(modes, 1), 1); for i 1:size(modes, 1) tmp corrcoef(signal(:), modes(i, :)); R(i) abs(tmp(1, 2)); end validIdx find(R 0.3); if isempty(validIdx) error(没有筛出有效模态请降低阈值或检查FMD参数); end clean zeros(size(signal)); for i 1:length(validIdx) m modes(validIdx(i), :); [thr, sorh] ddencmp(den, wv, m); clean clean wdencmp(gbl, m, db4, 4, thr, sorh); end这段代码里wdencmp的阈值是逐模态自动估计的。如果你发现某个模态被压得太狠可以单独调试这个小波去噪步骤。4.4 用SNR、RMSE和相关系数评估没有量化指标你很难说清楚联合降噪比单一方法好多少。如果仿真阶段有干净的参考信号优先计算三个指标SNR(dB)SNR 10*log10(sum(x_ref.^2) / sum((x_ref - x_den).^2))RMSEsqrt(mean((x_ref - x_den).^2))相关系数rcorr(x_ref(:), x_den(:))这三个指标我都建议算因为SNR反映整体增益RMSE反映幅值误差相关系数可以看波形的相似程度。代码非常简单SNR 10 * log10(sum(x_ref.^2) / sum((x_ref - clean).^2)); RMSE sqrt(mean((x_ref - clean).^2)); r corr(x_ref(:), clean(:));实际现场没有参考信号时可以改用降噪前后包络谱的故障频率幅值比、样本熵等指标来评估效果但那是另一个话题了。5. 仿真信号实测与最容易翻车的三个环节5.1 多分量含噪信号上的对比结果为了验证整套流程我构造了一个模拟信号30Hz和80Hz两个正弦分量加上周期性指数衰减冲击再叠加0.15倍的高斯白噪声。采样率1000Hz长度2000点。分别跑了三条路线只用小波阈值降噪固定参数FMD分解加皮尔逊筛选重构NRBO-FMD加皮尔逊筛选再对小波阈值逐模态降噪。结果大概是这样具体数值和信号设置强相关仅供趋势参考方法SNR(dB)RMSE相关系数含噪原始信号5.20.31—单独小波阈值10.10.180.88固定FMD皮尔逊重构11.60.150.91NRBO-FMD皮尔逊小波阈值14.20.110.95联合降噪的优势很明显NRBO把最优参数找对后FMD分出的模态更干净皮尔逊筛掉伪模态小波阈值清除残余噪声。三者是叠加效果不是简单重复。这个流程对周期性冲击类信号特别有效如果你处理的是心电信号、声音信号这种宽频瞬态信号思路完全一样只是参数边界和小波基需要调整。5.2 翻车点一FMD参数搜索区间给得不对我第一次把K上限设成15想让NRBO“多找几种可能性”结果它给我选出一堆频带碎片适应度看着很低实际每个模态都是噪声切片。后来把K上限降到10以内情况立刻好转。滤波长度L也容易踩坑。L太小FMD会丢失低频成分L太大分解速度慢且过度平滑。建议先根据冲击间隔估算一个周期比如冲击间隔大约是0.05秒采样率1000Hz那L初值取50比较合理搜索范围设在[20, 200]就够了。跑完NRBO后不要只看适应度曲线建议把最优参数下的模态频谱画出来看看模态中心频率是否物理上说得通。5.3 翻车点二皮尔逊阈值一刀切有一组强噪声信号用0.3阈值筛选时只留下了两个模态所有冲击相关的高频模态全被漏掉。原因是噪声太强把有效模态和原始信号的相关性拉低了。后来把阈值降到0.2才把冲击模态选出来。所以不要机械地定一个0.3用到底。可以先画出相关系数从大到小的排序图看有没有明显拐点。如果有拐点取拐点附近的值做阈值如果没有我建议用“所有模态相关系数平均值的一半”作为参考线。另外计算相关系数时如果发现边缘畸变明显可以先截掉信号头尾各50个点再算避免边界效应干扰。5.4 翻车点三小波阈值把冲击特征压没了小波阈值降噪不是“阈值越高越干净”。我踩过最典型的坑是把sym8小波、5层分解、sqtwolog阈值、硬阈值一起上结果冲击尖峰被当成高频噪声削掉了降噪后的信号非常平滑但故障特征也没了。后来我改成逐模态处理包含冲击的高频模态用rigrsure软阈值分解层数降到4层平稳谐波模态再用稍微强一点的阈值。这样既保住了冲击特征又清理了噪声。记住一个原则冲击特征是小波系数里的“大值”阈值设太狠会直接把大值也收缩掉。宁可让降噪后残余一点噪声也别把特征压没。最后分享一个我现在一直沿用的习惯NRBO跑完别急着拿最优参数去出图先看适应度曲线的下降形态。如果曲线剧烈震荡大概率是目标函数里模态数上下浮动导致的不连续这时候我会对K做平滑惩罚或者改用固定K、只优化L和alpha。这套路子的本质不是某个算法有多神奇而是每个环节都解决一个具体问题组合起来才稳定。结合我自己的经验如果你打算把它用在新的数据集上最好保留NRBO-FMD优化出的K、alpha和L同时记录皮尔逊阈值和小波参数。这样即使信号变了也有一组历史参数作为起点能省下大量试错时间。
返回列表