第一章 PPG信号特性:读懂你的心跳信号
各位同学,咱们今天聊聊PPG信号。说白了,这就是光电容积描记法测出来的信号。你把手环戴在手腕上,那个绿光一闪一闪的,就是在采集PPG信号。
我刚开始做心率监测芯片那会儿,总觉得这玩意儿简单——不就是个光信号嘛。结果第一次流片回来,测出来的波形乱七八糟,根本没法用。后来才明白,PPG信号里的门道,比我想象的多得多。
1.1 PPG信号的波形特征
先看一张典型的PPG波形。嗯,我手边正好有之前项目里抓的数据,咱们直接看特征。
核心特征:PPG信号包含主波和重搏波两个关键部分
主波——这是波形里最高的那个峰。心脏收缩时,血液被泵到外周血管,血管容积瞬间增大,光吸收量也跟着猛增。你看到的就是这个陡峭的上升沿。
重搏波——主波后面那个小鼓包。心脏舒张时,主动脉瓣关闭,血液回流冲击主动脉根部,产生一个小的二次波峰。我做过统计,健康成年人的重搏波位置大概在主波下降支的1/3到1/2处。
这里有个坑,我踩过。重搏波在年轻人身上很明显,但老年人或者动脉硬化患者,这个波可能就消失了。你设计算法时,千万别把重搏波当成主波来检测,否则心率直接翻倍。
实战经验:我在做运动手环项目时,发现重搏波的位置会随心率变化。心率快时,重搏波会往主波方向靠拢,甚至融合在一起。这时候再用传统的波峰检测算法,基本就废了。
1.2 AC分量与DC分量
PPG信号可以拆成两部分:AC分量和DC分量。你想想看,血液在血管里是脉冲式流动的,但血管本身和组织一直存在。
| 分量 | 来源 | 频率范围 | 幅度占比 |
|---|---|---|---|
| AC分量 | 动脉血容积脉动 | 0.5 - 5 Hz | 1% - 5% |
| DC分量 | 组织、静脉血、非脉动动脉血 | 接近直流 | 95% - 99% |
AC分量才是我们真正关心的。它反映了心脏搏动引起的血管容积变化。DC分量呢?说白了就是背景噪声,包括皮肤、肌肉、骨骼这些不动的组织对光的吸收。
我建议你在硬件设计时,第一件事就是滤掉DC分量。为什么?因为ADC的动态范围有限。你想想,一个12位的ADC,如果DC分量占了90%的输入范围,那AC分量就只能用剩下的10%来量化,精度根本不够。
注意:DC分量不是一成不变的。佩戴松紧、皮肤颜色、出汗情况都会改变DC分量。我曾经遇到过,用户运动出汗后,DC分量漂移了30%以上。如果你的高通滤波器截止频率设得太低,这个漂移会直接饱和ADC。
1.3 心率范围与信号频率
心率范围,咱们按30到220 BPM来算。换算一下:
- 30 BPM → 0.5 Hz
- 60 BPM → 1.0 Hz
- 120 BPM → 2.0 Hz
- 220 BPM → 3.67 Hz
所以PPG信号的有效频率范围是0.5到5 Hz。为什么上限取5 Hz?因为心率220 BPM对应3.67 Hz,再加上谐波分量,留点余量就够了。
这里有个设计要点。我习惯把带通滤波器的通带设在0.5到5 Hz。低于0.5 Hz的,那是呼吸引起的基线漂移。高于5 Hz的,那是高频噪声和运动伪影。但要注意,滤波器的阶数不能太高,否则会引入群延迟,影响实时性。
关键参数:PPG信号采样率建议至少25 Hz(满足奈奎斯特),实际工程中常用50-100 Hz。我做过对比,50 Hz采样配合5 Hz低通滤波,效果和100 Hz采样差不多,但功耗能省一半。
1.4 运动伪影的来源
运动伪影,这是做心率监测最头疼的问题。没有之一。
伪影来源主要有三类:
- 传感器位移——手环在手腕上晃动,LED和PD的相对位置变化,光路改变
- 组织变形——运动时肌肉收缩,皮下组织厚度变化,光衰减量改变
- 静脉回流变化——手臂摆动时,静脉血回流速度变化,DC分量跟着变
我做过一个实验:让测试者戴着我们的手环,在跑步机上从走到跑。结果发现,运动伪影的幅度可以达到PPG信号AC分量的10倍以上。换句话说,你的信号完全被噪声淹没了。
怎么处理?硬件上可以加加速度计,用运动信号做自适应滤波。软件上可以用模板匹配或者小波变换。但说实话,没有一种方法能完美解决所有场景。我个人的经验是,先做运动检测,判断用户当前的运动强度,然后切换不同的滤波策略。
避坑指南:我曾经在算法里用了固定阈值的运动伪影剔除,结果用户在慢走时,伪影幅度刚好和心率信号差不多,阈值设高了剔不干净,设低了把正常信号也剔了。后来改成自适应阈值,根据加速度计的能量动态调整,效果才好起来。
知识体系总览
下面这张图,是我自己整理的PPG信号知识框架。你看一眼,心里就有数了。
这张图把PPG信号的四个核心维度串起来了。波形特征告诉你信号长什么样,AC/DC分量告诉你信号怎么拆解,频率范围告诉你滤波器怎么设计,运动伪影告诉你最大的敌人是谁。
嗯,第一章的内容就到这儿。记住一句话:PPG信号不是你想象中那么干净的波形。它很脆弱,很容易被干扰。但只要你理解了它的脾气,就能设计出靠谱的算法。