How detection works

Three passes over the same heartbeat.

Catching an ectopic beat on a single-lead chest strap is a trade-off between missing real events and inventing fake ones. RytmoECG does not try to win that with one clever detector. It runs three independent passes, each tuned for a different moment: while you record, when you open one event, and over the whole recording afterwards.

LEAD I · 130 Hz · one early beat, three readers SWEEP
early

The amber marker is one premature beat. Whether it becomes an event depends on which pass is looking, and that is the whole story of this page.

The three passes

Live, on demand, and after the fact.

Same algorithms, three contexts. The earlier the pass, the more conservative it has to be; a live alarm you cannot un-see costs more than a finding you chose to open.

per beat

Live

Runs on the streaming signal as each beat arrives. Immediate, but gated hard so a noisy stretch cannot spam events.

per event

Advanced Analysis

A second opinion you trigger by opening one strip. Re-derives a local baseline and judges that window in isolation.

per session

Session re-scan

Sweeps an entire recording after the fact by interval criteria, surfaces beats the live pass merged away, and adds them.

Pass 1

Live detection, on every beat.

As the Polar H10 streams 130 Hz lead I, Pan-Tompkins finds each R-peak, a morphology classifier shapes every beat, and a stack of detectors runs against the rolling beat history. Anything that fires goes through the same capture path, so it inherits every guard before it ever becomes an event.

What runs live

per beat

Wide-complex capture, the rhythm-pattern detector (bigeminy, trigeminy, couplet, triplet, NSVT, idioventricular, PVC-with-compensatory-pause, PAC), long-pause (RR > 2.0 s), the rules + CoreML irregular ensemble, and the isolated single-beat ectopy detector below.

The guards it must clear

four gates

Movement gate (accelerometer std-dev), hard SQI floor (mean SQI ≥ 0.50 over thirty beats), baseline-stability gate (DC drift, spread, peak excursion), and a per-kind cooldown. A run of events chains into one clip instead of dozens.

Why it stays conservative

design choice

Live is the only pass that interrupts you. A false "maybe PVC" mid-session erodes trust faster than a quiet miss you can still recover in pass two or three. So live errs toward silence when signal or context is ambiguous.

The bar each pass must clear to fire

lower bar, catches morehigher bar, fewer false alarms

Inside pass 1

Isolated single-beat ectopy.

A single premature beat with a compensatory pause is the classic "one PVC" most people picture. The hard part on one lead is not finding it; it is not drowning in false positives from respiratory sinus arrhythmia, where a normal beat can land 20 % early followed by a longer one purely from breathing. This detector catches the real thing while staying quiet on the impostor.

LEAD I · local baseline window + early beat PASS 1
local baseline window 20%+ early compensatory pause

Local baseline

6 prior beats

Prematurity is measured against the median of the six beats the early beat interrupted, not a session-wide average that drifts as your heart rate changes. The beat is judged against the rhythm it actually broke.

Regular-background gate

anti-RSA

At most one of those six beats may deviate more than 25 % from the local baseline. If the surrounding rhythm is already irregular, a single early-plus-pause is just normal variation, and belongs to the dedicated irregular and bigeminy paths, not here.

Compensatory window

0.96 to 1.12

The early interval plus the pause must sum to roughly twice the baseline; the ventricular signature, not the smoother give-and-take of breathing. The same window the per-event and full-session passes use.

Quality and spacing

SQI + cooldown

The candidate beat needs SQI ≥ 0.70 so a noise spike is not read as an early beat, an eight-second cooldown stops a borderline stretch from repeating, and chaining folds a burst into one reviewable clip.

The interval signature

Short beat, long pause, the sum gives it away.

Plot successive RR intervals as bars and a real ectopic beat is obvious: one bar drops well below baseline (the early beat), the next jumps well above it (the pause), and the two together sum to roughly twice a normal interval. That sum, not the QRS shape, is what every pass keys on.

A double-counted R-peak makes two short bars, never a short-then-long pair, so it fails the sum test. A missed beat makes one long bar with no preceding short one. The compensatory signature is specific on purpose.

RR intervals around one PVC

fires

Bar height = interval length. Baseline 850 ms.

850 850 840 860 850 620 1080 850 860 620 + 1080 = 1700 ms 2 x 850

Why an interval rule alone floods

The impostor, and the real thing.

In a high-variability heart (RMSSD over 80 ms) a plain "20 % early plus a longer beat" rule fires constantly on respiratory sinus arrhythmia, where RR rises and falls smoothly with each breath. The regular-background gate is what tells the two apart: a smooth swing has no single sharp outlier; a PVC does.

Respiratory sinus arrhythmia

we stay quiet

RR rises and falls smoothly; no single outlier.

Isolated PVC

we fire

Regular background, one sharp early beat, one pause.

The honest cost: in very high HRV the gate will sometimes hold back a borderline narrow beat, and occasionally let one through. That is deliberate. On a single noisy lead you cannot separate a narrow PVC from respiratory variation by timing alone; wide-complex beats are caught by their shape on a separate path, and anything missed here is recoverable in passes two and three.

Pass 2

Advanced Analysis, a per-event second opinion.

Open any event and tap Advanced Analysis. RytmoECG re-runs the full pipeline against that one thirty-to-sixty-second strip in isolation, with a baseline derived from the window itself. Because it is not the live, streaming classifier, it can flag a beat the live pass merged into the dominant sinus template.

Classifier-independent

interval criteria

It counts ectopy by timing: any beat 20 % or more early followed by a compensatory pause is ectopic regardless of how the morphology classifier labelled its QRS. This surfaces the PVC the live chain reported as "wide-complex: 0".

A verdict, with its math

four states

Likely arrhythmia, ambiguous, likely normal, or poor signal; with the supporting markers and every measured parameter listed, flag colours and all. It reports even a single ectopic beat, where the live pass deliberately would not.

On your terms

on demand

It never fires an alert; you choose to run it on a strip you are already looking at. That is why it can afford a lower bar than live: the cost of a borderline finding is a line of text, not an interruption.

Pass 3

Session re-scan, over the whole recording.

A multi-hour recording can hide ectopy the live pass merged away beat by beat. From a recorded session you can trigger a full re-scan: RytmoECG reads the stored ECG and sweeps every beat by the same interval criteria as the second opinion, then adds each hit as a reviewable event.

Whole-recording sweep

up to 30 min full-res

Re-runs Pan-Tompkins and a fresh classifier over the recording (capped so a 24 h Holter cannot pull millions of samples at once), independent of whatever the live session's template state happened to be.

Interval, not morphology

20 % early + pause

Each ectopic beat becomes an event carrying its own strip window, so you can see what came before and after. The exact pass that catches the beat the live morphology gate merged into sinus.

Deduped against what exists

no doubles

Hits within a second or so of an event already on the session are skipped, so re-scanning does not pile duplicates on top of what live already captured.

Where to find it: open a recorded session, then run the re-scan from its detail view. It reports how many new events it added.

When the passes disagree

One beat, three verdicts.

The most common question: "I can see the early beat, Advanced Analysis flags it, so why was there no live event?" Usually the live classifier merged that beat into the dominant sinus template, so the shape-based path saw nothing wide, and the live baseline at that instant was drifting, so the timing looked less premature than it does against a clean window.

LEAD I · the same premature beat, read three ways VERDICTS
this beat

Live

often missed

The classifier merged it into sinus (wide-complex: 0) and the drifting baseline softened the prematurity. The isolated-ectopy detector closes most of this gap in real time, but live still errs quiet when context is ambiguous.

Advanced Analysis

flagged

Judged in isolation against a clean local baseline, by timing alone. The early-plus-pause sum clears the bar, so the strip reads "ambiguous" or "likely arrhythmia" with the markers listed.

Session re-scan

flagged

The same interval criteria over the whole recording surface it as a reviewable event, deduped against anything live already caught. The catch-all safety net.

The principle: layers, not one verdict. The same interval criteria run in passes two and three, so a finding is reproducible, not a one-off. Nothing leaves the device; all three passes run on your iPhone.

Get it

See it on your own rhythm.

iPhone, iOS 17 or later. Requires a Polar H10 chest strap.

App Store; coming soon

RytmoECG is a wellness app; not a medical device. It does not diagnose, treat, or screen for any condition. Every detector phrases its result as a possibility, never a diagnosis. If you have chest pain, shortness of breath, or persistent palpitations, contact emergency services or your physician.