4、传感器数据采集与预处理:采样率选择、数据清洗、归一化、滑动窗口与特征提取

在Edge AI传感器异常检测系统中,数据采集与预处理是决定模型性能与延迟预算的第一道关口。传感器原始信号中混杂着噪声、缺失值与量纲差异,若未经妥善处理直接送入模型,不仅会拉高推理延迟(因无效数据增加计算量),还会导致误报率上升。本章围绕采样率选择、数据清洗、归一化、滑动窗口与特征提取五个核心环节,讲解如何在资源受限的MCU/DSP上,以最小延迟代价获取最具判别力的特征向量。

传感器数据采集与预处理流水线 采样率选择 Nyquist定理 带宽/功耗权衡 数据清洗 缺失值/异常值 滤波去噪 归一化 Min-Max / Z-score 定点化映射 滑动窗口 窗口长度/步长 重叠率优化 特征 提取 时域/频域 延迟预算分配(典型值,总预算 10ms) 采样+清洗 1.5ms | 归一化 0.5ms | 窗口缓冲 2.0ms | 特征提取 3.0ms | 推理 3.0ms 关键权衡 • 高采样率 → 信息完整但功耗↑、计算量↑ • 长窗口 → 频率分辨率↑但响应延迟↑ • 高重叠率 → 特征平滑但重复计算↑ • 特征维度↑ → 精度↑但内存/延迟↑ Edge AI 约束 • MCU 主频 80-240MHz,RAM 16-512KB • 无浮点单元 → 需定点化/查表 • 实时性要求 → 预处理需O(n)或O(n log n) • 功耗预算 → 采样率与唤醒策略联动

4.1 采样率选择:从Nyquist到工程折中

核心原理:采样率决定了信号中可保留的最高频率分量。根据Nyquist-Shannon采样定理,采样率需大于信号最高频率的2倍才能无混叠重建。但在Edge AI场景中,采样率并非越高越好——高采样率意味着单位时间内处理的数据量线性增长,直接推高ADC功耗、DMA传输带宽和后续特征提取的计算量。对于振动传感器(如加速度计),典型故障特征频率集中在几十Hz到几kHz;对于电流传感器,工频50Hz及其谐波(最高可达数kHz)是主要关注对象。

工程判断方法:选择采样率需遵循以下步骤:

  1. 确定信号带宽:通过频谱分析或先验知识,找出故障特征的最高有效频率 fmax。例如,轴承外圈故障特征频率 fo = 0.4×n×fr(n为滚动体数,fr为转频),若 fr=30Hz、n=9,则 fo=108Hz,考虑其3倍谐波,fmax≈324Hz。
  2. 计算理论最低采样率:fs ≥ 2×fmax,实际工程中取3-5倍裕量,即 fs = (3~5)×fmax。
  3. 匹配硬件能力:检查MCU的ADC采样率上限、DMA带宽、存储空间。例如,STM32F4系列ADC最高6.6Msps,但实际连续采样受限于DMA和内存。
  4. 功耗与延迟折中:若系统由电池供电,每增加1kHz采样率,ADC功耗约增加0.5-2mW。此时可考虑自适应采样——在设备空闲时降低采样率,检测到异常征兆时切换高采样率。
经验提醒:在Edge AI项目中,不要盲目追求高采样率。一个实用的做法是:先用高采样率(如10kHz)离线采集数据,分析频谱确定有效带宽后,再在嵌入式端降采样至2-4kHz。这样既保证特征完整,又降低实时处理压力。

4.2 数据清洗:剔除噪声与异常值

核心原理:传感器数据在采集过程中会混入多种噪声:电源纹波(50Hz/100Hz)、电磁干扰(高频尖峰)、机械振动耦合、传感器自身热噪声等。此外,ADC可能产生偶发的野值(spike)或丢数。数据清洗的目标是在不损伤真实信号特征的前提下,最大程度去除这些干扰。清洗操作必须放在归一化之前,因为异常值会扭曲归一化的统计参数(如均值和方差)。

操作流程:

  • 缺失值处理:对于ADC丢数,采用线性插值或前值保持。若连续丢数超过3个,建议丢弃该窗口数据并标记。
  • 野值剔除:使用Hampel滤波器——计算滑动窗口内的中位数和MAD(绝对中位差),若当前值偏离中位数超过3×1.4826×MAD,则用中位数替换。
  • 低通滤波:根据采样率设计截止频率为 fmax×1.5 的IIR滤波器(如Butterworth二阶),或更节省算力的移动平均滤波(窗口长度N=5~15)。
  • 工频陷波:若存在50Hz干扰,使用二阶IIR陷波器,Q值设为10-30,避免过度展宽。
// Hampel滤波器伪代码(C语言风格)
#define WIN_SIZE 7
#define N_SIGMA 3.0
float hampel_filter(float x, float buffer[WIN_SIZE]) {
    // 将x移入环形缓冲区
    memmove(&buffer[1], &buffer[0], (WIN_SIZE-1)*sizeof(float));
    buffer[0] = x;
    // 计算中位数
    float sorted[WIN_SIZE];
    memcpy(sorted, buffer, sizeof(sorted));
    qsort(sorted, WIN_SIZE, sizeof(float), cmp);
    float median = sorted[WIN_SIZE/2];
    // 计算MAD
    for (int i=0; i<WIN_SIZE; i++) sorted[i] = fabsf(buffer[i]-median);
    qsort(sorted, WIN_SIZE, sizeof(float), cmp);
    float mad = sorted[WIN_SIZE/2];
    // 判断并替换
    float threshold = N_SIGMA * 1.4826 * mad;
    return (fabsf(x - median) > threshold) ? median : x;
}
风险提示:滤波会引入相位延迟,对于需要实时响应的异常检测(如碰撞检测),IIR滤波器的相位失真可能导致检测延迟增加。此时应优先选择FIR滤波器(线性相位)或使用零相位滤波(但会增加延迟)。务必在滤波延迟与检测实时性之间做明确权衡。

4.3 归一化:消除量纲差异与适配定点运算

核心原理:不同传感器通道的量纲和幅值范围差异巨大——加速度计输出±2g(约±2000mV),温度传感器输出0-3.3V,电流传感器输出0-5A。若不归一化,特征提取时幅值大的通道会主导距离计算,导致模型偏向。同时,Edge设备上的MCU通常没有FPU(浮点单元),归一化后的数据映射到定点数(如int16或Q15格式)可大幅加速计算。

归一化方法对比:

方法公式适用场景Edge端实现代价
Min-Maxx' = (x - min) / (max - min)已知信号范围,如加速度±2g需存储min/max,除法可用移位近似
Z-scorex' = (x - μ) / σ信号分布未知,存在异常值需在线计算μ/σ,浮点除法
Robust Scalingx' = (x - median) / IQR存在野值,需抗干扰需维护中位数和四分位数,内存开销大
定点映射x' = round(x × 2^N)MCU无FPU,需Q格式仅需移位和乘法,最快

实战建议:在Edge AI中,推荐离线计算归一化参数,在线仅做线性映射。即在开发阶段用采集的数据集计算min/max或μ/σ,固化为常量,运行时只需执行一次乘加操作。例如,将加速度计输出映射到int16范围[-32768, 32767]:

// 离线计算:min=-2.0g, max=2.0g
#define ACC_MIN (-2.0f)
#define ACC_MAX (2.0f)
#define ACC_SCALE (65535.0f / (ACC_MAX - ACC_MIN))
#define ACC_OFFSET (-ACC_MIN * ACC_SCALE - 32768.0f)

int16_t acc_norm(float raw_g) {
    return (int16_t)(raw_g * ACC_SCALE + ACC_OFFSET);
}

4.4 滑动窗口:平衡时间分辨率与计算开销

核心原理:异常检测需要基于一段时间内的信号片段(窗口)提取特征,而非单点判断。滑动窗口以固定步长在时间轴上移动,每次生成一个数据帧送入特征提取模块。窗口长度W和步长S直接决定:频率分辨率(Δf = fs/W)、检测延迟(约等于S/fs + 处理时间)、计算量(每步处理W个样本)。

参数选择方法:

  1. 窗口长度W:至少包含3-5个完整故障特征周期。例如,轴承故障特征频率为108Hz,采样率2kHz,则周期T=9.26ms,W应≥46ms,取W=64ms(128个采样点)。
  2. 步长S:决定检测延迟。若系统要求100ms内响应,则S ≤ 100ms×fs - W。通常取S = W/4(75%重叠)或W/2(50%重叠)。重叠率越高,特征序列越平滑,但计算量线性增加。
  3. 内存约束:窗口数据需在RAM中缓存。W=128点×2字节×3轴=768字节,对于典型MCU(RAM≥16KB)可接受。若窗口过长,可考虑DMA双缓冲或分段处理。
案例拆解:电机轴承故障检测的窗口参数设计
背景:某工业电机转速3000rpm(50Hz),加速度计采样率4kHz,MCU为Cortex-M4(168MHz),RAM 64KB。目标:在200ms内检测出轴承外圈故障。
分析:外圈故障特征频率 fo = 0.4×9×50 = 180Hz,周期5.56ms。取窗口包含5个周期 → W=27.8ms,向上取整为32ms(128点)。步长取W/4=8ms(32点),则检测延迟=8ms+处理时间。特征提取采用FFT(128点)+时域统计,总处理时间约3ms,满足200ms要求。
结果:实际部署后,误报率从15%降至2%,检测延迟实测45ms(含通信开销)。复盘发现,窗口重叠率从50%提升至75%后,特征方差降低30%,但CPU占用率从22%升至35%,仍在预算内。

4.5 特征提取:从原始信号到判别向量

核心原理:特征提取将窗口内的原始样本压缩为低维向量,减少模型输入维度,同时增强判别力。Edge AI场景下,特征提取需满足:计算简单(避免复杂变换)、物理可解释(便于调参)、存储友好(特征维度≤32)。

常用特征分类:

类别特征计算复杂度适用场景
时域均值、方差、峰值、峰峰值、RMSO(n)幅值变化明显的故障(如松动)
时域峭度、偏度、波形因子、峰值因子O(n)冲击类故障(如轴承点蚀)
频域FFT频谱峰值、频谱质心、谱能量O(n log n)周期性故障(如齿轮断齿)
时频小波包能量(需DWT)O(n)非平稳信号(如变转速工况)

Edge端优化策略:

  • 避免完整FFT:若只需特定频段的能量,使用Goertzel算法(O(n))计算单频点幅值。
  • 递推计算:均值、方差等统计量可利用滑动窗口的重叠特性,用递推公式更新,避免每步全量重算。例如,窗口均值 μk = μk-1 + (xnew - xold)/W。
  • 定点FFT:使用CMSIS-DSP库的Q15格式FFT,比浮点快3-5倍。
  • 特征选择:通过离线训练时的特征重要性排序(如随机森林的feature importance),只保留Top-8特征,减少计算量。
常见误区:不要将所有可用特征全部提取。特征维度越高,不仅计算延迟增加,还可能导致“维度灾难”——模型过拟合、泛化能力下降。一个典型的反面案例是:某团队提取了24维特征(含6个频段能量、8个时域统计、10个谱形状指标),导致模型训练时间增加3倍,且推理延迟超出预算2ms。经特征选择后仅保留8维,精度反而提升1.2%。

4.6 预处理链路延迟预算核算

在Edge AI系统中,预处理环节的延迟必须纳入整体预算。以一个典型的三轴加速度计异常检测任务为例,假设采样率2kHz,窗口128点,步长32点,MCU主频168MHz:

环节操作计算量延迟(μs)
数据采集ADC+DMA传输(3通道×128点)384次采样192(DMA后台)
数据清洗Hampel滤波(3×128点)1152次比较+排序~80
归一化定点映射(3×128点)384次乘加~15
特征提取时域统计+128点FFT×3轴3×FFT+统计~450(CMSIS-DSP)
合计--~737μs

上述链路总延迟约0.74ms,加上模型推理(假设2ms),总延迟约2.74ms,远小于10ms预算。若采样率提升至8kHz,FFT点数增至512点,特征提取延迟将升至约2.1ms,总延迟接近4ms,仍可接受。但若窗口长度增至512点,内存占用将达3KB,且FFT延迟增至8ms,此时需考虑分帧处理或降低重叠率。

复盘总结:预处理环节的延迟优化应遵循“先算后采”原则——在开发阶段用离线数据验证每个环节的延迟和精度影响,确定最优参数组合后再固化到固件中。同时,建议在代码中埋入性能计数器(如DWT->CYCCNT),实时监测各环节耗时,便于现场调优。