3. 时域特征提取:均值、方差、峰值、峭度等统计量计算
各位搞故障诊断的同行,咱们今天聊聊时域特征提取。说实话,这是整个特征工程里最基础、也最容易被忽视的一环。很多人一上来就搞小波包、搞深度学习,结果发现效果还不如几个简单的统计量管用。我个人的习惯是:先把手头的时域特征算清楚,再考虑要不要上复杂方法。
3.1 为什么时域特征这么重要?
你想想看,风机运行时的振动信号,本质上就是一个随时间变化的波形。这个波形里藏着大量信息——轴承有没有磨损、齿轮有没有断齿、转子有没有不平衡。而这些信息,很多都能通过简单的统计量捕捉到。
说白了,时域特征就是给原始信号做「体检」。均值告诉你信号的中心在哪,方差告诉你波动有多大,峰值告诉你有没有冲击,峭度告诉你信号分布的形状。每一项指标都对应着某种物理意义。
核心观点:时域特征是故障诊断的「第一道防线」。很多故障在时域上就有明显表现,根本不需要转到频域去看。
3.2 基础统计量:均值与方差
先来最基础的。均值(Mean)和方差(Variance),这两个大家应该都很熟。
均值反映信号的直流分量。对于风机振动信号,如果均值突然变大,往往意味着传感器有零漂,或者转子出现了严重的静不平衡。我在项目里遇到过一台风机,均值从0.02慢慢漂到0.15,一开始以为是传感器坏了,后来发现是轴承保持架碎了——碎片卡在传感器附近,改变了静态力。
方差反映信号的能量波动。方差越大,说明振动越剧烈。这个指标对早期故障比较敏感,但有个问题——它容易受工况影响。转速一变,方差就跟着变,所以使用时最好做归一化处理。
import numpy as np
def basic_stats(signal):
mean_val = np.mean(signal)
var_val = np.var(signal)
return mean_val, var_val
# 示例:一段风机振动信号
signal = np.random.randn(1000) * 0.5 + 0.1
mean_val, var_val = basic_stats(signal)
print(f"均值: {mean_val:.4f}, 方差: {var_val:.4f}")
3.3 峰值与峰峰值:捕捉冲击信号
峰值(Peak Value)和峰峰值(Peak-to-Peak Value)是诊断冲击类故障的利器。比如齿轮断齿、轴承滚动体剥落,这些故障会在信号中产生明显的瞬态冲击。
峰值就是信号的最大绝对值。峰峰值是最大值减最小值。这两个指标对冲击非常敏感,但有个缺点——容易受噪声干扰。一个偶然的噪声尖峰,就能让峰值翻好几倍。
我的经验:用峰值之前,先做一下中值滤波或者小波降噪。否则你算出来的峰值可能不是故障冲击,而是某个传感器接触不良的毛刺。
def peak_stats(signal):
peak_val = np.max(np.abs(signal))
peak_to_peak = np.max(signal) - np.min(signal)
return peak_val, peak_to_peak
3.4 峭度:故障诊断的「金标准」
峭度(Kurtosis)是我个人最常用的时域特征之一。它衡量信号分布的「尖峭程度」。正态分布的峭度是3,如果峭度远大于3,说明信号中有明显的冲击成分。
为什么峭度好用?因为它对早期故障特别敏感。轴承刚开始出现点蚀时,振动能量变化不大,方差可能看不出什么,但峭度已经悄悄往上跳了。我记得有一次诊断一台冷却风机,峭度从3.2涨到4.8,我判断轴承有问题。拆开一看,内圈果然有两条细裂纹。
峭度的计算公式:
def kurtosis(signal):
n = len(signal)
mean_val = np.mean(signal)
fourth_moment = np.sum((signal - mean_val)**4) / n
second_moment = np.sum((signal - mean_val)**2) / n
return fourth_moment / (second_moment**2)
# 或者直接用scipy
from scipy.stats import kurtosis
kurt_val = kurtosis(signal, fisher=True) # Fisher定义,正态分布为0
注意:峭度对单个异常点非常敏感。如果信号中有明显的野点,峭度会急剧增大。我曾经吃过这个亏——算出来峭度12,以为轴承废了,结果发现是数据采集卡掉了一个包。所以用峭度之前,一定要做数据清洗。
3.5 其他常用时域特征
除了上面几个,还有几个特征也值得关注:
| 特征名称 | 计算公式 | 物理意义 | 适用场景 |
|---|---|---|---|
| 均方根值(RMS) | √(Σx²/n) | 信号的有效能量 | 整体振动水平评估 |
| 波形因子 | RMS / 整流平均值 | 波形形状特征 | 区分不同类型故障 |
| 峰值因子 | 峰值 / RMS | 冲击程度 | 早期冲击故障 |
| 脉冲因子 | 峰值 / 整流平均值 | 冲击强度 | 与峰值因子互补 |
| 裕度因子 | 峰值 / (Σ√|x|/n)² | 磨损程度 | 轴承磨损诊断 |
这些特征之间其实有相关性。比如峰值因子和脉冲因子,变化趋势基本一致。我个人建议不要一股脑全算,选3-5个互补的就行。算多了反而容易过拟合。
3.6 时域特征的知识体系
下面这张图是我整理的时域特征提取逻辑。你可以看到,所有特征都从原始信号出发,经过不同的数学变换,最终服务于故障诊断。
3.7 实战中的避坑指南
最后分享几个我踩过的坑:
- 不要直接算原始信号的均值。 风机振动信号通常有直流偏置,这个偏置来自传感器或者采集系统。我建议先做去直流处理,否则均值这个特征就废了。
- 峭度不是万能的。 它对早期故障敏感,但对严重故障反而会下降。因为故障发展到后期,冲击变成连续碰撞,信号分布又趋于正态了。所以峭度要结合其他特征一起看。
- 注意采样长度。 算峭度、峰值这些高阶统计量时,样本量不能太少。我一般要求至少10个旋转周期的数据。样本太少,统计量不稳定,今天算一个值,明天算另一个值,没法用。
- 工况归一化很重要。 风机转速和负载一变,所有时域特征都会变。我习惯把特征除以转速或者负载的某个函数,做成无量纲指标。这样不同工况下的数据才能放在一起比较。
嗯,时域特征这块就先聊到这儿。这些统计量看着简单,但用好了真能解决大问题。下次你拿到一段振动信号,别急着上复杂算法,先把均值、方差、峰值、峭度算一遍,说不定答案就在眼前。