4、数据采集与预处理:使用加速度计采集原始数据、数据清洗、去噪、滤波(低通/高通)、归一化方法

TinyML跌倒检测系统的性能上限,在绝大多数情况下并非由模型结构决定,而是由数据质量决定。加速度计输出的原始信号中混杂着重力分量、人体抖动、传感器噪声以及高频电磁干扰,若未经妥善处理直接送入模型,轻则导致误报率飙升,重则使模型完全无法收敛。本章围绕“从物理世界到模型输入”这一关键链路,系统讲解加速度计原始数据的采集规范、清洗策略、滤波方法(低通/高通)以及归一化处理,帮助你在资源受限的MCU上构建稳定可靠的跌倒检测前端。

采集层 清洗层 滤波层 归一化层 加速度计 ADXL345/MPU6050 采样率 50Hz~100Hz 量程 ±4g / ±8g 窗口 2s~3s / 50%重叠 三轴输出 ax, ay, az (g) 缺失值处理 线性插值/丢弃 异常值剔除 3σ准则 / MAD 毛刺修复 中值滤波(窗口=3) 时间戳校准 重采样/对齐 静默段标记 方差阈值判断 低通滤波 截止频率 15~20Hz 高通滤波 截止频率 0.3~0.5Hz 一阶IIR y[n]=α·x[n]+(1-α)·y[n-1] 滑动平均 窗口=5~10点 带通组合 高通+低通串联 Min-Max 映射到[0,1] Z-Score 均值0, 标准差1 单位归一化 除以重力常数g 鲁棒归一化 中位数±IQR 特征缩放 适配INT8量化 数据预处理流水线:从原始三轴信号到模型可用的标准化特征张量

4.1 加速度计原始数据采集:核心原理与工程约束

加速度计基于MEMS(微机电系统)原理,通过检测敏感质量块因加速度产生的位移或电容变化,将物理加速度转换为电信号。在跌倒检测应用中,通常选用三轴加速度计(如ADXL345、MPU6050、LIS3DH),输出沿X、Y、Z三个正交方向的加速度分量,单位为g(1g≈9.8m/s²)。采集环节的核心任务不是简单地“读寄存器”,而是要在采样率、量程、分辨率、功耗与信号保真度之间做出合理权衡。

采样率选择:人体跌倒动作的典型持续时间约为300~500ms,其中冲击峰值出现在跌倒后100~200ms内。根据奈奎斯特采样定理,要捕捉跌倒冲击的瞬态特征,采样率至少应为信号最高频率分量的两倍。人体运动信号的能量主要集中在0.5~20Hz频段,因此50Hz~100Hz的采样率是工程上公认的合理区间。过低的采样率(如20Hz)会丢失冲击峰值细节,导致特征失真;过高的采样率(如500Hz)则显著增加MCU的存储与计算负担,且对跌倒检测精度提升有限。

量程与分辨率:日常活动(走路、坐下、弯腰)的加速度幅值通常在±2g以内,而跌倒瞬间的冲击加速度可达±6g甚至更高。若量程设置过小(如±2g),传感器会饱和削顶,丢失关键峰值信息;若量程设置过大(如±16g),则低幅值信号的分辨率下降。推荐将量程设置为±4g或±8g,配合13位以上的ADC分辨率,既能覆盖跌倒冲击范围,又能保留日常活动的细微差异。

工程经验:在穿戴设备中,加速度计通常安装在胸部、腰部或手腕处。不同佩戴位置对信号特征影响显著——腰部更接近人体质心,信号更稳定;手腕处因手臂摆动引入额外的高频分量。在采集数据时,应固定佩戴位置并记录元数据(位置、方向、设备型号),以便后续模型训练时进行对齐或数据增强。

4.2 数据清洗:剔除异常与修复缺失

原始加速度数据在采集过程中不可避免地混入异常值、缺失值和瞬时毛刺。数据清洗的目标是保证输入模型的每个样本都是“干净”的物理信号,避免异常样本干扰模型训练或导致推理误判。

缺失值处理:在无线传输或SD卡写入过程中,可能出现数据包丢失或时间戳跳变。对于短时间缺失(1~3个采样点),可采用线性插值法修复:

// 线性插值修复缺失点
// 假设第i个采样点缺失,前后有效值为x[i-1]和x[i+1]
x[i] = (x[i-1] + x[i+1]) / 2.0f;

// 若连续缺失超过5个点,建议丢弃该窗口数据
if (missing_count > 5) {
    discard_window();
}

异常值剔除:传感器偶发故障或电磁干扰会产生远超物理极限的尖峰(如加速度值突然跳变到±20g)。常用的检测方法是3σ准则——计算窗口内数据的均值μ和标准差σ,若某采样点与均值的偏差超过3σ,则判定为异常值。更稳健的方法是使用MAD(中位数偏差)法,它对离群点不敏感:

// MAD异常值检测
median = median_of_window(data);
mad = median(|data[i] - median|);
threshold = 3.0 * 1.4826 * mad;  // 1.4826为MAD与σ的换算系数
if (|data[i] - median| > threshold) {
    data[i] = median;  // 用中位数替换
}

毛刺修复:对于单点突变的毛刺信号,中值滤波(窗口大小=3)是最高效的修复手段。中值滤波在去除脉冲噪声的同时能较好地保留信号边缘,适合处理加速度信号中的瞬时跳变。

清洗方法 适用场景 计算开销 MCU实现建议
线性插值 短时缺失(≤3点) 极低 定点运算即可
3σ准则 高斯分布数据 低 需维护滑动窗口统计量
MAD法 含离群点的非高斯数据 中 需排序,适合离线处理
中值滤波 单点毛刺/脉冲噪声 低 窗口=3时仅需比较3个值

4.3 滤波处理:低通与高通的协同应用

滤波是加速度信号预处理中最关键的一环。加速度信号中,重力分量是缓变的直流偏置(约0Hz),人体主动运动(走路、挥手)集中在0.5~5Hz,跌倒冲击则分布在5~20Hz,而传感器噪声和电磁干扰通常在20Hz以上。单一滤波器无法同时满足所有需求,工程上常采用低通与高通组合的方式。

低通滤波:用于去除高频噪声和振动伪迹。一阶IIR低通滤波器因其计算量小、适合MCU实时处理而被广泛采用:

// 一阶IIR低通滤波器
// 截止频率 fc = 15Hz, 采样率 fs = 50Hz
// α = 1 / (1 + 2π·fc/fs) ≈ 0.16
float lowpass(float x, float prev_y) {
    float alpha = 0.16f;
    return alpha * x + (1.0f - alpha) * prev_y;
}

// 实际使用中,α需根据采样率动态计算
// α = 1 / (1 + 2π * fc / fs)

高通滤波:用于去除重力分量和极低频漂移。跌倒检测中,重力分量会掩盖冲击信号的真实幅值,因此需要通过高通滤波将直流偏置去除。一阶高通滤波器的递推公式为:

// 一阶IIR高通滤波器
// 截止频率 fc = 0.3Hz, 采样率 fs = 50Hz
// α = 1 / (1 + 2π·fc/fs) ≈ 0.96
float highpass(float x, float prev_x, float prev_y) {
    float alpha = 0.96f;
    return alpha * (prev_y + x - prev_x);
}

带通组合策略:在跌倒检测中,通常先对原始信号进行高通滤波(去除重力),再对高通输出进行低通滤波(去除高频噪声),形成带通效果。这种组合能保留0.3~20Hz频段内的有效运动信息,同时消除直流偏置和高频干扰。需要注意的是,级联滤波器会引入相位延迟,在窗口特征提取时应考虑延迟补偿。

风险提示:滤波器的截止频率设置不当会带来严重后果。若低通截止频率过低(如5Hz),会滤除跌倒冲击的高频分量,导致冲击峰值被严重衰减,模型无法区分“跌倒”与“快速坐下”;若高通截止频率过高(如2Hz),会滤除正常的肢体运动信号,使模型丢失姿态变化信息。建议在部署前使用真实跌倒数据验证滤波参数。

4.4 归一化方法:让模型输入标准化

归一化的目的是消除不同轴之间量纲差异和幅值差异,使模型训练更加稳定、收敛更快。在TinyML场景下,归一化还能帮助模型适配INT8量化,减少精度损失。

Min-Max归一化:将数据线性映射到[0,1]区间。适用于已知数据边界且分布相对均匀的场景:

// Min-Max归一化
float min_val = -4.0f;  // 对应±4g量程
float max_val = 4.0f;
float normalized = (raw_value - min_val) / (max_val - min_val);

Z-Score归一化:将数据转换为均值为0、标准差为1的标准正态分布。适用于数据分布近似高斯且存在离群点的场景。在MCU上实现时,需要预先统计训练集的均值和标准差,作为常量存储:

// Z-Score归一化(使用预计算的统计量)
float mean = 0.02f;    // 训练集均值
float std = 1.15f;     // 训练集标准差
float normalized = (raw_value - mean) / std;

单位归一化(除以g):由于加速度计输出本身以g为单位,直接除以1.0g即可将数值映射到物理意义明确的范围内(如±4g对应[-4,4])。这种方法简单直观,且不依赖训练集统计量,适合MCU上的实时推理。

鲁棒归一化:使用中位数和四分位距(IQR)代替均值和标准差,对离群点不敏感。适合数据中存在大量异常尖峰的场景,但计算开销较大,通常用于离线训练阶段。

归一化方法 公式 优点 缺点 MCU适用性
Min-Max (x-min)/(max-min) 实现简单,边界明确 对离群点敏感 高(需预存min/max)
Z-Score (x-μ)/σ 适合高斯分布 需预存μ和σ 高
除以g x/1.0g 物理意义明确,无需统计量 未消除幅值差异 极高
鲁棒归一化 (x-median)/IQR 抗离群点 计算复杂 低(离线用)

4.5 实战案例:基于ADXL345的跌倒检测数据预处理闭环

某智能手环项目需要实现跌倒检测功能,硬件平台为Cortex-M4 MCU(主频80MHz),加速度计采用ADXL345(I2C接口,量程±8g,13位分辨率),采样率设定为50Hz。项目初期模型误报率高达30%,经排查发现数据预处理链路存在多个问题。

初始现象与诊断:模型在实验室测试中准确率尚可,但在真实场景中频繁将“快速坐下”和“弯腰捡物”误判为跌倒。通过分析原始波形发现:①原始信号中重力分量未去除,导致特征提取时冲击幅值被直流偏置掩盖;②传感器高频噪声(>20Hz)未被滤除,干扰了峰值检测;③不同佩戴者因体型差异,信号幅值范围不同,未归一化导致模型泛化能力差。

优化方案与实施步骤:

  1. 调整采样与量程:将量程从±4g调整为±8g,避免跌倒冲击时饱和削顶;采样率保持50Hz,满足奈奎斯特要求。
  2. 增加高通滤波:在原始信号上应用截止频率为0.3Hz的一阶IIR高通滤波器,有效去除重力分量。实测滤波后,静止状态下三轴输出接近0g,而非之前的1g(Z轴)。
  3. 级联低通滤波:在高通输出后串联截止频率为15Hz的低通滤波器,消除高频振动噪声。滤波后信号波形明显平滑,冲击峰值更加突出。
  4. 采用除以g的归一化:由于ADXL345输出已按量程归一化(-1.0~1.0对应±8g),直接乘以8即可得到以g为单位的物理值。归一化后,不同佩戴者的信号幅值范围统一到[-8,8]g,模型输入分布更加稳定。
  5. 窗口内二次清洗:在2秒滑动窗口内,计算三轴合加速度的均值和标准差,若标准差小于0.05g则判定为静默段,标记为“无活动”状态,不送入模型推理,减少无效计算。

结果对比与复盘:优化后,模型误报率从30%降至4.2%,召回率保持在95%以上。关键改进点在于高通滤波去除重力分量——这一步骤使特征提取器能够准确捕捉跌倒冲击的净加速度变化。此外,归一化策略的选择也至关重要:使用除以g的方法而非Min-Max,避免了因个别离群点导致的边界漂移问题。

案例启示:数据预处理不是“锦上添花”,而是TinyML模型性能的基石。在资源受限的MCU上,应优先选择计算量小、物理意义明确的预处理方法(如IIR滤波、除以g归一化),避免使用需要复杂统计计算的方案。同时,预处理参数(截止频率、归一化边界)必须基于真实场景数据校准,不能简单套用理论值。

4.6 常见误区与总结复盘

误区一:滤波越强越好。过度滤波会滤除有效信号。例如,将低通截止频率设为5Hz虽然能彻底消除噪声,但也会严重衰减跌倒冲击的峰值特征,导致模型无法区分“跌倒”和“快速坐下”。正确做法是根据信号频谱分析结果,选择能保留目标特征频段的截止频率。

误区二:归一化方法随意选择。Min-Max归一化在数据存在离群点时会导致正常数据被压缩到极小区间,降低模型区分度。在跌倒检测中,由于冲击峰值天然是离群点,使用Min-Max反而会放大噪声。推荐优先使用除以g或Z-Score归一化。

误区三:忽略滤波器的相位延迟。IIR滤波器会引入非线性相位延迟,导致窗口内信号的时间对齐关系被破坏。在提取时序特征(如峰值出现时间)时,必须考虑延迟补偿,否则特征值会偏移。

误区四:清洗和滤波顺序颠倒。应先进行异常值剔除和毛刺修复,再进行滤波。若先滤波,异常值会被滤波器“扩散”到邻近采样点,增加后续清洗难度。

总结:加速度计数据预处理是一个系统工程,采集环节要合理设置采样率和量程,清洗环节要针对缺失、异常、毛刺分别处理,滤波环节要采用高通+低通的组合策略,归一化环节要选择物理意义明确且适合MCU实现的方法。每一步都直接影响模型性能,建议在项目初期就建立标准化的预处理流水线,并用真实场景数据反复验证参数。