Field Guide · term

Also known as: decimation

Decimation reduces a signal’s sample rate by keeping only every Nth sample, after a low-pass filter removes the frequencies that would otherwise alias.1 The integer N is the decimation factor; the pair “low-pass then downsample” is treated as one operation.

high rate keep every 4th (÷4) low rate
Decimation lowers the sample rate after filtering, cutting the data the rest of the pipeline must process.

How it works

Downsampling by N lowers the sample rate to Fs/N, which drops the Nyquist frequency to Fs/2N. Any energy that was between the new and old Nyquist limits does not disappear — it folds down onto the surviving band as an alias. So the order is non-negotiable: filter first, then decimate. The low-pass stage confines the signal to the new, narrower band before the samples are thrown away, so nothing folds back. Skipping or under-designing that filter is one of the most common DSP mistakes, and it manifests as noise or phantom carriers that no later stage can remove.

Once a narrow channel has been isolated, decimating cuts the workload of everything downstream in direct proportion — halve the rate and you halve the multiply-adds per second in the demodulator, the timing recovery, and the decoder. This is why decimation, not raw CPU speed, is what makes running many channels from one wide capture practical.

Variants

  • Cascaded (multistage) decimation — a large factor is split into smaller stages (e.g. ÷2 several times). Each early stage runs a short filter at a high rate and a heavier filter runs last at a low rate, drastically cutting total computation.
  • Half-band filters — the efficient choice for ÷2 stages: nearly half their coefficients are zero.
  • CIC filter — a multiplierless integrator-comb structure for very large decimation factors in FPGAs and radio ASICs; needs a corrective FIR afterward to flatten its passband droop.
  • Polyphase decimation — restructures the filter so it only computes the output samples that are kept, never wasting work on discarded ones.

In practice

Non-integer rate changes need a resampler (interpolate, filter, decimate), since plain decimation only divides by an integer. In GopherTrunk decimation lives inside the digital down-converter: after the NCO shifts a channel to baseband, the signal is low-pass filtered and decimated down to the per-protocol channel rate (48 kHz for 4800-baud C4FM, 144 kHz for TETRA), so the demodulator always runs at a fixed, low rate regardless of the capture rate.

The same down-converter also decimates captures on demand, so a long recording need not be stored at the radio’s full rate. Some SDRs cannot stream a low rate at all — the USRP B210’s hardware sample-rate floor is ~1 MS/s, far above what a single narrowband channel needs — so GopherTrunk records at the hardware rate and decimates in software:

  • gophertrunk capture -decimate N records the full band at sample-rate / N (or -bandwidth <hz> to carve a narrowband slice).
  • --iq-capture …,decimate=N decimates a live-daemon grab and writes a metadata sidecar with the reduced rate.
  • baseband.auto_record: { tap: wideband, decimate: N } decimates event-triggered captures.

Each anti-alias filters before downsampling, so a 1 MS/s B210 stream becomes an alias-free 200 kS/s file at decimate: 5 — one fifth the size, still wide enough to replay and debug.

Relevance to SDR

Decimation is what makes running many channels from one capture computationally feasible, and it is the reason GopherTrunk’s decode path is rate-invariant to the radio’s capture rate.

Sources

  1. Decimation (signal processing) — Wikipedia, on filter-then-downsample and anti-alias requirements. ↩

See also