4. 信号采集与预处理
加速度计输出的原始信号在进入TinyML模型之前,必须经过一条严谨的“物理世界→数字世界→干净特征”的链路。很多初学者将精力集中在模型结构上,却忽略了前端信号质量——事实上,模型的上限由数据质量决定。本章围绕振动信号采集与预处理展开,涵盖采样定理与抗混叠滤波、去直流与去趋势项、平滑滤波(移动平均与中值滤波)、数据分段与加窗四大模块,并结合一个轴承振动分类的实战案例,帮助您建立从传感器原始输出到模型输入张量的完整工程认知。
4.1 采样定理与抗混叠滤波
核心原理
根据奈奎斯特采样定理,为了无失真地恢复模拟信号,采样频率 \( f_s \) 必须大于信号最高频率分量 \( f_{max} \) 的两倍,即 \( f_s > 2f_{max} \)。在振动测试中,通常取 \( f_s = 2.56 \sim 10 \) 倍的 \( f_{max} \),以留出工程裕量。例如,若关注轴承外圈故障特征频率在 2 kHz 以内,采样率至少应设为 5 kHz,实际工程中常取 10 kHz 或更高。
抗混叠滤波是采样前必须完成的硬件动作。理想情况下,ADC 前应放置一个低通滤波器,其截止频率 \( f_c \) 设为 \( 0.4 \sim 0.5 \times f_s \),以衰减高于奈奎斯特频率的成分。若缺少该滤波器,高频噪声会折叠到低频段,产生虚假的频谱峰,导致后续 FFT 特征完全失真。
判断方法与操作流程
- 确定目标频率范围:根据机械结构、轴承型号、转速计算可能出现的故障特征频率(BPFO、BPFI、BSF、FTF)。
- 选择采样率:\( f_s \ge 2.56 \times f_{max} \),推荐 5~10 倍裕量。
- 配置抗混叠滤波器:硬件低通滤波器阶数建议 4 阶以上(巴特沃斯或切比雪夫),截止频率设为 \( 0.4 \times f_s \)。
- 验证:采集已知正弦信号,检查频谱中是否存在非预期的高频镜像。
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 采样率 fs | ≥ 2.56 × fmax | 工程常用 5~10 倍 |
| 抗混叠截止频率 | 0.4~0.5 × fs | 硬件低通滤波器 |
| 滤波器阶数 | 4~8 阶 | 阶数越高过渡带越窄 |
| ADC 分辨率 | ≥ 16 bit | 振动信号动态范围大 |
4.2 去直流与去趋势项
核心原理
加速度计输出常包含直流偏置(由传感器零偏、放大电路漂移引起)和趋势项(由温度漂移、机械松动或积分漂移导致)。直流分量会使 FFT 在 0 Hz 处产生巨大峰值,掩盖低频故障特征;趋势项则表现为缓慢变化的基线漂移,在频谱中形成低频伪峰。
去直流最简单的方法是减去信号均值:x_detrend = x - mean(x)。去趋势项则需拟合多项式(通常 1~3 阶)并从原始信号中减去。对于振动信号,一阶线性去趋势通常足够;若信号存在明显的非线性漂移,可考虑二阶或三阶多项式拟合。
操作流程
// 伪代码示例:去直流 + 去趋势
float mean = 0;
for (i = 0; i < N; i++) mean += x[i];
mean /= N;
for (i = 0; i < N; i++) x[i] -= mean; // 去直流
// 一阶线性去趋势
float slope, intercept;
linear_fit(x, N, &slope, &intercept);
for (i = 0; i < N; i++) x[i] -= (slope * i + intercept);
案例拆解:温度漂移导致的低频伪峰
某旋转机械振动监测系统在开机 10 分钟后,频谱 0.5 Hz 附近出现异常峰值。初步怀疑是轴承故障,但复查发现传感器温度从 25°C 升至 45°C,导致输出基线漂移。对原始信号进行一阶去趋势后,0.5 Hz 伪峰消失,真实故障特征(1× 转频)清晰可见。此案例说明:去趋势项是低频分析的前提,尤其在长时间采集中不可省略。
4.3 平滑滤波:移动平均与中值滤波
核心原理
平滑滤波用于抑制随机噪声和高频毛刺,但需注意过度平滑会削弱故障冲击特征。移动平均滤波器(MA)对窗口内数据取均值,能有效平滑高斯白噪声,但对脉冲型异常(如轴承剥落冲击)不敏感。中值滤波器取窗口内数据的中位数,对脉冲噪声和离群点有极佳的抑制效果,且能保留信号边缘。
对比与选择
| 滤波器类型 | 适用场景 | 窗口大小建议 | 缺点 |
|---|---|---|---|
| 移动平均 | 高斯噪声、平稳信号 | 3~15 点 | 边缘模糊,脉冲响应差 |
| 中值滤波 | 脉冲噪声、尖峰干扰 | 3~7 点 | 计算量大,平滑度有限 |
| 加权移动平均 | 需要更平滑的频谱 | 5~21 点 | 相位延迟增加 |
实战场景:电机振动信号预处理
某电机振动信号采样率 12.8 kHz,原始信号包含明显的电磁干扰尖峰(约 200 Hz 重复脉冲)。直接做 FFT 后,频谱在 200 Hz 及其谐波处出现虚假峰值。采用 5 点中值滤波后,尖峰被有效抑制,真实故障特征(1× 转频 50 Hz 及其边带)得以保留。若改用 11 点移动平均,虽然噪声更低,但 50 Hz 附近的边带幅值衰减了 30%,影响故障诊断精度。
4.4 数据分段与加窗
核心原理
FFT 要求输入信号为有限长度,且隐含周期性延拓假设。直接截取一段信号进行 FFT 会产生频谱泄漏——能量从真实频率扩散到相邻频点。加窗可以缓解泄漏,但会引入主瓣展宽和幅值误差。振动分析中常用 Hann 窗(余弦窗),其旁瓣衰减较大,适合连续振动信号;矩形窗(不加窗)仅适用于瞬态冲击信号。
数据分段时,每段长度应包含足够的振动周期数。例如,对于 50 Hz 转频,若频率分辨率为 1 Hz,则每段至少需要 1 秒数据(即 12800 点)。实际中常采用 50% 重叠分段,以增加平均次数、降低方差。
操作流程与参数选择
- 确定频率分辨率:\( \Delta f = f_s / N \),N 为 FFT 点数。
- 选择段长度:N 取 2 的幂次(256/512/1024/2048),保证频率分辨率满足需求。
- 设置重叠率:50%~75%,重叠越多,平均效果越好,但计算量增大。
- 选择窗函数:Hann 窗(默认)、Hamming 窗(频率精度更高)、Blackman 窗(旁瓣更低)。
- 幅值修正:使用 Hann 窗时,幅值恢复系数为 2.0(单边谱)。
// Python 示例:分段加窗与 FFT
import numpy as np
fs = 12800
segment_len = 1024
overlap = 512
window = np.hanning(segment_len)
for start in range(0, len(data) - segment_len, overlap):
segment = data[start:start+segment_len] * window
spectrum = np.fft.rfft(segment)
freq = np.fft.rfftfreq(segment_len, 1/fs)
# 幅值修正:乘以 2.0(单边谱),再除以 segment_len
案例拆解:轴承故障特征提取
某轴承试验台,转速 1800 r/min(转频 30 Hz),外圈故障特征频率 BPFO = 5.6× 转频 = 168 Hz。采样率 25.6 kHz,每段取 1024 点(频率分辨率 25 Hz),无法区分 168 Hz 与 180 Hz。将段长度增至 4096 点(分辨率 6.25 Hz),采用 Hann 窗、50% 重叠,平均 20 段后,168 Hz 处出现明显峰值,边带间隔 30 Hz 清晰可见。若不加窗,频谱泄漏导致 168 Hz 与 180 Hz 混叠,无法识别。
① 硬件抗混叠滤波 → ② 去直流与去趋势 → ③ 中值滤波(去脉冲)→ ④ 移动平均(去高斯噪声)→ ⑤ 分段加窗(Hann,50% 重叠)→ ⑥ FFT 特征提取。每一步都需通过频谱对比验证,确保特征真实可靠。