
很多做设备状态监测的朋友第一次接触这套组合拳多半是被论文里那一串缩写搞懵的明明就是处理一根振动信号曲线为什么有人要先用VMD拆一遍再做FFT看频谱最后还要拉一个HHT时频图出来我在现场处理轴承故障数据时也走过不少弯路一开始直接拿FFT怼原始信号结果特征频率全被噪声埋掉换了VMD-FFT-HHT这条流水线之后故障特征才从一片“草地”里清晰浮出来。这篇内容就把这套组合讲的明明白白面向正在跟信号数据较劲、做旋转机械故障诊断的同学也适合想把FFT真正用透的工程师。1. 为什么组合是VMD加FFT再加HHT三者各自在解决什么问题1.1 VMD不是玄学它本质上是把一团毛线按颜色分股变分模态分解Variational Mode DecompositionVMD是2014年提出的信号分解方法核心思想非常直接把一段多分量、非平稳的信号拆成若干个中心频率不同、带宽有限的子信号这些子信号在论文里叫本征模态函数IMF。它在数学上构造了一个约束变分问题通过迭代求极值一次性把所有模态解出来而不是像EMD那样一层一层把“剩余信号”剥出来。我先说个容易踩的坑第一次见到“VMD”这个词的人很容易把它和电脑BIOS里那个Intel VMD混合存储技术搞混这俩完全不是一个东西。我们这里说的VMD是纯信号处理领域里用来做自适应分解的工具它的价值在于把原始振动信号里混叠在一起的转频、故障冲击、谐波、噪声拉开让后续分析不再是“一团黑”。VMD相对EMD最大的优势在于它从根本上避开了EMD递归筛选带来的模态混叠问题。EMD在信号频率接近或噪声强时经常出现一个模态里混着两个频率成分的情况或者同一个频率成分被劈成两个模态这种“驴唇不对马嘴”的分解结果会让你后面的频谱分析直接走偏。VMD把一个非递归问题变成变分问题来解每个模态都有明确的中心频率和带宽约束所以分解结果更稳定、更具物理意义。不过它也不是万能药VMD对参数极其敏感尤其是要提前指定分解模态个数K还有惩罚因子alpha。K给少了信号欠分解一个模态里塞了好几种频率K给多了会出现虚假模态把噪声也当成有用成分拆出来。这块的具体调参经验我在第2部分和问题排查章节会展开讲。1.2 FFT是每个做信号的人绕不开的“标配频谱仪”快速傅里叶变换Fast Fourier TransformFFT大家太熟了。它把时域信号变换到频域本质是计算信号在各个频率上的幅值和相位工程上最常用的就是看幅值谱用来识别信号里存在哪些频率成分。旋转机械故障诊断的物理基础就在这里轴承、齿轮的局部损伤在运转中会产生周期性冲击这个冲击频率是可以通过轴承几何尺寸和转速算出来的比如外圈故障特征频率BPFO、内圈故障特征频率BPFI。只要FFT频谱上对应频率出现了谱峰基本就能锁定损伤位置。但FFT有个先天短板它默认信号是平稳的或者准平稳的也就是说它给出的频谱是整个分析时间窗内的“平均”结果。实际采集到的故障信号往往是非平稳的转速波动、载荷变化、冲击衰减都会导致频率成分随时间变化这时FFT的谱线会被“糊掉”看起来峰不高、底噪大、边带杂乱读不出有效信息。这就是为什么我在实际故障诊断时不主张对原始信号直接做FFT。先让VMD把信号拆开每个IMF至少是窄带且相对平稳的再对感兴趣的那个模态做FFT谱线会干净得多故障特征频率和它的倍频、边带也能分辨清楚。1.3 HHT补上了FFT丢掉的“时间轴”希尔伯特-黄变换Hilbert-Huang TransformHHT是黄锷在1998年提出的它实际上包含两步第一步对信号做经验模态分解EMD把非平稳信号拆成本征模态函数第二步对每个IMF做希尔伯特变换得到瞬时频率和瞬时幅值最终绘制出以时间为横轴、频率为纵轴、颜色表达能量的希尔伯特时频谱。很多人问已经有FFT了为什么还要HHT我的回答是FFT回答的是“有哪些频率”HHT回答的是“这些频率在什么时刻出现、强度怎么变化”。举个例子一个轴承外圈出现早期点蚀故障冲击是间歇性出现的不是每转都打一下。你拿FFT看1秒的平均频谱能看到BPFO处有一点点凸起但无法判断这个冲击是连续还是间歇、发生在转轴的哪一圈。HHT时频谱上这种间歇冲击会表现为一根根等间隔的垂直能量带冲击间隔、强度变化一目了然。要注意的是经典HHT第一步用的是EMD而EMD有模态混叠的毛病。所以近几年工程界流行用VMD代替EMD做第一步分解再对分解出的模态做希尔伯特谱分析。严格说这个流程叫“VMD-HHT”更准确很多人直接写HHT也只是沿用习惯叫法。我在实际项目里用的就是VMDHHT这套改良流程。1.4 三件套的配合逻辑切分、看频、追时把三件套串起来的逻辑链条是这样的原始信号里同时混着转频、高倍频谐波、故障冲击、随机噪声直接用FFT看是“一锅粥”先让VMD把这锅粥按频带“分餐”每个IMF只保留一个或多个窄带成分然后对每个IMF做FFT看看各模态里的频率成分是否符合某个故障特征频率如果想进一步定位冲击出现的时域位置、判断故障严重程度就对这个IMF做希尔伯特变换画出时频图。整个过程总结成六个字切分、看频、追时。这种组合的现实价值不只是论文里好看而是能形成一条完整、可解释、不容易出错的证据链。尤其对故障诊断这种要求“给结论还得有依据”的工种频谱上的谱峰和时频图上的冲击周期互为印证比丢给用户一个卷积神经网络的“损坏概率0.87”要让人信服得多。2. 从数据采集到特征提取完整流程的每一步细节2.1 数据怎么来、怎么进MATLABCSV和Excel导入的实操细节好多人卡在第一步手里是一堆csv或者Excel表格怎么倒腾到MATLAB里做FFT这里给一个我常用的模板。如果csv文件第一行是列名数据从第二行开始采样率假设已知用readmatrix读取最简单data readmatrix(vibration_data.csv); fs 8192; % 采样率单位Hz x data(:, 2); % 假设第二列是振动加速度信号 x x - mean(x); % 去掉直流分量读取Excel同理用readmatrix也能直接读xlsx文件但要注意readmatrix读txt、csv、xlsx都适用读取后先确认数据的单位。加速度信号一般是m/s²或g位移信号是μm不同单位会直接影响到幅值谱的量级但不影响频率位置判断。读进来以后第一件事就是画时域图看一眼有没有野值、断点、饱和削顶。数据质量不过关后面所有分析都是白搭。预处理方面我建议至少做两步去均值和去趋势。去均值是为了消掉直流分量不然FFT之后0Hz处会顶起一个巨大的谱线把其他频率细节压得看不清。去趋势是为了消除传感器零点漂移或温漂造成的低频斜坡。/趋势项会污染低频段让频谱在很低的频率处出现虚假的较大幅值。另外如果采集的是非等间隔数据比如某些历史数据时间戳不均匀必须先用interp1做一次重采样转成等间隔采样序列否则FFT的解算是错的。2.2 采样率和数据长度怎么定一个能算清楚的工程问题采样率的选择遵循奈奎斯特采样定理采样率必须大于信号最高关注频率的两倍工程上通常取关注频率上限的2.56倍以上甚至5到10倍。比如你关心轴承外圈故障特征频率BPFO约100Hz转频20Hz那采样率取5120Hz已经绰绰有余但如果还要分析故障冲击引起的结构共振频率共振峰可能在几千赫兹采样率就得拉高到20kHz以上。数据长度决定了频率分辨率也就是FFT频谱上相邻两根谱线的间隔。频率分辨率Δf fs / NN是参与FFT的采样点数。想分辨出BPFO92.3Hz和BPFI107Hz这两个只差15Hz左右的频率频率分辨率至少要优于15Hz最好能到1Hz。这意味着在fs4096Hz时N至少要4096点也就是1秒数据。我自己做诊断时谁跟我说“我就采了0.1秒数据”那基本没法做精细分析因为0.1秒只有409个点Δf高达40Hz特征频率附近全是糊的。还有一点要提醒补零能视觉上让谱线更密但它不提高真实分辨率只是把FFT结果插值画平滑了。判断频率分辨率是否够只看实际采样时长TN/fs够不够长。这是很多新手的误区。2.3 VMD参数怎么选K值和penalty alpha的调参思路VMD调试的核心参数有两个模态个数K和惩罚因子alpha。官方默认alpha2000但实际工程数据千差万别照抄默认值容易出问题。关于K值选择我的做法是“扫描观察法”固定alpha2000把K从2开始递增到8每次分解后打印各模态的中心频率。如果某两组模态的中心频率越来越接近或者出现一个中心频率特别低、波形几乎趋于0的模态说明K已经给多了。反过来如果K3时某个模态的中心频率附近还能看到明显的双峰说明这个模态里混了两种频率K给少了。我一般在轴承振动数据上选K4到6齿轮箱数据由于啮合频率和边带复杂K会取6到10。alpha的物理含义是模态带宽约束alpha越大每个模态的带宽越窄对噪声的容忍度越低alpha越小带宽越宽模态里可能裹入无关频率。数据幅值量级不同alpha的合适取值范围也会漂移。我的习惯是把信号先归一化到[-1, 1]再以alpha2000为起点试如果分解出的模态波形毛刺很多就把alpha提高到5000如果发现某个模态明显包含多个频率成分说明带宽太宽了也往大调反之如果模态被拆碎、出现虚假模态就往小调比如800到1000。注意VMD对初值和迭代次数也有感知但一般影响不大。MATLAB从R2021a开始自带vmd函数旧版本需要从作者主页下载官方的vmd.m文件放到路径下调用方式是一样的。2.4 对每个IMF做FFT频谱图和功率谱密度图到底怎么画才算对对VMD分解出的IMF做FFT最需要注意的是幅值修正和画单边谱的规则。很多人在这一步画出的频谱幅值差了好几倍不是因为算法错了而是没搞清单双边谱和幅值修正。给一个我自己常用的标准模板function [f, amp] single_side_spectrum(x, fs) N length(x); X fft(x); amp abs(X) / N; % 双边幅值谱 freq (0:N-1) * fs / N; f freq(1:N/21); % 只取正频部分 amp amp(1:N/21); amp(2:end-1) amp(2:end-1) * 2; % 非直流和非奈奎斯特分量乘2 end直流分量0Hz处不乘2奈奎斯特频率即fs/2处只有偶数N才有也不乘2其他非直流谱线乘2这是因为做单边谱时把负频率的能量折回了正频。如果你用的是周期图法算功率谱密度MATLAB里直接调periodogram即可% 加汉宁窗的周期图法功率谱密度估计等效于频域平滑 [psd, f] periodogram(x, hann(N), N, fs);至于功率谱密度和幅值谱的区别幅值谱告诉你某个频率成分的幅值多大适合找特征频率峰值功率谱密度告诉你单位频带宽度里有多少功率适合比较不同频段的能量分布。诊断时我还是习惯两个都看先幅值谱找峰、对频率再用PSD看噪声基底和边带能量。关于加窗我得特意说一句经验之谈。对原始信号做FFT时数据截断造成频谱泄露一般建议加汉宁窗或布莱克曼窗来压低旁瓣。但如果信号已经过了VMD分解IMF是窄带信号频谱泄露已经相对小了加不加窗影响不大。我实际处理时直接对IMF做不加窗FFT反而能保留更高的频率分辨能力。所以很多人都问“FFT到底要不要加窗”我的答案是加窗是缓解频谱泄露的手段不是规定动作要看你分析对象是什么。原始信号某一段做FFT建议加窗VMD分解后的窄带IMF做FFT不加窗通常也没问题。2.5 希尔伯特谱怎么看瞬时频率编码了故障的“时间指纹”对VMD分解出的某一个IMF做希尔伯特变换可以得到它的解析信号瞬时频率就是解析信号相位的导数瞬时幅值就是解析信号的模。把所有IMF的瞬时幅值在时频平面叠加绘制就是希尔伯特谱。MATLAB里最省事的做法是用hht函数% 对第2个IMF绘制时频谱 hht(IMF(:, 2), fs);出来的图横轴是时间纵轴是频率颜色深浅表示瞬时能量。看这种图我最关注两点第一能量带是否随时间产生周期性间断一段亮一段暗亮的宽度和间隔能对应到某个故障特征周期第二频率是否随时间漂移如果转速不稳转频和故障特征频率都会跟着漂HHT能画出这种漂移轨迹这是FFT完全做不到的。还要坦白一个HHT的固有毛病端点效应。信号两端在做希尔伯特变换时边界附近瞬时频率经常发散出现向上或向下的“飞刺”。处理办法是在分析前对信号做镜像延拓或者干脆把分析段两端的短暂过渡区去掉只读取中间可信段。这个坑我踩过好几次后面问题排查里再细说。3. 一个能直接上手的轴承故障诊断案例3.1 案例设定与数据说明为了让大家能完全复现这段流程我用一个仿真轴承信号来演示。设一个滚动轴承参数滚动体数量Z12节径D65mm滚动体直径d15mm接触角α0°轴转速N1200rpm那转频fr1200/6020Hz。外圈故障的特征频率BPFO按公式算BPFO (Z/2) × fr × (1 - d/D × cosα) 6 × 20 × (1 - 15/65) 120 × (50/65) ≈ 92.31Hz也就是说如果外圈上有一个局部损伤每当滚动体滚过这个损伤点时会产生一个冲击理论上这个冲击的重复频率就是92.3Hz。我在MATLAB里模拟这样一段信号一个20Hz的转频正弦分量叠加一组按92.3Hz重复的衰减振荡冲击冲击激起的结构共振频率取3000Hz再叠加一定量的高斯白噪声。采样率fs8192Hz数据长度N8192点正好1秒数据。为什么要造仿真数据因为真实故障数据里你永远不知道“标准答案”而仿真数据里每个成分都是我放进去的跑完流程后拿结果跟标准值对比才能真正检验这套方法的有效性。这也是我建议所有新手先做的事。3.2 VMD分解实操代码与调参记录对生成的仿真信号调用MATLAB自带vmd函数[IMF, res] vmd(x, NumIMFs, 4, Alpha, 2000, InitMethod, peaks);我在K值上做了三次试算。K3时IMF1的中心频率在19.8Hz附近代表转频IMF2中心频率在92Hz附近是我想找的BPFO频段但IMF3的中心频率跑到2870Hz附近里面同时包含了共振冲击和相邻的噪声频带说明分解不够细。K4时IMF2依然稳定在92HzIMF3和IMF4把高频段拆成了两个窄带一个落在1800Hz左右、一个落在2900Hz左右边界更干净。K5时出现了一个中心频率为0.2Hz的模态波形几乎是一条平线这就是典型的过分解虚假模态。所以最终选K4。alpha方面我把信号归一化到[-1,1]后alpha2000分解出的IMF2包络还比较光滑不用额外调整。如果你的实测信号噪声更大可以把alpha调到3000到5000让模态带宽更窄减少噪声混入。要注意的是alpha调大后计算时间会明显上升这是正常现象。3.3 各模态FFT频谱找到故障特征频率及其倍频分解完成后我对IMF2做FFT幅值谱上能看到三根清晰的谱线92.3Hz、184.6Hz、276.9Hz分别对应BPFO的基频、二倍频和三倍频。谐波的出现意味着冲击不是纯正弦而是周期性的瞬态冲击这种“基频加整数倍频”的组合就是轴承外圈局部损伤的典型频谱特征。再回头对比一下直接对原始信号做FFT的结果92.3Hz处的谱峰被噪声抬高了很多几乎看不出比旁边的谱线高多少而VMD分解后噪声被分割到其他模态IMF2里信噪比大幅提升BPFO基频的谱峰高度直接突出了近一个数量级。这就是为什么我总是说FFT不是不中用而是前面缺了一个好“切片工”。另外我还会顺手把IMF1的FFT也画出来确认它确实是20Hz转频成分并且没有出现明显的边带。如果在转频两侧看到间隔为BPFO的边带说明外圈故障对转频产生了幅值调制这也是故障的另一个佐证。3.4 HHT时频图把故障冲击的时刻与强度挖出来用hht函数画IMF2的时频谱你会看到一根稳定在92Hz左右、等间隔出现脉冲式亮带的频率轨迹。每个亮带对应一次滚动体滚过外圈损伤点的冲击相邻亮带的间隔就是1/BPFO≈10.8ms。你再拿时域波形图核对一下冲击的位置能发现冲击峰值的间隔与亮带间隔完全对应。这种时间维度的验证是单纯FFT给不了的。我在实际项目中发生过这样的事FFT频谱上92Hz处明明有谱峰但特征频率对应的能量在时间轴上时有时无后来用HHT才发现故障冲击存在“间歇性”并不是每圈都打这直接影响了故障严重程度的判断——连续冲击比间歇冲击通常意味着更严重的损伤扩展。所以遇到这种情况强烈建议多看一眼时频图。3.5 特征判据小结如何从结果给出“轴承坏了”的结论把整个案例的结论梳理成故障判据基本分三条。第一条频域判据IMF的FFT频谱在BPFO及其倍频处出现明显谱峰且倍频次数越多、幅值越高损伤通常越严重。第二条时域判据希尔伯特谱上冲击能量带重复间隔等于1/BPFO说明冲击事件以特征频率周期重复。第三条调制判据如果转频两侧存在BPFO间隔的边带或冲击幅值呈现某种周期性变化说明损伤位置在承载区变化常与内圈或滚动体故障相关。三条合起来就可以比较有把握地给出外圈损伤的结论。4. 实战中高频踩坑与排查速查表4.1 VMD不收敛、长时间跑不完怎么办现象是代码跑了几分钟还在迭代或者提示达到最大迭代次数但模态仍然失真。常见原因有三个数据太长、alpha设置过大、K值设置过大。解决办法也直接把参与VMD的数据截短到0.5到1秒比如从8192点截到4096点或者把数据先降采样但降采样前要保证奈奎斯特频率仍高于关注频率上限再或者下调alpha到1000左右。VMD计算复杂度不低几十万点数据跑一次就要好几分钟不是机器不行是这种算法天生就吃算力。我在做大批量数据批处理时都是先写一个自动分段脚本每段只取1秒数据做VMD速度能快一大截。4.2 频谱上全是刺分不清边带和噪声怎么办频谱上一堆乱七八糟的谱线时先别急着怀疑算法先检查预处理。首要检查是否去均值其次检查是否存在野值点。野值在FFT里会表现为整个频段上的宽谱噪声抬升一个削顶脉冲就能毁掉一整段分析。再就是VMD参数问题如果IMF中心频率附近有明显毛刺适当提高alpha让模态更窄或者把数据加窗后再做FFT。还有一个排查技巧把时域波形用包络谱再验证一次包络谱对周期性冲击很敏感故障特征频率会在包络谱上以清晰谱峰出现这个可以作为旁证。4.3 端点效应和模态混叠绕不开的宿命问题VMD和HHT都存在边界效应信号两端分解出的模态容易失真。我在工程上常用的数招第一截取数据时前后各留一小段“掩护数据”分析时只读中间段第二先做镜像延拓把数据镜像翻转接到两端再分解处理完再截掉延拓部分第三也是比较实用的一招直接用分段重叠分析对每一段取中间的稳定结果拼接。模态混叠则更多是K值没选好或者信噪比太低造成的先把信号做一次带通滤波预处理减少远离关注频段的能量干扰再跑VMD混叠概率会明显下降。4.4 算得慢、内存爆大数据量下如何做工程实用化VMD和HHT离实时计算还有距离这一点必须承认。我在做在线监测项目时通常是这么分工的嵌入式或PLC侧用FFT加包络谱实时计算特征频率幅值做粗报警一旦报警触发把原始波形上传到服务器或PC端再用VMD-FFT-HHT做精细分析输出证据链。跟FPGA打交道的朋友可能知道Vivado里的FFT IP核能把FFT做到微秒级但VMD是个迭代变分问题目前想塞进小资源嵌入式芯片里并不现实。所以我的建议是充分利用FFT做实时快筛VMD-HHT做离线精判两头兼顾不要拿一台服务器死磕实时性那是跟算法特性过不去。5. 把这三件套用到更多场景扩展思路与我的体会5.1 从轴承到齿轮箱、电机与结构健康监测这套流程不挑轴承这一个对象。齿轮箱故障里啮合频率及边带分析同样适合VMD先把啮合频率、转频、故障边带拆开再做FFT看边带间隔电机故障里电流信号的谐波分析也能套用先把基波工频当作一个模态拆出去剩余信号里的故障特征频率会暴露得更清楚。还有一些非设备场景比如一段时间内卫星信号信噪比数据集的趋势分析、风电塔筒振动监测、地震波数据处理本质上都是“多分量非平稳噪声污染”VMD-FFT-HHT的路子都能走通。我个人的经验是只要数据里既有周期性又有非平稳性这套流程大概率有用如果数据本身就是平稳正弦叠加热噪声那老老实实一个FFT就够了不见得每次都要上VMD。5.2 与机器学习结合特征工程的新姿势现在深度学习做故障诊断很火但工程落地时我反而更喜欢“物理特征浅层模型”的组合。VMD分解后天然能得到一组特征各模态的能量占比、中心频率、峰值频率、幅度、包络谱特征、希尔伯特边际谱的特征频率幅值等。把这些整理成特征向量丢给随机森林或SVM模型小、可解释、不容易过拟合而且只要特征物理意义明确现场工程师也能理解。相比之下直接把原始波形丢给CNN是精度高但故障定位和故障机理的解释就成了黑盒这在很多对严谨性要求高的行业里并不讨喜。如果你想在故障诊断方向做论文或产品我建议把VMD-FFT-HHT当作特征提取前端再接一个浅层分类器效果往往比端到端网络更稳。5.3 实测下来这套流程的边界在哪儿最后说点大实话。VMD-FFT-HHT不是万能的。第一它对低信噪比数据的容忍度有限如果故障信号比噪声低20dB以上VMD也很难把特征频率从噪声里救回来这时候得靠更定向的带通滤波或包络解调先行处理。第二VMD参数选择带有一定人工经验色彩不同人调出的K值可能不同这会让结果在细节上有差异。第三分析结果的物理判读仍然依赖人的经验算法只是把证据摆到桌面上最终判断还是得靠人对设备机理的理解。我的建议是初次接触的朋友先在仿真信号上反复打磨流程等参数手感培养出来再上实测数据这样踩坑成本最低。等这套流程用顺手了你会发现它就像工具箱里的一把好扳手未必天天用但遇到难拆的活它是真能救命。