What is a spectrogram?

A spectrogram is a time–frequency plot. Each vertical slice is a single FFT (Fast Fourier Transform) frame — a snapshot of how much energy is present at each frequency at that moment. As time passes, new frames are appended to the right, and the display scrolls leftward so the most recent audio is always at the right edge.

  • Horizontal axis — time, scrolling from right to left
  • Vertical axis — frequency, with low frequencies at the bottom and high frequencies at the top
  • Colour — amplitude (sound pressure level in dB), mapped through the selected colour palette

Frequency range

The spectrogram displays from 0 Hz up to the Nyquist frequency — half the active sample rate. The Nyquist frequency is the highest frequency that can be faithfully represented at a given sample rate:

Sample rate Nyquist (max displayed frequency)
44.1 kHz 22.05 kHz
48 kHz 24 kHz
96 kHz 48 kHz
192 kHz 96 kHz

The actual sample rate used depends on your hardware and the active iOS audio route. Choose a preferred sample rate in Settings; Chirps then reports the actual negotiated rate in the info bar and Diagnostics. A 192 kHz-capable USB microphone extends the display into the bat echolocation range, while devices with custom rates are shown with those discovered values when iOS exposes them.


FFT and frequency resolution

Chirps calculates the FFT window size, FFT size, hop size, and output bin count automatically from:

  • The active sample rate
  • The physical height of the plot panel (in pixels)
  • The visible frequency span

The system targets enough output bins to fill the screen with one bin per display pixel, never oversampling. On a typical iPad in landscape, this resolves to a window of 8,192–16,384 samples with 1,024–2,048 output bins depending on the active frequency span. On a smaller iPhone display the numbers are proportionally smaller.

Window size — controls frequency resolution. Larger windows resolve closer frequencies better but add latency.

Hop size — the step between successive FFT frames. Smaller hops produce more time slices per second (smoother scrolling), at the cost of more CPU or GPU work.

You do not need to set these manually. Chirps computes them when the stream starts and recomputes them if the plot panel is resized.


GPU rendering and fallback

Chirps uses the GPU (Metal) as the preferred live spectrogram rendering path. FFT frames are prepared for the active display and rendered through Metal so the plot can scroll smoothly while recording and monitoring continue.

An internal CPU fallback remains available if Metal cannot be used.


Colour palettes

Chirps includes six colour palettes. All palettes map dB amplitude (after perceptual emphasis) to colour; they differ in which features of the spectrum they visually emphasise.

Palette Character
Blue (default) Deep blue–to–cyan gradient. High contrast on both faint and loud signals. Designed for broad bioacoustic use.
Autumn Orange–red–yellow. Emphasises mid-level structure. Good for bird calls and insect sound.
Bloom Purple–pink–white. High-contrast for faint signals against a dark background.
Flux Teal–green gradient. Smooth perceptual gradient
Solaris Yellow–white. Very bright render, useful in high ambient light outdoors.
Grey Monochrome.

Inverted colour map — available for all palettes. Swaps the direction of the gradient so that higher amplitude = darker colour. Some prefer inverted grey for printing.

Long-press the plot while the stream is running to open the spectrogram tools, then use the paintbrush to change the active colour palette. Double-tap the plot to show the prominent grid overlay; the dB colour legend appears with that overlay.


Dynamic range and perceptual emphasis

Sound recordings contain energy across a very wide dynamic range — sometimes 80 dB or more from the quietest detail to the loudest signal. If the entire palette was mapped linearly across this range, faint calls would be invisible and loud signals would dominate every colour.

Chirps uses a perceptual emphasis curve: more of the palette range is allocated to the loudest 30 dB of the visible signal. This makes faint spectral structure visible alongside loud signals without clipping the bright end.

The display bounds adapt to the content currently visible in the plot. In live view, the colour range follows the ring buffer window. In Data Review playback, it follows the rolling playback window. The upper bound responds to the peak of the visible signal, then breathes down gradually as louder transients leave view so past loud calls do not suddenly wash out.


Ring buffer duration

The ring buffer holds the most recent N seconds of spectrogram columns in GPU memory. The maximum is 10 seconds. You can reduce this to 2 seconds on older devices to save memory, or leave it at the maximum.

The ring buffer duration is set in Settings → Recording → Ring Buffer. It is adjustable from 2 to 10 seconds in 0.1 second steps and takes effect when the stream is restarted.


Frequency zoom

You can constrain the display to a sub-range of the full frequency span using the spectrogram tools opened from the plot. For example, constraining to 20–90 kHz when using a 192 kHz input focuses the view on the bat frequency range and suppresses audible noise below 20 kHz.

Changing the frequency limits may restart the spectrogram view, but it does not stop the audio stream.