第三章 振动信号分析基础
大家好,我是老张。今天咱们聊聊振动信号分析。说实话,这玩意儿是风机故障诊断的"基本功"。你想想看,风机转起来,振动信号里藏着多少秘密?轴承磨损、齿轮裂纹、不对中……这些故障都会在振动信号里留下"指纹"。我做了十几年风电,可以负责任地告诉你:读懂振动信号,你就掌握了故障诊断的"密码"。
3.1 振动传感器原理
先说说传感器。振动传感器,说白了就是把机械振动转换成电信号的东西。常用的有三种:
- 压电式加速度传感器:利用压电晶体的压电效应。振动时晶体变形,产生电荷。我习惯用这种,因为它频响宽、动态范围大。
- 速度传感器:通过线圈在磁场中运动产生感应电动势。低频响应好,但体积大。
- 位移传感器:测量轴与探头之间的间隙变化。适合测量轴振动,比如风机的主轴。
嗯,这里要注意:选型时一定要看频率范围。风机振动信号通常在10Hz-10kHz之间,压电式加速度传感器最合适。我曾经在项目里遇到过有人用错了传感器,低频信号全被滤掉了,结果误判了轴承故障……
3.2 时域特征提取
时域信号,就是振动幅值随时间变化的波形。直接看波形能看出啥?说实话,肉眼很难看出门道。所以我们要提取特征值。
3.2.1 均值
均值反映信号的直流分量。对于振动信号,均值应该接近0。如果均值明显偏离0,说明传感器有零漂,或者信号里有低频干扰。
import numpy as np
def calculate_mean(signal):
return np.mean(signal)
# 示例
vibration = np.random.randn(1000) # 模拟振动信号
mean_val = calculate_mean(vibration)
print(f"均值: {mean_val:.4f}")
3.2.2 峰值
峰值就是信号的最大绝对值。它能反映振动的最大冲击强度。我一般用峰值来初步判断有没有"打齿"或者"撞击"。
def calculate_peak(signal):
return np.max(np.abs(signal))
peak_val = calculate_peak(vibration)
print(f"峰值: {peak_val:.4f}")
3.2.3 峭度
峭度,这个指标很有意思。它衡量信号分布的"尖锐程度"。正态分布的峭度是3。如果峭度大于3,说明信号里有冲击成分——这往往是早期故障的信号。
def calculate_kurtosis(signal):
n = len(signal)
mean = np.mean(signal)
std = np.std(signal)
kurt = np.sum((signal - mean)**4) / (n * std**4)
return kurt
kurt_val = calculate_kurtosis(vibration)
print(f"峭度: {kurt_val:.4f}")
我记得有一次,某风场一台机组齿轮箱振动峭度从3.2突然升到5.8。我当时就判断:轴承可能出问题了。拆开一看,果然保持架断裂。峭度这个指标,对早期故障特别敏感。
3.3 频域特征提取
时域信号看着乱,但转到频域就清晰多了。频域分析的核心思想:任何复杂振动都可以分解成不同频率的正弦波。
3.3.1 FFT(快速傅里叶变换)
FFT是频域分析的基础工具。它把时域信号变换到频域,得到频谱。频谱的横轴是频率,纵轴是幅值。
from scipy.fft import fft, fftfreq
def compute_fft(signal, fs):
n = len(signal)
yf = fft(signal)
xf = fftfreq(n, 1/fs)
# 只取正频率部分
idx = np.where(xf >= 0)
return xf[idx], np.abs(yf[idx]) * 2 / n
fs = 2560 # 采样频率
freqs, mags = compute_fft(vibration, fs)
看频谱时,我习惯先找转频(1X)及其谐波(2X、3X……)。如果出现边频带,那往往就是调制现象——比如齿轮啮合频率被转频调制,说明齿轮可能有故障。
- 转频:风机转速对应的频率
- 啮合频率:齿轮齿数×转频
- 边频带:故障特征频率
3.3.2 包络谱
包络谱,说白了就是"解调"。它专门用来提取高频载波中的低频调制信号。对于轴承故障诊断,包络谱比普通频谱好用得多。
为什么?因为轴承故障产生的冲击会激发结构共振,共振频率很高(几kHz到几十kHz)。普通频谱里这些高频成分混在一起,很难分辨。但包络谱能把冲击的重复频率提取出来——这个频率就是轴承的故障特征频率。
from scipy.signal import hilbert
def compute_envelope_spectrum(signal, fs):
# 希尔伯特变换求包络
analytic_signal = hilbert(signal)
envelope = np.abs(analytic_signal)
# 对包络做FFT
freqs, mags = compute_fft(envelope, fs)
return freqs, mags
env_freqs, env_mags = compute_envelope_spectrum(vibration, fs)
我曾经处理过一个案例:某机组振动频谱看起来很正常,但包络谱里明显出现了轴承外圈故障频率。拆检后发现外圈已经剥落。如果只看普通频谱,这个故障就被漏掉了。
3.4 知识体系总览
下面这张图,是我自己总结的振动信号分析知识框架。你可以把它当作"地图"来用。
3.5 实战要点总结
最后,我把自己这些年积累的经验整理成一张表,方便你对照:
| 特征 | 物理意义 | 故障指示 | 注意事项 |
|---|---|---|---|
| 均值 | 信号直流分量 | 传感器零漂、低频干扰 | 正常应接近0 |
| 峰值 | 最大冲击强度 | 打齿、撞击 | 对毛刺敏感 |
| 峭度 | 信号分布尖锐度 | 早期冲击故障 | >3.5需警惕 |
| FFT频谱 | 频率成分分布 | 转频、谐波、边频带 | 注意频率分辨率 |
| 包络谱 | 调制信号提取 | 轴承故障特征频率 | 高频共振解调 |
好了,这一章的内容就到这里。振动信号分析是门手艺活,光看理论不行,得多动手。建议你找几组实际的风机振动数据,自己算算均值、峰值、峭度,再画个频谱和包络谱看看。嗯,等你真正上手了,就会发现——原来故障信号就在那里,等着你去发现。