3. 信号处理与特征工程:从原始数据到故障指纹
大家好,我是老张。在设备维护这行摸爬滚打了十几年,今天咱们聊聊信号处理与特征工程。说白了,就是把传感器采集的那些“乱七八糟”的原始数据,变成能反映设备健康状态的“故障指纹”。
你想想看,传感器每秒采几千个点,直接拿这些数去判断设备好坏?那肯定不行。我们需要一套“翻译”方法,把时域、频域、时频域的信息都挖出来,再挑出最有用的特征。嗯,这就是本章要讲的核心。
3.1 时域分析:最直观的“体检报告”
时域分析,就是直接看信号随时间怎么变。我习惯把它比作人的体温、心率——简单直接,但信息量有限。
3.1.1 均值(Mean)
均值反映信号的直流分量。比如一个振动传感器,如果均值突然漂移,说明传感器可能坏了,或者设备有静载荷变化。我在项目里遇到过,一个泵的均值缓慢上升,最后发现是轴承磨损导致轴心偏移。
import numpy as np
signal = np.array([...]) # 你的振动数据
mean_value = np.mean(signal)
print(f"均值: {mean_value:.4f}")
3.1.2 峰值(Peak Value)
峰值就是信号的最大绝对值。它很敏感,能快速捕捉冲击信号。但要注意,峰值容易受噪声干扰。我曾经因为一个螺丝松动,峰值瞬间跳了3倍,差点误报成轴承碎裂。
3.1.3 均方根值(RMS)
RMS是时域分析里最常用的特征之一。它代表信号的能量水平。对于旋转机械,RMS值稳定上升,往往意味着磨损在加剧。我个人习惯用RMS做长期趋势监控,因为它比峰值稳定得多。
rms_value = np.sqrt(np.mean(signal**2))
print(f"RMS: {rms_value:.4f}")
| 特征 | 物理含义 | 适用场景 | 我的经验 |
|---|---|---|---|
| 均值 | 直流分量 | 传感器漂移、静载荷变化 | 配合温度看,效果更好 |
| 峰值 | 最大冲击 | 早期冲击故障 | 容易误报,需加滤波 |
| RMS | 信号能量 | 磨损、不平衡 | 长期趋势监控首选 |
3.2 频域分析:用FFT看“频谱指纹”
时域看不出来的东西,频域一眼就能发现。比如一个齿轮有裂纹,时域波形可能只是微微抖动,但频谱里会出现边频带。这就是FFT(快速傅里叶变换)的威力。
3.2.1 FFT 基础
FFT把时域信号转换到频域,告诉我们信号里包含哪些频率成分,以及各自的幅值。说白了,就是给信号做“光谱分析”。
from scipy.fft import fft, fftfreq
N = len(signal)
T = 1.0 / fs # 采样间隔
yf = fft(signal)
xf = fftfreq(N, T)[:N//2]
amplitude = 2.0/N * np.abs(yf[:N//2])
3.2.2 频谱分析实战
拿到频谱后,我们主要看几个东西:
- 转频及其谐波:判断不平衡、不对中
- 边频带:齿轮故障、轴承故障的典型特征
- 高频段能量:摩擦、气蚀等异常
我记得有一次,一个风机振动超标。时域RMS只高了15%,但频谱里出现了明显的2倍转频谐波。我判断是不对中,结果拆开一看,联轴器胶垫已经磨掉了一半。
3.3 时频分析:小波变换的“显微镜”
FFT有个局限——它假设信号是平稳的。但实际设备信号往往是非平稳的,比如启动瞬间、冲击响应。这时候就需要时频分析。小波变换就像一把“显微镜”,能同时看清时间和频率的局部变化。
3.3.1 为什么需要小波?
短时傅里叶变换(STFT)也能做时频分析,但它有个矛盾:时间分辨率高,频率分辨率就低;反之亦然。小波变换通过可变窗口解决了这个问题。低频用宽窗口,高频用窄窗口,非常巧妙。
3.3.2 小波变换实战
import pywt
coeffs, freqs = pywt.cwt(signal, scales=np.arange(1, 128), wavelet='cmor')
# coeffs 就是时频矩阵,可以画成热力图
我在做轴承故障诊断时,经常用小波变换提取“冲击成分”。因为轴承故障信号是周期性的冲击,在时频图上会呈现“竖条纹”模式。这个特征在FFT里很难直接看到。
3.4 特征选择与降维:PCA 的“降维打击”
好,现在你从时域、频域、时频域提取了几十个特征。然后呢?全部扔进模型?那会“维度灾难”——计算慢、过拟合、解释性差。我们需要做特征选择与降维。
3.4.1 为什么要降维?
- 减少计算量:几十个特征变成几个主成分
- 去除冗余:很多特征之间高度相关
- 提升泛化能力:减少过拟合风险
3.4.2 PCA 主成分分析
PCA 的原理不复杂:找到数据方差最大的方向,把数据投影上去。第一个主成分捕获最大方差,第二个次之,以此类推。通常前几个主成分就能解释90%以上的信息。
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
# 标准化很重要!否则量纲大的特征会主导
X_scaled = StandardScaler().fit_transform(X)
pca = PCA(n_components=0.95) # 保留95%方差
X_pca = pca.fit_transform(X_scaled)
print(f"原始特征数: {X.shape[1]}, 降维后: {X_pca.shape[1]}")
3.4.3 特征选择的其他方法
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 方差阈值 | 去掉方差太小的特征 | 初步筛选 |
| 相关系数 | 去掉高度相关的特征 | 去除冗余 |
| 随机森林重要性 | 用模型评估特征贡献 | 有标签数据 |
我个人习惯先用随机森林跑一遍特征重要性,把排名靠后的砍掉。然后再用PCA做最终降维。这样既保留了物理意义,又控制了维度。
好了,以上就是信号处理与特征工程的核心内容。从时域的均值、峰值、RMS,到频域的FFT频谱,再到时频域的小波变换,最后用PCA等工具做降维。每一步都有它的价值,也都有坑。我踩过的坑不少,希望你能少走弯路。
记住一句话:特征工程决定了模型的上限,而模型只是逼近这个上限。把信号处理基本功打扎实,你的预测性维护系统就成功了一半。