4、数据采集与预处理:传感器数据采集方法、数据清洗、归一化、滑动窗口、特征提取(如均值、方差、FFT)
TinyML边缘告警应用的核心挑战在于:如何在资源极度受限的微控制器(MCU)上,从原始传感器流中提取出足以支撑可靠告警决策的信息。传感器数据在进入模型推理之前,必须经过一条严谨的预处理流水线。本章将系统拆解这条流水线的五个关键环节——采集、清洗、归一化、滑动窗口与特征提取,并给出在C/C++与嵌入式环境下的落地方法。下图展示了从物理信号到模型输入张量的完整数据流转路径,以及各环节的输入输出关系。
4.1 传感器数据采集方法
核心原理:数据采集是预处理流水线的起点,其质量直接决定后续所有环节的有效性。在TinyML边缘告警场景中,传感器类型通常包括加速度计(振动告警)、麦克风(异常声音告警)、PIR(人体入侵告警)等。采集过程涉及三个关键参数:采样率(Nyquist定理决定上限)、分辨率(ADC位数决定量化精度)和通道数(多轴或多麦克风阵列)。MCU端通常利用定时器触发ADC转换,并通过DMA(直接内存访问)将数据搬运至内存环形缓冲区,避免CPU干预造成采样抖动。
操作流程:
- 确定采样率:根据信号最高频率成分,按Nyquist定理设置采样率至少为信号最高频率的2倍。例如,振动告警关注50Hz~1kHz频段,采样率应≥2kHz;语音告警关注300Hz~3.4kHz,采样率应≥8kHz。
- 配置ADC与DMA:在STM32、ESP32或RP2040等平台上,配置ADC为连续转换模式,DMA以循环模式将结果写入预分配的缓冲区。
- 时间戳同步:在DMA中断或定时器溢出中断中记录采样计数,确保每个样本关联精确时间戳,便于后续滑动窗口对齐。
- 多通道交替采样:对于三轴加速度计,需配置ADC扫描模式或使用SPI/I2C接口读取,确保三轴数据在时间上对齐。
// 使用I2C接口读取MPU6050,定时器中断触发读取
void timer_isr(void) {
uint8_t data[6];
mpu6050_read_accel(data); // 读取X/Y/Z轴原始值
ring_buffer_push(accel_x, (int16_t)(data[0]<<8 | data[1]));
ring_buffer_push(accel_y, (int16_t)(data[2]<<8 | data[3]));
ring_buffer_push(accel_z, (int16_t)(data[4]<<8 | data[5]));
sample_count++;
}
// 定时器配置:100Hz,优先级高,禁止被其他中断打断
4.2 数据清洗:去噪与异常值处理
核心原理:原始传感器数据不可避免地包含噪声、尖峰和直流偏置。噪声来源包括电源纹波、机械振动耦合、电磁干扰等。数据清洗的目标是保留与告警事件相关的信号成分,抑制无关干扰。常用方法包括:中值滤波(有效去除脉冲噪声)、一阶低通滤波(衰减高频噪声)、去直流偏置(消除重力分量或麦克风静音电平)。
判断方法:选择滤波策略需根据信号特征和计算开销权衡。中值滤波窗口大小通常取3~5个样本,计算量小且不引入相位延迟;低通滤波的截止频率应高于告警信号最高频率,低于噪声主频。对于MCU实现,推荐使用整数运算的IIR滤波器(如一阶巴特沃斯),避免浮点运算开销。
| 清洗方法 | 适用场景 | 计算开销 | 延迟影响 | MCU实现建议 |
|---|---|---|---|---|
| 中值滤波(窗口=3) | 脉冲噪声、传感器毛刺 | 低(3次比较) | 无相位延迟 | 适合所有MCU |
| 一阶低通IIR | 高频噪声、电源纹波 | 极低(2次乘加) | 引入相位滞后 | 系数用Q15定点 |
| 去直流偏置 | 加速度计重力分量、麦克风偏置 | 极低(减法) | 无 | 用滑动平均估计偏置 |
| 限幅滤波 | 明显异常值(超出物理范围) | 极低(比较) | 无 | 设定合理阈值 |
4.3 归一化:统一特征尺度
核心原理:不同传感器通道的量纲和数值范围差异巨大(如加速度计输出±2g对应±16384 LSB,麦克风输出±1V对应±4096 LSB)。归一化将所有特征映射到统一尺度,避免数值范围大的特征在模型训练中主导梯度更新。两种主流方法:Min-Max归一化将数据线性映射到[0,1]或[-1,1];Z-Score标准化使数据均值为0、标准差为1。
操作流程:
- Min-Max归一化:需要预先知道或动态估计数据的最小值和最大值。在边缘设备上,可在设备启动后的校准阶段采集一段“正常”数据,统计min/max并存储于Flash。公式:
x_norm = (x - x_min) / (x_max - x_min)。 - Z-Score标准化:需要估计均值和标准差。适用于数据分布近似高斯的情况。公式:
x_std = (x - μ) / σ。在MCU上,μ和σ可预先在PC端离线计算并固化为常量。 - 定点化处理:为避免浮点运算,可将归一化参数转换为Q格式定点数。例如,将缩放因子
1/(x_max-x_min)乘以2^15后存储为int16_t,推理时用乘法+移位实现。
4.4 滑动窗口:构建时间上下文
核心原理:单个传感器样本无法反映事件的时间演化模式(如振动从弱到强的过程、声音的时序模式)。滑动窗口将连续N个样本组成一个帧,作为模型的一次输入。窗口长度决定了模型感知的时间跨度,步长(hop)控制相邻窗口的重叠程度。对于告警应用,窗口长度应覆盖一个完整事件的最小持续时间,步长通常设为窗口的25%~50%以保证时间分辨率。
判断方法:窗口长度选择需权衡:窗口过短→特征不稳定,易受噪声干扰;窗口过长→响应延迟增大,且MCU内存占用增加。例如,对于持续时间约200ms的异常声音事件,采样率8kHz下窗口长度取1600样本(200ms),步长800样本(100ms),内存占用约3.2KB(int16_t)。
// 环形缓冲区实现滑动窗口(C语言伪代码)
#define WINDOW_SIZE 1600
#define HOP_SIZE 800
int16_t buffer[WINDOW_SIZE];
uint16_t write_idx = 0;
void process_sample(int16_t sample) {
buffer[write_idx] = sample;
write_idx = (write_idx + 1) % WINDOW_SIZE;
// 每累积HOP_SIZE个新样本,触发一次特征提取
static uint16_t since_last_hop = 0;
if (++since_last_hop >= HOP_SIZE) {
since_last_hop = 0;
extract_features_from_buffer(buffer, WINDOW_SIZE);
}
}
4.5 特征提取:从原始信号到判别信息
核心原理:特征提取将高维原始波形压缩为低维判别向量,降低模型输入维度,减少计算量和过拟合风险。时域特征计算简单、物理意义明确;频域特征(通过FFT获得)能揭示信号的周期性成分,对旋转机械故障、特定频率声音等告警尤为有效。
常用特征清单:
| 特征类别 | 特征名称 | 计算公式 | 告警应用示例 |
|---|---|---|---|
| 时域 | 均值 | μ = (1/N)Σxi | 检测直流偏置变化(如设备倾斜) |
| 方差 | σ² = (1/N)Σ(xi-μ)² | 振动能量水平,异常振动时显著增大 | |
| 峰峰值 | max(x) - min(x) | 冲击事件检测 | |
| 过零率 | ZCR = (1/N)Σ|sign(xi)-sign(xi-1)| | 区分周期性振动与随机噪声 | |
| 频域 | FFT幅度谱峰值 | max|X[k]| | 旋转机械的基频及其谐波 |
| 频谱质心 | SC = Σ(k·|X[k]|)/Σ|X[k]| | 声音的明亮度变化 | |
| 频带能量比 | Eband/Etotal | 特定频段能量异常升高(如轴承故障) |
FFT在MCU上的实现要点:对于窗口长度N=256或512,可使用基-2时间抽取FFT算法。ARM Cortex-M系列可调用CMSIS-DSP库的arm_rfft_q15或arm_rfft_f32函数,计算256点实数FFT仅需约0.1ms(Cortex-M4 @ 80MHz)。注意FFT输入需加窗函数(如汉宁窗)以减少频谱泄漏。
背景与约束:某工厂在电机轴承座上部署TinyML节点(STM32L4+ADXL345),要求检测轴承早期磨损。采样率800Hz,窗口长度256点(320ms),步长128点。MCU仅有64KB RAM,需在2ms内完成特征提取。
初始现象:正常运行时振动频谱在50Hz(电机转频)处有峰值;轴承磨损后,在200Hz~400Hz频段出现边带能量上升。
关键参数:窗口256点,FFT后得到128个频点。提取特征:①50Hz处幅度;②200-400Hz频带能量比;③时域方差;④过零率。共4维特征向量。
分析判断过程:通过对比正常与故障样本,发现频带能量比从0.05升至0.23,方差从120升至890,过零率从0.12升至0.31。这些特征组合可有效区分两种状态。
实际操作步骤:①DMA采集256点数据;②中值滤波(窗口3)去除毛刺;③去直流偏置(减去均值);④加汉宁窗;⑤调用arm_rfft_f32计算FFT;⑥计算4维特征;⑦送入决策树模型(深度3)进行推理。
结果对比:使用原始波形直接训练CNN(输入256点)准确率91%,但RAM占用8KB、推理时间5.2ms;使用4维特征+决策树准确率89%,RAM占用仅0.5KB、推理时间0.3ms。在MCU上后者更具实用性。
风险与代价:特征提取可能丢失相位信息,对于某些依赖相位特征的告警(如双通道声源定位)不适用。需根据具体告警类型评估特征集是否充分。
复盘经验:特征设计应结合物理机理分析,而非盲目堆砌。与设备工程师沟通确认故障频率范围,能显著提升特征有效性。
4.6 常见误区与总结复盘
误区一:采样率越高越好。高采样率导致数据量激增,MCU存储和计算压力增大,且高频噪声可能淹没低频告警特征。应根据信号带宽合理选择采样率,并前置模拟低通滤波器(抗混叠)。
误区二:归一化参数在训练集上计算后直接用于设备。训练数据与部署环境的数据分布可能存在差异(如不同安装位置、不同环境温度)。建议在设备端设计轻量校准流程,定期更新归一化参数。
误区三:滑动窗口重叠越多越好。高重叠率虽然提升时间分辨率,但导致相邻窗口特征高度相关,增加冗余计算。50%重叠通常已足够,且能保证事件至少完整落入一个窗口。
误区四:FFT点数越多频率分辨率越高。频率分辨率Δf = fs/N,增大N确实提高分辨率,但窗口时间变长,可能超出事件的平稳性假设。对于非平稳信号,过长的窗口反而模糊了事件的时间边界。
总结:数据采集与预处理是TinyML告警系统中最具工程挑战的环节。建议遵循以下设计原则:①从告警事件的物理机理出发确定采样率和窗口长度;②清洗环节保持最小干预,避免破坏瞬态特征;③归一化参数在目标设备上校准;④特征选择优先考虑计算简单、物理可解释的时域特征,必要时辅以FFT频域特征;⑤在PC端用Python/NumPy完成算法原型验证,再移植到MCU并做定点化优化。整个流水线应在真实部署环境中进行端到端测试,确保从传感器到告警输出的延迟满足应用要求。