4、振动信号分析与特征提取:时域特征、频域特征、时频域特征
各位同行,大家好。今天我们来聊聊振动信号分析。这是风电故障预测里最核心的一环。说白了,就是把传感器采集到的原始振动数据,变成能反映设备健康状态的特征值。
我刚开始做风电运维那会儿,面对一堆波形图,说实话有点懵。后来慢慢摸索,发现其实就三个维度:时域、频域、时频域。今天我把这些年积累的经验,掰开揉碎了讲给你听。
核心逻辑:振动信号 → 特征提取 → 故障识别。特征提取的质量,直接决定了预警系统的准确性。
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