You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:52:11