# Comb Desk > The nulls are set by distance, the depth by level, and EQ fixes neither. When one sound > arrives twice separated by a path difference d, the first null is `c / 2d` and every > other null is an odd multiple of it — and THAT DEPENDS ON d ALONE. How deep they go is > `20 log((1+a)/(1-a))` where `a = 10^(-L/20)` — and THAT DEPENDS ON THE LEVEL DIFFERENCE > ALONE. Two independent axes. 35 cm puts nulls at 491 Hz, 1.47 kHz, 2.45 kHz, 3.43 kHz, four of them > inside the speech band. **The 3:1 rule leaves a 6.02 dB comb** — 3:1 is 9.54 dB of > separation and that is what 9.54 dB gives. Holding a comb to 1 dB needs 24.81 dB, a > 17.4:1 distance ratio. And at equal level the nulls are total: the signal is gone, > not reduced, and no equaliser recovers a frequency that is not there. ## The one thing to know **THE NULLS ARE SET BY DISTANCE, THE DEPTH BY LEVEL, AND EQ FIXES NEITHER.** ```text delay tau = d / c first null f1 = c / (2d) <- the PATH difference, alone nulls f = (2n + 1) * f1 peaks f = 2n * f1 a 10^(-L/20) <- the LEVEL difference, alone depth 20 * log10((1 + a) / (1 - a)) ``` The important thing about those six lines is which variables are missing. `L` does not appear in the null formula and `d` does not appear in the depth formula. Moving a microphone scales every null at once and leaves the depth exactly where it was; riding a fader changes the depth without moving a single null. **THE 3:1 RULE LEAVES A 6.02 dB COMB.** 3:1 is `20 log 3` = 9.54 dB of separation, and that gives 6.02 dB of ripple — more than any equalisation anybody would apply on purpose. Holding it to 1 dB needs 24.81 dB, which by inverse square is 17.4:1. The rule's own implied target was 6.02 dB; the ratio outlived the target it was chosen for. **AND EQUALISATION WILL NOT UNDO IT.** The nulls are periodic and, at equal level, infinitely deep, so the inverse filter needs infinite gain at an infinite number of frequencies. A boost at a null amplifies the noise floor and the room, because the signal that cancelled is not there to be boosted. Every null also moves the moment anything moves, and they shift 6.4% from 0 °C to 35 °C, so a filter fitted to one take is wrong for the next. The fixes are geometric and there are three. **Change the path difference** — and SMALL is the achievable direction, because under 4.3 cm the first null clears the speech band entirely, which is what a boundary microphone pressed to a surface is for. **Change the level difference** — which needs far more separation than anybody expects. Or **lose one of the arrivals**, with a pattern, a barrier or a gate. ## The two axes are independent | Path difference | Level difference | First null | Depth | | --- | --- | --- | --- | | 35 cm | 0 dB | **491 Hz** | infinite | | 35 cm | 3 dB | **491 Hz** | 15.34 dB | | 35 cm | 6 dB | **491 Hz** | 9.57 dB | | 35 cm | 9.54 dB | **491 Hz** | 6.02 dB | | 35 cm | 12 dB | **491 Hz** | 4.46 dB | | 35 cm | 20 dB | **491 Hz** | 1.74 dB | | 35 cm | 24.81 dB | **491 Hz** | 1 dB | | | | | | | 1 cm | 9.54 dB | 17.2 kHz | **6.02 dB** | | 4.3 cm | 9.54 dB | 3.99 kHz | **6.02 dB** | | 10 cm | 9.54 dB | 1.72 kHz | **6.02 dB** | | 35 cm | 9.54 dB | 491 Hz | **6.02 dB** | | 1 m | 9.54 dB | 172 Hz | **6.02 dB** | | 3.4 m | 9.54 dB | 51 Hz | **6.02 dB** | **Read the two bolded columns.** In the top block the path difference never changes and the first null never moves — 35 cm gives 491 Hz at every level difference from 0 dB to 24.81 dB. In the bottom block the level difference never changes and the depth never moves — every row is 6.02 dB, from a 1 cm path difference to a 3.4 m one. **TWO INDEPENDENT AXES.** The path difference sets the frequencies and the level difference sets the depth, and neither touches the other. That is why moving a microphone changes what the comb sounds like without making it shallower, and why riding a fader makes it shallower without moving a single null. ## What each distance ratio really delivers | Distance ratio | Level difference | Comb depth | Verdict | | --- | --- | --- | --- | | 1:1 | 0 dB | **infinite** | total cancellation | | 1.5:1 | 3.52 dB | **13.98 dB** | the comb is the sound | | 2:1 | 6.02 dB | **9.54 dB** | the comb is the sound | | 3:1 | 9.54 dB | **6.02 dB** | the comb is the sound | | 5:1 | 13.98 dB | **3.52 dB** | the comb is the sound | | 8:1 | 18.06 dB | **2.18 dB** | shallow and audible | | 12:1 | 21.58 dB | **1.45 dB** | shallow and audible | | 17.4:1 | 24.81 dB | **1 dB** | inside 1 dB | | 25:1 | 27.96 dB | **0.7 dB** | inside 1 dB | **THE 3:1 ROW IS THE ONE TO READ.** Three times the distance is 9.54 dB of separation, and 9.54 dB leaves 6.02 dB of ripple. The rule is quoted as though it solved the problem. It reduces it to six decibels, which is more than any equalisation anybody would apply on purpose. Getting to 1 dB needs 24.81 dB of separation, which by inverse square is 17.4:1 — and getting to 3 dB still needs 5.85:1. **The honest version of the rule of thumb is roughly 17:1, and it is usually unachievable**, which is why the real answer is normally to lose one of the arrivals rather than to balance them. ## Where a path difference puts its nulls | Path difference | Delay | First null | Nulls in the speech band | What it is | | --- | --- | --- | --- | --- | | 5 mm | 0.015 ms | **34.3 kHz** | 0 | a mic pressed flat to a boundary | | 1.6 cm | 0.047 ms | **10.6 kHz** | 0 | a mic 2 cm above a table | | 4.3 cm | 0.125 ms | **4 kHz** | 0 | the largest difference that clears speech | | 8.1 cm | 0.236 ms | **2.12 kHz** | 1 | a mic 10 cm above a table | | 35 cm | 1.019 ms | **491 Hz** | 4 | two mics, or a talker between them | | 1 m | 2.912 ms | **172 Hz** | 11 | a nearby wall | | 12 m | 34.943 ms | **14 Hz** | 130 | the back wall of a hall | **The fourth column is the one that decides whether anybody cares.** A path difference of 4.3 cm or less puts the first null above 4 kHz and every null with it, so the comb exists and costs nothing. That is the entire reason a boundary microphone is pressed to the surface rather than raised off it. At the other end, a large path difference does not help by going below the band: the nulls are 29 Hz apart at 12 m, so 130 of them land in the speech band. **Small is the achievable answer; large only changes what it sounds like.** ## The boundary case, worked | Mic height | Path difference | First null | Nulls in speech | Verdict | | --- | --- | --- | --- | --- | | 2 mm | 1.6 mm | **105.7 kHz** | 0 | clear of speech | | 2 cm | 1.6 cm | **10.6 kHz** | 0 | clear of speech | | 5 cm | 4.1 cm | **4.23 kHz** | 0 | clear of speech | | 10 cm | 8.1 cm | **2.12 kHz** | 1 | one null, in the worst place | | 20 cm | 16 cm | **1.08 kHz** | 2 | a comb across the band | | 40 cm | 30.4 cm | **565 Hz** | 4 | a comb across the band | A talker 40 cm above a hard surface, 90 cm away horizontally: the reflection travels `√(x² + (hs+hm)²) − √(x² + (hs−hm)²)` further than the direct sound. **The reflection off a hard table arrives at essentially the same level as the direct sound**, so the nulls are total and the only thing to change is where they are. **The answer is to go DOWN, not up.** Below 5.3 cm the first null clears 4 kHz and the comb stops mattering; a microphone lying on the surface has a path difference near zero and no comb at all, which is what a boundary microphone is for. Lifting it to 10 cm puts a total null at 2.12 kHz, which is in the middle of speech. ## Thresholds | Threshold | Value | What it separates | | --- | --- | --- | | the speed of sound | 331.3 + 0.606T m/s | every null frequency scales with it; the depth does not. | | the speech band | 300 Hz–4 kHz | a null inside it removes information; outside it, colour. | | the audible band | 20 Hz–20 kHz | how many nulls get counted at all. | | a deep comb | ≥ 3 dB | past it the comb is the frequency response rather than a colour on it. | | a thin comb | ≥ 1 dB | shallow, audible, and the kind that gets argued about. | | equal level, within | 0.5 dB | below it the nulls are treated as total, because they very nearly are. | | the rule being tested | 3:1 | what everybody quotes, against what the arithmetic says it delivers. | Defaults when the sheet is silent: 343.4 m/s (dry air at 20 °C) and a target of 1 dB of ripple. **Both are notes rather than warnings**: the speed scales every frequency by the same small factor and the target only changes what gets recommended. Neither can turn a good sheet into a bad one, which is the test for whether an assumption deserves a warning. ## Sheet grammar Two blocks. `SETUP` is `key | value`, one per line. `PAIRS` is a table. ``` SETUP name | what this rig is speed | 20 C a temperature, or `343 m/s` outright target | 1 the deepest comb you will accept, in dB PAIRS p1 | the host and guest mics | 0.35 | 3:1 | p2 | the host mic and the tabletop | 0.0809 | equal | why this one is here ``` A PAIRS row is `id | what it is | path difference | level difference | why`. **The path difference takes three forms.** A LENGTH — `0.35`, `35 cm`, `350 mm`, where a bare number is METRES. A DELAY — `1 ms`, `1020 us` — because a delay line and a DAW work in time rather than distance, and it is the same quantity divided by the speed of sound. Or THE TWO PATH LENGTHS that create it — `1.2 / 0.85` — which is what a tape measure gives you. **The level difference takes four.** DECIBELS — `9.5`, `9.5 dB`. A DISTANCE RATIO — `3:1` — converted by inverse square. `equal`, for two arrivals at the same level, which is the worst case and the common one for a hard reflection. Or `auto`, which computes it from the two path lengths — and `auto` therefore requires the two-length form in the path column. A level difference has **no sign**, because swapping which arrival is louder does not change the comb at all: the depth is `(1+a)/(1-a)` and `a` is a magnitude. `speed` and `target` both default when absent and both are reported as notes rather than warnings — the speed scales every frequency by the same small factor, and the target only changes what gets recommended. ## Lanes - **`plan`** — Place the second arrival before anybody reaches for a filter. A comb gets discovered in the edit and then somebody tries to equalise it out. This works the other way: decide what the second arrival is, where it puts its nulls, and how deep they will be — and choose the geometry that leaves them somewhere harmless, because that is the only stage at which there is a choice. Sections: Summary, The Sheet, The Setting, Reasoning, Next Step. - **`check`** (primary) — Whether this is a comb you can live with. The paid read of what the free panel computes. Where every null falls, how deep it is, which of them land in the speech band, what the target would need — and, when it is bad, the flat statement that no equaliser undoes it and what does. Sections: Summary, Verdict, Findings, Corrected Sheet, Next Step. - **`nulls`** — The frequency question: where the nulls fall. The path difference sets every null on its own — odd multiples of c over twice the difference — and the level has nothing to do with it. This reads the frequencies: which land in the speech band, how far apart they are, what moves them, and why an inverse filter is not one of those things. Sections: Summary, Where They Fall, What Moves Them, Why EQ Cannot, Next Step. - **`depth`** — The depth question: how much the nulls cost. The level difference sets the depth on its own — and the path difference has nothing to do with it. This reads the other axis: how deep each comb is, what separation the target would need, and the number the 3:1 rule actually delivers as against the one everybody assumes it does. Sections: Summary, How Deep, What The Target Needs, Why The Rule Is Weak, Next Step. - **`deliver`** — Decide what changes: the geometry, the balance, or the arrival. Sorts every finding into what moving something fixes, what only losing one of the arrivals fixes, and what nothing fixes. Equalisation appears in none of those buckets, which is the point — the inverse filter has infinite gain at an infinite number of frequencies and the nulls move when anything does. Sections: Summary, Geometry Fixes, Only Losing An Arrival Fixes, Nothing Fixes, Next Step. ## Findings All 29 are computed in the browser and cost nothing. | Code | Severity | Scope | What it means | | --- | --- | --- | --- | | `SPEED-ASSUMED` | note | setup | The speed of sound was assumed | | `TARGET-ASSUMED` | note | setup | The acceptable comb depth was assumed | | `NO-PAIRS` | error | setup | No pairs, so there is nothing interfering | | `LEVEL-FROM-PATHS` | note | pair | The level difference was computed from the two paths | | `FIRST-NULL` | note | pair | Where the first null falls | | `NULL-SERIES` | note | pair | Every null this pair puts in the audible band | | `NULLS-IN-SPEECH` | warn | pair | Nulls land inside the speech band | | `NULLS-ABOVE-SPEECH` | note | pair | The nulls sit above the speech band | | `COMB-DEPTH` | note | pair | How deep the comb is | | `DEPTH-IS-BAD` | error | pair | The comb is deep enough to be the sound | | `DEPTH-IS-THIN` | warn | pair | The comb is shallow but present | | `DEPTH-IS-FINE` | note | pair | The comb is below the target | | `EQUAL-LEVEL-INFINITE-NULL` | error | pair | Equal level, so the nulls are total | | `GAIN-DOES-NOT-CHANGE-THE-COMB` | note | pair | The comb is a ratio, so level changes do not touch it | | `EQ-CANNOT-FIX-THIS` | warn | pair | Equalisation will not undo this | | `EQ-STILL-CANNOT-FIX-IT` | note | pair | Equalisation would not undo it either | | `MOVING-MOVES-EVERY-NULL` | note | pair | Moving the microphone moves the whole comb | | `THE-3-TO-1-RULE-IS-WEAK` | warn | setup | The 3:1 rule leaves a 6 dB comb | | `RATIO-THE-TARGET-NEEDS` | warn | setup | The distance ratio the target actually needs | | `LEVEL-THE-TARGET-NEEDS` | note | pair | The level difference this pair needs | | `PATH-FOR-A-CLEAR-BAND` | note | pair | The path difference that clears the speech band | | `DELAY` | note | pair | The delay between the two arrivals | | `IT-IS-AN-ECHO-NOT-A-COMB` | warn | pair | This delay is long enough to be an echo | | `NULL-SPACING` | note | pair | How far apart the nulls are | | `PEAKS-TOO` | note | pair | The peaks are as real as the nulls | | `TEMPERATURE-MOVES-THE-NULLS` | note | setup | Every null moves with the temperature | | `WORST-PAIR` | warn | setup | The pair worth fixing first | | `COMBS-STACK` | warn | setup | More than one pair, and they add | | `ONE-PAIR-ONLY` | note | setup | One pair, so nothing stacks | ## What this page cannot do This page computes from the path and level differences on the sheet. It has not listened to anything. - **It models two arrivals of one sound, and nothing else.** A real room delivers dozens, and their combined response is a product of many combs rather than one. The arithmetic here is exact for a pair and only indicative once several are in play — which is why several pairs are reported separately rather than summed. - **It assumes the two arrivals are the same signal.** A boundary reflection off an absorbent surface is filtered as well as delayed, so its level difference varies with frequency and the comb is shallower at the top than this predicts. Only a hard, flat, large surface behaves like the model. - **The level difference from `auto` is inverse square only.** No absorption, no directivity, no obstruction, and no near-field effect. - **Nothing here is frequency-dependent except the comb itself.** Microphone directivity, air absorption and surface absorption all vary with frequency and none of them is modelled. - **The speech band is a convention**, not a measurement. 300 Hz to 4 kHz is a telephony inheritance; intelligibility has contributions above and below it, and a null just outside the band is not harmless. - **Depth is not the same as audibility.** A 3 dB comb with nulls 2 kHz apart and a 3 dB comb with nulls 30 Hz apart measure the same and sound nothing alike, and this page reports both numbers rather than pretending one covers it. - **Movement is not modelled.** A talker who leans changes the path difference continuously, so the real comb sweeps. Every figure here is a snapshot of one geometry. - Nothing here reaches the network, reads a file, or listens to anything. ## API `POST https://api.skillsafe.ai/v1/app-api/run` with a bearer token from https://comb-desk.skillsafe.ai/tokens.html. The body IS the input object — there is no `input` wrapper and no `X-App-Slug` header. `task` is required and must be one of plan, check, nulls, depth, deliver. `POST /estimate` is free and validates the same body. Full documentation at https://comb-desk.skillsafe.ai/api.html. ## Provenance Lanes derived from the `songsee` skill in https://github.com/steipete/clawdis. The arithmetic, thresholds, sheet grammar and findings are this app's own. Not affiliated with or endorsed by the authors of that repository.