Как преобразовать данные RR (IBI) в частоту сердечных сокращений в Javascript

Проведя некоторое исследование, я дошел до того, что решил обратиться за советом, поскольку я не уверен, что делать дальше.

Проблема:

У меня есть массив данных RR (IBI)

Пример: [679, 686, 650...]

Как я могу преобразовать это в частоту сердечных сокращений?

Мое исследование:

Мой подход, который, конечно, неисправен:

for (const ibiInMilliseconds of eventJSONObject.DeviceLog["R-R"].Data) {
      ibiBuffer.push(ibiInMilliseconds);
      const ibiBufferTotal = ibiBuffer.reduce((a, b) => a + b, 0);
      // If adding the ibi to the start of the activity is greater or equal to 2.5 second then empty the buffer there
      if ((lastDate.getTime() + ibiBufferTotal) >= lastDate.getTime() + 2500) {
        const average = ibiBuffer.reduce((total, ibi) => {
          return total + ibi;
        }) / ibiBuffer.length;

        const avg = 1000 * 60 / average; 
        // I save this avg to a 1s list but it's very error prone


        ibiBuffer = [];
        lastDate = new Date(lastDate.getTime() + ibiBufferTotal);
      }
    }

Я был бы признателен за любую помощь или указатели, где искать.

3 ответа

Решение

После многих испытаний и т. Д. Правильный ответ:

/** 
   * Converts the RR array to HR instantaneus (what user sees) 
   * @param rrData 
   * @return {any} 
   */ 
  public static convertRRtoHR(rrData): Map<number, number> { 
    let totalTime = 0; 
    return rrData.reduce((hrDataMap: Map<number, number>, rr) => { 
      totalTime += rr; 
      hrDataMap.set(totalTime, Math.round(60000 / rr)); 
      return hrDataMap; 
    }, new Map()); 
  } 

Я думаю, что на самом деле это проще:

 const hearbeats = [];

 let beatCount = 0;
 let time = 0;
 for(const ibi of ibis){
   time += ibi;
   beatCount++;
   if(time > 60 * 1000){
     hearbeats.push(beatCount);
     beatCount = time = 0;
   }
 }

(Отказ от ответственности: я понятия не имел, о чем я говорю)

До сих пор и из того, что я принял от @jonas W с фиксированным временем и переводом в удары в минуту (частота сердечных сокращений)

/**
   * Returns an Map of elapsed time and HR from RR data
   * @param rr
   * @param {number} sampleRateInSeconds
   * @return {number[]}
   */
  private static getHRFromRR(rr, sampleRateInSeconds?: number, smoothByAvg?: boolean): Map<number, number> {
    sampleRateInSeconds = sampleRateInSeconds || 10; // Use any second number
    const limit = sampleRateInSeconds * 1000;
    let totalTime = 0;
    let rrBuffer = [];
    return rr.reduce((hr, d) => {
      // add it to the buffer
      rrBuffer.push(d);
      // Increase total time
      totalTime += d;
      // Check if buffer is full
      const time = rrBuffer.reduce((a, b) => a + b, 0); // gets the sum of the buffer [300+600 etc]
      if (time >= limit) {
        if (smoothByAvg) {
          // @todo implement
        } else {
          hr.set(totalTime, rrBuffer.length * 60 / (time / 1000)); // convert to bpm
        }
        rrBuffer = [];
      }
      return hr;
    }, new Map());
  }
Другие вопросы по тегам