如何在Android平台从100Hz的PPG原始数据中提取心率
在Android平台从100Hz PPG原始数据提取心率的方法
一、通用处理流程
1. 数据预处理
- 滤波降噪:PPG信号易受运动、环境干扰,需用高通滤波器(截止频率0.5Hz)去除基线漂移,低通滤波器(截止频率10Hz)滤除高频噪声。Android上可通过Java/Kotlin手动实现IIR/FIR滤波器,计算滤波系数后对数据逐点处理。
- 归一化:消除个体差异,将数据缩至[0,1]范围,公式:
归一化值 = (原始值 - 数据最小值) / (数据最大值 - 数据最小值)。
2. 波峰提取
PPG的波峰对应心脏收缩期,是计算心率的核心依据:
- 滑动窗口法:因采样率100Hz,设置2-3秒的滑动窗口(200-300个数据点),遍历窗口内数据,标记局部最大值为波峰,同时约束相邻波峰的间隔在40-150个点之间(对应心率40-150BPM),过滤异常值。
- 阈值法:先计算数据均值,设定高于均值的阈值,当数据点超过阈值且前后相邻点均小于它时,判定为波峰,同样加入间隔约束。
3. 心率计算与平滑
- 统计连续N个有效波峰的间隔,取平均间隔T(单位:秒,T = 间隔点数 / 100),心率 = 60 / T。
- 滑动平均平滑:对最近3-5次计算的心率结果取平均值,减少实时数据的波动。
4. Android平台实现要点
- 保证采样率稳定:通过传感器回调的时间戳校准采样间隔,避免丢包导致的时间误差。
- 后台处理:将信号处理逻辑放在
Coroutine或子线程中,避免阻塞UI线程。 - 增量更新:实时处理时采用滑动窗口增量更新,无需每次重新处理全部历史数据。
二、针对给定PPG数据的心率计算
给定数据共100个点,对应1秒的采样数据,样本量偏小且存在局部噪声,直接计算的心率可靠性较低,处理步骤如下:
1. 预处理
- 先提取数据极值:最小值为924419,最大值为933289,可通过归一化缩小数据范围,便于波峰识别。
- 做移动平均滤波:比如对数据做3点或5点平均,平滑局部噪声,例如
滤波后值 = (当前点 + 前1点 + 后1点) / 3。
2. 波峰识别
遍历平滑后的数据,标记局部最大值:
- 初步识别到的波峰位置为第24、62、88个点,但相邻波峰的间隔(38点、26点)对应的心率远超正常范围(150-230BPM),说明数据存在异常噪声或仅包含部分心脏周期。
3. 结论与建议
这段1秒的数据不足以计算可靠心率,建议采集至少5-10秒的连续PPG数据后,按照上述通用流程处理。若必须使用现有数据,需过滤间隔异常的波峰,仅保留符合40-150点间隔的有效波峰,再计算平均间隔得到心率,但结果仅供参考。
内容的提问来源于stack exchange,提问作者Crow ForKotlin
相关产品推荐
相关产品推荐

