第1章:数据采集基础——光电传感器与PPG信号
大家好,我是老李。做嵌入式十几年,血氧仪这块我摸过不少。今天咱们聊聊数据采集的基础,说白了就是——光怎么变成数字,数字又怎么变成血氧值。
你想想看,一个血氧仪最核心的部件是什么?不是屏幕,不是蓝牙,是那个贴在手指上的光电传感器。我当年第一次拆开进口血氧仪时,看到里面就两个LED灯和一个接收管,心里还嘀咕:就这?后来踩了不少坑才明白,简单的东西往往最难做好。
1.1 光电传感器原理:红光与红外光
血氧仪用两种光:红光(660nm左右)和红外光(940nm左右)。为什么是这两个波长?
因为血红蛋白有两种状态:带氧的(氧合血红蛋白)和不带氧的(还原血红蛋白)。它们对光的吸收特性完全不同。我画个简表给你看:
| 波长 | 氧合血红蛋白吸收率 | 还原血红蛋白吸收率 |
|---|---|---|
| 红光(660nm) | 低 | 高 |
| 红外光(940nm) | 高 | 低 |
你看,两种血红蛋白对红光的吸收正好相反。这就是血氧计算的物理基础。我刚开始做项目时,选LED踩过坑——有些便宜的红光LED波长漂移严重,标称660nm实际可能到680nm,测出来的血氧值能差2-3个百分点。
1.2 ADC采样与信号调理
光信号从手指穿过后,被光电二极管接收,变成微弱的电流信号。这个电流有多弱?大概在纳安到微安级别。直接送ADC?不行,信号太小了。
所以需要信号调理,一般分三步:
- I-V转换:把电流信号转成电压信号,用运放实现
- 滤波:去掉高频噪声和工频干扰
- 放大:把信号放大到ADC的满量程范围
我习惯用跨阻放大器做第一级。这里有个坑——运放的偏置电流必须远小于信号电流,否则你测的根本不是血氧信号,而是运放自己的噪声。我曾经用过一款通用运放,偏置电流50pA,结果信号完全被淹没了。后来换了JFET输入的运放,偏置电流只有1pA,问题才解决。
ADC采样参数建议:
- 分辨率:至少12位,推荐16位
- 采样率:100Hz以上,我一般用200Hz
- 参考电压:内部参考或外部精密参考
1.3 PPG信号特征分析
PPG信号长什么样?说白了就是心跳引起血管容积变化,导致光吸收量周期性变化。你把手放在血氧仪上,看到那个波形一跳一跳的,就是PPG信号。
一个典型的PPG波形包含:
- 直流分量(DC):组织、骨骼、静脉血等非脉动部分的吸收
- 交流分量(AC):动脉血脉动引起的吸收变化,就是那个小波浪
血氧饱和度计算公式:
SpO2 = A - B × (AC_red / DC_red) / (AC_ir / DC_ir)
其中A和B是校准系数,不同厂家不一样。我当年做产品时,这个系数调了整整两周。为什么?因为每个人的手指厚度、肤色、血流速度都不一样。你想想看,一个老烟民的手指和一个运动员的手指,PPG信号能一样吗?
1.4 运动伪影与干扰源
这是血氧仪最头疼的问题。没有之一。
运动伪影怎么来的?手指一动,传感器和皮肤之间的相对位置变了,光路变了,信号就乱了。我见过最夸张的情况——测试者甩了一下手,血氧值直接从98%掉到85%,持续了3秒才恢复。
常见的干扰源有:
- 环境光干扰:太阳光、日光灯,尤其是50Hz/60Hz的工频干扰
- 运动伪影:手指抖动、走路、跑步
- 电磁干扰:手机、WiFi模块靠近时
- 低灌注:手指太冷、血压低时,信号弱到几乎测不到
怎么处理?我分享几个实战经验:
- 硬件上:加屏蔽罩,用差分信号传输,电源做好滤波
- 软件上:用自适应滤波器,比如LMS算法,可以实时跟踪噪声频率
- 算法上:加运动检测,检测到运动时暂停计算或给出低置信度标记
嗯,这一章的内容差不多就这些。光电传感器原理、ADC采样、PPG信号特征、运动伪影处理——这四个点你吃透了,血氧仪的数据采集部分就稳了。下一章我们聊聊数据存储,怎么把采集到的PPG数据可靠地存下来。
记住一句话:信号质量决定数据质量,数据质量决定算法上限。前端做不好,后面再牛的算法也白搭。