赞
踩
本章介绍PPG信号的心率计算方法——时域法。基本思想是计算动态阈值曲线,利用波形与曲线相交来确定PPG信号的周期。
如下图,当PPG波形在相同的位置两次经过动态阈值曲线的交点时,这段时间的间隔就能认为是PPG的一个周期,根据此周期即可求出心率。动态阈值曲线的某一点的值为前面若干个周期内的点的平均值。
只有在达到阈值(皮肤接近传感器)后,才开始心率计算,否则计算无意义。
#define PPG_DATA_THRESHOLD 100000 //根据实际情况进行设置
if(ppg_raw_data[1] > PPG_DATA_THRESHOLD) {...} //阈值检测
else {...} //没有达到阈值,计数清零
经过测试,当达到阈值后,也就是皮肤刚刚接触到传感器时,会有一段不稳定的时间段。所以尽可能地丢弃这段数据。
wave_stable_counter++;
if(wave_stable_counter>=WAVE_STABLE_NUMS) //等待波形稳定{...}
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; //求平均数
这一步比较复杂,主要利用了波形的特征与阈值曲线的点进行比较。具体内容请看工程内的源码。
计时是用到了MCU的定时器,当定时器中断一次时,时间+若干毫秒,心率计算开始时清零。如下:
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if(htim->Instance == TIM2){
ppg_times +=10; //中断一次10ms
}
}
多次测试如下(经过了5次平均滤波),手指几乎静止贴在传感器上。大概8-10秒测量一次,这里取决于心率快慢。
手指贴在传感器上滑动,多次测试如下:
缺点:
改进(有时间再弄):
关注下方公众号,回复 “MAX30102V3” 获取源码;若有疑问,请在公众号回复“交流群”,进群一起讨论分享!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。