4、振动信号分析与特征提取:时域特征、频域特征、时频域特征

各位同行,大家好。今天我们来聊聊振动信号分析。这是风电故障预测里最核心的一环。说白了,就是把传感器采集到的原始振动数据,变成能反映设备健康状态的特征值。

我刚开始做风电运维那会儿,面对一堆波形图,说实话有点懵。后来慢慢摸索,发现其实就三个维度:时域、频域、时频域。今天我把这些年积累的经验,掰开揉碎了讲给你听。

核心逻辑:振动信号 → 特征提取 → 故障识别。特征提取的质量,直接决定了预警系统的准确性。

振动信号分析 时域特征 频域特征 时频域特征 均值、方差 峰值、峰峰值 峭度、波形因子 FFT频谱 幅值谱、功率谱 小波包分解 能量谱、系数 故障诊断与智能预警

4.1 时域特征:最直观的"体检报告"

时域特征,就是直接看振动波形本身。你想想看,一个正常运转的齿轮箱,它的振动波形应该是平稳的、有规律的。一旦出现故障,波形就会"发疯"。

均值(Mean):反映信号的直流分量。正常轴承的均值基本稳定在0附近。我记得有一次,某台机组的主轴承均值突然从0.02跳到了0.15,我当时就觉得不对劲。后来停机检查,发现保持架已经裂了。

方差(Variance):衡量信号的波动程度。方差越大,说明振动越剧烈。嗯,这里要注意,方差对早期故障特别敏感。我习惯用方差作为第一道预警阈值。

峰值(Peak):信号的最大瞬时值。这个参数对冲击性故障很敏感。比如齿轮断齿,峰值会瞬间飙升。

我的经验:时域特征计算简单,适合做实时监控。但有个缺点——它无法告诉你故障发生在哪个频率上。所以,我们还需要频域分析。

# Python 时域特征计算示例
import numpy as np

def time_domain_features(signal):
    mean_val = np.mean(signal)          # 均值
    var_val = np.var(signal)            # 方差
    peak_val = np.max(np.abs(signal))   # 峰值
    rms_val = np.sqrt(np.mean(signal**2))  # 有效值
    
    return {
        'mean': mean_val,
        'variance': var_val,
        'peak': peak_val,
        'rms': rms_val
    }

4.2 频域特征:用FFT"听"出故障频率

频域分析,说白了就是把时域信号转换到频率域。为什么要这么做?因为每种故障都有它特定的"频率指纹"。

FFT(快速傅里叶变换)是频域分析的核心工具。我刚开始做FFT时,总纠结于频谱图的每个细节。后来发现,其实抓住几个关键频率就够了:

  • 转频:主轴旋转频率,比如15rpm的风机,转频就是0.25Hz
  • 啮合频率:齿轮箱的齿轮啮合频率,GMF = 齿数 × 转频
  • 轴承故障频率:外圈、内圈、滚动体、保持架各有特征频率

我曾经处理过一台齿轮箱,FFT频谱在啮合频率附近出现了明显的边频带。当时我就判断是齿轮出现了局部损伤。拆开一看,果然有一个齿面剥落了。

避坑指南:FFT有个大坑——频率分辨率。分辨率 = 采样率 / FFT点数。分辨率不够,两个相近的频率就分不开。我建议FFT点数至少取1024,采样率要满足奈奎斯特定理。

# FFT频谱计算
def fft_spectrum(signal, fs):
    n = len(signal)
    fft_vals = np.fft.fft(signal)
    fft_freq = np.fft.fftfreq(n, 1/fs)
    
    # 只取正频率部分
    positive_idx = np.where(fft_freq >= 0)
    magnitude = np.abs(fft_vals[positive_idx]) / n
    
    return fft_freq[positive_idx], magnitude

4.3 时频域特征:小波包分解的"显微镜"

时域和频域都有局限。时域看不到频率,频域看不到时间变化。对于非平稳信号(比如变转速工况),我们需要时频域分析。

小波包分解(WPD)是我个人最常用的时频域工具。它比传统小波变换更精细——不仅分解低频,还分解高频部分。

为什么需要小波包?你想想看,风电的振动信号往往是突变性的。比如叶片裂纹扩展时,会产生瞬态冲击。FFT只能告诉你"有冲击",但小波包能告诉你"冲击发生在什么时间、什么频段"。

分解层数 频带数量 频率分辨率 适用场景
3层 8个 较粗 快速筛查
4层 16个 中等 常规诊断
5层 32个 精细 早期微弱故障

我一般用4层小波包分解。层数太少,特征不够精细;层数太多,计算量太大,实时性跟不上。嗯,这里有个平衡点。

# 小波包分解示例(使用PyWavelets)
import pywt

def wavelet_packet_decomposition(signal, level=4, wavelet='db4'):
    wp = pywt.WaveletPacket(data=signal, wavelet=wavelet, mode='symmetric')
    
    # 提取各节点系数
    nodes = [node.path for node in wp.get_level(level, 'natural')]
    features = []
    
    for node in nodes:
        coeffs = wp[node].data
        energy = np.sum(coeffs ** 2)  # 节点能量
        features.append(energy)
    
    # 归一化能量特征
    total_energy = np.sum(features)
    features_normalized = features / total_energy
    
    return features_normalized

核心要点:小波包分解后,每个频带的能量占比就是故障的"指纹"。正常状态下,能量分布是均匀的;故障出现时,某些频带的能量会异常升高。

4.4 三种特征的实战选择

说了这么多,到底该用哪种?我的建议是:

  • 实时监控:用时域特征(均值、方差、峰值),计算快,适合嵌入式系统
  • 定期巡检:用频域特征(FFT频谱),能精确定位故障频率
  • 疑难杂症:用时频域特征(小波包),特别是变转速、非平稳工况

我曾经遇到一个案例:某机组振动值忽大忽小,时域和频域都看不出明显规律。最后用小波包分解,发现某个高频段的能量在特定转速下异常。原来是叶片上的结冰脱落导致的瞬态冲击。

我的习惯:实际项目中,我会把三种特征融合使用。先时域做快速预警,再频域定位故障类型,最后时频域确认故障严重程度。三管齐下,基本不会漏报。

好了,关于振动信号的特征提取,今天就聊到这里。这些方法我都亲自验证过,在风电场的实际数据上效果不错。你回去可以拿自己场站的数据试试,有问题随时交流。


公众号:蓝海资料掘金营,微信deep3321