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

如何在Javascript中将RR(IBI)数据转换为心率?求技术指引

解决RR(IBI)转心率的JavaScript方案

嘿,我来帮你搞定这个RR间期转心率的问题!其实核心逻辑很简单,咱们一步步来:

核心转换逻辑

RR(IBI)是两次心跳之间的毫秒间隔,心率是每分钟的心跳次数,所以转换公式很直接:

心率(bpm)= 60000 / RR值(毫秒)

举个例子,你的示例里第一个值是679毫秒,计算下来就是 60000 / 679 ≈ 88.4 bpm。

基础JavaScript实现

如果你只是需要把整个RR数组转换成对应的心率数组,直接遍历计算就行,这里给你写好可用的代码:

// 单个RR值转心率(保留1位小数,避免结果太零散)
function rrToHeartRate(rrMs) {
  // 处理无效值(比如RR为0或负数,避免除以0错误)
  if (rrMs <= 0) return 0;
  return Math.round((60000 / rrMs) * 10) / 10;
}

// 批量转换RR数组为心率数组
function rrArrayToHeartRates(rrArray) {
  return rrArray.map(rr => rrToHeartRate(rr));
}

// 示例使用
const rrData = [679, 686, 650];
const heartRates = rrArrayToHeartRates(rrData);
console.log(heartRates); // 输出: [88.4, 87.5, 92.3]

更平滑的心率计算(滑动窗口)

单个RR值计算的心率可能波动很大(比如呼吸、运动都会影响),如果需要更稳定的结果,可以用滑动窗口取最近N个RR的平均值再计算心率,比如取最近3个:

// 滑动窗口计算平滑心率,windowSize可自定义(默认3个RR值)
function slidingWindowHeartRate(rrArray, windowSize = 3) {
  const heartRates = [];
  for (let i = 0; i < rrArray.length; i++) {
    // 确保窗口不会超出数组开头
    const startIdx = Math.max(0, i - windowSize + 1);
    // 截取当前窗口内的RR值
    const windowRr = rrArray.slice(startIdx, i + 1);
    // 计算窗口内RR的平均值
    const avgRr = windowRr.reduce((sum, rr) => sum + rr, 0) / windowRr.length;
    // 转成心率并存入结果
    heartRates.push(rrToHeartRate(avgRr));
  }
  return heartRates;
}

// 示例使用
const smoothedRates = slidingWindowHeartRate(rrData);
console.log(smoothedRates); // 输出: [88.4, 87.9, 89.4]

几个注意点

  • 单位确认:确保你的RR数据是毫秒级的,如果是秒级的话,直接用 60 / RR值 计算就行。
  • 无效值处理:一定要过滤掉RR为0或负数的情况,不然会出现除以0的错误或者不合理的心率值。
  • 窗口大小调整:如果需要实时性强的心率,窗口可以设为2-3;如果要更稳定的长期心率,窗口可以设为5-10。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:04:53