3. 信号采集与预处理
振动异常检测项目的成败,往往不取决于算法模型的先进程度,而取决于进入模型之前的信号质量。在TinyML设备(如Cortex-M4/M7内核MCU、ESP32、K210等)上部署FFT模型时,计算资源与内存受限,任何混叠、趋势漂移或噪声干扰都会在频域中被放大,导致误判。本章围绕“从传感器原始电压到可喂入FFT的干净序列”这一完整链路,系统讲解采样率设定、抗混叠滤波、去趋势、去噪与归一化的工程方法。
3.1 采样率设定与奈奎斯特准则
核心原理
奈奎斯特采样定理指出:为了无失真地恢复模拟信号,采样频率 \( f_s \) 必须大于信号最高频率分量 \( f_{max} \) 的两倍,即 \( f_s > 2f_{max} \)。在实际工程中,由于FFT分析需要观察频谱细节,且抗混叠滤波器存在过渡带,通常取 \( f_s = 2.56 \sim 4 \) 倍的 \( f_{max} \)。例如,若关注轴承故障频率最高到 2000 Hz,则采样率应设为 5120 Hz 或 8000 Hz,而非刚好 4000 Hz。
对于旋转机械振动检测,特征频率与转速直接相关。设转速为 \( RPM \),则轴频 \( f_r = RPM/60 \)。齿轮啮合频率 \( GMF = 齿数 \times f_r \),轴承故障频率(BPFO、BPFI、BSF、FTF)需根据轴承几何参数计算。采样率设定必须覆盖这些特征频率的 3~5 倍频,因为故障冲击往往产生丰富的谐波成分。
判断方法与操作流程
- 确定最高分析频率:根据设备类型和故障模式,列出所有可能的特征频率及其谐波,取最大值作为 \( f_{max} \)。
- 计算最小采样率:\( f_s \ge 2.56 \times f_{max} \),并向上取整到常用采样率(如 1000、2000、5000、10000 Hz)。
- 校验频率分辨率:FFT频率分辨率 \( \Delta f = f_s / N \),其中 N 为FFT点数。若需分辨间隔 5 Hz 的两个相邻频率,则 \( N \ge f_s / 5 \)。
- 考虑TinyML内存限制:N=256 时需 256 个 float32 样本(1KB),N=1024 时需 4KB。MCU 内存通常 64~512KB,需平衡分辨率与资源。
| 设备类型 | 典型特征频率范围 | 推荐采样率 | FFT点数 | 频率分辨率 |
|---|---|---|---|---|
| 低速电机 (300 RPM) | 5~50 Hz | 256 Hz | 256 | 1 Hz |
| 高速主轴 (12000 RPM) | 200~2000 Hz | 5120 Hz | 512 | 10 Hz |
| 齿轮箱 (含啮合频率) | 100~5000 Hz | 12800 Hz | 1024 | 12.5 Hz |
| 轴承早期故障 (高频冲击) | 500~10000 Hz | 25600 Hz | 1024 | 25 Hz |
3.2 抗混叠滤波
核心原理
混叠(Aliasing)是指当信号中含有高于 \( f_s/2 \) 的频率成分时,这些高频成分会“折叠”回低频区域,与真实低频信号叠加,造成频谱失真。例如,采样率 1000 Hz 时,一个 600 Hz 的信号会被误认为 400 Hz(因为 1000-600=400)。抗混叠滤波器是一个低通滤波器,其截止频率 \( f_c \) 设定在 \( f_s/2 \) 之前,通常取 \( f_c = 0.4 \times f_s \),确保高于 \( f_c \) 的成分被充分衰减(至少 -40dB)。
在TinyML硬件中,抗混叠滤波有两种实现方式:模拟滤波(在ADC之前使用RC有源滤波器)和数字滤波(在ADC之后使用FIR/IIR滤波器)。模拟滤波适合高频抑制,但会增加硬件成本;数字滤波灵活可调,但需要额外的计算开销。对于大多数MCU内置ADC,建议在传感器输出端加一级简单的RC低通滤波(截止频率约 \( f_s/2 \)),再在软件中做数字滤波。
操作流程与参数选择
// 数字抗混叠滤波示例 (一阶IIR低通,fs=1000Hz, fc=400Hz)
float alpha = 0.2; // 滤波系数,由fc和fs计算
float filtered = 0;
for (int i = 0; i < N; i++) {
filtered = alpha * raw[i] + (1 - alpha) * filtered;
out[i] = filtered;
}
实际工程中,一阶IIR滤波器的阻带衰减只有 -20dB/十倍频,对于强干扰场景不够。建议使用二阶巴特沃斯滤波器(-40dB/十倍频)或FIR滤波器(线性相位,但计算量大)。在Cortex-M4上,可使用CMSIS-DSP库的 arm_biquad_cascade_df1_f32 函数高效实现。
3.3 去趋势与去均值
核心原理
振动传感器输出的原始信号通常包含直流偏置(DC offset)和低频趋势项。直流偏置来源于传感器的零点漂移或信号调理电路的偏置电压;趋势项则可能由温度漂移、机械松动或传感器安装不稳引起。这些低频成分在FFT中会表现为 0 Hz 附近的巨大能量,掩盖真实的低频故障特征,并导致频谱泄漏。
去趋势的核心是消除信号中的直流分量和缓慢变化的趋势。最简单的方法是去均值:计算整个采样序列的平均值并减去。但若信号存在线性或非线性趋势,仅去均值不够,需使用多项式拟合去趋势(如一次或二次多项式)或高通滤波(截止频率 1~5 Hz)。
实现方法与代码示例
// 去均值 (最常用)
float mean = 0;
for (int i = 0; i < N; i++) mean += raw[i];
mean /= N;
for (int i = 0; i < N; i++) data[i] = raw[i] - mean;
// 线性去趋势 (消除一次趋势)
float sum_x = 0, sum_y = 0, sum_xy = 0, sum_xx = 0;
for (int i = 0; i < N; i++) {
sum_x += i; sum_y += data[i];
sum_xy += i * data[i]; sum_xx += i * i;
}
float slope = (N * sum_xy - sum_x * sum_y) / (N * sum_xx - sum_x * sum_x);
float intercept = (sum_y - slope * sum_x) / N;
for (int i = 0; i < N; i++) data[i] -= (slope * i + intercept);
3.4 去噪方法
核心原理
振动信号中的噪声来源包括:电磁干扰(EMI)、电源纹波、传感器本底噪声、机械结构共振等。去噪的目标是保留故障特征频率成分,抑制无关噪声。常用方法分为三类:频域滤波(带通/带阻)、时域平滑(移动平均/中值滤波)、自适应滤波(小波变换、卡尔曼滤波)。
在TinyML场景下,计算资源有限,推荐使用带通滤波:根据设备特征频率范围设定通带,例如关注 10~1000 Hz 的振动,则使用带通滤波器滤除 10 Hz 以下和 1000 Hz 以上的成分。带通滤波同时实现了去趋势(低端截止)和抗混叠(高端截止)的功能。
滤波方法对比
| 方法 | 计算量 | 延迟 | 适用场景 | TinyML可行性 |
|---|---|---|---|---|
| 移动平均 | 低 (O(N)) | 低 | 平滑随机噪声 | ✅ 推荐 |
| 中值滤波 | 中 (O(N log N)) | 中 | 去除脉冲/尖峰 | ⚠ 需排序 |
| IIR带通 | 低 (O(N)) | 低 | 频带选择 | ✅ 推荐 |
| FIR带通 | 高 (O(N×M)) | 高 | 线性相位要求 | ⚠ 需权衡 |
| 小波变换 | 高 | 高 | 非平稳信号 | ❌ 不推荐 |
3.5 归一化方法
核心原理
归一化的目的是消除不同传感器、不同量程、不同安装位置带来的幅值差异,使特征具有可比性。在TinyML模型中,归一化还能加速模型收敛、提高数值稳定性。常用方法有:Min-Max归一化(映射到 [0,1])、Z-score标准化(零均值、单位方差)、幅值归一化(除以最大值或RMS值)。
对于振动信号,推荐使用Z-score标准化,因为它对异常值不敏感,且保留了信号的相对波动信息。Min-Max归一化在存在尖峰脉冲时会导致正常信号被压缩到很小的范围。
实现与选择
// Z-score 标准化
float mean = 0, std = 0;
for (int i = 0; i < N; i++) mean += data[i];
mean /= N;
for (int i = 0; i < N; i++) std += (data[i] - mean) * (data[i] - mean);
std = sqrt(std / N);
for (int i = 0; i < N; i++) norm[i] = (data[i] - mean) / std;
// Min-Max 归一化
float min = data[0], max = data[0];
for (int i = 1; i < N; i++) {
if (data[i] < min) min = data[i];
if (data[i] > max) max = data[i];
}
for (int i = 0; i < N; i++) norm[i] = (data[i] - min) / (max - min);
3.6 完整预处理流程与案例复盘
标准流程
- 原始采集:设置采样率 \( f_s \),采集 N 点数据(N 为 2 的幂,如 256/512/1024)。
- 抗混叠:硬件RC滤波 + 软件IIR低通(截止频率 \( f_s/2.56 \))。
- 去趋势:去均值 + 线性去趋势(消除直流和漂移)。
- 带通滤波:根据特征频率范围设定带通(如 10~2000 Hz)。
- 归一化:Z-score标准化,使用预计算的均值/标准差。
- 加窗:对归一化后的数据乘以Hanning窗(减少频谱泄漏)。
- FFT:计算幅值谱,提取特征频率幅值。
案例拆解:电机轴承故障检测
背景与约束:某工厂一台 4 极异步电机(额定转速 1450 RPM),配套 6205 深沟球轴承。需在 STM32F407(Cortex-M4, 168MHz, 192KB RAM)上实现实时振动监测,检测轴承外圈故障(BPFO)。
初始参数:轴频 \( f_r = 1450/60 = 24.17 \) Hz,6205 轴承 BPFO = 3.585 × \( f_r \) ≈ 86.6 Hz。考虑 3 倍频,最高分析频率设为 300 Hz。采样率取 \( f_s = 1024 \) Hz(满足 2.56×300=768 Hz 要求),FFT点数 N=512,频率分辨率 \( \Delta f = 2 \) Hz。
预处理实施:
- 抗混叠:RC 低通(截止 400 Hz)+ 软件二阶巴特沃斯低通(截止 350 Hz)。
- 去趋势:去均值 + 一次多项式去趋势(消除温度漂移)。
- 带通:10~300 Hz 带通(滤除低频摆动和高频噪声)。
- 归一化:Z-score,均值/标准差从 100 组正常样本统计。
- 加窗:Hanning 窗,减少频谱泄漏。
结果对比:未预处理时,FFT频谱在 0~5 Hz 有巨大能量(幅值 0.8),86.6 Hz 处幅值仅 0.05,无法识别。预处理后,0~5 Hz 能量降至 0.02,86.6 Hz 处幅值 0.31,信噪比提升约 16 dB。进一步在 173.2 Hz(2×BPFO)和 259.8 Hz(3×BPFO)处也观察到明显峰值,确认外圈故障。
代价与风险:预处理总耗时约 3.2 ms(含滤波和FFT),在 168MHz MCU 上占用约 15% CPU,可满足 100 Hz 的实时处理需求。风险在于带通滤波上限 300 Hz 可能遗漏更高频的早期故障特征,后续可通过提高采样率至 2048 Hz 并增加 FFT 点数来扩展频带。
3.7 常见误区与总结
| 误区 | 后果 | 正确做法 |
|---|---|---|
| 采样率刚好等于 2×fmax | 抗混叠滤波器过渡带导致边缘频率失真 | 取 2.56~4 倍 fmax |
| 忽略直流偏置直接做FFT | 0Hz 巨大能量掩盖低频故障 | 必须去均值/去趋势 |
| 对所有信号使用相同归一化参数 | 不同传感器数据不可比 | 按传感器/工况分别统计 |
| 过度滤波 | 丢失真实故障特征 | 先频谱分析再定滤波范围 |
| 在推理时动态计算均值/标准差 | 增加延迟且特征不稳定 | 离线统计,固化参数 |
信号采集与预处理是振动异常检测系统的“地基”。一个设计良好的预处理链路,能够显著提升FFT频谱的信噪比,使故障特征清晰可辨;反之,再优秀的分类模型也无法从失真的数据中提取有效信息。在TinyML环境下,每一步预处理都需在算法效果与计算资源之间取得平衡。建议开发者在实际部署前,使用采集的真实振动数据离线验证预处理参数,再移植到MCU上运行,确保系统在真实工况下的鲁棒性。