calculateBaselineFHRDR method

List<int> calculateBaselineFHRDR()

Calculates the baseline fetal heart rate (FHR) using Dawes-Redman criteria.

Returns a list of baseline FHR values.

Implementation

List<int> calculateBaselineFHRDR() {
  int size = millisecondsEpoch.length;

  baselineFHRDR = List.filled(size, null, growable: false);

  int buckets = 1001, modeIndex = 0;
  List<int?> freq = List.filled(buckets, null, growable: false);
  int? mode = 0,
      sumOfValues = 0,
      limitingValue = 0; // 60-220 bpm = 1000-272 ms

  /** calculate frequency distribution of intervals**/
  for (int i = 0; i < buckets; i++) {
    freq[i] = 0;
  }
  for (var epoch in millisecondsEpoch) {
    if (epoch == 0 || epoch! >= buckets) {
      freq[0] = freq[0]! + 1;
    } else {
      freq[epoch] = freq[epoch]! + 1;
    }
    /*for (int i = 0; i < buckets; i++) {
              if (Math.round(beat) == (double) i) {
                  freq[i]++;
              }
          }*/
  }

  /** calculate peak frequency or mode **/
  for (int i = 1; i < buckets - 1; i++) {
    if (freq[i]! > mode!) {
      mode = freq[i];
      modeIndex = i;
    }
  }

  int peak = 0;
  /** calculate limiting parameter **/
  for (int i = buckets - 1; i >= 5; i--) {
    if (sumOfValues! > (0.125 * (size - freq[0]!))) {
      if (freq[i]! >= freq[i - 5]! &&
          freq[i]! >= freq[i - 4]! &&
          freq[i]! >= freq[i - 3]! &&
          freq[i]! >= freq[i - 2]! &&
          freq[i]! >= freq[i - 1]!) {
        if (freq[i]! > 0.005 * size || (modeIndex - i) <= 30) {
          limitingValue = i;
          peak = i;
          break;
        }
      }
    }
    sumOfValues += freq[i]!;
  }

  if (limitingValue == 0) limitingValue = modeIndex;

  /** apply band filter with the use of limiting value **/
  baselineFHRDR![0] = millisecondsEpoch[0];
  for (int i = 1; i < size - 1; i++) {
    if (millisecondsEpoch[i] == 0) {
      baselineFHRDR![i] =
          millisecondsEpoch[i]; //avgLastMin(baselineFHRDR, i - 1);;

    } else {
      if (millisecondsEpoch[i]! >= (limitingValue! - 60) &&
          millisecondsEpoch[i]! <=
              (limitingValue + 60)) {
        // 60 is given in the literature
        baselineFHRDR![i] = millisecondsEpoch[i];
      } else {
        baselineFHRDR![i] = baselineFHRDR![i -
            1]; //avgLastMin(baselineFHRDR, i - 1); //interpolate over previous values
      }
    }
    if (baselineFHRDR![i]!.isNaN) baselineFHRDR![i] = baselineFHRDR![0];
  }
  baselineFHRDR![size - 1] = avgLastMin(baselineFHRDR, size - 2);
  return convertBaselineEpochToBPMArrayList(baselineFHRDR!);
}