第1章:振动信号分析基础

各位同行,大家好。我是老张,在风电行业摸爬滚打了十几年。今天咱们开始聊振动信号分析,这是风机健康管理里最核心的一环。说白了,振动就是设备的“心跳”,读懂它,你就能知道风机到底舒不舒服。

我记得刚入行那会儿,老师傅跟我说:“听声音就能判断轴承好坏。”我当时不信,后来发现,其实振动信号里藏着所有秘密。今天我就把这些年积累的经验,掰开揉碎了讲给你听。

1.1 时域特征:最直观的“体检报告”

时域信号,就是传感器直接采集到的原始波形。你想想看,就像心电图一样,横轴是时间,纵轴是振幅。我习惯先看时域,因为它最直观,能快速判断有没有“大毛病”。

均值(Mean)

均值反映的是信号的直流分量。对于旋转机械,正常运行时均值应该稳定在零附近。如果均值发生漂移,嗯,那就要小心了——可能是传感器出了问题,或者轴发生了弯曲。

我的经验: 有一次现场报故障,说振动值异常大。我一看均值,直接偏了0.5V。结果呢?传感器线缆被老鼠咬断了。所以别小看均值,它能帮你快速排除低级错误。

峰值(Peak)

峰值就是信号的最大绝对值。这个指标简单粗暴,但很实用。我一般用它来做“红绿灯”报警——超过阈值就亮红灯。

但这里有个坑:峰值对瞬时冲击特别敏感。比如叶片偶尔打一下雷,峰值会瞬间飙升,但设备其实没事。所以单纯用峰值报警,误报率会很高。

避坑指南: 我曾经在一个风场,峰值报警一天响几十次。后来发现是风速仪叶片偶尔刮到塔筒。所以峰值要结合其他指标一起看,别被它骗了。

峭度(Kurtosis)

峭度是个好东西,它衡量的是信号分布的“尖锐程度”。正常运行的设备,峭度值接近3。如果峭度突然变大,说明信号里出现了“尖峰”——这往往是早期故障的信号。

我特别喜欢用峭度来做早期预警。为什么?因为均值、峰值可能还没变化,峭度已经悄悄升高了。就像人感冒前,体温还没升,但已经觉得不舒服了。

特征 物理意义 典型值 异常含义
均值 直流分量 ≈0 传感器故障/轴弯曲
峰值 最大振幅 取决于工况 冲击/松动
峭度 分布尖锐度 ≈3 早期故障/磨损

1.2 频域特征:把信号“拆开”看

时域信号就像一锅粥,什么都混在一起。频域分析呢,就是把这锅粥里的米、豆子、肉都挑出来,看看各自有多少。说白了,就是告诉你振动能量都集中在哪些频率上。

FFT(快速傅里叶变换)

FFT是频域分析的基础工具。它把时域信号转换到频域,让我们能看到各个频率成分的幅值。我习惯先看FFT频谱,找找有没有“不该出现的频率”。

举个例子:风机主轴的转频是0.2Hz,如果FFT里出现了0.4Hz、0.6Hz,那大概率是齿轮或者轴承出了问题。就像你听发动机声音,正常是“嗡嗡嗡”,突然出现“吱吱吱”,那肯定不对劲。

核心要点: FFT能帮你定位故障源。不同故障对应不同频率特征,这是诊断的基础。

包络谱(Envelope Spectrum)

包络谱是FFT的升级版。它专门用来处理“调制信号”——比如轴承故障时,高频振动会被低频旋转调制。直接看FFT可能不明显,但包络谱能把这种调制信号提取出来。

我记得有个项目,轴承早期故障,FFT上几乎看不出异常。但包络谱一出来,故障特征频率清清楚楚。从那以后,包络谱就成了我工具箱里的“必备品”。

1.3 特征提取实战:Python代码示例

光说不练假把式。下面我写一段Python代码,演示如何提取时域和频域特征。这段代码我用了很多年,改过好几版,现在分享给你。

import numpy as np
from scipy.fft import fft
from scipy.signal import hilbert

def extract_features(signal, fs):
    """
    提取振动信号特征
    signal: 时域信号数组
    fs: 采样频率 (Hz)
    """
    # 时域特征
    mean_val = np.mean(signal)          # 均值
    peak_val = np.max(np.abs(signal))   # 峰值
    kurtosis_val = np.mean((signal - mean_val)**4) / (np.std(signal)**4)  # 峭度
    
    # 频域特征 - FFT
    n = len(signal)
    freq = np.fft.fftfreq(n, 1/fs)[:n//2]
    fft_vals = np.abs(fft(signal))[:n//2]
    
    # 频域特征 - 包络谱
    analytic_signal = hilbert(signal)
    envelope = np.abs(analytic_signal)
    envelope_fft = np.abs(fft(envelope))[:n//2]
    
    return {
        'mean': mean_val,
        'peak': peak_val,
        'kurtosis': kurtosis_val,
        'fft_freq': freq,
        'fft_amp': fft_vals,
        'envelope_freq': freq,
        'envelope_amp': envelope_fft
    }

# 使用示例
fs = 2560  # 采样频率
t = np.arange(0, 1, 1/fs)
signal = np.sin(2*np.pi*50*t) + 0.5*np.random.randn(len(t))

features = extract_features(signal, fs)
print(f"均值: {features['mean']:.3f}")
print(f"峰值: {features['peak']:.3f}")
print(f"峭度: {features['kurtosis']:.3f}")
小提示: 实际应用中,我建议先做预处理——去直流、滤波、去趋势项。不然噪声会干扰特征提取。这段代码里我加了随机噪声,模拟真实场景。

1.4 本章知识体系

下面这张图,是我自己画的振动信号分析知识框架。你看一眼,就能明白今天讲了什么,以及它们之间的关系。

振动信号分析 时域特征 均值 峰值 峭度 频域特征 FFT 包络谱 实战应用 特征提取 Python实现 三者关系:时域看异常 → 频域找原因 → 实战定方案 核心逻辑:从原始信号中提取有用信息,为故障诊断服务

这张图你看懂了吗?时域特征负责“报警”——告诉你设备可能有问题;频域特征负责“定位”——告诉你问题出在哪;实战代码负责“落地”——让你能真正用起来。三者缺一不可。

好了,今天的内容就到这里。振动信号分析是基础,但也是最重要的。你把这些吃透了,后面讲阈值设定、健康指标构建,就会轻松很多。

专注资料整理