4、信号采集与预处理:PPG信号采样策略、运动伪影的时域特征分析、基线漂移的成因与影响、工频干扰的频谱特征
各位同学,欢迎来到第四讲。前面我们聊了光路设计和光电二极管选型,那些都是硬件层面的功夫。但说实话,硬件做得再好,信号进了ADC之后,如果预处理没做好,后面算法再牛也白搭。今天我们就来聊聊PPG信号从模拟域进入数字域之后,第一道坎该怎么迈。
4.1 PPG信号采样策略:别让奈奎斯特坑了你
采样率怎么定?很多人第一反应就是奈奎斯特定理,两倍于最高频率。嗯,理论上没错,但实际做血氧仪,你会发现事情没那么简单。
PPG信号的有效成分主要集中在0.5Hz到5Hz之间,对应心率30到300次/分。按奈奎斯特,10Hz采样就够了。但我个人习惯,至少设到100Hz。为什么?
- 波形保真度:PPG信号里有个关键特征叫"重搏波切迹",这个凹陷很窄。采样率低了,这个特征直接丢失,后续特征点提取就废了。
- 运动伪影的时域分辨率:运动伪影往往是高频成分,低采样率下你根本看不清它的形态。
- 过采样降噪:100Hz采样后做数字低通滤波,比硬件滤波器效果好得多。
重要经验:我在项目中遇到过,采样率从50Hz提到100Hz,SpO2计算精度提升了约1.5%。代价只是MCU多花一点点算力,非常划算。
当然,也不是越高越好。采样率太高,数据量暴增,功耗也跟着涨。对于穿戴设备,我个人建议:
| 应用场景 | 推荐采样率 | 理由 |
|---|---|---|
| 临床监护仪 | 200-500 Hz | 需要高精度波形分析 |
| 家用指夹式 | 50-100 Hz | 够用,省电 |
| 手环/手表 | 25-50 Hz | 功耗优先,牺牲一点精度 |
小技巧:如果你用STM32,可以开定时器触发ADC,配合DMA,采样率非常稳定。别用软件延时去凑,那个抖动会让你后期滤波很痛苦。
4.2 运动伪影的时域特征分析
运动伪影,说白了就是血氧仪的天敌。你想想看,手指在动,血液在晃,光路在变,ADC读出来的数据乱七八糟。怎么识别它?
我们先看时域特征。正常的PPG波形,周期稳定,上升支陡峭,下降支平缓,有个明显的重搏波。运动伪影来了之后,波形变成什么样?
- 幅度突变:正常PPG的峰峰值变化不超过20%。运动伪影能让它瞬间翻倍或减半。
- 周期紊乱:心率明明是72,突然冒出来一个"心跳"间隔只有200ms,这肯定不是心跳。
- 基线剧烈波动:这个我们下一节细说。
我记得有一次调试,发现算法在走路时SpO2掉到85%,吓我一跳。后来把原始数据拉出来一看,好家伙,波形完全被步频淹没了。步频大概2Hz,和心率重叠了,根本分不开。
避坑指南:我曾经以为运动伪影就是高频噪声,用低通滤波就能搞定。结果发现,走路时的伪影频率和心率几乎一样,滤波反而把真实信号滤掉了。后来我才明白,运动伪影的时域特征比频域特征更重要。
怎么在时域识别运动伪影?我常用的几个指标:
// 伪代码:运动伪影检测
if (abs(peak_amplitude - avg_amplitude) > 0.3 * avg_amplitude) {
// 幅度异常,标记为运动伪影
motion_flag = 1;
}
if (abs(interval - avg_interval) > 0.4 * avg_interval) {
// 周期异常,标记为运动伪影
motion_flag = 1;
}
if (baseline_drift_rate > threshold) {
// 基线漂移过快,标记为运动伪影
motion_flag = 1;
}
这三个条件,满足任意一个,我就认为这段数据不可靠,要么丢弃,要么进入补偿算法。
4.3 基线漂移的成因与影响
基线漂移,就是PPG信号的整体水平在缓慢变化。你想想看,正常PPG应该在一个稳定的直流电平上波动,但实际采集到的信号,这个直流电平会上下飘。
成因有哪些?
- 呼吸运动:吸气时胸腔扩张,指尖血容量变化,导致基线上升。呼气时下降。频率大概0.2-0.3Hz。
- 肢体移动:手在动,传感器和皮肤的接触压力在变,基线跟着变。
- 温度漂移:LED和光电二极管都有温度系数,开机后温度上升,基线慢慢飘。
- 电路耦合:电源纹波、运放失调电压,都会贡献基线漂移。
影响有多大?
基线漂移最直接的影响,就是让特征点提取变得困难。你设一个固定阈值去检测波峰,基线一飘,阈值就不准了。要么漏检,要么误检。
我做过一个实验:在无漂移的情况下,波峰检测准确率99.5%。加入0.5Hz、幅度为信号幅度20%的基线漂移后,准确率直接掉到85%。
关键结论:基线漂移不处理,后续的SpO2计算、心率计算都是空中楼阁。必须做高通滤波或基线校正。
常用的基线校正方法:
- 高通滤波:截止频率设0.3-0.5Hz,简单粗暴。但会损失一部分低频的心率信息。
- 多项式拟合:用低阶多项式拟合基线,然后减去。效果不错,但计算量大。
- 形态学滤波:用开运算和闭运算估计基线,适合实时处理。
我个人偏爱形态学滤波,因为它不需要知道信号的统计特性,而且计算量可控。
4.4 工频干扰的频谱特征
工频干扰,就是50Hz(或60Hz)的电网噪声。这个噪声怎么进来的?
- 空间辐射:电源线、灯具、显示器,都是辐射源。你的血氧仪就像一根天线。
- 地环路:如果设备接地不良,地线上会有工频电流流过。
- 电源耦合:开关电源的纹波,虽然频率高,但整流后会有50Hz的残留。
频谱特征:
工频干扰在频谱上非常干净,就是一个单频尖峰,在50Hz处。但要注意,实际中还会有谐波,100Hz、150Hz,甚至更高。为什么?因为电网波形不是完美的正弦波,有畸变。
我记得有一次,客户反馈说血氧仪在工厂里测不准。我带着示波器过去一看,好家伙,车间里全是变频器,50Hz的谐波一直延伸到500Hz。我们的低通滤波只到40Hz,根本挡不住。
避坑指南:我曾经以为50Hz陷波器就够用了。结果发现,在工业环境下,谐波分量比基波还大。后来我改用了自适应陷波器,能跟踪频率变化,效果好了很多。
怎么处理工频干扰?
| 方法 | 优点 | 缺点 |
|---|---|---|
| 硬件低通滤波 | 简单,不占算力 | 截止频率难调,会衰减有用信号 |
| 数字陷波器 | 精准去除50Hz | 对频率偏移敏感,可能引入相位失真 |
| 自适应滤波 | 能跟踪频率变化 | 计算量大,收敛速度慢 |
| 同步采样 | 理论上完全消除 | 需要锁相环,硬件复杂 |
对于大多数血氧仪,我建议用数字陷波器加一个低通滤波的组合。陷波器干掉50Hz,低通干掉高频噪声。注意陷波器的Q值不要太高,否则会引入振铃。
小技巧:如果你用IIR陷波器,注意系数的量化精度。在定点MCU上,系数稍微一截断,陷波频率就偏了。我一般用双精度浮点算好系数,再转成定点,然后验证一下频率响应。
好了,这一讲的内容就到这里。采样策略、运动伪影、基线漂移、工频干扰,这四个问题搞定了,你的PPG信号才算真正"干净"了。下一讲,我们开始聊特征提取,也就是怎么从干净的信号里找到波峰波谷。