光电容积脉搏波描记法PPG 
光学心率传感器,如果带过上述那些智能手表或者智能手环的朋友来说也不算稀奇的事情。就拿AppleWatch来说,测量心率时底部的表盘会发出绿色的灯光,并且测量的时候手腕最好保持不动否侧会影响测量结果。接下来将详细介绍光学心率测量的原理。
如下两张图是光学心率传感器。图a是LED没有发光的时候中间是一个光敏二极管,图b是传感器的LED发光的时候。

android 相机测心率实现 手机照相机测心率_android 相机测心率实现

图A                                   图B

android 相机测心率实现 手机照相机测心率_android 相机测心率实现_02

那么为什么通过LED灯发光就能测量心率呢?
当LED光射向皮肤,透过皮肤组织反射回的光被光敏传感器接受并转换成电信号再经过AD转换成数字信号,简化过程:光--> 电 --> 数字信号

android 相机测心率实现 手机照相机测心率_时域_03

为什么大多数传感器都是采用的绿光呢?
我们先看看光谱的特点,从紫外线到红外线的波长是越来越长的。

android 相机测心率实现 手机照相机测心率_数字信号_04

之所以选择绿光作为光源是考虑到一下·几个特点:
1. 皮肤的黑色素会吸收大量波长较短的波
2. 皮肤上的水份也会吸收大量的UV和IR部分的光
3. 进入皮肤组织的绿光(500nm)-- 黄光(600nm)大部分会被红细胞吸收
4. 红光和接近IR的光相比其他波长的光更容易穿过皮肤组织
5. 血液要比其他组织吸收更多的光
6. 相比红光,绿(绿-黄)光能被氧合血红蛋白和脱氧血红蛋白吸收
总体来说,绿光-- 红光能作为测量光源。早起多数采用红光为光源,随着进一步的研究和对比,绿光作为光源得到的信号更好,信噪比也比其他光源好些,所以现在大部分穿戴设备采用绿光为光源。但是考虑到皮肤情况的不用(肤色、汗水),高端产品会根据情况自动使用换绿光、红光和IR多种光源。
虽然知道了上面的几个特点,但是还不足以弄清楚为什么通过光照就能测出心率、血氧等参数呢?
下图就解释了核心原理

android 相机测心率实现 手机照相机测心率_android 相机测心率实现_05

当光照透过皮肤组织然后再反射到光敏传感器时光照有一定的衰减的。像肌肉、骨骼、静脉和其他连接组织等等对光的吸收是基本不变的(前提是测量部位没有大幅度的运动),但是血液不同,由于动脉里有血液的流动,那么对光的吸收自然也有所变化。当我们把光转换成电信号时,正是由于动脉对光的吸收有变化而其他组织对光的吸收基本不变,得到的信号就可以分为直流DC信号和交流AC信号。提取其中的AC信号,就能反应出血液流动的特点。我们把这种技术叫做光电容积脉搏波描记法PPG。
下图是PPG信号和ECG信号的对比

android 相机测心率实现 手机照相机测心率_频域_06

实际测量手指的PPG信号如下:

android 相机测心率实现 手机照相机测心率_频域_07

所以,只要测得到的PPG信号比较理想算出心率也不算什么难事。但是事实总是残酷的,由于测量部位的移动、自然光、日光灯等等其他的干扰,最终测到的信号可能是下面的这种,所以要通过很多方法进行滤波处理

android 相机测心率实现 手机照相机测心率_频域_08

对于PPG信号的处理,目前我知道的有两种方法。一种是时域分析,即算出一定时间内PPG信号的波峰个数,另一种是通过对PPG信号进行FFT变换得到频域的特点。
时域方法:

通过对原始的{PPG信号进行滤波处理,得到一定时间内的波峰个数,然后既可算出心率值

android 相机测心率实现 手机照相机测心率_android 相机测心率实现_09

假设连续采样5秒的时间,在5s内的波峰个数为N,那么心率就是N*12 (这个相信大家都懂,就跟把脉一样~)


频域分析:

上面分析过,我们把血液流动对光吸收转变成了AC信号,如果对于进行FFT变换,那么就能看到频域的特点。如下图就是对PPG信号的FFT转变

android 相机测心率实现 手机照相机测心率_android 相机测心率实现_10

上图中的频域图,0Hz的信号很强,这部分是骨骼、肌肉等组织的DC信号,在1Hz附近有个相对比较突出的信号就是血液流动转变的AC信号。假设测得到的频率f = 1.2Hz
那么心率HeartRate HR = f x60 = 1.2 x 60 = 72
最后再简单提一下血氧的测量,相比心率血氧测量难度较大而且精度不算太高。测量血氧的原理图下图所示

android 相机测心率实现 手机照相机测心率_时域_11

由于血液中含有的氧合血红蛋白HbO2和血红蛋白Hb存在一定的比例,简单说也就是含氧量吧。上面的图表示了氧合血红蛋白HbO2和血红蛋白Hb对波长600~1000nm的光吸收特性,从图中可以看出上600~800nm间Hb的吸收系数更高,800~1000之间HbO2的吸收系数更高。所以可以利用红光(600~800nm)和接近IR(800~1000nm)的光分别检测HbO2和Hb的PPG信号,然后通过程序处理算出相应的比值,这样就得到了血氧值。
但是由于光源不同,直接利用红光和接近IR的光进行信号对比是不可靠的,因为红光和IR透过皮肤组织也会产生不同的吸收。下图是红光和IR透过皮肤的原始信号示意图

android 相机测心率实现 手机照相机测心率_android 相机测心率实现_12

上面分析说过,DC部分是光透过皮肤组织转换成的直流信号,AC是血液流动产生转换成的交流信号。由于皮肤组织对红光和IR的吸收程度不同,DC部分自然也就不一样。为了能共“公平对待”两种光源的PPG信号,所以需要对原始信号处理一下。下图示意了处理后的信号(DC部分相等)

android 相机测心率实现 手机照相机测心率_频域_13

通过一定的比例计算,公平对待Red和IR的PPG信号。这样计算出来的Hb和HbO2比例才可靠。