About the numbers on this page
All numbers below are test results measured by actually running the C reference implementation on a PC. The inputs are records from public ECG databases (MIT · NST · CU · VFDB) and synthetic signals (synthetic 60 Hz noise, synthetic muscle noise, synthetic pacemaker pulses, synthetic 4-lead). These are not values measured on a real device or a real person.
- Training, thresholds and rule selection were done only on inner data excluding the test DB (split by DB group; beat classification is split between patients).
- What did not work well and what failed are recorded as-is. This is not yet a stage that can be called a pass.
- MCU computation time is an estimate converted from measurements on a Mac; not yet measured on an actual MCU board.
| Term | Meaning (on this page) |
|---|---|
| Se / +P | Detection sensitivity (fraction of reference events caught) / positive predictivity (fraction of detections that were correct) |
| VF · VT | Ventricular fibrillation · ventricular tachycardia alarm conditions |
| False alarms /h | Number of alarms not overlapping the reference, divided by record time (per hour) |
| MIT · NST · CU · VFDB | ECG database sets used for testing (NST = noise stress test records) |
1. At a glance (round 4 — reducing false alarms)
The goal (reduce false alarms without increasing misses) was only half achieved. VF false alarms decreased, but misses of short VF fragments increased, VT false alarms did not decrease, and separating VF from VT failed.
- VF false alarms: CU 61 → 44 (12.6 → 9.1 per hour, −28 %), VFDB 183 → 136 (14.3 → 10.6, −26 %). Almost all of the reduction came from the alarm confirmation rule (3 consecutive seconds → 4 consecutive seconds). MIT · NST 0, as in round 3
- VF of 8 s or longer caught within 9 s: CU 45/47, VFDB 27/27, MIT 3/4 (same as round 3). Median delay CU 3.7 → 4.7 s, VFDB 3.8 → 3.8 s
- Where misses increased: short fragments under 8 s. Over all episodes CU 47 → 46/47, VFDB 105 → 96/111, MIT 4 → 3/6
- Separating VF and VT: failed. Even with 6 new features, AUC 0.44~0.61 when measured with record-wise splits — chance level. Since both are high priority, alarming as a single "lethal arrhythmia (VF/VT)" and keeping the name as reference only is what the current data allows
- VT false alarms: not reduced. NST 24.8 → 27.1, CU 14.8 → 17.0, VFDB 21.8 → 20.0, MIT 0.8 → 0.7 per hour. In exchange, VT of 5 beats or more in MIT is caught 5 → 8/11
- Lethal arrhythmia alarm (VF ∪ VT) false alarms: MIT 0.8 → 0.8, NST 23.9 → 26.1, CU 21.7 → 20.7, VFDB 18.3 → 17.0 per hour
- Beat classification V: LDA → stump boosting. DS1 V Se 66.6 → 86.3 %, +P 85.5 → 85.8 %. DS2 Se 86.8 → 96.5, +P 82.9 → 77.3 (+P went down)
- Asystole muscle noise 150 µV: fraction of time alarm on in synthetic muscle noise 17 → 87 %. Real muscle-noise records (NST ma) unchanged (on fraction 21 %)
- Synthetic 4-lead: with motion noise on the RA electrode only, VT false alarms 1-lead 11.4 → 2-lead 6.8 → 4-lead 2.9 per hour
- MCU computation (estimate): measured on Mac 168 µs (2-lead) · 318 µs (4-lead) per 1 s of signal. Converted to Cortex-M7 800 MHz, load 0.5~0.9 % (2-lead) — estimate. Double-precision FPU required
2. Dual adaptive notch (removing 60 Hz mains noise)
The notch built in round 2 (v2) is used unchanged through round 4. Below are the round-2 test results (synthetic signals, same signals · same random seed as the round-1 test, first 10 s excluded).
2.1 What changed (round 1 → round 2)
- 40 Hz 4th-order high-pass filter on the estimator input + estimator delay 400 ms
- All leads share one frequency estimator (default)
- Goertzel initial search: 2 s window searching 58.0~62.0 Hz in 41 bins at 0.1 Hz steps. No adaptation before 60 Hz is first confirmed
- QRS slope gate + output-stage "QRS-freeze canceller": while a QRS passes, the weights are frozen and only a fixed sinusoid is subtracted. To engage the freeze before QRS onset, the output is delayed by 40 ms
2.2 Convergence · attenuation

- 20 µVp-p convergence: round 1 50.5~60.0 s → v2 canceller 5.3~10.1 s
- 100 µVp-p: 9.8~10.0 s → 3.0~5.0 s
- 1 mVp-p: 2.2 s → at frequencies other than 60.0 Hz, 2.9~4.7 s, slower than round 1 (because it waits for the first 2 s Goertzel block)
- 60 Hz attenuation: v2 canceller −56.6 ~ −71.8 dB, round-1 improved version −41.7 ~ −92.1 dB. At small 60 Hz v2 is deeper; at 100 µVp-p and above, round 1 is deeper in more cells
- With no 60 Hz present: round 1 drifted toward 58.16 Hz, v2 stays at 60.000 Hz · HOLD 99 %
- Step 60.0 → 60.2 Hz reconvergence 5.5 s (round 1 5.3 s)
2.3 Does the notch clip the ECG · ringing

| Mode | Waveform | Clipping peak µV round 1 | v2 canceller | Ringing µV round 1 | v2 canceller |
|---|---|---|---|---|---|
| Monitor | Normal QRS | 15.6 | 0.1 | 1.9 | 0.1 |
| Monitor | Narrow QRS | 50.9 | 0.8 | 33.8 | 0.8 |
| Monitor | Triangle 20 ms | 51.4 | 1.0 | 43.0 | 1.0 |
| Diagnostic | Normal QRS | 7.8 | 0.0 | 0.9 | 0.0 |
| Diagnostic | Narrow QRS | 25.5 | 0.9 | 16.9 | 0.9 |
| Diagnostic | Triangle 20 ms | 26.1 | 1.1 | 21.7 | 1.1 |
- Clipping is determined by the output stage. Switching to the canceller gives normal QRS 0.0~0.1 µV, narrow QRS 0.8~0.9 µV, triangle 20 ms 1.0~1.1 µV
- The cost is that the entire on-screen waveform is delayed by 40 ms
- On narrow QRS, v2 also has an estimated-frequency bias of −6.4 ~ −8.6 mHz and never met the "5 mHz" convergence criterion (round 1 also −6.4 ~ −8.3 mHz)
- lead III residual ε = RMS(II − I − III)/RMS(II): shared estimator 0.48~0.49 % (within the criterion ≤ 1 %)
- With a 300 mV electrode DC offset applied, the IIR notch (round-1 structure) was off by up to 88 µV, while the canceller was 0.59 µV, independent of the offset
3. QRS detection, rounds 1~4 compared
Beat-by-beat scoring was done with WFDB bxb. From round 2 on, values are cross-validated (measured on groups not seen during selection). Round-4 beat positions do not differ from round 3 by a single sample (checked on all records of the 4 DBs).
| QRS Se / +P % | Round 1 | Round 2 A cross | Round 3 | Round 4 |
|---|---|---|---|---|
| MIT 48 | 99.80 / 99.14 | 99.61 / 99.52 | 99.61 / 99.51 | 99.61 / 99.51 |
| NST 12 | 96.85 / 79.23 | 94.95 / 86.97 | 94.91 / 87.23 | 94.91 / 87.23 |
| CU 35 | 95.85 / 86.43 | 92.94 / 91.70 | 93.93 / 92.93 | 93.93 / 92.93 |
- In round 2 false detections decreased and misses increased (the adaptive threshold cut Se)
- Detection delay (round 2, MIT 48): confirmed detection median 278 ms. A separate fast detection for display makes the heart blink at median 36 ms after R (95 % 66 ms). The fast detection is less accurate than the confirmed detection on MIT, Se 97.37 · +P 99.90
- Pacemaker (round 2, synthetic): external flag (mimicking pace detection inside the AFE chip — assuming the chip catches pulses perfectly) + blanking + tail correction gave correct HR in all 144 synthetic conditions. The 500 SPS software detection caught only pulses with area of 5 mV·ms or more, and caught no pulses at all in MIT 102 · 104 · 107 · 217
4. VF · VT false alarms
4.1 Can VF and VT be separated — failed
A "VF vs VT" boosting was measured with 6,432 VF windows · 5,044 VT windows using 5-fold record grouping (the same record never appears in both training and test).
| Features | AUC | VFDB VT→VF % (P≥0.5) | VFDB VF retained % | CU VT→VF % | MIT VT→VF % |
|---|---|---|---|---|---|
| Round-3 window features | 0.522 | 56.9 | 54.8 | 50.0 | 2.2 |
| Round-4 window features | 0.442 | 58.4 | 40.9 | 35.7 | 0.0 |
| Beat-based | 0.613 | 49.5 | 53.9 | 57.1 | 4.3 |
| Window (round 4) + beat | 0.491 | 55.4 | 37.7 | 57.1 | 1.1 |
AUC near 0.5 means "cannot separate". No stage was added to call VT separately inside the VF alarm. The fraction of VFDB VT windows called VF: round 3 69.6 % → round 4 74.9 %.
4.2 Alarm confirmation rule
VF alarm = turns on if P ≥ threshold for at least k seconds of the last m seconds and the current second is also ≥ threshold; turns off if less than 3 consecutive seconds. Round 3 used k = m = 3. Defaults were chosen on inner data (the outer test groups were not used).

| DB | k/m | Episodes | 8 s+ | 8 s+ within 9 s | Median delay s | Max s | False alarms | /h |
|---|---|---|---|---|---|---|---|---|
| CU | 3/3 | 47/47 | 47/47 | 45 | 3.7 | 22.7 | 61 | 12.60 |
| CU | 4/4 | 46/47 | 46/47 | 45 | 4.7 | 127.7 | 44 | 9.09 |
| CU | 5/5 | 46/47 | 46/47 | 44 | 5.7 | 128.7 | 35 | 7.23 |
| VFDB | 3/3 | 100/111 | 27/27 | 27 | 2.8 | 6.2 | 178 | 13.94 |
| VFDB | 4/4 | 96/111 | 27/27 | 27 | 3.8 | 7.2 | 136 | 10.65 |
| VFDB | 5/5 | 92/111 | 26/27 | 26 | 5.3 | 8.1 | 102 | 7.99 |
| MIT | 3/3 | 4/6 | 3/4 | 3 | 6.2 | 7.3 | 0 | 0.00 |
| MIT | 4/4 | 3/6 | 3/4 | 3 | 7.2 | 8.3 | 0 | 0.00 |
| MIT | 5/5 | 3/6 | 3/4 | 2 | 8.2 | 9.3 | 0 | 0.00 |
4.3 VF false alarms — round 3 vs round 4

| DB | Version | Window Se % | Window Sp % | Episodes | 8 s+ | Median delay | False alarms | /h |
|---|---|---|---|---|---|---|---|---|
| MIT | Round 3 | 81.97 | 100.00 | 4/6 | 3/4 | 6.2 | 0 | 0.00 |
| MIT | Round 4 | 81.15 | 100.00 | 3/6 | 3/4 | 6.5 | 0 | 0.00 |
| CU | Round 3 | 73.91 | 94.31 | 47/47 | 47/47 | 3.7 | 61 | 12.60 |
| CU | Round 4 | 73.91 | 94.31 | 46/47 | 46/47 | 4.7 | 44 | 9.09 |
| VFDB | Round 3 | 94.00 | 94.17 | 105/111 | 27/27 | 3.8 | 183 | 14.33 |
| VFDB | Round 4 | 94.82 | 93.33 | 96/111 | 27/27 | 3.8 | 136 | 10.65 |
Window Se/Sp are based on the threshold before the confirmation rule, so they are almost the same as round 3. False alarms decreased because of the confirmation rule, not the model. What was missed was mainly short fragments under 8 s (9 fragments of 1.1~2.3 s in VFDB 419, 6.8 s in 422, 5.9 s in MIT 207).
4.4 VT alarm re-confirmation — not enabled by default
VT alarm = 5 consecutive V · 100 bpm or more. 768 candidate cells re-confirming by other-lead agreement · morphology agreement · noise suspicion · run length · rate were selected on inner data.

| DB | Version | 5 beats+ (VFDB 3 s+) | False alarms | /h |
|---|---|---|---|---|
| MIT | Round 3 | 5/11 | 19 | 0.8 |
| MIT | Round 4 default | 8/11 | 18 | 0.7 |
| NST | Round 3 | 0/0 | 149 | 24.8 |
| NST | Round 4 default | 0/0 | 163 | 27.1 |
| CU | Round 3 | 4/4 | 73 | 14.8 |
| CU | Round 4 default | 4/4 | 84 | 17.0 |
| VFDB | Round 3 | 35/64 | 280 | 21.8 |
| VFDB | Round 4 default | 34/64 | 257 | 20.0 |
| VFDB | Round 4 re-confirm | 24/64 | 42 | 3.3 |
Lead agreement (per beat) almost eliminates NST false alarms, 27.1 → 3.3/h, but misses VFDB VT, 34 → 26/64. Morphology agreement · run length · rate all went the same direction (false alarms ↓ · VFDB misses ↑). So the round-4 default is re-confirmation off (the side that does not increase misses).
4.5 Treating the lethal arrhythmia alarm (VF ∪ VT) as one

| DB | 3 s+ VF/VT caught round 3 | Round 4 default | False alarms round 3 | Round 4 default |
|---|---|---|---|---|
| MIT | 9/15 | 9/15 | 18 (0.8/h) | 18 (0.8/h) |
| NST | 0/0 | 0/0 | 143 (23.9/h) | 156 (26.1/h) |
| CU | 51/51 | 51/51 | 105 (21.7/h) | 100 (20.7/h) |
| VFDB | 103/122 | 102/122 | 234 (18.3/h) | 217 (17.0/h) |
Calling VT as VF is not a false alarm in this table.
5. Alarm delay (10 s total target)
"Condition delay + signal generation delay ≤ 10 s" was also set as the target for VF · VT (proposal). Signal generation delay (sound · screen) does not exist yet and could not be measured, so 1 s was reserved and a condition delay of 9 s was used as the baseline (proposal).
| Alarm | What creates the delay | Median delay s (round 4) | Within 9 s (8 s+) |
|---|---|---|---|
| VF | Feature window 4 s + confirmation 4 consecutive seconds + 1 s decision cycle | CU 4.7 · VFDB 3.8 · MIT 6.5 | CU 45/47 · VFDB 27/27 · MIT 3/4 |
| VT | 5 consecutive V + classification lags by 1 beat | MIT 1.7 · CU 1.5 · VFDB 2.5 | — |
| Asystole | No beat for 4 s + 1 s decision cycle | Synthetic 4 s (13 test types) | Synthetic muscle noise 150 µV 8/8 (within 10 s) |
| Lead-off | 1 s window | 1 s | — |
6. Asystole — countermeasure for 150 µV muscle noise
The asystole timer resets to 0 every time a beat arrives. In round 4, only "trustworthy beats" (amplitude / rms above 40 Hz ≥ 6) reset the timer (selected on the training half). Beat output (HR calculation) is left unchanged; this is used only for asystole.

| Noise | Version | 50 µV | 100 µV | 150 µV | 200 µV | 300 µV |
|---|---|---|---|---|---|---|
| Synthetic · independent per lead | Round 3 | 8/8 · 87 % · false 0 s | 8/8 · 71 % · false 0 s | 8/8 · 17 % · false 0 s | 8/8 · 17 % · false 0 s | 8/8 · 13 % · false 0 s |
| Synthetic · independent per lead | Round 4 | 8/8 · 87 % · false 0 s | 8/8 · 87 % · false 0 s | 8/8 · 87 % · false 0 s | 8/8 · 88 % · false 0 s | 8/8 · 88 % · false 133 s |
| Synthetic · 70 % common | Round 3 | 8/8 · 85 % · false 0 s | 8/8 · 62 % · false 0 s | 8/8 · 16 % · false 0 s | 8/8 · 14 % · false 0 s | 7/8 · 11 % · false 2 s |
| Synthetic · 70 % common | Round 4 | 8/8 · 85 % · false 0 s | 8/8 · 87 % · false 0 s | 8/8 · 85 % · false 0 s | 8/8 · 86 % · false 0 s | 8/8 · 86 % · false 109 s |
| Real ma | Round 3 | 8/8 · 41 % · false 0 s | 4/8 · 18 % · false 0 s | 4/8 · 21 % · false 0 s | 2/8 · 7 % · false 0 s | 3/8 · 9 % · false 0 s |
| Real ma | Round 4 | 8/8 · 43 % · false 0 s | 4/8 · 18 % · false 0 s | 4/8 · 21 % · false 0 s | 2/8 · 7 % · false 0 s | 3/8 · 10 % · false 0 s |
Cell = number of records alarmed within 10 s of the asystole event · fraction of time alarm on during 30 s of asystole · total false asystole seconds over 8 records with no event
- Real muscle noise (ma) was not solved. Real muscle noise has much energy at 1~30 Hz and cannot be separated from QRS by frequency
- With 300 µV synthetic noise + normal ECG, new false asystole appeared (independent per lead 3/8 records 133 s, common 4/8 records 109 s). Up to 150 µV, 0 s
- Re-running the 13 round-3 synthetic types with round 4, only "muscle noise 150 µV" changed (on fraction 21 → 87 %). The other 12 types (flat · P wave only · lead-off etc.) have the same alarm type · delay as round 3
7. Beat classification V — inter-patient split kept
The classifier was changed from LDA (round 3) to per-class stump boosting (64 · 128 stumps). Selection used only the inner 4 folds, and no record was measured with a model trained on its own beats.

| Group | V Se round 3 | Round 4 | V +P round 3 | Round 4 | V false round 3 | Round 4 |
|---|---|---|---|---|---|---|
| DS1 22 (trained on DS2) | 66.61 | 86.34 | 85.47 | 85.83 | 364 | 458 |
| DS2 22 (trained on DS1) | 86.82 | 96.46 | 82.90 | 77.25 | 481 | 763 |
| MIT 44 (paced excluded) | 75.81 | 90.95 | 84.11 | 81.46 | 845 | 1221 |
| Paced 4 (trained on MIT 44) | 31.34 | 36.82 | 19.69 | 20.00 | 257 | 296 |
| NST 12 (trained on DS2) | 77.90 | 89.96 | 33.94 | 36.18 | 3429 | 3589 |
- DS1 V Se rose 66.6 → 86.3 % and +P did not drop. Instead DS2 +P went 82.9 → 77.3 % and NST V false increased 3,429 → 3,589, which led to the increase in VT false alarms
- Consecutive ectopic beats (MIT 44): couplet Se/+P 36.0/69.5 → 54.5/69.8 %
- The first attempt (LDA + new morphology features + patient-adaptive normalization) actually lowered DS1 V Se to 54.4 %. After that, classifier type was added to the selection candidates — that is, the candidates were expanded after seeing the test results once
8. Synthetic 4-lead (I · II · III · V) electrode noise
4 leads were approximately synthesized from the two channels of 20 MIT records (I = III = 0.5·II approximation), and real electrode motion noise (em) was cut from different segments for each electrode and added to RA · LA · LL · V.

| Noise | Leads | QRS Se | +P | V Se | V +P | VT (5 beats+ · false/h) |
|---|---|---|---|---|---|---|
| No noise | 1-lead II | 99.54 | 99.84 | 89.8 | 88.6 | 3/7 · 1.5 |
| No noise | 4-lead | 99.27 | 99.68 | 89.0 | 86.5 | 4/7 · 1.2 |
| RA only 0.3 mV | 1-lead II | 98.85 | 96.12 | 80.7 | 36.2 | 4/7 · 11.4 |
| RA only 0.3 mV | 2-lead II·V | 97.42 | 97.97 | 75.0 | 41.9 | 4/7 · 6.8 |
| RA only 0.3 mV | 4-lead | 99.26 | 99.67 | 76.9 | 48.8 | 5/7 · 2.9 |
| All four electrodes 0.15 mV | 1-lead II | 99.27 | 99.53 | 85.7 | 63.6 | 3/7 · 2.0 |
| All four electrodes 0.15 mV | 4-lead | 98.26 | 99.09 | 79.9 | 59.6 | 3/7 · 2.8 |
- RA noise does not enter III (LL−LA), so SQI selects that lead. When all four electrodes moved, the number of leads did not help
- This synthesis makes I · III scaled-down copies of II, so morphology differences between leads are smaller than in reality. It must be re-measured with real multi-lead records or device signals
9. MCU computational load (Mac measurement → estimated conversion)
The C reference implementation was run 5 times on a Mac (Apple M6, clang -O2) with MIT 207 30 minutes (2-lead) and the synthetic 4-lead of the same record. The Cortex-M7 values are estimates (assuming the same instruction count, CPI 0.8~1.5, 800 MHz).
| Configuration | Mac µs / 1 s of signal | Instructions M / 1 s of signal | M7 800 MHz ms / 1 s (estimate) | Load % (estimate) | 1 s block max ms (estimate) |
|---|---|---|---|---|---|
| 2-lead | 167.9 | 4.54 | 4.5~8.5 | 0.45~0.85 | 6.0~11.2 |
| 4-lead | 317.7 | 8.67 | 8.7~16.3 | 0.87~1.63 | 10.4~19.5 |
- Cortex-M7 build check: static floating-point instructions f32 3,263 · f64 802 → it must be an M7 with a double-precision FPU. Code .text 68 KB
- RAM (estimate): 2-lead 117 KB · 4-lead 187 KB
- Because the 1 s block (VF features: 5 × 1024-point FFT per lead, etc.) runs all at once, incoming samples (500 SPS) during that time must be buffered via DMA · FIFO (design item, not yet measured)
10. Rounds 1~4 compared
| Item | Round 1 | Round 2 | Round 3 | Round 4 |
|---|---|---|---|---|
| VF false alarms /h (CU · VFDB) | — | — | 12.6 · 14.3 | 9.1 · 10.6 |
| 8 s+ VF within 9 s (CU · VFDB) | — | — | 45/47 · 27/27 | 45/47 · 27/27 |
| All VF episodes (CU · VFDB · MIT) | — | — | 47 · 105 · 4 | 46 · 96 · 3 |
| VT false alarms /h (NST · CU · VFDB) | — | — | 24.8 · 14.8 · 21.8 | 27.1 · 17.0 · 20.0 |
| Lethal alarm false alarms /h (NST · CU · VFDB) | — | — | 23.9 · 21.7 · 18.3 | 26.1 · 20.7 · 17.0 |
| V Se / +P % DS1 | No classification | No classification | 66.6 / 85.5 | 86.3 / 85.8 |
| V Se / +P % DS2 | No classification | No classification | 86.8 / 82.9 | 96.5 / 77.3 |
| Asystole muscle noise 150 µV (synthetic · real ma, % on) | — | — | 17 · 21 | 87 · 21 |
| MCU computation (M7 800 MHz, 2-lead) | — | — | Not measured | 0.5~0.9 % (estimate) |
11. Limitations · not yet verified
- Separating VF and VT failed (AUC ≈ 0.5). Whether to name the alarm as a single "VF/VT" is undecided
- VT false alarms NST 27.1 · CU 17.0 · VFDB 20.0 per hour. Every re-confirmation rule caused VFDB VT to be missed
- More VF fragments under 8 s are missed (VFDB 9 · MIT 1). Whether to alarm on fragments that end quickly is undecided
- Asystole missed in real muscle noise (ma). New false asystole with 300 µV synthetic noise
- DS2 V +P 77.3 % (round 3 82.9), paced records V +P 20.0 %; other beats (SVEB etc.) were not addressed
- Notch: 1 mVp-p convergence is slower than round 1, and frequency estimate bias −6~−9 mHz on narrow QRS. Must be re-measured with a real simulator · real AFE noise
- MCU time is an estimate converted from Mac measurements. Not yet measured on an actual M7 board. Alarm signal generation delay (sound · screen) also not yet measured
- The confirmation rule · trustworthy-beat threshold · ±120 ms etc. are all proposed values set during development, not confirmed specifications