A spectrogram answers a question a level meter cannot: not how loud, but what, and when. Every column is one short Fourier transform of the signal, stacked left to right, so a sustained note becomes a horizontal line and a snare hit becomes a vertical one.
Reading the plot
Bright means loud. The default palette runs from the page background through the category tint to white, so the loudest content is the whitest.
A voice shows a stack of evenly spaced horizontal lines, the harmonics of the fundamental, moving together as the pitch changes. A cymbal is a broad wash across the top. Mains hum is a straight line at 50 or 60 Hz that never moves, with weaker lines at each multiple.
FFT size is a trade, not a quality setting
The transform cannot resolve time and frequency at once. A 512-point window at 48 kHz covers about 10 ms, so it places an event precisely and lumps every pitch into 94 Hz-wide bins. An 8192-point window covers 170 ms and resolves 6 Hz, which separates two close notes but smears the moment they start.
Pick by the question. Finding the exact frequency of a resonance wants a large window. Finding the sample where a click happened wants a small one.
Log vs linear frequency
The linear axis gives every hertz the same width, so the top octave takes half the picture and everything musical is crushed into the bottom strip. It is the right choice when you care about the top of the band, such as spotting an encoder’s low-pass.
The log axis gives every octave the same width, which is how pitch is heard. Use it for music, speech, and anything where the bass matters.
The floor
Everything below the floor is drawn as background. Raising it toward -30 dB strips away room tone and leaves only the strong content; dropping it toward -110 dB reveals the noise floor, the dither, and whatever else is hiding down there.
The floor is a display control, not a measurement. Moving it redraws the same data rather than reading the file again.
Long files
Columns are pooled as they arrive. When the column budget fills, neighbouring columns are merged and the pooling doubles, so a 45-minute file uses the same memory as a 45-second one and simply reads coarser in time. The column width is printed under the plot.
Pooling keeps the loudest frame in each column rather than the average, so a single click in an hour of silence still shows up as a vertical line.