前言
本章介绍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.动态测试
手指贴在传感器上滑动,多次测试如下:
四、总结
缺点:
- 抗干扰性很差,几乎等于没有;
- 舍弃了一部分数据(间隔的周期没有测到);
- 准确度不高;
改进(有时间再弄):文章来源:https://www.toymoban.com/news/detail-437732.html
- 在上一章滤波中使用带通滤波器,去除0.5Hz以下的频率成分;
- 增加平均值滤波的次数;
- 使用其它滤波方法(去除最大最小值或者去除不合理数据等);
五、获取工程源码
关注下方公众号,回复 “MAX30102V3” 获取源码;若有疑问,请在公众号回复“交流群”,进群一起讨论分享!
文章来源地址https://www.toymoban.com/news/detail-437732.html
到了这里,关于MAX30102脉搏血氧仪和心率传感器(三)心率计算——时域法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!