4、信号处理与特征提取:时域分析、频域分析、时频域分析
各位工程师朋友,咱们接着聊。上一章我们把传感器数据拿到手了,但原始信号就像一团乱麻,直接看是看不出门道的。这章的核心任务,就是把这团乱麻理清楚,提取出能反映太阳翼驱动机构(SADA)健康状态的特征量。
说白了,信号处理就是给数据“做体检”。我做了十几年电源系统故障诊断,可以负责任地告诉你:特征提取的好坏,直接决定了诊断模型的成败。你想想看,如果输入的都是噪音,再厉害的AI也白搭。
4.1 时域分析:最直观的“心电图”
时域分析,就是直接看信号随时间怎么变化。这是最基础,也是最容易上手的方法。我个人习惯,拿到数据第一件事,先画个时域波形图,看看有没有明显的“毛刺”或“突变”。
常用的时域特征,我列个表,大家一目了然:
| 特征名称 | 计算公式 | 物理意义(在SADA中) |
|---|---|---|
| 均值 | \(\bar{x} = \frac{1}{N}\sum_{i=1}^{N}x_i\) | 反映驱动电流的直流分量,正常时很稳定 |
| 均方根值 | \(X_{RMS} = \sqrt{\frac{1}{N}\sum_{i=1}^{N}x_i^2}\) | 代表信号的能量,轴承磨损时这个值会缓慢增大 |
| 峰值 | \(X_p = \max|x_i|\) | 捕捉瞬时冲击,比如齿轮卡涩瞬间的电流尖峰 |
| 峭度 | \(K = \frac{1}{N}\sum_{i=1}^{N}(\frac{x_i-\bar{x}}{\sigma})^4\) | 对冲击信号极其敏感,早期故障的“侦察兵” |
| 波形因子 | \(S = X_{RMS} / \bar{|x|}\) | 判断波形是否畸变,谐波污染时这个值会变 |
时域分析的优点是快,计算量小,适合做在线监测。但缺点也很明显——它很难区分不同频率的故障源。比如,电机换向火花和齿轮啮合冲击,在时域上可能都表现为“毛刺”,但根源完全不同。这时候,就得请出频域分析了。
4.2 频域分析:看穿信号的“频谱指纹”
频域分析,核心工具就是傅里叶变换(FFT)。它能把时域信号拆解成不同频率的正弦波分量。每个频率分量的大小,就是该频率的“能量”。
对于SADA来说,不同部件的故障,会在特定的频率上留下“指纹”:
- 电机转子不平衡: 会在转频 \(f_r\) 及其倍频 \(2f_r, 3f_r\) 处出现峰值。
- 齿轮啮合故障: 会在啮合频率 \(f_m = f_r \times Z\)(Z为齿数)附近出现边频带。
- 轴承故障: 会在轴承特征频率(外圈、内圈、滚动体)处出现能量聚集。
- 谐波减速器磨损: 会在柔轮变形频率附近出现调制现象。
下面是一段典型的Python代码,用于计算SADA电流信号的频谱:
import numpy as np
import matplotlib.pyplot as plt
def compute_fft(signal, fs):
"""
计算信号的幅值谱
:param signal: 输入时域信号
:param fs: 采样频率 (Hz)
:return: 频率数组, 幅值数组
"""
n = len(signal)
freq = np.fft.fftfreq(n, d=1/fs)[:n//2]
fft_vals = np.fft.fft(signal)[:n//2]
amplitude = np.abs(fft_vals) / n * 2 # 单边谱幅值
return freq, amplitude
# 示例:分析一段SADA电流数据
# fs = 1000 Hz, 数据长度 1秒
fs = 1000
t = np.linspace(0, 1, fs, endpoint=False)
# 模拟正常信号 + 50Hz 转频 + 200Hz 齿轮啮合频率
normal_signal = np.sin(2*np.pi*50*t) + 0.3*np.sin(2*np.pi*200*t)
# 加入故障特征:在 75Hz 处出现边频带
fault_signal = normal_signal + 0.1*np.sin(2*np.pi*75*t)
freq, amp_normal = compute_fft(normal_signal, fs)
freq, amp_fault = compute_fft(fault_signal, fs)
# 绘制频谱对比
plt.figure(figsize=(10, 4))
plt.plot(freq, amp_normal, label='正常状态', alpha=0.7)
plt.plot(freq, amp_fault, label='故障状态 (75Hz边频)', alpha=0.7, linestyle='--')
plt.xlabel('频率 (Hz)')
plt.ylabel('幅值')
plt.title('SADA 电流信号频谱对比')
plt.legend()
plt.grid(True)
plt.show()
4.3 时频域分析:给信号做“B超”
既然信号是非平稳的,我们就需要一种既能看频率,又能看频率随时间变化的方法。这就是时频域分析。它相当于给信号做“B超”,能看到每个时刻的频谱构成。
4.3.1 小波变换:多分辨率的“显微镜”
小波变换的核心思想,是用一个可伸缩、可平移的“小波基”去匹配信号。低频部分用宽窗口,看得更准(频率分辨率高);高频部分用窄窗口,定位更准(时间分辨率高)。这种“自适应”的特性,非常适合分析SADA的瞬态冲击信号。
我个人在项目中常用的是连续小波变换(CWT),它的时频谱图非常直观:
import pywt
import numpy as np
import matplotlib.pyplot as plt
def cwt_analysis(signal, fs, wavelet='cmor'):
"""
连续小波变换时频谱分析
:param signal: 输入信号
:param fs: 采样频率
:param wavelet: 小波基,常用 'cmor' (复Morlet小波)
"""
scales = np.arange(1, 128) # 尺度范围
coefficients, frequencies = pywt.cwt(signal, scales, wavelet, sampling_period=1/fs)
plt.figure(figsize=(10, 6))
plt.imshow(np.abs(coefficients), extent=[0, len(signal)/fs, frequencies[-1], frequencies[0]],
aspect='auto', cmap='jet')
plt.colorbar(label='幅值')
plt.ylabel('频率 (Hz)')
plt.xlabel('时间 (s)')
plt.title('SADA 电流信号 CWT 时频谱')
plt.show()
# 模拟一段非平稳信号:前0.5秒50Hz,后0.5秒100Hz
fs = 1000
t = np.linspace(0, 1, fs, endpoint=False)
signal = np.sin(2*np.pi*50*t) * (t < 0.5) + np.sin(2*np.pi*100*t) * (t >= 0.5)
cwt_analysis(signal, fs)
4.3.2 EMD分解:数据驱动的“自适应滤波器”
经验模态分解(EMD)是个很有意思的方法。它不像小波那样需要预先选好基函数,而是根据信号本身的特点,自适应地分解成若干个本征模态函数(IMF)。
每个IMF分量,都代表了信号中一个特定的振荡模式。比如,第一个IMF(IMF1)通常包含最高频的成分(如噪声、冲击),后面的IMF则依次包含越来越低的频率成分(如转频、趋势项)。
我举个例子,在SADA的电流信号中,EMD分解后:
- IMF1: 高频噪声和换向火花干扰。
- IMF2-IMF4: 齿轮啮合频率及其谐波。
- IMF5-IMF6: 电机转频和轴承故障特征频率。
- 残余分量: 电流的直流偏置和缓慢漂移。
这样,我们就可以把不同物理过程的信号“分拣”出来,分别提取特征。比如,只对IMF2-IMF4计算能量,就能精准评估齿轮的磨损程度,而不受其他频段干扰。
4.4 三种方法的对比与选择
讲了这么多,到底该用哪种?我根据自己的经验,整理了一个对比表,方便大家在实际项目中做选择:
| 分析方法 | 适用场景 | 优点 | 缺点 | 我的推荐指数 |
|---|---|---|---|---|
| 时域分析 | 在线监测、快速预警、稳态工况 | 计算快、物理意义明确 | 无法区分不同频率的故障源 | ★★★★☆ |
| 频域分析(FFT) | 稳态工况、已知故障频率的精确诊断 | 频率定位精准、理论成熟 | 不适用于非平稳信号 | ★★★☆☆ |
| 小波变换(CWT) | 非平稳信号、瞬态冲击、变转速工况 | 时频分辨率可调、适合突变信号 | 计算量大、小波基选择依赖经验 | ★★★★★ |
| EMD/EEMD分解 | 复杂信号分离、未知故障模式发现 | 自适应、无需先验知识 | 模态混叠、端点效应、数学理论不完善 | ★★★★☆ |
最后说一句,没有万能的方法。我个人的工作流通常是:先用时域特征做快速筛查,发现异常后,用小波变换看时频谱定位故障时刻,最后用EMD分解把故障信号“提纯”出来,做精确的特征量化。这套组合拳,帮我解决了不少SADA的疑难杂症。
嗯,这章的内容就到这里。下一章,我们聊聊怎么把这些特征量组合起来,构建一个能自动诊断故障的健康管理系统。