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

使用HealthKit获取ECG数据时如何得到测量期间的用户平均心率

从Apple Watch ECG采样数据中获取平均心率的实现方案

方案1:直接读取系统预计算的平均心率(推荐)

无需手动处理原始ECG采样点,苹果官方已完成波形识别、异常过滤和心率计算,准确率更高,性能开销极小
HKElectrocardiogram类自带averageHeartRate属性,存储了本次ECG测量的平均心率,你可以在获取到ECG样本后直接读取,不需要解析原始采样数据:

// 拿到ECG样本后直接读取平均心率
guard let ecgSample = samples[counter] as? HKElectrocardiogram,
      let averageHeartRate = ecgSample.averageHeartRate?.doubleValue(for: HKUnit.count().unitDivided(by: HKUnit.minute())) else {
    // 处理心率获取失败的异常情况
    return
}
print("本次ECG平均心率:\(averageHeartRate) 次/分钟")

你可以修改原有代码的completion回调,把平均心率作为额外参数返回即可:

case .done:
    print("done")
    guard let ecgSample = samples[counter] as? HKElectrocardiogram,
          let averageHeartRate = ecgSample.averageHeartRate?.doubleValue(for: HKUnit.count().unitDivided(by: HKUnit.minute())) else {
        DispatchQueue.main.async {
            completion(ecgSamples, samples[counter].startDate, nil)
        }
        return
    }
    DispatchQueue.main.async {
        completion(ecgSamples, samples[counter].startDate, averageHeartRate)
    }

方案2:从原始ECG采样点手动计算平均心率

如果你有自定义计算需求,需要从你收集的ecgSamples数组中手动计算心率,可按以下步骤实现:

  • 先将ecgSamples按采样时间升序排序,保证时间序列正确:
    ecgSamples.sort { $0.1 < $1.1 }
    
  • 对ECG电压信号做预处理:使用带通滤波(推荐0.5~40Hz频段)去除基线漂移、工频干扰等噪声
  • 使用QRS波检测算法(常用Pan-Tompkins算法)识别所有R波的时间点
  • 计算相邻R波的时间差(R-R间期,单位为秒),过滤掉偏差过大的异常间期(如早搏、漏检导致的异常值)
  • 换算平均心率:平均心率 = 60 / 平均R-R间期,单位为次/分钟
    注意:手动计算对ECG信号质量要求极高,存在干扰、电极脱落等情况时准确率会远低于系统预计算结果,无特殊需求优先选择方案1

内容的提问来源于stack exchange,提问作者Osman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 18:36:03