How Chord IMD is analyzed

Two careful readers were each handed one Chord IMD record — the chart, the ranked table, the tiles — and asked to judge it. Each worked out how the analysis must have been done from what the record showed, and they disagreed: one inferred a heavy windowing function from the depth of the floor, the other inferred a curve-fitting estimator from how cleanly two neighbouring products separated. Neither exists. The method is simpler than either guess, and this page states it so a record can be checked rather than trusted. Intermodulation explains why chords mush and Chord Roughness explains how to read the chart; this page is the analysis underneath both.

Both notes sit exactly on analysis bins

The analysis is one long FFT over the steady part of the two-tone capture, with a plain rectangular window and no tapering function of any kind. That works because the two notes are not played at their exact nominal pitches: before anything plays, each is moved to the centre of an analysis bin, so that every note completes a whole number of cycles inside the window. A tone that fits the window exactly leaks into no other bin. There is nothing to suppress, so nothing is suppressed, and the floor you see under a record is the capture’s own noise, not the skirt of a window. The depth of that floor says nothing about a windowing function, because there is none.

Every combination tone inherits the same property. If the low note sits on bin k₁ and the high note on bin k₂, the product m·f1 + n·f2 lands on bin m·k₁ + n·k₂ — exactly, because bin numbers add the way frequencies do. That is what “the analysis lattice” means wherever a record says it: the set of bins the two notes and every one of their products occupy. The analyzer reads each product at its one bin and nowhere else. Nothing is fitted, nothing is subtracted, and no neighbouring bin is consulted.

Coherent sampling — the textbook name for tones placed on bin centres — is the whole trick. It is also why the analysis is so long: the window holds 2²¹ samples, which at 96 kHz is 21.8 seconds of steady tone (the two-tone stimulus plays for 22.3 seconds, and 24.3 at 88.2 or 44.1 kHz, where the same duration takes a different power of two). The length buys bin spacing, and bin spacing is what the next section is about.

Two numbers describe the lattice

Write the two tone bins as a common factor times a reduced ratio: k₁ = g·a and k₂ = g·b, with a and b sharing no factor. The pair answers two different questions, and it pays to keep them apart.

The reduced ratio a : b says whether two recipes can ever land on the same bin. Two products of order seven or lower can collide only when a + b is 14 or less, so the probe insists on a sum of at least 15. The shipped fifth is 109 : 163, a sum of 272 — no two of the 54 recipes the analyzer enumerates share a bin, and no recipe lands on either note or on DC.

The common factor g says how close two lattice points can get. Every product bin is a whole multiple of g, so no product can sit nearer than g bins to another product or to either played note — two distinct products differ by g·(Δm·a + Δn·b), a whole multiple of g that the first test keeps from being zero. On the current fifth that is 22 bins, outside the 12-bin neighbourhood, so the app never has to ask whether one product is inside another’s skirt; on the probe used until 3 September 2026, with g = 2, products cluster two bins apart, and on those records a product within 12 bins of a louder one is refused for the reason the notes’ neighbours are — the louder of the pair is read, the quieter is not (see A recipe beside a louder product on the Chord Roughness page). On the fifth PedalScope plays at 96 kHz and 48 kHz, the notes sit on bins 2398 and 3586 and g is 22 bins; at 88.2 kHz and 44.1 kHz the same 109 : 163 lands on bins 2616 and 3912 and g is 24. A lattice can pass the first test and fail the second. The probe PedalScope used until 3 September 2026 shared no bins and still put four recipes two bins from the played notes, and records from before that date carry unreadable rows beside the notes because of it — see A recipe beside a played note on the Chord Roughness page.

Why the interval is not exactly a fifth

Placing both notes on bin centres, and then choosing bins that keep the products g bins apart, moves the notes a few cents from equal temperament; the interval tile on every record shows the offsets for that capture (at 96 kHz, “A2 −4¢ + E3 −7¢”). They stay inside a ±15-cent budget and are smaller than what a fretted guitar does to the same interval — Tuning and temperament has the full account, including what the note names themselves assume.

Two floors, one direction

A record mentions a floor in two places, and they are different quantities that never feed back into each other.

The first is decided at capture time, once per product. The analyzer compares each product’s bin with the median of the raw spectrum around it: the bins from 3 out to 192 out on either side at 96 kHz — a span of about ±8.8 Hz, held in hertz at every sample rate — leaving out every bin the lattice claims — the other products, both notes, DC, and the coherence bins beside each note described below. A product is called present when it stands more than four times (12 dB) above that median. The three nearest bins are left out because they are the product’s own: if a capture loses coherence, a rectangular window spills into the immediate neighbours first, and a floor must never be read from the skirt of the thing it is judging. That verdict is stored with the record and is never revisited.

The second is stated at read time, every time the record page opens. The floor line under the table is the median level of the products that were judged not present — leaving out any the page refuses on other grounds, such as a recipe beside a note or below 20 Hz — with the scatter of those reads quoted beside it. It is a summary of decisions already made and changes none of them: the capture floor cannot make a product present or absent. Present is decided by the local floor, once, at capture; the capture floor tells you how deep this capture could see.

What the rectangular window costs, and what pays for it

A rectangular window’s sidelobes fall as 1/(πm) with distance m in bins: a note that loses its exact bin centring spills about −16 dB two bins out and −32 dB at twelve. That is excellent performance with no margin at all. As long as both notes stay put across the window it costs nothing, and if either drifts — a clock, a sagging supply, a circuit warming through a 22-second capture — the note’s own skirt lands across the whole lattice and buries the product set. Coherence does not degrade gracefully; it collapses.

So every record carries a coherence check. The analyzer stores the raw spectrum at the nine bins either side of each played note — bins no product of a clear lattice can reach, since the nearest lattice point is g bins away — and reads the worst of them against the local floor beside that note. When that worst bin stands more than 30 dB over the floor, the record says the notes did not stay stationary and its floor and product levels are not to be trusted. The bar is measured, not chosen: the one loop-only capture on the reference bench that lost coherence read 53 dB over its floor, the two clean captures the next morning read about 10 dB over, and five clean captures on the current lattice on 4 September 2026 read 14 to 17 dB over.

Two things the check does not claim. It cannot say which stage moved: a pedal with a dying battery moves a note across twenty seconds as surely as an interface clock does, so the sentence names the chain, never a culprit. And it reads those bins only while the played notes are louder than anything the device makes — under lost coherence every component spills a skirt, and a product louder than the notes would put its own skirt beside them — so the check first compares the record’s loudest product with a ceiling for each offset and reads only the offsets that clear it. A device whose products stand above its own fundamentals, a full-wave rectifier for instance, is not read at all, and the line says why instead of delivering a verdict. What the line looks like on the page, and where the measure sheet announces it, is on the Chord Roughness page.

What the record cannot tell you

The interface intermodulates too. On the reference bench — a Scarlett Solo at 96 kHz on the 22-second window — five loop-only captures on 4 September 2026 each resolved the interface’s own two second-order products, at −108 to −112 dBc, and nothing else. A pedal’s second-order product at or under about −108 dBc on that interface cannot be told from the rig’s; the floor cannot make that separation and does not claim to. A control capture with no pedal in the loop is what does, which is why the Null run exists.

The analysis enumerates orders 2 through 7 — 54 recipes — and order counting is a small-signal idea. At the standard −26 dBFS drive, on the diode stages of this project’s reference box, orders 2 and 3 carry the content, orders 4 and 5 are trace, and nothing above order 5 stands above the floor; orders 6 and 7 are headroom. The exception is a device that suppresses its own fundamentals — the reference rectifier — whose even-order products stand above the played notes at every order the analysis reaches. Past the clipping knee the small-signal picture stops applying: a hard clipper’s spectrum decays slowly while the number of products per order grows, so a fuzz at playing levels has real energy at orders this analysis does not enumerate. An empty row above order 5 means “measured, and nothing stood above the floor at this drive”, never “the device makes nothing there”.

For the curious: the arithmetic

Collisions. Products (m, n) and (m′, n′) share a bin when (m − m′)·a = −(n − n′)·b. With a and b coprime that forces m − m′ = −k·b and n − n′ = k·a for some non-zero integer k, so the orders satisfy |m − m′| + |n − n′| = |k|·(a + b) ≤ 2·maxOrder. Hence no collision is possible once a + b ≥ 2·maxOrder + 1 = 15 at order 7. The bound is tight: 1 : 13 (sum 14) collides, every ratio at 15 is clean.

Spacing. The integer combinations of k₁ and k₂ are exactly the multiples of g = gcd(k₁, k₂) (Bézout), so two distinct lattice points differ by at least g bins, and some pair differs by exactly g.

Sidelobes. A rectangular window of N samples has the Dirichlet kernel sin(πx)/(N·sin(πx/N)) ≈ sin(πx)/(πx) for a displacement of x bins; its envelope at whole-bin offsets m is 1/(πm), i.e. −20·log₁₀(πm) dB: 9.9 dB at one bin, 16.0 at two, 31.5 at twelve, 36.8 at the 22-bin lattice spacing.

Noise. Beside the coherence excess the line states what noise alone would put over the floor for the number of bins read: the expected worst power of N exponential (Rayleigh-magnitude) bins over their median is H_N / ln 2 with H_N the harmonic number — 7.8 dB for the detector’s 36 bins, 4.8 dB for the four bins the older records read.