做旋转机械状态监测的人,对振动信号肯定都不陌生。之前我一直在用RMS、峭度这些时域指标盯着设备状态,直到有一次项目里遇到一台轴承故障早期但峭度变化不明显的案例,才意识到传统特征在非平稳信号面前有多迟钝。后来把经验模态分解(EMD)和样本熵结合起来做特征提取,才算真正把振动信号里藏着的故障信息挖了出来。
EMD能把一段复杂的非平稳信号自适应分解成若干个本征模态函数(IMF),相当于把混在一起的振动成分按频率尺度逐层拆开;样本熵则用来量化每个IMF的不规则程度,把"信号看着乱不乱"变成一个可比较的数字。这套组合在故障诊断领域很常见,但真正落地时会踩不少坑——端点效应、模态混叠、参数怎么选、IMF怎么筛,这些细节没人给你讲透。这篇就围绕"EMD分解+样本熵特征提取"这条主线,把原理、代码、实操经验和避坑策略一次性讲清楚。
1. 为什么振动信号分析需要EMD这种自适应分解
1.1 时域统计特征与频域方法在非平稳信号面前的短板
很多人一开始做振动特征提取,都是从时域统计量入手的。均值、峰值、均方根值(RMS)、峰值因数、峭度、波形因数、脉冲指数这一套,计算简单、物理意义直观,在很多工业现场的在线监测系统里至今仍是主流。但这些特征有一个共同的隐含假设:信号在统计意义上是平稳的,或者至少在一个较长时间段内是近似稳定的。实际设备尤其是旋转机械,振动信号往往带有明显的非平稳特性——启动停机过程中的转速变化、变工况下的载荷波动、故障冲击引起的瞬态调制,都会让信号的统计特性随时间变化。
举个例子,一个正常的滚动轴承和一个有内圈剥落故障的轴承,在稳定工况下测得的RMS可能只差10%-20%,而峭度在故障早期可能还处于正常范围。因为早期故障产生的冲击能量微弱,被背景噪声和正常振动成分淹没,时域统计量根本分辨不出来。一位前辈跟我说过一句话,我记了很多年:"时域特征是在跟信号的平均值较劲,而故障信息恰恰藏在不平均的地方。"
频域方法也不是万能的。FFT把整个时间段内的频率成分平均化,它回答的是"这段信号里有哪些频率分量、能量多大",但对于"频率成分在时间上怎么变化"这个问题基本无能为力。包络谱分析虽然能通过希尔伯特变换提取调制成分,但需要先人工确定共振频带,而这个频带又随设备结构、轴承型号、转速变化,选不好就漏掉故障特征。小波变换解决了部分时频分析问题,但小波基函数的选择本身就是一个经验活,选错了基函数,分解结果直接偏掉。这就是EMD这类自适应分解方法的价值所在——它不需要预设基函数,完全根据信号自身的局部极值特性来分解,天然适配非平稳、非线性信号。
1.2 EMD+样本熵这套组合的价值逻辑
先想清楚一个问题:为什么要用EMD和样本熵绑在一起?单独用EMD,分解出来的IMF还是时间序列,没法直接作为分类器的输入;单独用样本熵,直接对原始信号算一个熵值,又等于把所有频率成分的复杂度混在一起,特征分辨率不够。把两者结合起来,逻辑就顺了:EMD负责把复杂信号按尺度拆开,让不同物理成分各归其位;样本熵负责对每个IMF做二次刻画,把"这段信号的复杂程度"量化为数值。这样得到的分量级特征,既保留了时频域信息,又具备统计学意义上的可比较性,作为机器学习分类器的输入非常合适。
样本熵本身也是一种复杂度度量,它衡量的是时间序列中出现新模式的可能性大小。信号越规律,熵值越小;信号越随机、越不规则,熵值越大。故障轴承的振动信号因为叠加了周期性冲击和调制成分,某些IMF的复杂度会明显区别于正常状态。我实测过一个内圈故障的样本,某些IMF的样本熵正常状态下在0.3左右,故障状态下能上升到0.6以上,这种区分度是RMS和峭度很难做到的。
顺带说一句,很多论文里还会把EMD和排列熵、模糊熵结合,但样本熵在工程中的性价比最高——它参数少(就两个),计算逻辑直观,对数据长度不敏感,而且对噪声有一定容忍度。尤其是和EMD配合时,每个IMF相对干净,样本熵的度量效果比直接用在原始混合信号上要好得多。这套组合适合谁用?只要是做振动信号故障诊断、状态识别、健康管理相关工作的工程师和研究生,都值得掌握。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 经验模态分解(EMD)的原理拆解与PyEMD实战
2.1 EMD到底在做什么:包络与筛分过程
EMD的核心思想可以概括为一句话:把一段复杂信号看成多个"快慢不同的振荡"叠加的结果,然后通过筛分过程,把这些振荡一层层剥出来。这里的每个振荡分量就是IMF,全称是Intrinsic Mode Function,本征模态函数。
筛分过程是这样的:先找到原始信号的所有局部极大值点和局部极小值点,用三次样条分别对极大值点和极小值点插值,得到上包络线和下包络线。然后计算上下包络线的均值,得到一条平均包络曲线m1(t)。用原始信号x(t)减去m1(t),得到第一个分量h1(t)。理想情况下h1(t)就是一个IMF,但实际中一次减完往往不够,因为新得到的信号极值点分布可能还不符合IMF要求,所以要对h1(t)重复上述"找包络、算均值、相减"的过程,直到满足IMF的两个条件。这个过程叫筛分(sifting),我把第一次筛分得到的中间信号叫h11(t)、h12(t)……这样依次下去,直到满足条件,得到第一个IMF分量c1(t)。然后把原始信号减去c1(t),得到残余信号r1(t),对r1(t)继续做同样的筛分,得到c2(t)、c3(t)……直到残余信号变成一个单调函数或幅值足够小,整个分解就结束了。最终原始信号被表示为:x(t) = ΣIMF_i(t) + r_n(t)。
这个过程我常用"剥洋葱"类比——每一层筛分就相当于剥掉一层洋葱皮,从外到里,先剥出频率最高的振荡成分,再逐层剥出低频成分,最后剩下一个芯子(趋势项)。
2.2 IMF的判据和筛选停止条件
IMF必须满足两个条件:一是在整个数据段内,极值点数目与过零点数目相等或最多相差1个;二是在任意点上,由局部极大值确定的上包络线和
