信号处理与特征提取:时域、频域与小波变换
各位同学,大家好。今天我们来聊聊故障诊断里最核心的一步——特征提取。
说白了,传感器采集回来的原始数据,就像一堆没加工的矿石。你得把它“洗”一遍,把有用的“金子”挑出来。这个“洗矿”的过程,就是信号处理与特征提取。
我个人习惯把特征提取分成三个维度去看:时域、频域,还有时频域(小波变换)。每个维度都有自己的脾气,咱们一个一个说。
1. 时域分析:最直观的“望闻问切”
时域分析,就是直接看信号随时间怎么变化。你想想看,一个正常的陀螺输出,波形应该是平稳的。如果突然出现一个尖刺,或者均值漂了,那肯定有问题。
常用的时域特征指标:
- 均值与方差:反映信号的整体水平和波动程度。我在项目中遇到过,某型号惯导的加速度计零偏缓慢漂移,就是靠均值滑动窗口抓出来的。
- 峰值与峰峰值:检测冲击性故障。比如动量轮轴承的“打滑”故障,峰值会突然跳变。
- 峭度(Kurtosis):这个指标很敏感。正常信号的峭度接近3,如果峭度远大于3,说明信号里混入了冲击成分。嗯,这里要注意,峭度对早期故障特别灵敏,但容易受噪声干扰。
- 波形因子与脉冲因子:用来区分不同类型的故障形态。
实战经验: 我曾经调试一个卫星的太阳翼驱动机构,遥测数据看起来一切正常。但我把时域波形放大100倍后,发现每个转动周期都有一个微小的“毛刺”。后来拆解发现,是齿轮上有一个微裂纹。所以,别小看时域波形,有时候“肉眼”就是最好的故障检测器。
2. 频域分析(FFT):把信号“拆”开看
时域看不出来的东西,换到频域里可能一目了然。为什么?因为很多故障都有特定的频率特征。比如,轴承故障会在某个特征频率上出现能量峰值。
FFT的核心思路: 把时域信号分解成不同频率的正弦波叠加。说白了,就是告诉你“信号里都有哪些频率成分,各自有多强”。
频域分析的关键点:
- 频谱分析:直接看幅值谱。正常状态下,频谱能量集中在少数几个频率上。故障状态下,会出现新的频率分量,或者原有频率的幅值发生改变。
- 功率谱密度(PSD):比幅值谱更平滑,适合分析宽带信号。我建议在做故障诊断时,优先看PSD,因为它对噪声的鲁棒性更好。
- 边频带分析:这是旋转机械故障诊断的“杀手锏”。当出现调制现象时(比如齿轮啮合频率被转频调制),频谱上会在主频率两侧出现对称的边频带。边频带的间距就是调制频率。
避坑指南: 我曾经犯过一个错误——直接用原始数据做FFT,结果频谱里全是噪声。后来才意识到,必须先做加窗处理。汉宁窗(Hanning)是通用选择,但如果你的信号是瞬态冲击,用矩形窗反而更好。记住:窗函数的选择直接影响频谱的分辨率和泄漏程度。
一个简单的FFT代码示例(Python):
import numpy as np
import matplotlib.pyplot as plt
fs = 1000 # 采样率 1000 Hz
t = np.arange(0, 1, 1/fs)
# 模拟一个正常信号 + 故障信号
x = np.sin(2*np.pi*50*t) + 0.5*np.sin(2*np.pi*120*t) + 0.2*np.random.randn(len(t))
# 加汉宁窗
window = np.hanning(len(x))
x_windowed = x * window
# FFT
X = np.fft.fft(x_windowed)
freq = np.fft.fftfreq(len(x), 1/fs)
# 只取正频率部分
idx = np.where(freq >= 0)
plt.plot(freq[idx], np.abs(X[idx]))
plt.xlabel('频率 (Hz)')
plt.ylabel('幅值')
plt.title('加窗后的频谱')
plt.grid(True)
plt.show()
3. 小波变换:给信号一个“显微镜”
FFT有个硬伤——它假设信号是平稳的。但航天GNC系统的故障信号,往往是非平稳的。比如,一个瞬态冲击,在FFT里会被“平均”掉,根本看不出来。
这时候,小波变换就派上用场了。它就像一个“显微镜”,既能看全局(低频),又能放大局部(高频)。
小波变换的核心思想: 用一系列可伸缩、可平移的小波基函数去匹配信号。通过改变尺度(伸缩)和平移,得到信号在不同时间、不同频率上的能量分布。
小波变换在故障诊断中的典型应用:
- 多尺度分解:把信号分解成近似系数(低频)和细节系数(高频)。故障信息通常藏在细节系数里。
- 奇异性检测:信号中的突变点(比如阶跃、尖峰),在小波变换的细节系数上会表现为模极大值。通过追踪模极大值线,可以精确定位故障发生的时间。
- 去噪与重构:先对细节系数做阈值处理(软阈值或硬阈值),再重构信号。我习惯用软阈值,虽然会损失一点幅值,但信号更平滑,不容易产生伪振荡。
重要提醒: 小波基函数的选择没有“万能解”。db4小波适合检测短时突变,sym8小波适合分析平滑信号。我在做某型号火箭的伺服机构故障诊断时,试了十几种小波基,最后发现“bior3.1”效果最好。所以,一定要根据你的信号特征去试,别偷懒。
小波变换的代码示例(Python + PyWavelets):
import pywt
import numpy as np
# 模拟一个带瞬态冲击的信号
t = np.linspace(0, 1, 1000)
x = np.sin(2*np.pi*10*t)
x[500:510] += 2.0 # 在第500个采样点加入冲击
# 小波分解(使用db4小波,分解到第4层)
coeffs = pywt.wavedec(x, 'db4', level=4)
cA4, cD4, cD3, cD2, cD1 = coeffs
# 提取细节系数(高频部分)
# 故障冲击会在cD1或cD2中表现为明显的峰值
plt.figure()
plt.subplot(2,1,1)
plt.plot(x)
plt.title('原始信号(含冲击)')
plt.subplot(2,1,2)
plt.plot(cD1)
plt.title('第一层细节系数(高频成分)')
plt.tight_layout()
plt.show()
三种方法的对比与选择
| 方法 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 时域分析 | 冲击、突变、趋势变化 | 直观、计算量小、实时性好 | 对周期性故障不敏感 |
| 频域分析(FFT) | 周期性故障、谐波、调制 | 频率定位准确、物理意义明确 | 不适合非平稳信号、有频谱泄漏 |
| 小波变换 | 非平稳信号、瞬态冲击、多尺度分析 | 时频局部化、适合突变检测 | 计算量大、小波基选择依赖经验 |
我的建议: 在实际工程中,别只依赖一种方法。我通常的做法是:先用时域分析做快速筛查,发现异常后,用FFT确认频率特征,最后用小波变换精确定位故障时刻。三种方法打组合拳,效果远好于单打独斗。
好了,关于信号处理与特征提取,咱们就聊到这里。记住,特征提取是故障诊断的“眼睛”,眼睛亮了,后面的诊断才能准。下一节,咱们会把这些特征喂给分类器,看看怎么自动识别故障模式。
公众号:蓝海资料掘金营,微信deep3321