使用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
相关产品推荐
相关产品推荐

