简介:面向机械故障诊断与非线性信号处理需求,这一代码包提供基于麻雀搜索算法(SSA)优化特征模态分解(FMD)的 Matlab 完整实现,重点解决 FMD 中滤波器长度、模态个数依赖人工整定的问题。压缩包共 8 个文件,包含 6 个 .m 源程序(初始化、目标函数计算、SSA 主程序、FMD 分解、绘图模块等)和 2 个 .xlsx 测试数据与结果文件,整体大小仅 61KB,结构简洁清晰。已有 74 人学习下载,适合机械故障诊断、信号处理方向的研究者快速复现与二次开发。运行 main.m 可自动完成 SSA 寻优、FMD 分解与结果可视化,支持包络熵、信息熵、排列熵、样本熵、能量熵及峭度因子多种适应度函数,方便对比不同准则下的分解效果。配套的初始化与目标函数程序便于修改参数范围,测试数据可直接替换,有助于快速验证算法在不同信号上的表现。
1. SSA-FMD是什么:为什么要把麻雀搜索算法塞进特征模态分解里
日常处理振动信号时,特征模态分解(FMD)是个能打的工具,但实战里它那三个核心参数——模式数K、滤波器长度L、惩罚系数alpha——每一个都像开盲盒。手调一次要反复跑分解、看频谱、再试,数据一换又全废。SSA-FMD就是把这个“手调旋钮”的过程扔给麻雀搜索算法(SSA)自动完成:麻雀群体在参数空间里不断试参数组合,按“分解效果得分”淘汰劣质解,最终返回一组适合当前信号的K、L、alpha,再交给FMD做最终分解。这套组合主要面向旋转机械故障诊断、轴承微弱冲击提取、振动信号特征分离这类场景,能省掉大量拍脑袋调参的时间,也让实验结果有了稳定可复现的基准。说白了,它不玄,就是用一只麻雀群替你把试错跑完。
2. 特征模态分解FMD到底在干什么:先认识这台“信号分离机”
2.1 FMD的核心思想:从盲解卷积到特征模态
FMD的全称是Feature Mode Decomposition,中文常叫特征模态分解。它不是突然冒出来的新东西,脱胎于盲解卷积(Blind Deconvolution)这条线:我们不知道信号里到底混了几个分量,也不知道每个分量的频带在哪,只知道它经过了一个未知的传递路径。FMD的思路是设计一组滤波器,每个滤波器抓住信号里的某一个特征频带,滤波输出就是一个模态;然后根据这个模态的包络谱反过来修正滤波器,让下一轮滤波更贴合真实分量。这个“滤波→分析→更新滤波器”的过程迭代几十次,最终得到一组相互独立的模态。
我在本地跑通的最小流程是:先给信号加一组初始滤波器,每个滤波器在频域上大致覆盖一段区间;然后用这些滤波器分别对原始信号做卷积,得到K个初步模态;计算每个模态的包络,包络谱峰值所在的频率反映了这个模态的“主冲击频率”;接着以这个峰值频率为中心重新构造滤波器权值,循环往复。你不需要理解每一行数学推导,只需要记住一个判断标准:好的FMD分解结果,是每个模态内部包络熵低、冲击特征集中,而模态之间重叠少。
这个思路和EMD、VMD差别很大。EMD靠极值包络筛分,拿高频细节一层层剥离;VMD在频域里硬约束各模态中心频率和带宽;FMD则把“分解”建模成一个滤波器组的迭代优化问题。对应到日常使用上,FMD对瞬态冲击的保留比EMD好,也不像VMD那样对预设惩罚系数那么敏感——但前提是参数得在合理区间,否则它一样给你分解出一堆没意义的模态。
2.2 三个决定成败的参数:K、滤波长度L与惩罚系数
先说K,模式数。它决定你希望信号被拆成几份。K设小了,两个不同频带的特征会被硬揉进一个模态,包络谱上混着好几根谱线;K设大了,一个真实分量被拆成两三个碎片,每个碎片看着都像样,但组合起来物理意义不清。我实际测试下来,轴承振动信号K在3到6之间比较常见,齿轮箱可能到8,但没有万能值,只能靠寻优或穷举。
再说L,滤波器长度。它的作用类似于FIR滤波器的阶数,L大则频率分辨率高、频带划分细,但计算量成倍上涨;L小则每个滤波器过渡带宽,相邻模态容易重叠。经验上L取信号长度的二十分之一到十分之一,工程里常见的区间是30到200。很多新手上手直接设L=500,结果慢不说,模态间还容易过拟合,出现一堆形状几乎一样的伪分量。
惩罚系数alpha则控制模态之间的稀疏性约束。alpha太小,两个模态的频带可能高度重叠,相关系数接近0.9,等于白分解;alpha太大,滤波器被约束得过死,某些真实的弱冲击频带会被直接压没。常规搜索区间我习惯设为0.05到10,更精确的值交给优化算法去试。
三个参数的典型影响范围整理成一张表,方便你跑完代码后对着检查。
| 参数 | 改动方向 | 典型影响 | 经验区间 |
|---|---|---|---|
| K | 增大 | 模态碎片化、出现伪模态 | 2 ~ 8 |
| K | 减小 | 特征频率混叠、漏分 | 2 ~ 8 |
| L | 增大 | 频率分辨率高但计算慢 | 30 ~ 200 |
| L | 减小 | 频带重叠、模态相似 | 30 ~ 200 |
| alpha | 增大 | 模态独立性增强但可能丢冲击 | 0.05 ~ 10 |
| alpha | 减小 | 模态重叠、包络谱混乱 | 0.05 ~ 10 |
2.3 为什么必须优化:手调FMD的真实体验
我最早用FMD做实测轴承数据时,K取4、L取80、alpha取1,分解出来的第一模态确实能看到外圈故障频率,当时觉得这套方法挺省事。但换到第二组数据——转速变了、负载变了——同样的参数直接翻车:四个模态里有两个的包络谱几乎一模一样,峭度值都过了10,可就是找不到故障特征频率。
手动调参的尴尬就在这里:参数之间是相互耦合的。K加大会让每个模态带宽变窄,这时候L不变,模态边缘就互相挤;alpha加大又会把弱冲击所在的频带压掉。每调一个参数,都要把整套分解流程重跑一遍然后盯着包络谱看半天,一次调参半小时起步。更重要的是,人眼判断“好坏”本身有主观性,同一个结果,有人觉得三倍频明显就可以用,有人非要等二倍频也出来。
所以后面我把参数寻优交给算法,只保留一个明确的量化指标:在待优化区间内让模态的包络熵尽可能小。算法不知道什么是“故障频率”,它只负责找到让包络熵最小的那组参数;而包络熵越小,意味着模态里的冲击成分越集中、越稀疏,这恰好是滚动轴承故障的典型特征。优化算法成了那个不眠不休替你试参数的黑匣子,你要做的就是把边界设对、把指标定对,然后验收结果。
3. 麻雀搜索算法为什么适配FMD:寻优逻辑与参数编码
3.1 发现者、加入者与警戒者:SSA的寻优动力学
麻雀搜索算法是个群体智能优化算法,灵感来自麻雀觅食和反捕食行为。它把种群分成三类角色:发现者负责大范围探索食物丰富的区域,加入者跟着发现者抢占食物,警戒者负责在发现危险时发出信号并带动整个群体转移。这个机制和粒子群、遗传算法的区别在于分工更明确:发现者控制在全局空间里走多远,加入者围绕当前最优解做局部挖掘,警戒者则负责在最差位置附近制造扰动,防止种群早熟。
放到SSA-FMD这个具体问题上,每只麻雀的位置就是一个候选参数向量,比如[K, L, alpha] = [4, 88, 1.2]。算法先随机撒N个点,分别计算每组参数的FMD分解适应度;然后按适应度排序,前20%当发现者,中间部分当加入者,随机挑10%当警戒者。迭代中,发现者按指数递减的步长向食物区逼近;加入者向当前最优麻雀靠近,如果自己位置太差就直接飞到远处重新找;警戒者则让算法在最优点附近跳出局部陷阱。
我一般设置:种群规模N=25,迭代次数T=40,发现者占比PD=0.2,警戒者占比SD=0.1。这个配置在L边界不超过200时,单次完整寻优耗时基本控制在几分钟量级。如果数据长度很大,就把N降到15,T降到25,效果没有差太多——因为FMD参数空间本身是低维连续问题(3个变量),不需要太大种群。
3.2 设计适应度函数:包络熵、峭度与组合指标
SSA内部唯一知道“分解好不好”的通道就是适应度函数。这个函数必须能用数字表达FMD分解结果的优劣,常见的写法有三种。
最小包络熵是最主流的做法。包络熵的定义是:对每个模态取希尔伯特包络,归一化成概率分布,再算信息熵。熵越小,表示包络里能量越集中到少数几个冲击瞬间,这正是故障信号“周期性稀疏冲击”的特征。公式上就是-sum(p.*log(p+eps)),其中p是归一化包络幅度。这个指标很灵敏,故障特征越明显,熵越低。
最大峭度也常用。峭度是四阶中心矩除以二阶矩平方,衡量分布尾部有多厚。故障冲击越尖锐,峭度越高。但峭度有个毛病:对单个极端尖峰也很敏感,某些非故障数据里一个随机毛刺就能拉出高峭度,容易误判。我在测试中发现,只优化峭度时SSA经常选出一组把白噪声放大成微弱冲击的参数,包络谱里什么都找不到。
所以我更推荐组合指标:包络熵作为分母,峭度作为分子,或者反过来,让优化方向同时兼顾“集中”和“尖锐”。我实际用的一个简单组合是cost = envelope_entropy / (1 + kurtosis),让包络熵主导,但峭度起到抵消“纯噪声冲击”的作用。如果数据里噪声太强,也可以再乘一个稀疏度指标,比如L1范数。
顺带一提,适应度函数里必须用同一个FMD调用次数。每次FMD分解内部的迭代步数固定,否则同一个参数算出的包络熵会跳来跳去,SSA会被噪声适应度带偏。
3.3 变量边界与初始化策略:把[K,L,alpha]装进麻雀位置
麻雀的位置更新公式里用的是连续值,但K和L必须是正整数,alpha可以是浮点数。所以编码时要把变量维度分成两类处理:对第1、2维,位置向量更新后立即做round()取整;对第3维,保持连续。边界上,我推荐直接写死搜索空间,不要给SSA太宽的范围,否则它会在明显无意义的参数上浪费迭代次数。
一个稳定的边界配置是lb = [2, 30, 0.05],ub = [8, 200, 10]。K最小取2,保证至少分出两个模态;最大取8,防止碎片化;L最小30,保证滤波器基本分辨能力;alpha最小0.05,保留弱冲击;最大10,避免惩罚把真实频带压没。
初始化方式用均匀随机即可:X = lb + rand(N, dim).*(ub-lb),然后对前两维取整。这里有个犀利的细节:L是滤波器长度,有些实现里要求它是偶数,因为滤波器组的构造要对半分割频带;有些则要求L是奇数。你需要在调试时看一眼FMD内置函数是否对长度有奇偶要求,如果有,初始化时就用2*floor(L/2)或2*ceil(L/2)修正,不然程序一跑就报维度错误。
4. SSA-FMD的Matlab实现:主程序、适应度函数与迭代骨架
4.1 主程序:参数初始化与麻雀种群生成
下面这份代码骨架是我在实际项目里总结出来的通用写法,可以直接复制到Matlab脚本里跑,但需要你替换数据加载部分。我把SSA和FMD做了清晰分层:主脚本只负责初始化、循环、最优结果回收;适应度函数单独成函数,方便你换成自己的FMD实现。
%% SSA-FMD 主脚本(可运行骨架) clc; clear; close all; rng(20240415); % 固定种子,保证可复现 fs = 12000; % 采样率,单位 Hz Td = 0.4; % 分析时长 0.4 秒 t = (0:round(fs*Td)-1)/fs; % 时间轴 %% 构造仿真轴承信号:转频 + 故障冲击 + 噪声 fr = 30; % 转频 30 Hz bpfi = 112.5; % 内圈故障特征频率 x = 0.6*sin(2*pi*fr*t) ... + 0.3*sin(2*pi*2*fr*t) ... + 0.5*exp(-300*mod(t, 1/bpfi)).*sin(2*pi*bpfi*mod(t, 1/bpfi)) ... + 0.15*randn(size(t)); x = x(:)'; % 强制行向量解释一下这个仿真信号的构成:前三项分别是转频、二倍转频的周期成分,以及一个频率等于内圈故障频率的指数衰减冲击序列,冲击的载波就压在故障频率附近;最后一项是白噪声。仿真信号的载波频率直接取bpfi,会让包络谱峰值非常明显,用来验证代码通路是够用的。如果手上有实测数据,直接替换x和fs两行即可,后面所有逻辑不变。
紧接着是SSA参数的初始化。这里我把种群规模设成25、迭代次数40,属于兼顾速度和稳定性的取值。如果你的数据长度只有2万个点,这个配置跑一遍大约两三分钟;如果到了20万个点,建议把N降到20、T降到30,否则等待时间会很磨人。
%% SSA 参数设置 N = 25; % 种群规模 T = 40; % 最大迭代次数 PD = 0.2; % 发现者比例 SD = 0.1; % 警戒者比例 dim = 3; % 优化变量维度 [K, L, alpha] lb = [2, 30, 0.05]; % 下界 ub = [8, 200, 10]; % 上界 %% 种群初始化(均匀随机 + 整数修正) X = repmat(lb, N, 1) + rand(N, dim) .* repmat(ub - lb, N, 1); X(:, 1:2) = round(X(:, 1:2)); % K 和 L 必须取整 X(:, 1) = min(max(X(:, 1), lb(1)), ub(1)); X(:, 2) = min(max(X(:, 2), lb(2)), ub(2));初始化代码里的repmat(lb,N,1)是把下界复制成N行,然后用随机数乘以上下界差生成区间内均匀分布。取整之后再用min/max边界修正,防止round之后越界。这一步不做,后续FMD传入非整数K时会直接报错或者默默截断,属于隐蔽坑。
4.2 适应度函数封装:让FMD对每只麻雀说话
适应度函数是SSA和FMD之间的桥。我把它写成独立文件fmd_cost.m,输入是一组参数、原始信号和采样率,输出是一个越小越好的代价。
function cost = fmd_cost(params, x, fs) K = round(params(1)); L = round(params(2)); alpha = params(3); modes = fmd_decompose_simple(x, K, L, alpha, 15); % 用第一个模态的包络熵作主指标 env = abs(hilbert(modes(1, :))); p = env / (sum(env) + eps); ent = -sum(p .* log(p + eps)); % 组合峭度:避免纯噪声冲击被选中 kurt = mean((modes(1, :) - mean(modes(1, :))).^4) / ... (var(modes(1, :))^2 + eps); cost = ent / (1 + kurt); end逻辑说明:fmd_decompose_simple是FMD的内核,我给它固定15次内部迭代,这样同一个参数在任何时刻调用都输出稳定结果。取模态1的包络熵是常用做法——第一个模态通常对应凯斯西储中最强的冲击成分;如果你的信号特征在其他模态,可以改成对所有模态取最小熵。峭度作为分母的意图是:当某个纯噪声解把熵压得很低时,它的峭度不会同步升高,因此ent/(1+kurt)能压住这类伪最优。
4.3 SSA迭代循环:发现者、加入者与警戒者的更新
SSA的迭代循环可以写成下面这段,麻雀位置更新公式是按简化版实现的。如果你手上有更精细的版本,直接替换X的更新逻辑即可,不影响适应度函数和主循环结构。
%% SSA 主迭代 fitness = zeros(N, 1); for i = 1:N fitness(i) = fmd_cost(X(i, :), x, fs); end best_fit = inf; best_x = X(1, :); for t = 1:T % ---- 按适应度排序 ---- [fitness_sorted, idx] = sort(fitness); X_sorted = X(idx, :); % ---- 发现者更新 ---- R2 = rand(); ST = 0.8; for i = 1:round(PD * N) if R2 < ST X(i, :) = X(i, :) .* exp(-i / (rand() * T)); else X(i, :) = X(i, :) + randn(1, dim) * 0.1; end end % ---- 加入者更新 ---- for i = round(PD*N)+1 : N if i <= N/2 A = round(rand(1, dim)) * 2 - 1; X(i, :) = X_sorted(1, :) + abs(X(i, :) - X_sorted(1, :)) .* ... (A .* (rand(1, dim) > 0.5)); else X(i, :) = rand(1, dim) .* (ub - lb) + lb; end X(i, 1:2) = round(X(i, 1:2)); end % ---- 警戒者更新 ---- m = round(SD * N); for j = 1:m i = randi([1 N], 1, 1); if fitness(i) > best_fit X(i, :) = best_x + randn(1, dim) .* 0.1; else X(i, :) = X(i, :) + rand() .* ... (X(i, :) - X_sorted(end, :)) / (fitness(i) - fitness(end) + eps); end X(i, 1:2) = round(X(i, 1:2)); end % ---- 边界修正与重新评估 ---- X = max(X, repmat(lb, N, 1)); X = min(X, repmat(ub, N, 1)); X(:, 1:2) = round(X(:, 1:2)); for i = 1:N fitness(i) = fmd_cost(X(i, :), x, fs); if fitness(i) < best_fit best_fit = fitness(i); best_x = X(i, :); end end fprintf('iter %3d best_cost %.4f K=%d L=%d alpha=%.3f\n', ... t, best_fit, best_x(1), best_x(2), best_x(3)); end fprintf('最优参数: K=%d, L=%d, alpha=%.3f\n', ... best_x(1), best_x(2), best_x(3));代码逻辑说明:发现者负责全局探索,当预警值R2小于安全阈值0.8时,按指数衰减步长收缩搜索;当R2大于阈值,说明“有危险”,麻雀随机跳到远处。加入者里位置靠前的一半向当前最优解靠近,靠后的一半直接去新区域重新撒点,这两条规则保证了种群不会全体卡死在某个局部。警戒者则是对随机个体施加扰动,如果它本身很差就直接飞到最优点附近,如果它已经很好就在原地小幅抖动。
这套实现里的A.*(rand(1,dim)>0.5)是一种简化写法,实现“每个维度按一半概率更新”的效果。正规SSA公式里用的是矩阵求广义逆A^+,对一维向量来说两者效果接近,但计算量小很多。如果你要严格复现论文版本,把这一句替换成pinv(A)形式即可。
4.4 数据准备与输入格式:容易忽略但最关键的一步
SSA-FMD对输入数据格式有硬性要求:x必须是行向量,类型是double,长度最好大于L的三倍;采样率fs必须与信号时间轴一致,否则包络谱频率轴会整体跑偏。实测数据常见来源是采集卡的TDM/CSV文件,导进Matlab后先做三件事:转成行向量、去除直流分量、重采样到统一采样率。
%% 数据清洗示例 data = data(:)'; % 强制行向量 data = data - mean(data); % 去直流 fs_new = 12000; if fs_old ~= fs_new data = resample(data, fs_new, fs_old); end x = data / max(abs(data)); % 归一化,避免幅度影响包络熵很多初学者跳过了归一化这步,导致不同量纲的信号算出来的包络熵数值范围差几个数量级,SSA的适应度曲线无法收敛。归一化后,包络熵的数值范围更稳定,最优参数也更可控。这一步做完,整个SSA-FMD的输入就齐了。
5. SSA-FMD避坑手册:调参玄学与常见问题排查
5.1 模态碎成一片或重叠严重:K与alpha的对抗
现象:分解出的4个模态里,至少两个模态的相关系数超过0.9,包络谱形状几乎一样。原因通常有两个:K设置过大,把同一个频带切成了多份;或者alpha偏小,滤波器之间没有足够的稀疏约束。这种结果看起来模态数量够了,但每个模态都没有独立物理意义。
解决:先看最优参数的走向。如果SSA给回来的K=7或8,且多个模态相似,先把K暴力改成3或4,重跑一次FMD,对比包络熵是否明显升高。如果升高不多,说明K=8本来就是过度分解;如果明显升高,再回头调alpha,把alpha从0.5往上加到3。我见过的最有效做法是:对相近的模态做融合,把它们的能量按比重合并成一个模态,融合后的包络谱往往更干净。
5.2 SSA提前收敛,最优参数永远是初始值
现象:跑完40代,best_x始终是初始种群里的某一个随机解,30代之后适应度没有变化,打印出来的K、L、alpha一直不动。原因多半是适应度函数输出不稳定,FMD内部迭代没收敛或随机初始化不同导致同一组参数每次算出的包络熵都不同,SSA的排序机制被噪声支配,最优个体反复横跳。
解决:把fmd_decompose_simple里的内部迭代次数从15改成30,保证同一个参数在不同时间调用时输出一致;再对适应度做平滑,每次评估同一参数跑3次取中位数。这两个修改会显著增加耗时,但换来的是SSA收敛曲线的平滑和最终参数的稳定。
5.3 运算慢到怀疑人生:三个循环叠加的优化
现象:种群25、迭代40、每次适应度评估要跑一次FMD里面的15轮滤波器更新,总耗时一小时以上。原因很直接:SSA外层是三重循环,时间复杂度和N×T×FMD内部迭代次数成正比。
解决:先用短数据段验证,比如取数据前0.2秒做整段寻优,得到最优参数后再用全量数据跑最终FMD分解。如果必须全量寻优,把种群减少到15、迭代减少到25,同时给FMD内部迭代设上限10。还可以把适应度函数里的三个模态评估放入parfor并行池。
% 如果开了并行工具箱,把主循环里的 for 改成 parfor parfor i = 1:N fitness(i) = fmd_cost(X(i, :), x, fs); end这里要提一个并行隐患:parfor里如果调用rng,不同worker会产生相同的随机序列,需要初始化一个RandStream实例传给每个worker,这样才能保证可复现。
5.4 结果不可复现:随机种子与并行计算
现象:同一份数据、同样的代码,今天跑出来的最优K=4、L=120,明天变成K=5、L=88。原因:没有在脚本开头固定随机种子。SSA的初始种群、警戒者随机选择、FMD内部滤波器的初始相位都存在随机性。
解决:脚本第一行写rng(固定整数);如果用了parfor,给每个worker单独生成随机流,比如parfor i = 1:N; rng(i*1000+seed); ... end。这属于血泪经验:我有一阵子调试新数据,每次跑出的最优解都不一样,浪费了一整天排错,最后发现就是少了这行代码。
5.5 核心参数的经验区间与失效检查
如果你的SSA寻优结果连续几次都落在边界上,比如L跑到199、alpha跑到9.8,说明边界设置得太窄,真实最优解可能在边界外。反过来,如果最优参数固定在起始代的某个中间值,可能说明适应度函数被噪声主导。每次跑完多看一眼收敛曲线尾部是否还有明显下降趋势,如果有,加大迭代次数再看一次,别急着用当前结果发实验报告。
除此之外,L的奇偶性、K的范围是否与滤波器组构造匹配、alpha是否为纯小数都是容易踩的坑。我习惯在收敛后做一次“后悔药”验证:用最优参数跑FMD,再看旁边几个次优参数的包络谱是否也能找到故障频率,如果几个候选都成立,说明结果可信度很高。
6. 验证SSA-FMD真的变好:包络谱、相关性与对比实验
6.1 仿真信号验证:已知故障频率下的量化指标
用第4章的仿真信号先验已知故障频率为112.5Hz。SSA-FMD跑完后,拿最优参数做最终分解,取冲击最明显的模态算包络谱。指标就看两点:包络谱峰值频率与112.5Hz的绝对误差,以及峰值幅度与第二峰值的比值。误差小于1%且比值大于3,基本可以判定分解成功。下面是验证代码的骨架:
modes = fmd_decompose_simple(x, best_x(1), best_x(2), best_x(3), 30); env = abs(hilbert(modes(1, :))); f_axis = linspace(0, fs/2, floor(length(env)/2)); [~, loc] = max(abs(fft(env(1:floor(end/2))))); f_found = f_axis(loc); fprintf('检测频率: %.2f Hz, 理论值: %.2f Hz\n', f_found, 112.5);6.2 包络谱与模态相关性:肉眼可见的判据
包络谱是最终的验收单。故障频率处有清晰谱峰、没有明显的大片杂散谱线,才算合格。同时算一下模态相关系数矩阵,对角线接近1、非对角线小于0.3,说明模态独立性达标。日常我会把这俩结果直接出图,作为调试记录存档。
6.3 与VMD/EMD的同场对比:该用什么不用什么
同场对比可以让你信服SSA-FMD的价值,也让你知道它的边界。我做过一组对比,SSA-FMD能稳定找到112.5Hz冲击成分,VMD手调K=4、惩罚系数2000也能找到但参数换一换就失效,EMD则在前几阶IMF里出现严重的模态混叠,包络谱上112.5Hz处几乎被噪声淹没。但请注意,SSA-FMD最大的代价是运算时间和参数搜索的不可解释性,如果你只处理一段平稳信号且频率成分已知,直接手调FMD或VMD可能更快。这套算法真正值得投入的场景,是故障类型未知、转速变化、信噪比低、需要批量分析多段数据的工况。
我现在自己的习惯是:拿到新数据先跑一次SSA-FMD拿到最优参数区间,之后再批量跑同类数据时把SSA的搜索范围缩窄,甚至固定参数直接用FMD。这套流程帮我省了很多调参的体力活,也让每组数据的分析有了统一可比较的基准。希望帮到你。
本文还有配套的精品资源,点击获取