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 时域特征的知识体系

下面这张图是我整理的时域特征提取逻辑。你可以看到,所有特征都从原始信号出发,经过不同的数学变换,最终服务于故障诊断。

时域特征提取知识体系 原始振动信号 数据清洗 → 去直流 → 归一化 基础统计量 冲击特征 分布特征 均值、方差、RMS 整流平均值 峰值、峰峰值 峰值因子 峭度、偏度 波形因子 故障诊断:轴承、齿轮、转子

3.7 实战中的避坑指南

最后分享几个我踩过的坑:

  • 不要直接算原始信号的均值。 风机振动信号通常有直流偏置,这个偏置来自传感器或者采集系统。我建议先做去直流处理,否则均值这个特征就废了。
  • 峭度不是万能的。 它对早期故障敏感,但对严重故障反而会下降。因为故障发展到后期,冲击变成连续碰撞,信号分布又趋于正态了。所以峭度要结合其他特征一起看。
  • 注意采样长度。 算峭度、峰值这些高阶统计量时,样本量不能太少。我一般要求至少10个旋转周期的数据。样本太少,统计量不稳定,今天算一个值,明天算另一个值,没法用。
  • 工况归一化很重要。 风机转速和负载一变,所有时域特征都会变。我习惯把特征除以转速或者负载的某个函数,做成无量纲指标。这样不同工况下的数据才能放在一起比较。

嗯,时域特征这块就先聊到这儿。这些统计量看着简单,但用好了真能解决大问题。下次你拿到一段振动信号,别急着上复杂算法,先把均值、方差、峰值、峭度算一遍,说不定答案就在眼前。


专注资料整理