本帖最后由 imxuheng 于 2021-1-23 14:59 编辑
使用MAX30100原始数据计算心率值的简易方法
0 前言 手里有块MAX30100模块,最近找出来准备用它实现心率测量。网上的方法貌似都是采用傅里叶变换,奈何编程水平有限,所以没去尝试这种方法、 想到以前用对数、双对数、求导等方法处理数据,所以试着用这些方法处理心率adc数据,看看能不能找到突破口。 最终确定方法:计算原始心率adc数据变化量+一阶滤波+阈值设置
1 方法简介 计算原始心率adc数据变化量+一阶滤波+阈值设置。 就是将新的心率adc数据减去前一次心率adc数据得到新数据序列 使用软件编程实现普通硬件RC低通滤波器的功能。 本例中指对上一步得到的adc数据变化量进行一阶滤波。 一阶低通滤波的算法公式为(摘自“ 书生侠客”的博客): Y(n)=αX(n) + (1-α)Y(n-1) 式中:α=滤波系数;X(n)=本次采样值;Y(n-1)=上次滤波输出值;Y(n)=本次滤波输出值。 一阶低通滤波法采用本次采样值与上次滤波输出值进行加权,得到有效滤波值,使得输出对输入有反馈作用。 设置阈值x,adc数据变化量一阶滤波后的值小于该阈值x,就认为出现一次心跳。
2 数据处理 2.1 数据采集 读取数据的方法就不多说了,就是初始化传感器、然后IIC通信连续读取fifo四次。 使用串口接收adc数据画出实际波形,如图1所示。波形随心跳波动,波形总体也有波动
原始adc
图1 原始心率adc数据图
2.2 求取前后两次数据的差值 波形如图2所示,现在的数据波形已经很有规律,不再像原始adc波形那样整体都做波动。每次心跳对应的波形基本等高,波形中心基本在同一高度。
图2 原始心率adc变化量曲线
2.3 一阶滤波 实际是对adc数据变化量波形有较多的“毛刺”,如果直接用阈值判断是否为心跳信号,那么有可能误判,如图3所示,如果阈值取-20,那么就会有一次误判。进行一阶滤波后(这里取滤波系数α=0.1)波形变得光滑,将降低误判风险。 ,
图3 心率adc变化量一阶滤波曲线 2.4 设定阈值 实际编程时可对滤波结果进行放大,从而有利于阈值的合理设置。 图4 阈值设定示意图
3 验证 使用STC15W408AS最小系统软件模拟IIC读写max30100模块,程序见附件
程序中使用了两次一阶滤波,滤波系数0.1,阈值-5,自己按需确定滤波次数、滤波系数、阈值,效果自查
https://v.youku.com/v_show/id_XN ... 5!2~5~5!3~5!2~5~5~A[/media]
|