4. 信号采集与预处理

振动信号的质量直接决定了TinyML故障诊断模型的上限。在嵌入式端,传感器采集到的原始信号往往夹杂着直流偏置、工频干扰、随机噪声以及传感器安装带来的趋势项。如果将这些“脏数据”直接送入模型,轻则导致特征偏移,重则使模型在训练时无法收敛。本章将系统讲解从传感器原始输出到模型可用张量之间的完整信号处理链路,涵盖采样率设定、抗混叠滤波、去趋势、去噪和归一化五大核心环节,并给出适用于MCU级TinyML场景的轻量化实现方案。

振动信号采集与预处理链路 加速度传感器 ADXL345 / MPU6050 I2C/SPI 输出 采样率设定 fs ≥ 2.56 × fmax 抗混叠滤波 低通 / 带通 预处理核心 ① 去趋势项 ② 去噪(移动平均/中值) ③ 归一化(Min-Max/Z-Score) ④ 加窗(Hamming/Hann) 特征提取 时域/频域特征 → TinyML模型 关键参数与工程约束 环节 核心参数 TinyML推荐值 注意事项 采样率 fs 1kHz ~ 4kHz ≥2倍最高分析频率 抗混叠 截止频率 fc fc = fs/2.56 硬件RC或软件滤波 去趋势 窗口长度 1s或整段 消除温度漂移/安装应力 归一化 范围 [-1, 1] 或 [0, 1] 需保存训练时的极值 去噪 核大小 3~7点 避免过度平滑丢失冲击特征

4.1 采样率设定与抗混叠滤波

核心原理:采样率决定了振动信号可分析的频率上限。根据奈奎斯特采样定理,采样频率 fs 必须大于信号最高频率成分 fmax 的两倍,否则高频成分会折叠到低频区间,产生混叠(Aliasing)现象。在实际工程中,考虑到滤波器并非理想陡降,通常取 fs ≥ 2.56 × fmax。例如,若设备转速为 3000 RPM(基频 50 Hz),需要分析到 10 倍频(500 Hz),则采样率应不低于 1280 Hz,工程上常取 2 kHz 或更高。

判断方法:在设定采样率前,先明确诊断目标频率范围。对于滚动轴承故障,特征频率可能高达数千赫兹;对于齿轮箱,啮合频率及其边带是重点。可通过以下步骤确定采样率:

  1. 查询设备铭牌或转速表,确定最高转速对应的基频 f0。
  2. 根据故障类型确定需要分析的最高倍频数(通常取 10~20 倍)。
  3. 计算 fmax = 倍频数 × f0,再取 fs = 2.56 × fmax 并向上取整到常用值。

抗混叠滤波:在 ADC 采样之前,必须使用低通滤波器(抗混叠滤波器)将高于 fs/2 的频率成分衰减掉。在 TinyML 硬件上,常见做法有两种:一是使用传感器模块自带的数字滤波器(如 ADXL345 内置的低通滤波器);二是在 MCU 端实现软件滤波,如二阶 IIR 巴特沃斯低通滤波器。对于嵌入式场景,推荐使用一阶或二阶 IIR 滤波器,因其计算量小、延迟低。

工程经验:在 STM32 平台上,使用 CMSIS-DSP 库的 arm_biquad_cascade_df1_f32 函数可实现高效的 IIR 滤波。对于 1 kHz 采样率,截止频率设为 400 Hz 的巴特沃斯二阶滤波器,仅需约 5 个乘加运算/样本,MCU 负载可忽略不计。

4.2 去趋势项处理

核心原理:趋势项是信号中缓慢变化的直流分量或低频漂移,通常由传感器温度漂移、安装面热膨胀、电缆摆动或 ADC 偏置引起。趋势项的存在会严重干扰后续的频域分析和特征提取,例如在 FFT 频谱中产生虚假的零频分量和低频隆起。去趋势的实质是估计并移除信号中的低频基线。

操作流程:常用的去趋势方法有两种:

  • 均值去趋势:直接减去整段信号的算术平均值,适用于信号平稳、无显著漂移的场景。
  • 线性去趋势:使用最小二乘法拟合一条直线,然后从原始信号中减去该直线。适用于存在线性漂移的情况。
  • 高通滤波去趋势:通过截止频率为 1~5 Hz 的高通滤波器,可同时去除直流和低频漂移。这是最稳健的方法,推荐在 TinyML 中使用。
// 线性去趋势示例(C语言,适用于MCU)
void remove_trend(float *data, uint32_t len) {
    float sum_x = 0, sum_y = 0, sum_xy = 0, sum_xx = 0;
    for (uint32_t i = 0; i < len; i++) {
        sum_x += i;
        sum_y += data[i];
        sum_xy += i * data[i];
        sum_xx += i * i;
    }
    float slope = (len * sum_xy - sum_x * sum_y) / (len * sum_xx - sum_x * sum_x);
    float intercept = (sum_y - slope * sum_x) / len;
    for (uint32_t i = 0; i < len; i++) {
        data[i] -= (slope * i + intercept);
    }
}

注意:去趋势时窗口长度不宜过短。若窗口小于 0.5 秒,可能会将真实的低频故障特征(如不对中产生的 1 倍频分量)误当作趋势项去除。建议窗口长度至少包含 5 个完整旋转周期。

4.3 去噪处理

核心原理:振动信号中的噪声主要来自电气干扰(50 Hz 工频及谐波)、传感器内部电子噪声、机械背景振动等。去噪的目标是在保留故障冲击特征的前提下,尽可能降低噪声幅值。对于 TinyML 场景,不宜使用过于复杂的去噪算法(如小波变换),而应选择计算量适中的时域滤波方法。

常用方法对比:

方法 原理 计算量 适用场景
移动平均滤波 对相邻 N 个点取平均 极低(N 次加法) 平稳信号、高斯白噪声
中值滤波 取窗口内排序后的中间值 中等(需排序) 脉冲噪声、尖峰干扰
指数加权平均 当前值 = α×新样本 + (1-α)×上次值 极低(2 次乘加) 实时流式处理
IIR 低通滤波 反馈型数字滤波器 低(5~10 次乘加) 频带受限的噪声

实战建议:对于轴承故障诊断,冲击特征通常表现为高频衰减振荡。移动平均滤波虽然能平滑噪声,但也会削弱冲击幅值。此时推荐使用中值滤波(窗口 3~5 点)或保留原始信号直接进行特征提取,因为 TinyML 模型(如 1D-CNN)本身具有一定的抗噪能力。若必须去噪,优先选择截止频率高于故障特征频率的低通滤波器。

4.4 归一化处理

核心原理:归一化是将不同量纲、不同幅值范围的信号映射到统一区间,避免模型训练时某些特征因数值过大而主导梯度更新。对于振动信号,归一化还能消除传感器灵敏度差异和安装位置不同带来的幅值偏差。

两种主流方法:

  • Min-Max 归一化:将数据线性映射到 [0, 1] 或 [-1, 1] 区间。公式为 x' = (x - x_min) / (x_max - x_min)。适用于信号幅值范围已知且稳定的场景。
  • Z-Score 标准化:使数据均值为 0,标准差为 1。公式为 x' = (x - μ) / σ。适用于信号幅值波动较大的场景,对异常值更鲁棒。

TinyML 部署要点:归一化参数(x_min、x_max 或 μ、σ)必须在训练集上计算并保存为常量,部署到 MCU 时直接使用这些常量进行推理前处理。切勿在推理时重新计算,否则会导致训练与推理数据分布不一致。

// 推理时的归一化(使用训练时保存的参数)
float norm_data[256];
for (int i = 0; i < 256; i++) {
    norm_data[i] = (raw_data[i] - x_min) / (x_max - x_min) * 2.0f - 1.0f;
}

4.5 案例拆解:电机轴承故障数据预处理全流程

背景与约束:某工厂一台 2.2 kW 三相异步电机,额定转速 1450 RPM,使用 ADXL345 加速度传感器采集振动信号。目标是通过 TinyML 模型区分正常状态与滚动轴承外圈故障。硬件平台为 STM32F407(Cortex-M4,168 MHz),内存 192 KB,需在 256 点窗口内完成预处理。

初始现象:原始信号中明显存在约 0.5 V 的直流偏置,且波形基线缓慢漂移(温度影响)。频谱分析显示 50 Hz 及其谐波幅值较高,掩盖了轴承故障特征频率(BPFO ≈ 87.5 Hz)。

关键参数设定:

  1. 采样率:需分析到 10 倍频(约 240 Hz),取 fs = 1 kHz。
  2. 抗混叠:使用 ADXL345 内置低通滤波器,截止频率设为 400 Hz。
  3. 去趋势:采用高通滤波(截止 5 Hz),消除直流和温度漂移。
  4. 去噪:使用 3 点中值滤波去除尖峰脉冲。
  5. 归一化:在训练集上计算 x_min = -1.2g,x_max = 1.2g,映射到 [-1, 1]。

操作步骤:

// 伪代码流程
1. 读取 256 点原始数据(I2C 读取,每点 16 位)
2. 减去 ADC 偏置(约 16384)
3. 软件高通滤波(二阶 IIR,fc=5Hz)
4. 3 点中值滤波
5. 归一化:norm = (x - (-1.2)) / (1.2 - (-1.2)) * 2 - 1
6. 送入 1D-CNN 模型进行推理

结果对比:预处理前,模型准确率仅为 72%(受直流偏置和工频干扰影响);预处理后,准确率提升至 96.5%。同时,模型推理时间从 18 ms 降至 12 ms(因归一化参数固定,减少了运行时计算)。

风险与代价:中值滤波窗口过大会导致冲击特征被平滑,经测试窗口为 5 时准确率下降至 91%。因此最终选择窗口为 3。此外,高通滤波会引入相位延迟,对于需要精确时域对齐的应用需注意。

复盘经验:预处理参数的选择必须与故障特征频率匹配。建议在开发阶段使用 Python 脚本(如 scipy.signal)离线验证参数效果,再将验证过的参数移植到 MCU 端。同时,归一化参数务必在训练集上统计,避免使用测试集数据。

4.6 常见误区与总结

误区一:采样率越高越好。过高的采样率会导致数据量激增,MCU 内存和功耗压力增大,且对故障特征无额外增益。应根据实际分析频率需求合理设定。

误区二:忽略抗混叠滤波。部分开发者直接使用传感器原始数据,未进行低通滤波,导致高频噪声折叠到低频段,产生虚假故障特征。

误区三:归一化参数在推理时动态计算。这会导致每次推理结果不一致,且 MCU 端计算开销增大。正确做法是使用训练集统计的固定参数。

误区四:过度去噪。去噪过度会抹平故障冲击特征,尤其是对于早期微弱故障,应保留原始冲击成分。

总结:信号采集与预处理是 TinyML 故障诊断系统的“地基”。一个合理的预处理流程应遵循“先硬件后软件、先粗后细”的原则:首先通过采样率设定和抗混叠滤波保证信号频带正确,然后通过去趋势消除低频漂移,再根据噪声类型选择轻量级去噪方法,最后使用固定参数的归一化将数据映射到模型输入空间。每一步的参数选择都应基于故障特征频率和硬件资源约束进行权衡,并通过离线仿真验证后再部署到 MCU 端。