Motion analysis · 1226 frames · 50 fps
A 24-second classical variation, extracted from video, fitted to a cosine series, and reduced to 38,808 numbers. Everything below is drawn live from those numbers — nothing here is a recording.
Measured from a 25-second Paquita variation danced by Maria Khoreva — watch the original on YouTube ↗
The representation
Each of the 66 channels — 33 joints, two coordinates each — is a truncated cosine series. The basis is defined for real t, not just integer frames, so the same coefficients deliver both smoothing and resampling at any framerate. There is no separate interpolation step.
A cosine basis rather than a Fourier one, because a dance is not periodic: she does not finish where she began. A Fourier series would impose a seam between the last frame and the first, and truncating across that artificial discontinuity produces Gibbs ringing in the limbs. The cosine transform mirrors the signal instead of wrapping it, so the endpoints match by construction.
Finding one
Poses were centred on the hip midpoint and scaled by torso length, so what remains is shape rather than stage position. Principal components over that 66-dimensional space collapse hard: three components carry 85% of the variance, five carry 90%, eleven carry 99%.
Scrubbing those three sliders moves along the axes the choreography actually uses, rather than along time. The grey figure is the mean pose; brass is the current position in eigen-space.
Finding two
Because the motion is now a function, it can be differentiated term by term — exact joint velocities, with none of the noise amplification that finite differences inflict on pose data. The spectrum of that velocity, taken over the clean first 18.5 seconds, has a sharp fundamental and a stronger second harmonic.
That exact doubling is the signature of a left–right symmetric travelling step. Speed is a magnitude, so it peaks once per step, while a full movement cycle contains two steps — one on each leg. Symmetric gait always shows its strongest energy at twice the cycle frequency.
Finding three — a failed prediction
The source clip is titled a balance sequence, so the prediction was that velocity minima would locate the held balances automatically — choreographic structure falling out of the calculus. It did not work.
Two errors, compounded. The first was measuring absolute joint speed, which conflates the body changing shape with the dancer travelling and the camera moving — a balance held while travelling reads as fast. Refitting in normalised pose space corrected that and changed almost nothing, which is the useful part: it ruled out the measurement and left only the premise.
The premise was wrong. A balancé is a travelling rocking step, not a held stillness. Median shape speed is 0.925 torso-lengths per second — she is moving continuously, as that step requires. The regular oscillation visible above was never noise around held poses; it was the step rhythm, which is precisely what the 2:1 spectrum measures. Only three intervals qualify as held: the opening pose, a 2.3-second final position, and a fragment.
Finding four
The cosine basis spans the entire clip, so a single cutoff has to suit both a sustained phrase and a pirouette at once. It cannot. At 6 Hz the phrases are right and the turn dissolves; at 12 Hz the turn sharpens and everything else picks up tracker jitter.
Fitting in segments resolves it — a low cutoff either side, a much higher one across the turn. The hazard is the join: two independently fitted segments choose their coefficients knowing only their own samples, so they disagree at the seam and the splice itself becomes a visible jump. Overlapping the segments and crossfading with a raised cosine spreads the handover across a fifth of a second.
Against 6.19 px in the turn for a single global 6 Hz fit, and 2.89 px for a global 12 Hz one that coarsened the rest of the variation to get there. The seams add nothing: measured against the raw data at the same frames, the spliced curve moves less, so it is still smoothing rather than introducing a discontinuity.
What it does not fix. The turn still does not read as a rotation, and no cutoff will make it. A pirouette is rotation about the vertical axis — precisely the axis a camera discards — so in projection it can only ever appear as a narrowing. What the splice recovers is articulation: limbs that hold their shape through the turn instead of smearing.
Method
Three clips went through identical code, which turned source selection into a controlled experiment. Leg visibility is the pose model's own confidence in the knee and ankle landmarks; span is the fraction of frame height the dancer occupies.
| Clip | Leg visibility | Span | Frames tracked | fps |
|---|
A romantic tutu drapes over the legs and occludes them; a classical tutu projects horizontally and never crosses them. The classical-tutu clip wins on every axis at once, which is why it is the one analysed here.
Two fixes that missed. The turn was first blamed on left/right limb labels swapping (56 frames, all inside it) and then on the 6 Hz cutoff filtering away real motion. Both were true and neither was the cause. The residual improved and the turn still looked broken, because a single global cutoff was the wrong model — see below.