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|}\) 判断波形是否畸变,谐波污染时这个值会变
我的经验: 别小看这些简单特征。我曾经处理过一个SADA“软故障”案例,电流均方根值只增加了2%,但峭度值却飙升了40%。就是靠这个“峭度”特征,我们提前两周预警了一次轴承保持架断裂事故。

时域分析的优点是快,计算量小,适合做在线监测。但缺点也很明显——它很难区分不同频率的故障源。比如,电机换向火花和齿轮啮合冲击,在时域上可能都表现为“毛刺”,但根源完全不同。这时候,就得请出频域分析了。

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()
注意: FFT有一个致命弱点——它假设信号是平稳的。但SADA在启停、变轨、对日定向过程中,转速是变化的,信号是非平稳的。这时候用FFT,就像用一把死尺子去量一个活物体,结果会失真。我曾经就犯过这个错,用FFT分析变转速工况下的振动信号,死活找不到故障频率,后来才发现是方法用错了。

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)
避坑指南: 我曾经用db4小波分析SADA的电流信号,结果时频谱上出现了很多虚假的“能量团”。后来才发现,小波基的选择很关键。对于分析类似电流、振动这种振荡型信号,复Morlet小波(cmor) 是最佳选择,因为它与信号形态最相似,能最大程度减少能量泄露。

4.3.2 EMD分解:数据驱动的“自适应滤波器”

经验模态分解(EMD)是个很有意思的方法。它不像小波那样需要预先选好基函数,而是根据信号本身的特点,自适应地分解成若干个本征模态函数(IMF)。

每个IMF分量,都代表了信号中一个特定的振荡模式。比如,第一个IMF(IMF1)通常包含最高频的成分(如噪声、冲击),后面的IMF则依次包含越来越低的频率成分(如转频、趋势项)。

我举个例子,在SADA的电流信号中,EMD分解后:

  • IMF1: 高频噪声和换向火花干扰。
  • IMF2-IMF4: 齿轮啮合频率及其谐波。
  • IMF5-IMF6: 电机转频和轴承故障特征频率。
  • 残余分量: 电流的直流偏置和缓慢漂移。

这样,我们就可以把不同物理过程的信号“分拣”出来,分别提取特征。比如,只对IMF2-IMF4计算能量,就能精准评估齿轮的磨损程度,而不受其他频段干扰。

我的建议: EMD有个小毛病叫“模态混叠”,就是不同频率的成分被分到了同一个IMF里。遇到这种情况,可以试试它的改进版——集合经验模态分解(EEMD)。EEMD通过添加白噪声来“平滑”信号,能有效抑制模态混叠。我在处理某型号卫星的SADA数据时,就是用EEMD成功分离出了微弱的轴承故障信号。

4.4 三种方法的对比与选择

讲了这么多,到底该用哪种?我根据自己的经验,整理了一个对比表,方便大家在实际项目中做选择:

分析方法 适用场景 优点 缺点 我的推荐指数
时域分析 在线监测、快速预警、稳态工况 计算快、物理意义明确 无法区分不同频率的故障源 ★★★★☆
频域分析(FFT) 稳态工况、已知故障频率的精确诊断 频率定位精准、理论成熟 不适用于非平稳信号 ★★★☆☆
小波变换(CWT) 非平稳信号、瞬态冲击、变转速工况 时频分辨率可调、适合突变信号 计算量大、小波基选择依赖经验 ★★★★★
EMD/EEMD分解 复杂信号分离、未知故障模式发现 自适应、无需先验知识 模态混叠、端点效应、数学理论不完善 ★★★★☆

最后说一句,没有万能的方法。我个人的工作流通常是:先用时域特征做快速筛查,发现异常后,用小波变换看时频谱定位故障时刻,最后用EMD分解把故障信号“提纯”出来,做精确的特征量化。这套组合拳,帮我解决了不少SADA的疑难杂症。

嗯,这章的内容就到这里。下一章,我们聊聊怎么把这些特征量组合起来,构建一个能自动诊断故障的健康管理系统。