第1章:振动信号分析基础
各位同行,大家好。我是老张,在风电行业摸爬滚打了十几年。今天咱们开始聊振动信号分析,这是风机健康管理里最核心的一环。说白了,振动就是设备的“心跳”,读懂它,你就能知道风机到底舒不舒服。
我记得刚入行那会儿,老师傅跟我说:“听声音就能判断轴承好坏。”我当时不信,后来发现,其实振动信号里藏着所有秘密。今天我就把这些年积累的经验,掰开揉碎了讲给你听。
1.1 时域特征:最直观的“体检报告”
时域信号,就是传感器直接采集到的原始波形。你想想看,就像心电图一样,横轴是时间,纵轴是振幅。我习惯先看时域,因为它最直观,能快速判断有没有“大毛病”。
均值(Mean)
均值反映的是信号的直流分量。对于旋转机械,正常运行时均值应该稳定在零附近。如果均值发生漂移,嗯,那就要小心了——可能是传感器出了问题,或者轴发生了弯曲。
峰值(Peak)
峰值就是信号的最大绝对值。这个指标简单粗暴,但很实用。我一般用它来做“红绿灯”报警——超过阈值就亮红灯。
但这里有个坑:峰值对瞬时冲击特别敏感。比如叶片偶尔打一下雷,峰值会瞬间飙升,但设备其实没事。所以单纯用峰值报警,误报率会很高。
峭度(Kurtosis)
峭度是个好东西,它衡量的是信号分布的“尖锐程度”。正常运行的设备,峭度值接近3。如果峭度突然变大,说明信号里出现了“尖峰”——这往往是早期故障的信号。
我特别喜欢用峭度来做早期预警。为什么?因为均值、峰值可能还没变化,峭度已经悄悄升高了。就像人感冒前,体温还没升,但已经觉得不舒服了。
| 特征 | 物理意义 | 典型值 | 异常含义 |
|---|---|---|---|
| 均值 | 直流分量 | ≈0 | 传感器故障/轴弯曲 |
| 峰值 | 最大振幅 | 取决于工况 | 冲击/松动 |
| 峭度 | 分布尖锐度 | ≈3 | 早期故障/磨损 |
1.2 频域特征:把信号“拆开”看
时域信号就像一锅粥,什么都混在一起。频域分析呢,就是把这锅粥里的米、豆子、肉都挑出来,看看各自有多少。说白了,就是告诉你振动能量都集中在哪些频率上。
FFT(快速傅里叶变换)
FFT是频域分析的基础工具。它把时域信号转换到频域,让我们能看到各个频率成分的幅值。我习惯先看FFT频谱,找找有没有“不该出现的频率”。
举个例子:风机主轴的转频是0.2Hz,如果FFT里出现了0.4Hz、0.6Hz,那大概率是齿轮或者轴承出了问题。就像你听发动机声音,正常是“嗡嗡嗡”,突然出现“吱吱吱”,那肯定不对劲。
包络谱(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 本章知识体系
下面这张图,是我自己画的振动信号分析知识框架。你看一眼,就能明白今天讲了什么,以及它们之间的关系。
这张图你看懂了吗?时域特征负责“报警”——告诉你设备可能有问题;频域特征负责“定位”——告诉你问题出在哪;实战代码负责“落地”——让你能真正用起来。三者缺一不可。
好了,今天的内容就到这里。振动信号分析是基础,但也是最重要的。你把这些吃透了,后面讲阈值设定、健康指标构建,就会轻松很多。