calculateSignalLossPercent method

double? calculateSignalLossPercent(
  1. List<int> beats,
  2. List<int> baselineFHRDR
)

Signal loss %

  1. calculate area under all deaccelerations (number of lost beats)
  2. add them up
  3. calculate % of those beats against total beats

TODO: How to consider parallel scanning of signal for deaccelerations and processing? Are we loosing some part of signal here?

Implementation

double? calculateSignalLossPercent(List<int> beats, List<int> baselineFHRDR) {
  int size = beats.length;

  int counter1 = 0, counter2 = 0;
  List<int?> beatsBpm = List.filled(size, null, growable: false);
  double noOfBeatsLost = 0, totalBeats = 0;

  for (int j = 0; j < size; j++) {
    if (beats[j] != 0) {
      beatsBpm[j] = (SIXTY_THOUSAND_MS / beats[j]).truncate();
    } else {
      beatsBpm[j] = 0;
    }
  }

  for (int i = 0; i < size; i++) {
    /** first criteria **/
    if (SIXTY_THOUSAND_MS / baselineFHRDR[i] - beatsBpm[i]! >= 5) {
      counter1++;
      if (counter1 == 16) {
        // 60 seconds = 16 samples

        for (int j = 0; j < counter1; j++) {
          noOfBeatsLost += baselineFHRDR[i - j] - beatsBpm[i - j]!;
          totalBeats += baselineFHRDR[i - j];
        }
      }

      if (counter1 > 16) {
        noOfBeatsLost += baselineFHRDR[i] - beatsBpm[i]!;
        totalBeats += baselineFHRDR[i];
      }
    } else {
      counter1 = 0;
    }

    /** second criteria **/
    if (SIXTY_THOUSAND_MS / baselineFHRDR[i] - beatsBpm[i]! >= 10) {
      counter2++;
      if (counter2 == 8) {
        // 30 seconds = 8 samples

        for (int j = 0; j < counter2; j++) {
          noOfBeatsLost += baselineFHRDR[i - j] - beatsBpm[i - j]!;
          totalBeats += baselineFHRDR[i - j];
        }
      }

      if (counter2 > 8 && counter2 < 16) {
        noOfBeatsLost += baselineFHRDR[i] - beatsBpm[i]!;
        totalBeats += baselineFHRDR[i];
      }
    } else {
      counter2 = 0;
    }
  }

  if (totalBeats != 0) {
    signalLossPercent = noOfBeatsLost * 100 / totalBeats;
  } else {
    signalLossPercent = 0;
  }
  return signalLossPercent;
}