第1章:数据采集基础——光电传感器与PPG信号

大家好,我是老李。做嵌入式十几年,血氧仪这块我摸过不少。今天咱们聊聊数据采集的基础,说白了就是——光怎么变成数字,数字又怎么变成血氧值。

你想想看,一个血氧仪最核心的部件是什么?不是屏幕,不是蓝牙,是那个贴在手指上的光电传感器。我当年第一次拆开进口血氧仪时,看到里面就两个LED灯和一个接收管,心里还嘀咕:就这?后来踩了不少坑才明白,简单的东西往往最难做好。

1.1 光电传感器原理:红光与红外光

血氧仪用两种光:红光(660nm左右)和红外光(940nm左右)。为什么是这两个波长?

因为血红蛋白有两种状态:带氧的(氧合血红蛋白)和不带氧的(还原血红蛋白)。它们对光的吸收特性完全不同。我画个简表给你看:

波长 氧合血红蛋白吸收率 还原血红蛋白吸收率
红光(660nm)
红外光(940nm)

你看,两种血红蛋白对红光的吸收正好相反。这就是血氧计算的物理基础。我刚开始做项目时,选LED踩过坑——有些便宜的红光LED波长漂移严重,标称660nm实际可能到680nm,测出来的血氧值能差2-3个百分点。

注意:LED的波长一致性很重要。同一批货,不同批次可能都有差异。我建议每次换批次都要重新校准。

1.2 ADC采样与信号调理

光信号从手指穿过后,被光电二极管接收,变成微弱的电流信号。这个电流有多弱?大概在纳安到微安级别。直接送ADC?不行,信号太小了。

所以需要信号调理,一般分三步:

  1. I-V转换:把电流信号转成电压信号,用运放实现
  2. 滤波:去掉高频噪声和工频干扰
  3. 放大:把信号放大到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信号能一样吗?

经验之谈:PPG信号的AC分量通常只有DC分量的1%-5%。所以ADC的动态范围要足够大,否则AC分量被量化噪声吃掉,血氧值就测不准了。

1.4 运动伪影与干扰源

这是血氧仪最头疼的问题。没有之一。

运动伪影怎么来的?手指一动,传感器和皮肤之间的相对位置变了,光路变了,信号就乱了。我见过最夸张的情况——测试者甩了一下手,血氧值直接从98%掉到85%,持续了3秒才恢复。

常见的干扰源有:

  • 环境光干扰:太阳光、日光灯,尤其是50Hz/60Hz的工频干扰
  • 运动伪影:手指抖动、走路、跑步
  • 电磁干扰:手机、WiFi模块靠近时
  • 低灌注:手指太冷、血压低时,信号弱到几乎测不到

怎么处理?我分享几个实战经验:

  1. 硬件上:加屏蔽罩,用差分信号传输,电源做好滤波
  2. 软件上:用自适应滤波器,比如LMS算法,可以实时跟踪噪声频率
  3. 算法上:加运动检测,检测到运动时暂停计算或给出低置信度标记
避坑指南:我曾经做过一个项目,运动伪影怎么都滤不掉。查了三天,最后发现是传感器窗口的密封胶透光。环境光从胶缝里漏进去,产生了周期性干扰。换了黑色密封胶,问题解决。有时候问题不在电路上,而在结构上。

嗯,这一章的内容差不多就这些。光电传感器原理、ADC采样、PPG信号特征、运动伪影处理——这四个点你吃透了,血氧仪的数据采集部分就稳了。下一章我们聊聊数据存储,怎么把采集到的PPG数据可靠地存下来。

记住一句话:信号质量决定数据质量,数据质量决定算法上限。前端做不好,后面再牛的算法也白搭。