3. 数据采集与预处理
电机振动异常评分模型的效果上限,在数据采集阶段就已经被决定。采集到的振动信号是否真实、完整、干净,直接决定了后续特征工程和模型训练的天花板。本章聚焦于从传感器原始输出到可训练数据集的全链路处理流程,涵盖采样率选择、抗混叠滤波、去趋势、去噪、归一化以及数据分割与标注六大核心环节。我们将从工程实践角度出发,结合TinyML部署的算力与存储约束,给出可落地的操作路径与参数选择依据。
上图展示了从传感器到TinyML部署的完整数据工程链路。在实际项目中,每个环节的参数选择都直接影响模型在边缘设备上的推理精度与稳定性。下面我们逐一展开每个环节的核心原理与操作要点。
3.1 采样率选择:从奈奎斯特到工程裕量
核心原理:采样率决定了振动信号能够表征的最高频率成分。根据奈奎斯特采样定理,采样率必须大于信号最高频率的两倍,否则会发生频谱混叠,导致高频成分折叠到低频区域,污染故障特征。然而,工程实践中我们通常采用更高的裕量系数。对于电机振动监测,需要关注的频率范围包括:转频(1×)、倍频(2×、3×…)、轴承故障特征频率(BPFO、BPFI、BSF、FTF)以及齿轮啮合频率。这些特征频率往往分布在数百赫兹到数千赫兹之间。
判断方法:采样率的选择应遵循以下步骤:
- 确定电机最高转速(RPM),计算转频 f_r = RPM / 60。
- 识别需要监测的最高故障特征频率,通常取轴承外圈故障频率 BPFO 的 5~10 倍作为上限。
- 设定采样率 fs ≥ 2.56 × f_max(工程常用系数),推荐 fs = 10 × f_r 至 20 × f_r。
| 电机类型 | 典型转速范围 | 推荐采样率 | 分析频带 |
|---|---|---|---|
| 小型伺服电机 | 3000~6000 RPM | 20~50 kHz | 0~10 kHz |
| 工业异步电机 | 1000~3000 RPM | 10~25 kHz | 0~5 kHz |
| 大型低速电机 | 100~600 RPM | 2~10 kHz | 0~2 kHz |
3.2 抗混叠滤波:硬件与软件的双重保障
核心原理:抗混叠滤波器的目的是在采样之前滤除高于奈奎斯特频率(fs/2)的信号成分。理想情况下,应在ADC之前放置硬件低通滤波器(模拟滤波器),确保进入采样器的信号带宽受限。然而,在TinyML低成本方案中,许多MEMS传感器内部已集成抗混叠滤波器,但其截止频率往往固定且不够陡峭。因此,软件层面的数字滤波(如FIR或IIR低通滤波器)成为必要的补充。
操作流程:
- 检查传感器数据手册,确认内部ADC是否包含抗混叠滤波,记录其-3dB截止频率。
- 若内部滤波不足,在MCU中实现二阶或四阶巴特沃斯低通滤波器,截止频率设为 0.4 × fs。
- 对于离线分析,可使用Python的scipy.signal.butter设计滤波器,并生成C代码部署到MCU。
# Python端设计抗混叠滤波器示例
from scipy.signal import butter, filtfilt
import numpy as np
fs = 10000 # 采样率 10kHz
fc = 4000 # 截止频率 4kHz
b, a = butter(4, fc/(fs/2), btype='low')
filtered_signal = filtfilt(b, a, raw_signal)
3.3 去趋势与去噪:还原真实振动特征
核心原理:振动信号中常包含趋势项(直流偏移、缓慢漂移)和噪声成分(白噪声、工频干扰)。趋势项会掩盖低频故障特征,噪声则降低信噪比。去趋势通常采用减去均值或高通滤波(截止频率1~5Hz)实现;去噪则可采用小波变换、中值滤波或带通滤波。
案例拆解:在某电机轴承外圈故障模拟实验中,我们采集了10kHz采样率的振动信号。初始信号包含明显的直流偏置(约1.2V)和50Hz工频干扰。处理流程如下:
- 去趋势:计算信号均值并减去,消除直流分量。
- 去工频:使用50Hz陷波滤波器(带宽±1Hz)消除工频及其谐波。
- 带通滤波:保留500Hz~5000Hz频带,突出轴承故障特征。
处理前后对比:原始信号的信噪比(SNR)为8.5dB,处理后提升至21.3dB,故障特征频率(BPFO=123.5Hz)的幅值从0.02g提升至0.15g,模型可识别性显著增强。
3.4 归一化:统一量纲,加速收敛
核心原理:振动信号的幅值受传感器灵敏度、安装位置、电机负载等因素影响,不同设备间的量纲和幅值范围差异较大。归一化可以消除这些差异,使模型专注于振动形态特征而非绝对幅值。常用的归一化方法包括:
- Min-Max归一化:将数据映射到[0,1]区间,公式为 x' = (x - min) / (max - min)。
- Z-score标准化:使数据均值为0,标准差为1,公式为 x' = (x - μ) / σ。
判断方法:对于TinyML部署,推荐使用Z-score标准化,因为其参数(μ, σ)更稳定,且对异常值不敏感。Min-Max归一化在存在极端峰值时会导致正常数据被压缩到很小的区间。
| 方法 | 适用场景 | 部署复杂度 | 鲁棒性 |
|---|---|---|---|
| Min-Max | 幅值范围已知且稳定 | 低(需存储min/max) | 较差(受异常值影响) |
| Z-score | 幅值波动大、多设备通用 | 低(需存储μ/σ) | 较好 |
| 稳健Z-score | 存在离群点 | 中(需存储中位数/MAD) | 最好 |
3.5 数据分割与标注:构建高质量训练集
核心原理:振动信号是时间序列,不能将连续数据直接输入模型,需要分割成固定长度的窗口。窗口长度应覆盖至少10~20个旋转周期,以保证每个窗口包含完整的故障特征周期。同时,窗口之间通常设置50%重叠,以增加样本数量并保持时间连续性。
操作流程:
- 确定窗口长度 N = fs × T_window,其中 T_window = 10~20 / f_r。
- 设置步长 stride = N / 2(50%重叠)。
- 对每个窗口计算标签:根据采集时的工况记录(转速、负载)和健康状态(正常/异常)进行标注。
- 划分数据集:训练集70%、验证集15%、测试集15%,确保同一电机或同一工况的数据不跨集合,避免数据泄漏。
案例拆解:某项目采集了4台电机的振动数据,每台电机包含正常、轴承外圈故障、内圈故障三种状态。采样率10kHz,电机转速1500RPM(转频25Hz)。窗口长度设为1024点(约0.1秒,覆盖2.5个旋转周期),步长512点。最终生成样本数:每台电机每状态约2000个窗口,总计24000个样本。数据集划分时,将2台电机作为训练集,1台作为验证集,1台作为测试集,确保模型泛化能力。
3.6 预处理流程的TinyML部署优化
在MCU上实现上述预处理时,需考虑算力和内存限制。建议将预处理步骤合并为一次遍历:读取原始数据 → 减去均值(去趋势) → 应用IIR滤波器(去噪) → 执行Z-score归一化 → 存入特征缓冲区。IIR滤波器相比FIR更节省计算量,但需注意数值稳定性,使用级联二阶节(SOS)实现。
// MCU端预处理伪代码
float process_sample(float raw) {
// 去趋势:减去预计算的均值
float detrended = raw - mean_value;
// IIR带通滤波(二阶节)
float filtered = iir_sos_apply(&sos, detrended);
// Z-score归一化
float normalized = (filtered - mu) / sigma;
return normalized;
}
通过将预处理参数(均值、滤波器系数、μ/σ)存储在Flash中,MCU可以在每次推理时快速加载并应用,无需重复计算。对于采样率10kHz、窗口1024点的场景,预处理耗时约2ms(基于Cortex-M4 @ 80MHz),完全满足实时性要求。