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


前言

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


一、算法思想

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

二、算法详解

在这里插入图片描述

1.阈值检测

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

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

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

2.等待波形稳定

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

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

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;  //求平均数

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

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

5.心率计算

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

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
   if(htim->Instance == TIM2){     
      ppg_times +=10; 	//中断一次10ms
	 }
}

三、实际测试

1.静止测试

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

2.动态测试

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

四、总结

缺点:

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

改进(有时间再弄):

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

五、获取工程源码

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

  • 20
    点赞
  • 264
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值