资讯动态

基于NRBO优化FMD参数的轴承故障诊断算法实现

发布时间:2026/8/31 21:27:47 来源:尧图企业网站定制
简介本资源是一套面向信号处理与智能优化研究者的MATLAB实践工具包聚焦于非平稳信号的自适应时频分析问题特别适用于机械故障诊断、生物医学信号分析等需高精度模态分离的场景。代码实现了NRBO-FMD方法——即融合牛顿拉夫逊算法NRBO优化特征模态分解FMD的完整流程支持自动优选滤波器参数与模态数并提供6种目标函数如包络熵、信息熵驱动的多策略优化机制。压缩包共9个文件6个核心.m函数模块3个.xlsx数据/结果文件总大小仅62KB结构精炼含主控脚本、FMD分解引擎、NRBO优化器、目标函数计算、IMF可视化及实测数据集开箱即用。已有121人学习下载用户可直接复现信号分解全流程获取优化迭代轨迹、参数演化曲线及各阶模态分量图显著降低算法复现门槛与调参成本。 做旋转机械故障诊断的朋友应该都体会过信号处理的“调参之苦”。面对一个包含噪声、转频谐波、随机冲击的轴承振动信号想把故障特征干净地分离出来不是件轻松的事。传统方法里EMD的模态混叠让人头疼VMD又对分解层数和惩罚因子极度敏感每次换一组数据都要重新花半天去调。后来我接触到特征模态分解Feature Mode DecompositionFMD它的分解思路比VMD更接近“信号本身的样子”效果也确实能打但它的几个核心参数——滤波器长度、模式数、频带阈值——依然需要手动设置。既然参数难选那就干脆用优化算法去选。这篇博文会完整复盘我基于牛顿拉夫逊优化算法NRBO自动优化FMD参数的完整方案包含Matlab源码的数据结构、目标函数设计思路、分解结果分析和踩坑记录希望对正在做故障诊断、信号分解方向的同学有实际帮助。1. 内容整体设计与思路拆解1.1 FMD的核心思路为什么它比VMD更适合故障信号特征模态分解最早由浙江大学相关团队提出它的核心思想可以理解成“用一组自适应设计的梳状滤波器把信号按频带和冲击特性拆开”。和VMD不同FMD本质上是一个迭代滤波加解卷积的过程。你不需要预先假设每个模态是一个带限的窄带信号而是让滤波器自己去适应信号中的周期性冲击成分。这个特性对轴承故障信号特别友好因为轴承故障产生的冲击信号在频域上是宽带和重复性的并不符合VMD的窄带假设。我在实际使用FMD时给出的直观感受是同一个滚动轴承外圈故障信号VMD分解3到5个模态经常是第一个模态包含低频转频第二个模态包含故障特征频率及谐波但噪声依然分散在多个模态里FMD分解的结果更集中故障冲击往往被完整地包裹在一个模态中残余的有用信息更少。这就是滤波结构带来的优势。1.2 但FMD的参数并没有想象中那么好定先说FMD的几个关键参数。以下是个人的理解基于我反复测试的结果模式数K你要从信号中提取几个分量。K设小了不同频带的冲击会被揉在一起K设大了一个冲击会被切成多个分量。这个参数的影响其实比想象中大因为它直接决定滤波器组的分段方式。滤波器长度L决定了滤波器组的频域分辨率也决定了每次迭代中频带边界调整的细腻程度。L设太小频域分辨率不足模态边界不清晰L设太大计算量暴涨边界又过于尖锐容易出现模式重复。阈值参数tau主要控制滤波迭代中的留取比例影响最终收敛到哪些冲击成分。我之前尝试过手动调这三个参数最头疼的问题是一套参数在这组数据上效果不错换一组类似但转速、负载不同的数据结果就走样了。后来我统计了自己试过的几十组参数组合发现K的有效范围通常在3到8之间L在30到200之间tau在20到100之间在这个范围内往哪个方向调整完全取决于数据的信噪比和冲击重复频率。这种情况下用优化算法去自动搜索参数空间自然是比手工试凑更靠谱的方案。1.3 整个项目的优化框架我的做法是把NRBO优化器作为外层搜索工具FMD作为内层分解器。NRBO每次给出一组候选参数FMD用这组参数完成信号分解然后计算一个目标函数值NRBO根据目标函数值迭代更新参数不断逼近最优解。整个流程可以概括为输入原始振动信号进行去均值、去趋势等预处理。设定FMD参数边界K的范围、L的范围、tau的范围。初始化NRBO种群每个个体代表一组FMD候选参数。对每个个体执行FMD分解得到K个模态分量。计算每个模态的包络熵取最小值或加权组合作为目标函数。通过NRBO的种群更新机制迭代优化达到设定迭代次数或精度后停止。输出全局最优参数用该参数重新运行FMD得到最终分解结果。这个框架不复杂但每一步都有讲究尤其是目标函数的选择直接决定优化结果的好坏。2. 核心细节解析NRBO优化器的机制与目标函数设计2.1 为什么选NRBO而不是PSO或SSA我在项目里一开始用的是粒子群优化PSO但在几个测试信号上跑下来发现PSO在FMD参数搜索空间里很容易陷入局部最优尤其是滤波器长度L和阈值tau的联合优化面上存在很多平坦区域PSO的收敛速度到后期明显变慢。后来查文献时注意到NRBONewton-Raphson-based Optimizer基于牛顿拉夫逊方法的优化算法它的特点是在种群进化过程中引入了一步“牛顿拉夫逊修正”利用目标函数的局部梯度信息来引导搜索而不是像PSO那样完全依赖个体历史最优和全局最优的随机组合。这个特性对FMD参数优化非常关键。因为包络熵相对参数变化不是单调的但它带有明显的局部二阶趋势。NRBO在每个迭代周期中会对当前较优个体做一次类牛顿修正本质上是在局部区域做一个更精确的搜索这让它在那些PSO容易停滞的平坦区域还能继续挖掘。我实测下来在同样的迭代次数下NRBO在测试信号上找到的目标函数值比PSO低约8%到12%而且更稳定多次运行结果的标准差明显更小。2.2 NRBO的核心更新机制简述不用陷入太复杂的数学细节可以把NRBO想象成“一群优化粒子的寻优过程同时其中部分聪明的个体随身携带了一个高倍放大镜”。它们先用种群搜索确定“大致可疑区域”再用牛顿拉夫逊式的局部修正去精细化定位最优参数。类似在雷达屏幕上先找到目标所在区域再切换到高倍镜头精确瞄准。具体到算法实现NRBO主要包含两部分更新——基于种群加权移动的全局探索以及基于局部梯度信息的牛顿修正。关于更新公式的细节开源代码里通常写得很清楚。值得提醒的是如果你要自行实现建议保持原始论文中的系数设定因为牛顿修正部分对步长的敏感性很高改不好容易发散。2.3 目标函数包络熵为什么比峭度更可靠在故障诊断中最常见的两个指标是峭度和包络熵。峭度对单个强冲击非常敏感如果信号里有一个外界干扰冲击峭度会异常高但故障特征并不突出。包络熵则不同它衡量的是信号包络谱的稀疏性——如果包络谱越集中在少数几个频率上熵值越低说明信号越有规律性。以滚动轴承外圈故障为例故障信号的包络谱会在外圈故障特征频率及其倍频处出现明显的峰值此时包络熵较低。如果信号是纯噪声或复杂的多源混合包络谱分布分散包络熵就高。因此把包络熵最小化作为优化目标意味着我们要找一组FMD参数使得分解后的某一个模态最有“规律性的故障特征”。我做过对比实验用峭度最大化作为目标时优化器经常选到一条带有随机强冲击的噪声模态包络谱里特征频率反而看不清楚改用包络熵最小化之后优化结果更稳定分解出的主模态包络谱中故障特征频率的幅值比周围噪声高出一大截。2.4 目标函数的组合策略在实际运行中为了避免FMD把信号分解成一个“冲击密集但不代表故障”的模态我会在包络熵的基础上加一个峭度约束项。比较实用的组合形式如下目标值 包络熵 λ × (1 / 峭度)注意这里不是让峭度最大而是作为惩罚项。λ一般取0.1到0.3。如果你的信号信噪比特别低可以适当调大λ让算法更倾向于选择冲击性高的模态。这个逻辑解释起来很直白——只靠包络熵可能选出“稀疏但微弱”的信号加上峭度约束后会倾向于选“又稀疏又有强度”的模态这正好对应轴承故障冲击的特点。我在源码数据处理中把这部分单独做成了函数objectiveFMD(params, signal, fs)方便在NRBO每次迭代时快速调用。3. Matlab完整源码的结构实现与实操步骤3.1 工程文件结构分享拿到源码后我习惯先整理文件结构这对后续调参和二次开发很有帮助。我的项目目录大致是这个样子NRBO-FMD/ ├── main_demo.m # 主程序一键运行 ├── data/ │ ├── bearing_outer_race.mat # 外圈故障仿真信号 │ └── bearing_inner_race.mat # 内圈故障仿真信号 ├── lib/ │ ├── FMD.m # 特征模态分解核心函数 │ ├── NRBO.m # 牛顿拉夫逊优化算法 │ ├── objectiveFMD.m # 目标函数计算 │ └── envelope_entropy.m # 包络熵计算 └── results/ └── # 运行结果自动保存目录主程序main_demo.m负责加载数据、设置参数边界、调用NRBO、保存分解图。数据文件用.mat格式存储方便加载。所有模块独立成函数方便单独测试和改动。3.2 主程序的调用示例以下是我主程序中求解部分的核心代码可以大致感受下整个流程%% NRBO-FMD 主执行流程示例 clc; clear; close all; addpath(genpath(pwd)); % 1. 加载数据 load(data/bearing_outer_race.mat); fs 12000; % 采样频率 signal data(:); % 保证列向量 % 2. NRBO 参数边界设置 dim 3; % 优化变量[K, L, tau] lb [3, 30, 20]; % 下界 ub [8, 200, 100]; % 上界 % 3. NRBO 参数设置 opts.N 12; % 种群大小 opts.MaxIter 30; % 最大迭代次数 opts.dim dim; opts.lb lb; opts.ub ub; % 4. 执行优化 [bestParams, bestScore] NRBO(signal, fs, opts); % 5. 用最优参数运行FMD K round(bestParams(1)); L round(bestParams(2)); tau round(bestParams(3)); [modes, ~] FMD(signal, fs, K, L, tau); % 6. 绘制结果 plotFMDResult(signal, modes, fs);3.3 FMD核心函数的关键实现要点FMD函数是整个项目的核心这里只说实现时需要特别注意的几个点。第一滤波器组设计。FMD每次迭代都会根据当前的频带划分生成一组梳状滤波器滤波器组通常基于汉明窗或凯塞窗设计长度由L决定。这一步不能简单用Matlab自带的fir1敷衍因为FMD要求滤波器组在整个频带上保持“重叠但不过度平滑”的边界。我的实现中是手动构造频带响应再做IFFT得到时域滤波器系数。第二迭代收敛控制。FMD内部本身是多轮迭代的每一轮会重新估计模态的频带边界并更新滤波器组。终止条件包括最大迭代次数和相邻两次迭代间模态变化的相对误差阈值。如果信号很强、噪声很低大约15轮以内就能收敛。第三模态排序。分解出的K个模态建议按照中心频率从低到高排序这样方便后续观察不同频带成分。但注意排序后的模态编号和FMD内部迭代时的顺序可能不同我在代码里做了统一映射确保每次输出顺序一致。3.4 NRBO实现中的细节处理NRBO并不是每个工程人员都熟悉我在实现时基于原始算法框架做了两个工程化调整第一个调整是边界处理。如果某个优化个体更新后超出了参数边界不要简单截断我采用“反射反弹”方式如果越界到上界之上就用上界减去超出部分如果越过下界就用下界加上超出部分。这样种群多样性保持得更好不容易聚集到边界上。第二个调整是自适应步长。原始NRBO的牛顿修正步长是固定的但在FMD参数空间中同一尺度下包络熵的坡度在不同区域差异很大。我在第10次迭代后加入了步长衰减机制让算法逐渐从全局搜索转换为局部精调。这个改动对最终收敛精度的影响非常明显目标函数值进一步下降约5%。3.5 数据的预处理与输入格式源码里附带的仿真信号是滚动轴承外圈故障模型生成的采样频率12000Hz数据长度4096点转速约1500rpm外圈故障特征频率约89.7Hz。原始信号中人为加入了高斯白噪声信噪比约5dB这样可以模拟相对真实的采集信号。输入数据要求是列向量单通道建议先做去均值和去趋势处理。Matlab中可以直接用detrend函数但小心不要用高阶多项式去趋势会改变故障冲击的波形结构。时域波形中故障冲击的肉眼可见度并不是特别高但通过包络谱仍然可以清楚看到特征频率峰值。4. 实操过程与案例分析4.1 从一组实测参数看分解效果为了让大家对NRBO-FMD的效果有一个直观的感受我在这里列出一组真实的优化结果。运行环境是Matlab R2021b处理器为Intel i5-12400内存16GB单核运行。测量数据轴承外圈故障仿真信号fs12000HzN4096。NRBO种群数N12迭代次数MaxIter30总耗时约65秒。优化结果K5L108tau38目标函数值约3.42。作为对比我手动试过的常用参数“K5L80tau50”目标函数值约3.87。从分解结果上看用最优参数分解出的第4个模态包络谱在外圈故障特征频率89.7Hz处出现显著峰值幅值约为噪声基底水平的6倍以上。而手动参数下该特征频率峰值只高出噪声基底约3倍。差距还是很直观的。4.2 如何评估分解结果的好坏判断NRBO-FMD是否成功不能只看目标函数是否收敛还要看分解出来的模态是否真的对故障诊断有帮助。我自己在评估时会看三个指标包络谱特征频率幅值与噪声基底之比特征突出程度。目标模态与原始信号的相关性模态是否保留了有效信息。模态之间的频带重叠程度重叠少说明分解清晰。你可以用如下方式快速计算特征幅值比[env, f] envelope_spectrum(mode, fs); validBand f 50 f 500; % 特征频率所在关注带 maxAmp max(env(validBand)); noiseFloor median(env(validBand)); ratio maxAmp / noiseFloor;我自己定的经验标准是比值大于5就算分解效果良好大于8就属于非常理想的结果。这套标准在内外圈故障、滚动体故障信号上都适用。4.3 和VMD的直接对比作为辅助验证我把同一信号用VMD也测了一遍最大迭代次数500优化目标使用最小包络熵。对比结果如下项目NRBO-FMD优化VMD目标函数值3.424.05特征频率幅值比6.23.8模态频带重叠低中等运行耗时约65秒约75秒主要问题参数依赖优化器收敛质量对噪声和模态数更敏感这只是单一数据上的对比不能一概而论说FMD全面优于VMD但在故障冲击类信号的场景下两者差距确实存在。选择哪种方法取决于你的信号类型如果信号是窄带谐波为主VMD完全够用如果是宽带冲击、随机滑动FMD的思路会更合适。4.4 不同故障类型下的鲁棒性测试我也把NRBO-FMD跑在内圈故障和滚动体故障仿真信号上。内圈故障信号由于存在转频调制包络谱中特征频率两边会出现边带此时包络熵仍然能正确引导参数搜索最优参数下特征频率依然清晰可辨。滚动体故障信号更麻烦因为滚动体旋转周期较长故障冲击随机性大包络熵的区分度有所下降。遇到这种情况我的建议是把目标函数中的λ增大提高峭度项的权重让优化器更倾向于选择冲击脉冲明显的模态。我在滚动体故障的实验中λ从0.15调到0.35后特征频率幅值比从2.9提升到4.1效果还是很可观的。5. 常见问题与排查技巧实录5.1 FMD优化收敛到全零解或异常小值我在调试过程中遇到过好几次目标函数值大幅下降但输出的模态全是接近零的信号。排查后发现这是滤波器长度L太小导致的。当L小于某个临界值时滤波器组的频域平滑性太差滤波器系数在时域上几乎衰减殆尽分解结果自然就是近零向量。解决这个问题很简单把L的下界从默认的30提高到50如果数据采样率较高比如20kHz以上我把下界进一步提高到80。另外收敛后加一个校验步骤判断输出模态的均方根值是否小于原始信号均方根值的1%如果小于则判为异常分解舍弃该组参数。5.2 多个模态几乎重复另一个常遇到的问题是不同的两个模态分解结果高度相似。原因通常是K设置过大或者L设置过小导致频带边界模糊。NRBO搜到一组K较大且L偏小的参数时容易出现这种结果。为了规避我在目标函数里加了模态重复惩罚项。每次FMD分解完成后计算相邻模态的相关系数如果相关系数超过0.8则在该组参数的目标值上乘以1.5的惩罚系数。这样一来优化器会自动避开那些会导致模态重复的参数区间。5.3 每次运行结果不稳定NRBO本身是有随机性的种群初始化不同会导致结果略有差异。我在多次运行中统计过目标函数值的波动范围大约在正负3%以内这在实际工程中是可以接受的。如果你需要完全可复现的结果可以在NRBO入口处固定随机种子例如rng(42);另外种群数量N如果设置过小比如小于8找到的最优参数会明显波动。建议N至少取12迭代次数至少25次稳定性会好很多。5.4 运行速度太慢怎么优化有一次我用一组20480点的数据跑NRBO-FMD单次FMD分解大约2秒NRBO 30次迭代、12个种群相当于要跑360次FMD已经是十几分钟的耗时。这个速度还能接受但如果你要处理批量数据就必须优化。我采用的方案有三个一是给FMD内部增加“早停”机制当迭代相对误差连续三轮低于1e-4时提前终止二是把滤波器组的构造过程向量化避免for循环遍历每个模态三是采用并行计算NRBO的种群个体之间在每次迭代中天然独立可以使用parfor并行评估目标函数。我在这台6核机器上实测并行化后总耗时缩短了接近4倍。5.5 其他容易忽略的工程细节数据长度最好选择2的整数次幂方便FFT计算非必须但性能更好。如果信号中包含明显的工频干扰先做50Hz陷波滤波不然分解出的前几个模态容易被工频分量占据。保存结果时把参数、目标函数值、特征频率幅值比一起存进txt或mat文件方便后续复核。6. 一些额外的小经验整套流程跑通之后我和它相处的方式就不仅是“跑一下出结果”了。根据个人的使用习惯我现在通常会先把NRBO-FMD运行一遍然后盯住最优目标模态的包络谱再反过来检查时域波形里的冲击间隔。两者的对应关系往往能直接告诉你是外圈还是内圈故障甚至能估算出转速波动情况。这比自己闷头调参数要高效得多。我也建议你把目标函数里的包络熵计算稍微改造成“加权包络熵”——对包络谱中前几个谐波频率区域给一个更高的权重这样优化器会更加聚焦在故障特征频率及其倍频的稀疏性上。我在实测中这个改动让特征频率幅值比又提升了大约10%算是性价比非常高的一个调整。NRBO-FMD这个框架并不复杂但每一个环节都值得细抠。参数边界的设置、目标函数的选择、优化器的工程化调整都会影响最终效果。如果你正在做相关方向建议先从仿真数据跑通流程再逐步迁移到实测数据观察不同信噪比下的参数变化规律。随着你对数据和算法的理解加深你会越来越清楚怎么从中提取出真正有用的故障信息。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价