4、传感器数据采集与预处理:加速度计和心率传感器的采样率、滤波(低通/带通)、去噪、归一化、滑动窗口分割

TinyML睡眠状态识别系统的第一道关卡,并非模型架构或训练策略,而是传感器数据的质量与形态。加速度计捕捉身体运动引起的微米级位移变化,心率传感器则反映自主神经系统的搏动节律——两者在物理特性、采样频率和噪声来源上截然不同。若未经过严谨的采集配置与预处理流水线,原始信号中的噪声、基线漂移和个体差异将直接污染后续的时序特征,导致模型在实验室精度尚可、部署后却频繁误判。本章聚焦于从传感器原始输出到模型输入张量之间的完整工程链路,涵盖采样率设定原则、滤波器选型与参数设计、去噪策略、归一化方法以及滑动窗口分割机制,并给出可直接落地的参数建议与代码范式。

传感器数据采集与预处理流水线 加速度计 采样率 25~50 Hz 量程 ±2g / ±4g 轴数: X / Y / Z 心率传感器 采样率 25~64 Hz PPG 光电容积脉搏波 HR / HRV / IBI 预处理流水线 ① 缺失值插补 ② 低通/带通滤波 ③ 去噪(中值/小波) ④ 归一化(Min-Max/Z) ⑤ 滑动窗口分割 ⑥ 标签对齐 窗口: 30s / 步长15s 特征工程 时域: 均值/方差/过零率 频域: FFT/功率谱密度 时序: 心率变异性HRV TinyML模型输入 张量形状: (窗口, 通道) 例: (750, 4) @50Hz 量化: int8 / float16 关键设计决策 • 采样率: 睡眠动作频率 < 5Hz,25Hz 满足奈奎斯特,50Hz 留足余量 • 滤波器: 加速度计用 0.5~10Hz 带通,心率用 0.5~5Hz 带通去除运动伪影 • 归一化: 加速度计用 Min-Max 到 [-1,1],心率用 Z-score 消除个体静息差异 • 窗口: 30s 窗口 + 15s 步长,兼顾时序上下文与实时性

上图展示了从双传感器原始信号到模型输入张量的完整数据通路。加速度计与心率传感器在物理层并行采集,经过统一的预处理流水线后,进入特征工程模块,最终形成TinyML模型可消费的紧凑张量。值得注意的是,预处理并非简单的“清洗”,而是根据睡眠状态识别的物理先验进行信号重塑——例如,人体在睡眠中的翻身动作频率通常低于2Hz,而呼吸引起的胸廓运动约0.2~0.5Hz,这些频带知识直接决定了滤波器的截止频率设计。

4.1 采样率设定:平衡信息完整性与资源开销

采样率是传感器数据采集的首要参数,它决定了信号的时间分辨率与数据量。对于睡眠状态识别,采样率的选择需要同时考虑动作频率范围、存储带宽、MCU处理能力以及电池续航。根据奈奎斯特采样定理,采样率必须大于信号最高频率的两倍,但工程上通常取5~10倍以保证波形保真度。

核心原理:人体睡眠中的有效运动信号集中在0.5~5Hz频段。翻身、肢体抽动等宏观动作约1~3Hz,呼吸引起的躯干起伏约0.2~0.5Hz,而心率信号的基频约1~1.7Hz(60~100 BPM),其谐波成分可达5Hz以上。因此,加速度计采样率设为25~50Hz即可完整捕获运动特征;心率传感器(PPG)建议25~64Hz,以保留脉搏波形态用于HRV分析。

实际操作中,采样率并非越高越好。以50Hz、三轴加速度计为例,每秒产生150个浮点数,若以float32存储,每分钟约36KB;若连续采集8小时睡眠数据,总量约17MB——对于TinyML设备常见的2MB Flash而言,这显然不可接受。因此,采样率设定必须与片上存储、无线传输功耗协同设计。

传感器推荐采样率频率范围依据数据量估算(8h)适用场景
加速度计(3轴)25 Hz动作频率≤5Hz,5倍过采样~8.6 MB (float32)低功耗、存储受限
加速度计(3轴)50 Hz动作频率≤5Hz,10倍过采样~17.2 MB需要精细动作识别
心率(PPG)25 HzHR基频~1.7Hz,谐波至5Hz~8.6 MB仅需HR/HRV粗粒度
心率(PPG)64 Hz保留脉搏波形态细节~22 MB需要精确IBI/HRV分析

在资源受限的TinyML设备上,建议采用自适应采样策略:正常睡眠阶段以25Hz采样,当检测到体动事件(加速度幅值超过阈值)时临时提升至50Hz,持续10秒后回落。这种策略在保持事件捕获能力的同时,平均功耗可降低30%~40%。

4.2 滤波与去噪:从信号中剥离噪声与伪影

原始传感器信号包含多种噪声源:电源工频干扰(50/60Hz)、人体运动伪影、传感器自身热噪声、以及接触不良引起的尖峰脉冲。滤波的目标是保留与睡眠状态相关的频带成分,同时抑制无关噪声。

4.2.1 加速度计滤波:带通滤波提取运动特征

加速度计的原始输出包含重力分量(DC)和动态运动分量(AC)。重力分量在睡眠中基本恒定,但会随睡姿变化而改变方向,因此不能简单高通滤除。推荐使用0.5~10Hz带通滤波器:下限0.5Hz用于去除缓慢基线漂移和呼吸引起的低频晃动,上限10Hz用于抑制高频抖动和电磁干扰。对于MCU实现,二阶巴特沃斯IIR滤波器即可满足需求,计算量小且相位失真可接受。

// 二阶IIR带通滤波器系数示例 (采样率50Hz, 0.5~10Hz)
// 使用Python scipy.signal.butter计算得到
float b[3] = {0.0201f, 0.0f, -0.0201f};  // 分子系数
float a[3] = {1.0f, -1.561f, 0.6414f};   // 分母系数
float x_history[2] = {0};
float y_history[2] = {0};

float bandpass_filter(float input) {
    float output = b[0]*input + b[1]*x_history[0] + b[2]*x_history[1]
                   - a[1]*y_history[0] - a[2]*y_history[1];
    x_history[1] = x_history[0];
    x_history[0] = input;
    y_history[1] = y_history[0];
    y_history[0] = output;
    return output;
}

4.2.2 心率信号去噪:运动伪影消除

PPG心率传感器对运动极为敏感——当肢体移动时,血液容积变化信号被叠加了大幅度的运动伪影,其幅值可达真实脉搏信号的数倍。单纯的低通滤波无法有效去除这类伪影,因为运动伪影的频谱与脉搏信号重叠。工程上采用自适应滤波或加速度辅助去噪:利用加速度计同步采集的运动信号作为参考噪声源,通过LMS或RLS自适应算法从PPG信号中减去运动相关成分。

经验提醒:在MCU上实现自适应滤波时,LMS算法的步长因子μ需谨慎选择。μ过大会导致滤波发散,μ过小则收敛缓慢。建议μ取参考信号功率的1/50~1/100,并设置最大迭代次数防止数值溢出。对于Cortex-M4内核,32阶LMS滤波器在50Hz采样率下仅占用约5% CPU资源。

此外,中值滤波对去除尖峰脉冲(如电极松动引起的瞬时跳变)非常有效。窗口长度取5~7个采样点即可,既不会过度平滑脉搏波形态,又能有效剔除异常值。

4.3 归一化:消除个体差异与量纲影响

不同个体的静息心率可能相差30BPM(例如运动员45BPM vs 普通成人75BPM),加速度计安装位置和方向也会导致重力分量不同。若不进行归一化,模型会过度依赖数值而非变化模式,导致泛化能力差。

  • Min-Max归一化:将数据线性映射到[0,1]或[-1,1]区间。适用于加速度计,因为其幅值范围相对固定(±2g或±4g)。公式:x' = (x - min) / (max - min)。在TinyML中,可预先统计训练集的全局最小/最大值,避免在线计算。
  • Z-score标准化:将数据转换为零均值、单位方差。适用于心率信号,因为不同个体的均值差异显著。公式:x' = (x - μ) / σ。μ和σ需从每个用户的静息状态数据中估计,建议取入睡后前5分钟的均值。
  • 鲁棒缩放:使用中位数和四分位距(IQR)代替均值和标准差,对异常值不敏感。适合包含偶发运动伪影的心率数据。

风险提示:归一化参数必须在训练集上计算并固化,部署时使用相同的参数进行变换。若在推理时动态计算min/max,会导致数据分布漂移,模型输出不稳定。同时,归一化参数应存储为常量,避免每次启动时重新统计。

4.4 滑动窗口分割:构造时序样本

睡眠状态识别需要基于一段时间窗口内的信号模式进行判断,而非单点采样。滑动窗口分割将连续信号流切分为固定长度的片段,每个片段作为一个独立样本输入模型。窗口长度和步长的选择直接影响时序上下文的信息量和样本数量。

窗口长度步长样本重叠率适用场景优缺点
10 s5 s50%快速响应、实时监测上下文短,易受瞬时噪声干扰
30 s15 s50%标准睡眠分期平衡上下文与实时性
60 s30 s50%深睡/REM分析上下文充分,但延迟较高
5 min1 min80%睡眠阶段趋势分析样本量大,但实时性差

对于TinyML部署,30秒窗口配合15秒步长是较为稳妥的起点。以50Hz采样率、4通道(3轴加速度+1路心率)计算,每个窗口包含1500个采样点,即1500×4=6000个浮点数。若使用float32表示,单窗口数据量为24KB——这已超出多数MCU的RAM容量(典型Cortex-M4有192KB RAM)。因此,必须在预处理阶段进行特征压缩,而非将原始窗口直接送入模型。

工程实践:在MCU上实现滑动窗口时,采用环形缓冲区管理数据流。缓冲区大小为窗口长度×通道数,每次新采样写入尾部并覆盖最旧数据。当缓冲区填满后,每步进一个步长就触发一次特征提取和推理。以30s窗口、15s步长为例,缓冲区需存储30s×50Hz×4ch=6000个float,即24KB,可接受。

4.5 案例拆解:从原始数据到可训练样本的完整流程

以下案例基于某可穿戴睡眠监测设备(Cortex-M4F @ 80MHz,192KB RAM,1MB Flash)的实测数据,展示预处理流水线的具体实施与效果。

背景与约束:设备需连续监测8小时睡眠,电池容量100mAh,无线传输仅在睡眠结束后批量上传。加速度计(BMI270)采样率设为25Hz,量程±4g;心率传感器(MAX30102)采样率设为25Hz,红光+红外双通道。存储预算:预处理后的特征数据不超过500KB。

初始现象:原始PPG信号在翻身时出现幅值超过2V的尖峰(正常脉搏幅值约0.3V),导致心率计算错误率高达40%。同时,加速度计Z轴存在0.8g的直流偏置(因佩戴角度倾斜),不同用户的偏置差异显著。

处理步骤:

  1. 缺失值插补:PPG信号因接触不良产生约0.5%的丢包,采用线性插值填充,插值窗口不超过1秒。
  2. 带通滤波:加速度计使用0.5~8Hz带通(巴特沃斯二阶),心率使用0.5~5Hz带通。滤波器系数预先在PC端计算并固化为常量数组。
  3. 运动伪影消除:利用加速度计X/Y轴合成幅值作为参考,对PPG信号执行16阶LMS自适应滤波,步长μ=0.01。滤波后心率计算错误率降至5%以内。
  4. 归一化:加速度计三轴分别做Min-Max归一化,映射到[-1,1];心率信号做Z-score标准化,μ和σ取用户入睡后前5分钟的统计值。
  5. 滑动窗口:窗口长度30秒(750个采样点),步长15秒(375个采样点),重叠率50%。每窗口提取特征:加速度计三轴的均值、方差、过零率、FFT前5个频段能量;心率信号的均值、标准差、HRV(SDNN、RMSSD)。共提取28维特征。

结果对比:预处理后,单窗口数据量从原始24KB(750×4×4字节)压缩至28维×4字节=112字节,压缩比约214:1。8小时数据总量从约17MB降至约1.1MB(含特征时间戳),满足500KB预算(通过降低特征维度至20维或增加步长至30秒进一步压缩)。模型在验证集上的睡眠分期准确率从预处理前的68%提升至89%。

风险与代价:LMS自适应滤波在MCU上占用约12% CPU资源,导致整体功耗增加8%。为平衡功耗,仅在检测到运动伪影(加速度幅值超过阈值)时启用自适应滤波,静止时段直接使用带通输出。

复盘经验:预处理参数并非一成不变。建议在部署前采集目标人群的小样本数据(5~10人),验证滤波器截止频率和归一化参数的适用性。例如,儿童睡眠动作频率略高于成人,带通上限可放宽至12Hz;老年人静息心率偏低,Z-score标准化的μ值需相应调整。

4.6 常见误区与总结复盘

在传感器数据预处理环节,开发者常陷入以下误区,导致模型性能与预期不符:

  • 误区一:采样率越高越好。高采样率带来数据量激增,MCU存储和功耗压力陡增,而睡眠动作频率有限,过采样并无信息增益。应根据信号最高频率的5~10倍设定采样率。
  • 误区二:滤波器阶数越高越好。高阶滤波器虽然频率选择性更好,但相位延迟增大,且MCU计算量呈线性增长。对于睡眠信号,二阶巴特沃斯已足够,过度滤波反而会滤除有用的瞬态特征(如翻身时的冲击波形)。
  • 误区三:归一化参数在线计算。在推理时动态计算min/max或μ/σ,会导致同一用户的相同状态在不同时间产生不同的归一化结果,破坏模型输入的稳定性。必须使用训练集统计的固定参数。
  • 误区四:窗口重叠率越高越好。高重叠率增加样本数量,但相邻样本高度相关,容易导致过拟合。50%重叠率是精度与计算量的良好折中。
  • 误区五:忽略传感器时钟同步。加速度计和心率传感器可能使用不同的时钟源,长时间运行后产生时间漂移。若两者采样时刻不对齐,后续特征融合将出现偏差。建议使用MCU的硬件定时器触发同步采样,或定期校准时间戳。

总结而言,传感器数据采集与预处理是TinyML睡眠识别系统的地基工程。采样率决定信息上限,滤波与去噪决定信噪比,归一化消除个体差异,滑动窗口构造时序样本——四者环环相扣,任何一环的疏忽都会在模型端放大为性能损失。在资源受限的MCU上,预处理算法必须兼顾效果与开销,优先选择低阶IIR滤波器、轻量级自适应算法和固定点运算,确保在电池供电的长期运行中保持稳定可靠。