4、数据采集与预处理:传感器数据采集方法、采样率与分辨率选择、数据格式与存储、数据清洗基础(去噪、滤波)
TinyML振动检测系统的性能上限,在数据采集与预处理阶段就已经被决定。传感器输出的原始信号质量、采样策略的合理性以及数据清洗的彻底程度,直接决定了后续特征提取、模型训练与边缘推理的可靠性。本章将围绕振动传感器数据从物理世界到数字特征的完整链路,系统讲解采集方法、参数选择、存储规范与清洗技术,帮助你在项目启动阶段就建立正确的数据工程基础。
4.1 传感器数据采集方法:从物理振动到数字信号
振动检测的核心传感器通常采用MEMS加速度计(如ADXL345、MPU6050、LSM6DS3)或压电式加速度计。在TinyML场景下,MEMS器件因其低功耗、小体积、数字接口(I2C/SPI)而成为首选。采集方法的关键在于理解传感器的工作模式与数据输出机制。加速度计输出的是比力(specific force),即传感器感受到的加速度与重力加速度的矢量和。在静态放置时,输出为1g(约9.8m/s²)指向地心;在振动工况下,输出为重力分量与动态振动分量的叠加。
采集方法分为轮询(Polling)与中断驱动(Interrupt-driven)两种。轮询方式简单但浪费CPU资源,适合低频采样(<50Hz);中断驱动方式通过传感器内置的FIFO缓冲区或运动检测中断唤醒MCU,适合高频采样与低功耗场景。对于振动检测,推荐使用FIFO模式:传感器以固定采样率连续采集数据并存入内部FIFO,MCU在FIFO半满或满时一次性读取批量数据,既保证采样均匀性,又降低唤醒频率。
4.2 采样率与分辨率选择:奈奎斯特之外的工程考量
采样率的选择遵循奈奎斯特采样定理:采样率必须大于信号最高频率成分的两倍。但在工程实践中,直接以2倍频率采样会导致频谱混叠边缘效应,且数字滤波器的过渡带需要额外带宽。因此,TinyML振动检测的采样率通常设置为最高关注频率的5~10倍。例如,要分析电机转速为3000RPM(基频50Hz)的振动信号,关注其1倍频到10倍频(50~500Hz),则采样率应设为2.5kHz~5kHz。若使用更高采样率(如10kHz),虽然数据量增大,但能保留更多高频信息,为后续特征提取提供余量。
分辨率(位深)决定了信号的动态范围与最小可分辨变化。12位ADC在±2g量程下的分辨率为4g/4096≈0.98mg;16位ADC在同样量程下分辨率为0.061mg。对于振动异常检测,若需捕捉早期轴承磨损产生的微弱冲击信号(幅值可能仅为正常振动的1%~5%),建议至少使用14位分辨率。同时要注意量程的选择:量程过小会导致削波(Clipping),量程过大会降低小信号分辨率。一般原则是让正常振动幅值占量程的30%~70%。
| 参数 | 低速设备(<1800RPM) | 中速设备(1800-3600RPM) | 高速设备(>3600RPM) |
|---|---|---|---|
| 关注频率范围 | 10~500Hz | 20~1000Hz | 50~5000Hz |
| 推荐采样率 | 2~5kHz | 5~10kHz | 10~25kHz |
| 推荐分辨率 | 12~14位 | 14~16位 | 16位 |
| 典型传感器 | ADXL345(12位) | MPU6050(16位) | LSM6DS3(16位) |
| 数据速率(3轴) | 12~30KB/s | 30~60KB/s | 60~150KB/s |
4.3 数据格式与存储:嵌入式环境下的高效组织
在TinyML振动检测系统中,数据格式的选择直接影响存储效率、传输带宽与后续处理复杂度。常用的数据格式包括:
- CSV(逗号分隔值):适合开发调试阶段,人类可读,但体积大(约比二进制大3~5倍),解析开销高。
- 二进制原始格式:直接将ADC值或浮点值按固定字节序存储,体积最小,解析最快,适合嵌入式端存储与传输。
- JSON:适合云端对接或配置信息,但序列化/反序列化开销大,不适合高频振动数据流。
- HDF5/Parquet:适合离线大数据分析,但嵌入式端无法直接使用。
推荐在MCU端使用紧凑二进制格式,并附加轻量级元数据头。一个典型的帧格式如下:
帧头(2字节: 0xAA55) | 时间戳(4字节: uint32 ms) | 通道数(1字节) |
采样率(2字节: uint16 Hz) | 数据区(N×3×2字节: int16三轴) | CRC16(2字节)
存储策略上,建议采用环形缓冲区(Ring Buffer)配合SD卡或Flash分块写入。每块大小建议为4KB~32KB,对齐Flash扇区大小以减少写放大。同时,为每个数据文件添加采集开始时间、设备ID、采样率等元数据,便于后续离线分析时对齐上下文。
pandas.read_csv()或numpy.fromfile()可快速加载两种格式。注意在二进制格式中明确字节序(小端/大端),避免不同平台间解析错误。
4.4 数据清洗基础:去噪、滤波与异常值处理
原始振动信号中通常包含多种噪声与干扰成分:传感器自身的热噪声(白噪声)、电源工频干扰(50/60Hz及其谐波)、安装共振、温度漂移导致的趋势项、以及偶发的尖峰脉冲(如电磁干扰或机械冲击)。数据清洗的目标是在保留有效振动特征的前提下,最大程度抑制这些干扰。
去均值与去趋势:MEMS加速度计输出包含重力分量,导致信号存在较大的直流偏置。首先应减去信号均值,消除直流分量。若信号存在缓慢漂移(如温度变化引起),需进行去趋势处理,常用方法包括:一阶差分、高通滤波(截止频率设为0.5~1Hz)或多项式拟合去除。对于旋转机械,高通滤波还能消除转频附近的低频摆动。
滤波策略:根据振动检测目标选择合适的滤波器类型。低通滤波器用于消除高频噪声,截止频率设为最高关注频率的1.5~2倍;带通滤波器用于突出特定频带(如轴承故障特征频率带);陷波滤波器用于消除工频干扰。在TinyML场景下,滤波器实现需考虑计算开销:IIR滤波器(如Butterworth)阶数低、计算量小,但存在相位失真;FIR滤波器线性相位但阶数高。对于离线预处理,推荐使用scipy.signal.butter设计滤波器;对于MCU在线处理,可使用一阶或二阶IIR滤波器级联。
# Python离线预处理示例
import numpy as np
from scipy import signal
def preprocess_vibration(data, fs, cutoff_low=0.5, cutoff_high=500):
# 去均值
data = data - np.mean(data, axis=0)
# 设计带通滤波器(4阶Butterworth)
b, a = signal.butter(4, [cutoff_low, cutoff_high], btype='bandpass', fs=fs)
# 零相位滤波(filtfilt避免相位偏移)
filtered = signal.filtfilt(b, a, data, axis=0)
return filtered
异常值剔除:振动信号中的尖峰脉冲(Spike)会严重干扰特征提取。常用的检测方法包括:基于绝对阈值的截断(超过±5σ视为异常)、基于中值绝对偏差(MAD)的鲁棒检测、以及基于滑动窗口的局部异常因子检测。对于TinyML场景,推荐使用简单的Hampel滤波器:在滑动窗口内计算中位数与标准差,若中心点偏离中位数超过3倍MAD,则用中位数替换。
4.5 常见误区与总结复盘
在数据采集与预处理环节,工程师常犯以下错误:
- 误区一:采样率刚好设为2倍最高频率。这会导致抗混叠滤波器设计困难,且实际信号在截止频率附近衰减严重。应留出至少2~3倍的过渡带余量。
- 误区二:忽略抗混叠滤波。即使采样率足够高,若传感器或ADC前端存在高于奈奎斯特频率的噪声,仍会混叠到低频段。务必在采样前加入硬件RC低通滤波器或使用传感器内置的抗混叠功能。
- 误区三:对所有数据统一使用固定阈值清洗。不同工况(启停、稳态、负载变化)下振动幅值差异巨大,固定阈值会误删有效信号或漏掉异常。应根据工况分段设置自适应阈值。
- 误区四:滤波过度导致特征失真。过度滤波会平滑掉冲击特征(如轴承故障的周期性冲击),使峰值因子、峭度等敏感指标失效。滤波参数需结合故障机理验证。
总结复盘:数据采集与预处理是TinyML振动检测系统的地基。正确的做法是:首先明确故障特征频率范围,据此确定采样率与滤波器参数;其次选择合适的传感器量程与分辨率,确保信号不削波且量化噪声可接受;然后设计高效的数据存储格式,兼顾嵌入式资源限制与后续分析便利;最后建立标准化的清洗流程,并针对不同工况验证清洗效果。建议在项目初期就建立数据质量评估指标(如信噪比、有效信号占比、异常点率),并在每次采集后自动生成质量报告,确保进入模型训练的数据集干净、一致、可复现。