当前位置:   article > 正文

MAX30102脉搏血氧仪和心率传感器(三)心率计算——时域法_max30102心率算法详解

max30102心率算法详解


前言

本章介绍PPG信号的心率计算方法——时域法。基本思想是计算动态阈值曲线,利用波形与曲线相交来确定PPG信号的周期。


一、算法思想

如下图,当PPG波形在相同的位置两次经过动态阈值曲线的交点时,这段时间的间隔就能认为是PPG的一个周期,根据此周期即可求出心率动态阈值曲线的某一点的值为前面若干个周期内的点的平均值。
在这里插入图片描述

二、算法详解

在这里插入图片描述

1.阈值检测

只有在达到阈值(皮肤接近传感器)后,才开始心率计算,否则计算无意义。

#define PPG_DATA_THRESHOLD 100000 //根据实际情况进行设置

if(ppg_raw_data[1] > PPG_DATA_THRESHOLD)  {...} //阈值检测
else	{...}	//没有达到阈值,计数清零

  • 1
  • 2
  • 3
  • 4
  • 5

2.等待波形稳定

经过测试,当达到阈值后,也就是皮肤刚刚接触到传感器时,会有一段不稳定的时间段。所以尽可能地丢弃这段数据。

wave_stable_counter++;
if(wave_stable_counter>=WAVE_STABLE_NUMS)	//等待波形稳定{...}
  • 1
  • 2

3.FIR滤波、存入缓存区

FIR滤波器在上一章介绍,缓存区的目的是储存了某个点的前若干周期内的数据点,利用这些数据点的平均值得出当前的阈值

for(i=0;i<CACHE_NUMS;i++)
{
	ppg_cache_sum_avr+=ppg_data_cache[i];   //求和
}
ppg_cache_sum_avr = ppg_cache_sum_avr/CACHE_NUMS;  //求平均数
  • 1
  • 2
  • 3
  • 4
  • 5

4.检测PPG信号与阈值曲线的交点

这一步比较复杂,主要利用了波形的特征与阈值曲线的点进行比较。具体内容请看工程内的源码。

5.心率计算

计时是用到了MCU的定时器,当定时器中断一次时,时间+若干毫秒,心率计算开始时清零。如下:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
   if(htim->Instance == TIM2){     
      ppg_times +=10; 	//中断一次10ms
	 }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

三、实际测试

1.静止测试

多次测试如下(经过了5次平均滤波),手指几乎静止贴在传感器上。大概8-10秒测量一次,这里取决于心率快慢。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

2.动态测试

手指贴在传感器上滑动,多次测试如下:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

四、总结

缺点:

  • 抗干扰性很差,几乎等于没有;
  • 舍弃了一部分数据(间隔的周期没有测到);
  • 准确度不高;

改进(有时间再弄):

  • 在上一章滤波中使用带通滤波器,去除0.5Hz以下的频率成分;
  • 增加平均值滤波的次数;
  • 使用其它滤波方法(去除最大最小值或者去除不合理数据等);

五、获取工程源码

关注下方公众号,回复 “MAX30102V3” 获取源码;若有疑问,请在公众号回复“交流群”,进群一起讨论分享!
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/很楠不爱3/article/detail/401527
推荐阅读
相关标签
  

闽ICP备14008679号