In old films the stagecoach races forward and its wheels turn slowly
backward. No trick of the eye, no editing — the camera is telling the literal
truth about every frame it caught, and the truth is a lie about the motion. Set the
wheel's real spin, its spokes, and the frame rate below, and watch the reversal happen.
Then watch why: the spoke frequency folding into the band the frame rate can hold.
Companion film · 2:32 · the film itself is the camera: it renders at exactly
24 fps and every frame draws the wheel at its true angle, spinning forward at +1.90 rev/s — the backward
crawl you watch is the MP4’s own genuine temporal aliasing, not an animation of it. A gold spoke
(S = 1) and a tachometer arrow tell the truth in the same frames; the wheel accelerates through the
2 rev/s freeze; and the soundtrack genuinely sample-and-holds a 1000 Hz tone at 1500 Hz so you hear
the 500 Hz alias. Every number on screen is recomputed live from the same fold() the verifier
proves (research/aliasing-wagon-wheel/verify.mjs); the percussion follows the wheel’s own
24 fps-sampled pose — it locks while the wheel is frozen. Build: research/aliasing-wagon-wheel/film/.
On film — sampled at 24 fps
—
Truth (tachometer)
1.90 rev/s
12
24 fps
Spoke frequency S·f22.8 Hz
Nyquist limit fs/212 Hz
Apparent spin (on film)−0.10 rev/s
Faithful capture?no — aliased
Reduced-motion is on, so the wheel starts paused — use
Step one frame to advance the strobe one snapshot at a time, or press Pause/Play.
The fold, drawn. The camera can only hold frequencies inside
the band (−fs/2, fs/2]. The real spoke
frequency S·f (amber, above) is reflected back and forth across
the band edges until it lands inside (cyan) — that landing spot is what the film records.
The same theorem, in sound
Sampling does not care whether the signal is a turning wheel or a vibrating string. Undersample a
pure tone and it does not vanish — it drops to a phantom pitch, the very same fold. Here a
1000 Hz tone is genuinely re-sampled at a rate you choose
(sample-and-hold, then played back), so you hear the alias, not a fake of it.
1000 Hz
1500 Hz
You will hear500 Hz
Below Nyquist?no — aliased down
A real subtlety, kept honest: your speakers run at the audio context's own
high rate, so what you hear is the reconstructed sample-and-hold signal — which contains
the alias (the fold) plus faint higher images of the staircase. The fundamental you perceive is
the alias the readout names.
The check
Everything above is the one formula
fold(f, fs) = f − fs·round(f / fs),
which folds a frequency into the band (−fs/2, fs/2].
The wheel's apparent spin is fold(S·f, fs) / S. From it,
four facts are proven — not asserted:
the wheel freezes exactly when its real spin is a whole multiple of
fs/S (12 spokes at 24 fps → first freeze at
2 rev/s);
just below a freeze it runs backward (1.9 rev/s on film →
−0.1 rev/s), just above it crawls forward;
the motion is captured faithfully only whenfs > 2·S·f — the Nyquist–Shannon limit;
the audio twin: 1000 Hz sampled at
1500 Hz is heard as 500 Hz.
The verifier research/aliasing-wagon-wheel/verify.mjs recomputes all
four from scratch, checks the fold stays inside the band across a dense sweep, and re-derives the
exact numbers shown in the presets above: 38 / 38 checks pass. It also
reads this page and asserts it ships the identical fold(), so the
drawing and the proof can never quietly disagree.