PPG原理说明

2024-03-03 15:59
文章标签 原理 说明 ppg

本文主要是介绍PPG原理说明,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

简介:

      在这个什么都要和“智能”串联的年代,除了我们司空见款的手机外也就是一些智能手表和手环之类的穿戴设备了。这些智能穿戴设备集成了很多的传感器,由于脉搏或者心率是生命体征的重要参数之一,所以心率率测量可算是高端入门产品必备的一个技能,正好最近有机会好好研究心率测量的技术,所以趁热打铁总结一下光学测量心率的相关知识。

      在网上搜集了很多资料,目前心率测量有以下几种传感器技术(仅供参考)

1. 心电ECG

2. 光电容积脉搏波描记法PPG 

3. 生物阻抗 bioimpedance

4. 摄像头Camera RGB 、wifi等技术

      在上述的几种方法中,最被人们熟悉的应该就是心电图。在医疗领域,通常使用心电图(ECG)测量生理电信号来实现心率和心脏活动的检测。但是由于测量ECG信号,常常要在身体多个部位连接传感器电极,在胸部和四肢之间最多可以连接10个电极。ECG信号虽然精准并且信息丰富,但是考虑到穿戴设备的便携性和功能简单所以并没有在穿戴设备上广泛采用ECG技术。目前情况ECG还是在一些专业领域里面使用例如医院、体育等方面的研究。

      第二种光电容积脉搏波描记法,这个名字读起来实在是高端,其实说简单点就是利用光测量脉搏的一种技术。这种技术目前被广泛应用,本文也是主要介绍这种技术。

目前市场上能看到采用这种技术的穿戴设备就有:AppleWatch、三星 Galaxy Gear S2、Moto 360、Microsoft Band 等....(其他厂家就省略了)。


      第三种生物阻抗传感器测量方法,目前市场上看到的好像只有Jawbone 的UP3了, 对于此技术网上的资料特别的少。不过通过亲身体验试戴JawboneUP3,感觉这种技术应该比光学测心率的技术难度大但是应该更精准更可靠。最后的Camera RGB和wifi都是是MIT研究出来的新技术,看起来都非常高端,MIT威武啊。其中一个是通过我们手机的摄像头就能检测出人体的体征变化,这个技术非常有意思并且也很高端,感兴趣的可以看视频介绍。另一个则是通过我们家里的wifi信号就能测,也甚是高端。当然这两种还没有看到上市的产品所以就不多说了。

光电容积脉搏波描记法PPG 

     光学心率传感器,如果带过上述那些智能手表或者智能手环的朋友来说也不算稀奇的事情。就拿AppleWatch来说,测量心率时底部的表盘会发出绿色的灯光,并且测量的时候手腕最好保持不动否侧会影响测量结果。接下来将详细介绍光学心率测量的原理。

      如下两张图是光学心率传感器。图a是LED没有发光的时候中间是一个光敏二极管,图b是传感器的LED发光的时候。

                                

图a                                                                               图b

        那么为什么通过LED灯发光就能测量心率呢?

        当LED光射向皮肤,透过皮肤组织反射回的光被光敏传感器接受并转换成电信号再经过AD转换成数字信号,简化过程:光--> 电 --> 数字信号


        为什么大多数传感器都是采用的绿光呢?

我们先看看光谱的特点,从紫外线到红外线的波长是越来越长的。


     之所以选择绿光作为光源是考虑到一下·几个特点:

       1. 皮肤的黑色素会吸收大量波长较短的波

       2. 皮肤上的水份也会吸收大量的UV和IR部分的光

       3. 进入皮肤组织的绿光(500nm)-- 黄光(600nm)大部分会被红细胞吸收

       4. 红光和接近IR的光相比其他波长的光更容易穿过皮肤组织

       5. 血液要比其他组织吸收更多的光

       6. 相比红光,绿(绿-黄)光能被氧合血红蛋白和脱氧血红蛋白吸收

      总体来说,绿光-- 红光能作为测量光源。早起多数采用红光为光源,随着进一步的研究和对比,绿光作为光源得到的信号更好,信噪比也比其他光源好些,所以现在大部分穿戴设备采用绿光为光源。但是考虑到皮肤情况的不用(肤色、汗水),高端产品会根据情况自动使用换绿光、红光和IR多种光源。

虽然知道了上面的几个特点,但是还不足以弄清楚为什么通过光照就能测出心率、血氧等参数呢?

     下图就解释了核心原理


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

        下图是PPG信号和ECG信号的对比



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

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

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

时域方法:

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


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


频域分析:

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


        上图中的频域图,0Hz的信号很强,这部分是骨骼、肌肉等组织的DC信号,在1Hz附近有个相对比较突出的信号就是血液流动转变的AC信号。假设测得到的频率f = 1.2Hz

那么心率HeartRate  HR = f x60 = 1.2 x 60 = 72

最后再简单提一下血氧的测量,相比心率血氧测量难度较大而且精度不算太高。测量血氧的原理图下图所示


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

但是由于光源不同,直接利用红光和接近IR的光进行信号对比是不可靠的,因为红光和IR透过皮肤组织也会产生不同的吸收。下图是红光和IR透过皮肤的原始信号示意图


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


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


本人水平有限,如有错误欢迎大家指出错误,相互学习!!

本文章参考文献:

1. Dae-Geun Jang, Sangjun Park, and Minsoo Hahn    A Real-Time Pulse Peak Detection Algorithm for the Photoplethysmogram 

2. Development of a Signal Processing Library for Extraction of SpO 2 , HR, HRV, and RR from Photoplethysmographic Waveforms 

3. S.  K.  Mitra,  Digital  Signal  Processing:  A  Computer-Based Approach, 3rd ed., New York, USA: McGraw-Hill
4. Y. K. Qawqzeh, M. B. I. Reaz, M. A. M. Ali   The analysis of PPG contour in the assessment of atherosclerosis for erectile dysfunction subjects 
5. Telecommunications Institute, Military University of Technology
6. Kaliskiego 2, 00-908 Warsaw, Poland ISSN 2079-9292 Wearable Photoplethysmographic Sensors—Past and Present 
7. Military Institute of Aviation Medicine, Krasińskiego 54, 01-455 Warsaw, Poland
8. 基于光电容积脉搏波的亚临床动脉弹性功能研究
9. 基于PPG的心率和呼吸频率的测量研究_马俊领

转自:https://blog.csdn.net/chehec2010/article/details/80507958

这篇关于PPG原理说明的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/770133

相关文章

Spring Boot循环依赖原理、解决方案与最佳实践(全解析)

《SpringBoot循环依赖原理、解决方案与最佳实践(全解析)》循环依赖指两个或多个Bean相互直接或间接引用,形成闭环依赖关系,:本文主要介绍SpringBoot循环依赖原理、解决方案与最... 目录一、循环依赖的本质与危害1.1 什么是循环依赖?1.2 核心危害二、Spring的三级缓存机制2.1 三

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程

Go 语言中的select语句详解及工作原理

《Go语言中的select语句详解及工作原理》在Go语言中,select语句是用于处理多个通道(channel)操作的一种控制结构,它类似于switch语句,本文给大家介绍Go语言中的select语... 目录Go 语言中的 select 是做什么的基本功能语法工作原理示例示例 1:监听多个通道示例 2:带

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Tomcat版本与Java版本的关系及说明

《Tomcat版本与Java版本的关系及说明》:本文主要介绍Tomcat版本与Java版本的关系及说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat版本与Java版本的关系Tomcat历史版本对应的Java版本Tomcat支持哪些版本的pythonJ

Python中随机休眠技术原理与应用详解

《Python中随机休眠技术原理与应用详解》在编程中,让程序暂停执行特定时间是常见需求,当需要引入不确定性时,随机休眠就成为关键技巧,下面我们就来看看Python中随机休眠技术的具体实现与应用吧... 目录引言一、实现原理与基础方法1.1 核心函数解析1.2 基础实现模板1.3 整数版实现二、典型应用场景2

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

JAVA封装多线程实现的方式及原理

《JAVA封装多线程实现的方式及原理》:本文主要介绍Java中封装多线程的原理和常见方式,通过封装可以简化多线程的使用,提高安全性,并增强代码的可维护性和可扩展性,需要的朋友可以参考下... 目录前言一、封装的目标二、常见的封装方式及原理总结前言在 Java 中,封装多线程的原理主要围绕着将多线程相关的操