KOEN中HI
Development prototype record · not yet approved as a medical device · not for diagnosis

← EKG Development Record

Signal Processing Results

Dual adaptive notch · QRS detection · VF/VT alarms · asystole · beat classification · multi-lead · computational load (2026-10-11, up to round 4)

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.

TermMeaning (on this page)
Se / +PDetection sensitivity (fraction of reference events caught) / positive predictivity (fraction of detections that were correct)
VF · VTVentricular fibrillation · ventricular tachycardia alarm conditions
False alarms /hNumber of alarms not overlapping the reference, divided by record time (per hour)
MIT · NST · CU · VFDBECG 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.

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)

2.2 Convergence · attenuation

Notch convergence time — round 1 vs round 2
Convergence time — slowest value among 4 frequencies. The round-1 improved version takes 50~60 s at 20 µVp-p, v2 within 10 s. At 1 mVp-p v2 is slower

2.3 Does the notch clip the ECG · ringing

Notch clipping waveform comparison on a narrow QRS
Narrow QRS — round 1 (orange) leaves 60 Hz ringing after R for over 300 ms. The v2 canceller (blue) is flat
ModeWaveformClipping peak µV round 1v2 cancellerRinging µV round 1v2 canceller
MonitorNormal QRS15.60.11.90.1
MonitorNarrow QRS50.90.833.80.8
MonitorTriangle 20 ms51.41.043.01.0
DiagnosticNormal QRS7.80.00.90.0
DiagnosticNarrow QRS25.50.916.90.9
DiagnosticTriangle 20 ms26.11.121.71.1

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 1Round 2 A crossRound 3Round 4
MIT 4899.80 / 99.1499.61 / 99.5299.61 / 99.5199.61 / 99.51
NST 1296.85 / 79.2394.95 / 86.9794.91 / 87.2394.91 / 87.23
CU 3595.85 / 86.4392.94 / 91.7093.93 / 92.9393.93 / 92.93

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).

FeaturesAUCVFDB VT→VF % (P≥0.5)VFDB VF retained %CU VT→VF %MIT VT→VF %
Round-3 window features0.52256.954.850.02.2
Round-4 window features0.44258.440.935.70.0
Beat-based0.61349.553.957.14.3
Window (round 4) + beat0.49155.437.757.11.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).

Alarm confirmation rule k/m curve
Varying k/m on the test groups (curve for reporting — the defaults were set on inner data). 4/4 has fewer false alarms than 3/3 with the same number caught within 9 s. From 5/5 the number caught within 9 s starts to drop
DBk/mEpisodes8 s+8 s+ within 9 sMedian delay sMax sFalse alarms/h
CU3/347/4747/47453.722.76112.60
CU4/446/4746/47454.7127.7449.09
CU5/546/4746/47445.7128.7357.23
VFDB3/3100/11127/27272.86.217813.94
VFDB4/496/11127/27273.87.213610.65
VFDB5/592/11126/27265.38.11027.99
MIT3/34/63/436.27.300.00
MIT4/43/63/437.28.300.00
MIT5/53/63/428.29.300.00

4.3 VF false alarms — round 3 vs round 4

VF false alarms round 3 vs round 4
Where VF false alarms came from — round 3 (light color) and round 4 (dark color)
DBVersionWindow Se %Window Sp %Episodes8 s+Median delayFalse alarms/h
MITRound 381.97100.004/63/46.200.00
MITRound 481.15100.003/63/46.500.00
CURound 373.9194.3147/4747/473.76112.60
CURound 473.9194.3146/4746/474.7449.09
VFDBRound 394.0094.17105/11127/273.818314.33
VFDBRound 494.8293.3396/11127/273.813610.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.

VT false alarms and number of VT of 5 beats or more detected
VT false alarms and number of VT of 5 beats or more caught — re-confirmation increased misses in VFDB
DBVersion5 beats+ (VFDB 3 s+)False alarms/h
MITRound 35/11190.8
MITRound 4 default8/11180.7
NSTRound 30/014924.8
NSTRound 4 default0/016327.1
CURound 34/47314.8
CURound 4 default4/48417.0
VFDBRound 335/6428021.8
VFDBRound 4 default34/6425720.0
VFDBRound 4 re-confirm24/64423.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

Lethal arrhythmia alarm false alarms
False alarms of the combined high-priority VF and VT alarm (those not overlapping reference VF·VT within on −3 s ~ off +2 s)
DB3 s+ VF/VT caught round 3Round 4 defaultFalse alarms round 3Round 4 default
MIT9/159/1518 (0.8/h)18 (0.8/h)
NST0/00/0143 (23.9/h)156 (26.1/h)
CU51/5151/51105 (21.7/h)100 (20.7/h)
VFDB103/122102/122234 (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).

AlarmWhat creates the delayMedian delay s (round 4)Within 9 s (8 s+)
VFFeature window 4 s + confirmation 4 consecutive seconds + 1 s decision cycleCU 4.7 · VFDB 3.8 · MIT 6.5CU 45/47 · VFDB 27/27 · MIT 3/4
VT5 consecutive V + classification lags by 1 beatMIT 1.7 · CU 1.5 · VFDB 2.5—
AsystoleNo beat for 4 s + 1 s decision cycleSynthetic 4 s (13 test types)Synthetic muscle noise 150 µV 8/8 (within 10 s)
Lead-off1 s window1 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.

Fraction of time alarm on during 30 s of asystole
Fraction of time the alarm was on during 30 s of asystole — solved for synthetic noise, unchanged for real muscle noise
NoiseVersion50 µV100 µV150 µV200 µV300 µV
Synthetic · independent per leadRound 38/8 · 87 % · false 0 s8/8 · 71 % · false 0 s8/8 · 17 % · false 0 s8/8 · 17 % · false 0 s8/8 · 13 % · false 0 s
Synthetic · independent per leadRound 48/8 · 87 % · false 0 s8/8 · 87 % · false 0 s8/8 · 87 % · false 0 s8/8 · 88 % · false 0 s8/8 · 88 % · false 133 s
Synthetic · 70 % commonRound 38/8 · 85 % · false 0 s8/8 · 62 % · false 0 s8/8 · 16 % · false 0 s8/8 · 14 % · false 0 s7/8 · 11 % · false 2 s
Synthetic · 70 % commonRound 48/8 · 85 % · false 0 s8/8 · 87 % · false 0 s8/8 · 85 % · false 0 s8/8 · 86 % · false 0 s8/8 · 86 % · false 109 s
Real maRound 38/8 · 41 % · false 0 s4/8 · 18 % · false 0 s4/8 · 21 % · false 0 s2/8 · 7 % · false 0 s3/8 · 9 % · false 0 s
Real maRound 48/8 · 43 % · false 0 s4/8 · 18 % · false 0 s4/8 · 21 % · false 0 s2/8 · 7 % · false 0 s3/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

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.

Beat classification V Se +P round 3 round 4
V Se · +P (bxb, first 5 minutes excluded) — round-3 LDA and round-4 boosting
GroupV Se round 3Round 4V +P round 3Round 4V false round 3Round 4
DS1 22 (trained on DS2)66.6186.3485.4785.83364458
DS2 22 (trained on DS1)86.8296.4682.9077.25481763
MIT 44 (paced excluded)75.8190.9584.1181.468451221
Paced 4 (trained on MIT 44)31.3436.8219.6920.00257296
NST 12 (trained on DS2)77.9089.9633.9436.1834293589

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.

Synthetic 4-lead electrode noise results
When only one electrode moves, more leads mean fewer false alarms (SQI selects the lead without noise)
NoiseLeadsQRS Se+PV SeV +PVT (5 beats+ · false/h)
No noise1-lead II99.5499.8489.888.63/7 · 1.5
No noise4-lead99.2799.6889.086.54/7 · 1.2
RA only 0.3 mV1-lead II98.8596.1280.736.24/7 · 11.4
RA only 0.3 mV2-lead II·V97.4297.9775.041.94/7 · 6.8
RA only 0.3 mV4-lead99.2699.6776.948.85/7 · 2.9
All four electrodes 0.15 mV1-lead II99.2799.5385.763.63/7 · 2.0
All four electrodes 0.15 mV4-lead98.2699.0979.959.63/7 · 2.8

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).

ConfigurationMac µs / 1 s of signalInstructions M / 1 s of signalM7 800 MHz ms / 1 s (estimate)Load % (estimate)1 s block max ms (estimate)
2-lead167.94.544.5~8.50.45~0.856.0~11.2
4-lead317.78.678.7~16.30.87~1.6310.4~19.5

10. Rounds 1~4 compared

ItemRound 1Round 2Round 3Round 4
VF false alarms /h (CU · VFDB)——12.6 · 14.39.1 · 10.6
8 s+ VF within 9 s (CU · VFDB)——45/47 · 27/2745/47 · 27/27
All VF episodes (CU · VFDB · MIT)——47 · 105 · 446 · 96 · 3
VT false alarms /h (NST · CU · VFDB)——24.8 · 14.8 · 21.827.1 · 17.0 · 20.0
Lethal alarm false alarms /h (NST · CU · VFDB)——23.9 · 21.7 · 18.326.1 · 20.7 · 17.0
V Se / +P % DS1No classificationNo classification66.6 / 85.586.3 / 85.8
V Se / +P % DS2No classificationNo classification86.8 / 82.996.5 / 77.3
Asystole muscle noise 150 µV (synthetic · real ma, % on)——17 · 2187 · 21
MCU computation (M7 800 MHz, 2-lead)——Not measured0.5~0.9 % (estimate)

11. Limitations · not yet verified