calculateSignalLossPercent method
Signal loss %
- calculate area under all deaccelerations (number of lost beats)
- add them up
- 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;
}