A measurement rig, not a sound-meter toy. Swept-sine impulse response by the Farina method, ISO 3382 decay analysis, modal prediction cross-checked against what the microphone actually heard, and a parametric EQ proposal that refuses to do the stupid thing.
Every number here is derived from your own microphone, and every one of them is labelled with what it is worth. The honest summary: this measures where very well and how much only roughly. The relative and absolute ledger in the last tab spells out which is which.
It drives the same controls that are on the other tabs. It sets the sweep parameters, presses measure, runs the octave band decay analysis on the result, and then reads the numbers those produce. It computes nothing of its own, so if a figure here disagrees with the tab it came from, the tab is right.
What it cannot do is the part that actually decides the measurement: where the microphone is, whether it is held in a hand, whether the room is quiet, and whether the thing playing the sweep is the system you meant to measure or the phone's own speaker. Those are the largest error terms in the whole exercise and they are all physical. The steps below ask about them rather than assuming them away.
One guided run gives you one position. A room is not one position. When this finishes it will tell you to move the microphone and go round again, and it means it: the spread between positions is usually larger than anything you will fix with equalization.
Clean, deterministic excitation. The pink noise is synthesized in the frequency domain, so it is exactly pink (equal energy per octave, verified in the self test to better than 0.05 dB) and exactly periodic in its own buffer length, which means it loops with no discontinuity and needs no analysis window in the RTA.
Load a local audio file to audition the proposed EQ on music rather than on noise. The file is decoded in the page and never leaves the device: there is no upload and no network call anywhere on this page.
A time-domain pink generator (Voss-McCartney, or Kellett's filtered white) approximates a 1/f power spectrum with roughly ±0.05 to ±0.5 dB of ripple, and its low-frequency corner depends on internal state. Building the spectrum directly instead is both shorter and exact: set the magnitude of bin k to 1/sqrt(f_k), impose Hermitian symmetry so the inverse transform is real, and take the IFFT.
The phases are assigned by Schroeder's rule rather than randomly. Random phase gives a Gaussian time signal with a crest factor near 12 dB; Schroeder phase gives about 6 dB. That is 6 dB more energy into the room for the same peak level, which is 6 dB of measurement signal-to-noise you get for free. The self test measures both and prints them.
Because the buffer is periodic in itself, looping it is seamless and any analysis window that is an integer submultiple of the buffer sees a periodic signal: no spectral leakage, no window function required, and the RTA converges in a handful of blocks instead of a hundred.
The low-friction measurement: play pink noise from the signal tab, come here, and watch the room curve. Fractional-octave bands, your choice of exponential or infinite averaging, peak hold, and a target overlay. This is the right tool for moving the microphone around and seeing what changes. It is the wrong tool for any number you intend to write down: for that, use the sweep.
The relative standard error of a power estimate from M independent blocks is 1/sqrt(M), so the uncertainty in decibels is about 4.343/sqrt(M). Twenty averages gets you to ±1.0 dB; seventy-five gets you to ±0.5 dB. At roughly 0.7 s per block that is about a hundred seconds of standing still.
Which is mostly wasted effort, because estimator variance is not the dominant error. Spatial variance is. Above the Schroeder frequency the room response at a point is an interference pattern whose magnitude is Rayleigh distributed with a standard deviation of 5.57 dB, independent of the room. Moving the microphone 10 cm changes the 2 kHz reading by more than another hundred averages will ever resolve. Averaging longer at one position converges precisely onto the wrong answer.
So: use enough averaging to stop the display flickering, then spend your time moving the microphone instead. What you are looking for here is the part of the curve that does not change as you move.
The serious measurement. An exponential sine sweep is played and recorded simultaneously, then deconvolved against its own matched inverse filter. What falls out is the impulse response of everything between the digital-to-analogue converter and the microphone: amplifier, loudspeaker, room, microphone, converter. Unknown playback latency is irrelevant to this method, which is one of the reasons it is the right choice in a browser.
A sweep reaches frequency k·f(t) at a later time than it reaches f(t). For an exponential sweep that delay is a constant, L·ln(k), where L = T/ln(f2/f1). After deconvolution the k-th harmonic response therefore lands at a fixed distance before the linear impulse response, in the acausal region where nothing else lives.
With the defaults (20 Hz to 20 kHz, 5 s) that is 502 ms for the second harmonic, 795 ms for the third. They are trivially windowed off, which is why this method beats maximum-length sequences: MLS smears distortion evenly across the whole impulse response as a noise-like floor, the sweep parks it somewhere you can throw away. The harmonics view above shows them; the energy in each window, relative to the linear peak, is the distortion table.
Read that table as chain distortion, not loudspeaker distortion. On a phone at any useful level the microphone is very likely the most non-linear thing in the path.
This also sets the sweep length. The second-harmonic gap has to comfortably exceed the reverberation you intend to analyze, which works out at roughly T ≥ 10 × RT60. A 0.5 s domestic room wants a 5 s sweep. That, not signal-to-noise, is the reason for the default.
Impulse responses are megabytes each, so they live in memory and are gone when you close the tab. Room dimensions, calibration and preferences do persist. Tick several positions and switch the response plot to power-average to get a spatial average, which is the only kind of curve that should ever inform an EQ decision.
| use | label | active | rate | snr | peak in | t30 mid |
|---|
Schroeder backward integration of the octave-band filtered impulse response, with Lundeby truncation and tail compensation, then a least-squares fit over the ranges ISO 3382 specifies. EDT from 0 to −10 dB, T20 from −5 to −25 dB, T30 from −5 to −35 dB, each extrapolated to a full 60 dB of decay. The correlation coefficient and the curvature are reported alongside every number, and bands that fail the standard's signal-to-noise requirement are refused rather than guessed.
| band | EDT | T20 | T30 | r² (T30) | curv % | INR | verdict |
|---|
Not enough decay above the noise. ISO 3382-2 requires the decay to start at least 35 dB above the background for T20 and 45 dB for T30. In a home at 63 Hz with a fridge running you will fail this routinely. The correct output is "insufficient signal-to-noise in this band", which is what the table prints. It is not a number with an asterisk.
The decay is not a single slope. The curvature C = 100(T30/T20 − 1) tests this. Below about 5 percent the decay is one clean exponential. Above 10 percent it is not, and a single reverberation time is not a physically meaningful description of the room, whatever the regression coefficient says. Coupled spaces, a very absorptive room with a live cavity, and residual noise all do this.
The band is below the Schroeder frequency. ISO 3382 assumes a diffuse field. In a 50 cubic meter room with a 0.4 s reverberation time the Schroeder frequency is 179 Hz, so the 125 Hz and 63 Hz octaves are modal, not diffuse. Each mode there decays at its own rate and the Schroeder curve is genuinely multi-sloped. Those bands are labelled "modal decay, indicative", and the number is the decay of whatever mode dominates, not a reverberation time. This is the single most common untruth in consumer room-measurement apps.
The integration ran into the noise floor. Schroeder's integral runs to infinity. Integrated over noise it accumulates energy linearly and bends the tail into a false straight line, inflating the answer. Truncating instead removes real decay energy and biases it short. Lundeby's iterative crosspoint estimate plus analytic tail compensation removes most of both biases, and is what runs here.
None of the filtering here is IEC 61260 class 1. It is a sixth-order Butterworth cascade run over the time-reversed impulse response, so the filter's own ringing lands before the decay instead of on top of it. Good to a few percent, and not claimed as more.
Enter the room and the calculator gives you every axial, tangential and oblique mode below the limit, weighted by how much each type actually matters. The payoff is further down: once you have measured an impulse response, the predicted modes are overlaid on the measured low-frequency response, so you can see which prediction is causing which measured peak. A predicted mode with no measured signature is not a problem you have.
The pressure of mode (nx,ny,nz) varies as a product of cosines, so it has an antinode at every boundary and a null at the middle of any dimension for every odd-order mode in that dimension. That is the whole reason a subwoofer in a corner couples to everything, and the reason a seat at exactly half the room length sits in a hole. Drag these and watch the curve.
| Hz | n | type | rel | flag |
|---|
| source | H : W : L | as your height |
|---|
Count the modes in each third-octave band from 20 Hz up. In a well-proportioned room the count rises monotonically. A band with fewer modes than the one below it is a hole in the modal distribution; a band containing two modes within a hertz or two of each other is a doubled-energy problem. Unlike the Bolt area, this is a diagnostic you can actually apply to a room you already live in.
The constant is not arbitrary. Modal density rises as dN/df = 4πVf²/c³, and each mode has a half-power bandwidth Δf = 2.2/T60. Schroeder's criterion is a modal overlap of three, meaning three modes within one mode's bandwidth. Solving Δf · dN/df = 3 gives f = sqrt(3c³/8.8π) · sqrt(T60/V), and with c = 343 the leading coefficient evaluates to 2093. Hence the familiar 2000·sqrt(T60/V).
Older texts sometimes quote 4000, which is a more conservative overlap criterion of about twelve, sometimes called the large-room frequency. Schroeder's own 1996 revisit settles on 2000, which is what this page uses.
Below that frequency the room is a small number of discrete resonances: deterministic, spatially broad, largely minimum phase, and reasonably consistent across a seating area. Equalization works there. Above it the response at a point is the statistical interference pattern of hundreds of overlapping modes, with a peak roughly every 4/T60 hertz and a magnitude standard deviation of 5.57 dB regardless of the room. Correcting that point by point is fitting noise.
A loudspeaker near a boundary radiates energy backwards which returns delayed by twice the distance. Where that round trip equals half a wavelength the reflection subtracts, and you get a cancellation you cannot equalize away, because any boost you apply to the direct sound is applied to the reflection in exactly the same proportion. The only fixes are geometry and absorption. Enter the distance from the woofer, not the cabinet face.
Mirror each loudspeaker through each surface and draw a line from the image to your head. Where it crosses the surface is the point that needs treating, and it is usually not where people put the panel. Coordinates are measured from the front wall, from the left wall, and from the floor. The room comes from the modes tab.
| surface | put the panel at | extra path | delay | rel level |
|---|
Every mode has a pressure antinode at every boundary, because the cosine that describes it is at its maximum where the wall is. Every odd-order mode along a dimension has a null at the exact center of that dimension. Sit at half the room length and you sit in the null of the first length mode, which is typically a 15 to 25 dB hole somewhere between 30 and 60 Hz, and no amount of equalization will fill it. The 38 percent point is chosen because it is not a null for any of the first three length modes. It is a starting point for the tape measure, not an answer.
The equilateral triangle comes from the loudspeakers, not the room. Most two-way designs are voiced for roughly 30 degrees of included angle, which is what an equilateral layout gives you, and it puts the two arrival times equal at the listening position so the phantom center image is stable. Pulling the seat further back widens the room's contribution relative to the direct sound; pushing it closer does the reverse. If the room is bad, closer is usually better, because the direct-to-reverberant ratio rises.
Both of these are outranked by measurement. Use them to choose where to start measuring.
A greedy peak-finder over the smoothed, ideally spatially averaged response, restricted to the modal region, capped in gain, and hard-limited in what it is allowed to boost. Each filter is a Room EQ Cookbook peaking biquad and the exact coefficients are printed so you can transcribe them into anything. The audition button applies the same chain to the signal generator through the browser's own peaking filters, which use the identical formula, so what you hear is what the numbers say.
Upper limit 0 means "use the Schroeder frequency from the modes tab, clamped to 300 Hz". You cannot raise it above 300 by hand, and the reason is in the honesty note below.
| # | f0 | Q | gain | b0 | b1 | b2 | a1 | a2 |
|---|
Cut peaks. Do not boost nulls. A peak is energy storage: a mode being efficiently driven, so more sound arrives than the source emitted. Turn the drive down at that frequency and the level genuinely falls. A null is cancellation: two paths arriving in opposition, so the transfer function is close to zero there. Boost it by 12 dB and you multiply near-zero by four. You spend sixteen times the amplifier power and four times the excursion, the cancellation subtracts the extra energy just as completely, and you get almost nothing back at the seat. Meanwhile every position in the room that does not have a null there now gets the full 12 dB. You have made the room worse in order to fail to fix one chair. This page caps boost at 3 dB and refuses any boost where the unsmoothed response shows a dip deeper than 10 dB or narrower than a twelfth of an octave, and it tells you which filter it declined and why.
Nothing narrow above 300 Hz, ever. Below the Schroeder frequency the room is a handful of resonances that occupy large regions of space and behave consistently across a seating area. Above it, the single-point response is an interference pattern with a 5.57 dB standard deviation and a peak every few hertz, which exists at one ear position and nowhere else. Correcting it point by point makes every other position worse. Broad correction above the modal region is legitimate, at third-octave resolution or wider and of the order of a few dB, because that is correcting the loudspeaker's power response and the room's average absorption, both of which are real and stable. That is a tilt or a shelf, not a parametric filter.
Equalization cannot fix decay time. A minimum-phase filter changes the level at which a mode is driven. It does not change the mode's Q or its decay rate. A 60 Hz mode that rings for 800 ms still rings for 800 ms afterwards; it just starts 8 dB quieter and so drops below audibility sooner. That is a real perceptual improvement and it is not the same thing as fixing the decay. Only absorption changes decay.
Equalization cannot fix reflections. Boundary interference, the floor bounce and early reflections are time-domain events. A filter on the source is applied to the reflection in the same proportion. You cannot subtract a delayed copy of a signal with a filter that acts on both copies equally.
What to do instead, below 100 Hz. If the proposal declines a deep wide null, the fix is geometry: move the subwoofer, move the seat, or add a second subwoofer. Two to four subwoofers, positioned and levelled sensibly, flatten the low end over a seating area in a way no single-position filter can, because they change how the modes are excited rather than what is fed to them. Equalize afterwards, on the already flatter result.
Measure each source on its own, from the same microphone position, in the same session, without touching any gain or routing. The unknown chain latency is then common to both measurements and cancels exactly in the difference. This is the regime where a phone is as good as a laboratory rig, because everything unknown divides out.
Peak-finding fails for a subwoofer. Its impulse response is heavily low-passed, so the peak is a broad sluggish hump whose maximum can sit tens of milliseconds from the true arrival and whose position depends on the crossover slope. The right measurement is a cross-correlation of the two impulse responses band-limited to one octave around the crossover, which is the only region where both sources actually contribute. The sign of the correlation peak is the relative polarity, and a parabolic fit on the three samples around it gets sub-sample resolution.
Say polarity, not phase. They are different things and conflating them is a tell. Absolute polarity, meaning whether a positive sample produces a positive pressure, is not measurable here: it needs a reference microphone and source of known polarity. Relative polarity between two sources measured minutes apart on the same chain is measurable, because the chain's own sign is common to both and cancels.
Verify with the null test, which is definitive. Apply the delay. Measure the sum of both sources with the sub polarity normal, then again with it inverted. The alignment is right when the inverted case produces the deepest null it can at the crossover. This is far more sensitive than maximizing the normal sum: a null depth of 25 dB against 15 dB is unmistakable, while a summed peak of +5.8 dB against +6.0 dB is not. Sweep the delay in half-millisecond steps around the computed answer and pick the deepest inverted null.
You can only ever delay the source that arrives earlier. Subwoofers usually arrive late, because their own low-pass and driver rolloff contribute group delay near the crossover, so the usual answer is to delay the mains. Many receivers express that only as a speaker distance: increasing the distance setting delays that speaker. Both numbers are given.
Frequency weighting applied per bin in the transform domain, which is exact and needs no filter design, then a one-pole time weighting on the power. Until you enter a calibration offset this reads decibels relative to digital full scale and nothing more. It is not, and after calibration still is not, an IEC 61672 class 2 instrument.
Constraints are requests, not commands. This asks the browser to disable echo cancellation, automatic gain control and noise suppression, then reads back what the browser actually did, and measures the noise floor so you know what headroom you have before you measure anything.
A phone measurement is a comparative and diagnostic instrument, not a metrological one. It is very good at telling you where: which frequencies peak, where the nulls are, how long the room rings, whether the subwoofer is aligned and in polarity, and whether the change you just made helped. It is poor at telling you how much in absolute terms, and it is close to blind to the true level of the bottom two octaves. Every quantity below that depends only on ratios and timings inside one measurement, or on differences between two measurements taken minutes apart on the same device, is trustworthy. Everything that depends on knowing the microphone's true sensitivity or its true response is not.
| quantity | needs calibration | phone, realistically |
|---|---|---|
| Peak and dip frequency location | no | ±1 to 2 percent, excellent |
| Response shape, 200 Hz to 8 kHz, smoothed and spatially averaged | no | ±2 to 3 dB |
| Response shape, 100 to 200 Hz | no | ±3 dB |
| Response level below 100 Hz | yes, needs a cal file | peaks located correctly, level unknown to ±10 dB |
| Response above 10 kHz | yes | unreliable, port and case resonance |
| RT60 and T30, 250 Hz to 4 kHz, with enough SNR | no | ±10 to 20 percent |
| RT60 at 63 and 125 Hz | no | usually fails the SNR gate, and not diffuse anyway |
| EDT | no | ±20 percent |
| C50, C80, D50, Ts | no | ±1 to 2 dB |
| Relative time alignment, same session | no | ±1 sample, about 0.02 ms |
| Relative polarity | no | reliable |
| Before and after a room change | no | reliable, this is the killer application |
| Room mode frequencies | no | reliable |
| Absolute SPL | yes | ±3 to 5 dB after offset, worse at the extremes |
| Loudspeaker sensitivity, dB per watt per meter | yes | not attempted here |
| NC or RC curves, occupational limits | yes, and a real meter | not attempted here |
MEMS microphones have a first-order low-frequency rolloff set by the vent and back-volume time constant, with the corner typically somewhere between 20 and 100 Hz depending on the part and the acoustic port, varying widely between models and between individual units. On top of that many phones apply a non-defeatable high-pass around 50 to 100 Hz in the voice path for wind and handling noise. The practical expectation is −3 dB somewhere around 50 to 100 Hz, and 6 to 12 dB per octave below that, which puts you anywhere from 6 to 20 dB down at 30 Hz with no way for this page to know which.
At the top, the port and the phone case form a resonator that typically adds a +3 to +10 dB peak somewhere between 3 and 8 kHz, plus dips from case diffraction. Above about 2 kHz the microphone is not omnidirectional either, so orientation is worth several dB.
The operational rule that follows: sharp features are trustworthy, broad tilt is not. The microphone's own error is smooth, monotonic and slowly varying, so it cannot create or move a narrow 12 dB peak. This page will confidently tell you there is a +12 dB peak at 62 Hz that is 3 Hz wide. It will not tell you your response is 8 dB down at 30 Hz, because the microphone's unknown rolloff is the same size as the thing being measured. The low-frequency region of every response plot is shaded for this reason.
And the measurement is speaker times room, inseparably, plus microphone and converters. There is no measurement in a room that separates the loudspeaker from the room. Gating the impulse response before the first reflection gets you a quasi-anechoic result, but only above roughly twice the reciprocal of the window length, and in a normal room the floor bounce arrives 3 to 8 ms after the direct sound, so that floors out somewhere between 250 and 650 Hz. You cannot obtain an anechoic bass response indoors. A dip is described here as an interference null at your listening position, never as a fault in your loudspeaker, because the second claim is not supported by the measurement.
The arithmetic on this page is checkable, so here it is being checked. The transform is compared against a naive discrete Fourier transform computed from the definition. A synthetic room with an exactly known decay is convolved with the sweep, given an arbitrary latency, and pushed through the identical measurement path used for real data, to see whether the reverberation time comes back out. The biquad coefficients are compared against values computed independently. Numeric deltas, not ticks.
| test | expected | measured | delta |
|---|
Everything on this page is in this one file: the transform, the sweep generator, the filters, the plots. There is no framework, no content delivery network, and no runtime network request carrying a single thing this page measured. The only external reference is the web font, which has a full local fallback stack, so once the page has loaded it works with the radio off. Audio never leaves the device: the microphone stream is processed in the page and discarded, and a file you load for A/B listening is decoded locally and never uploaded.
Measurements are held in memory and are gone when the tab closes, because impulse responses are megabytes and browser storage is not the place for them. Room dimensions, the calibration offset and display preferences are kept in this browser's local storage and nowhere else.
Add it to your home screen if you want it on a phone in a room with no signal. There is deliberately no service worker: this is one static file, the browser's own cache handles it, and a service worker on a shared domain is a way to break the rest of the site for a benefit this page does not need.