Also known as: gain in tenths of a dB, front-end overload, ADC saturation
SDR gain and front-end overload cause two of the most common “nothing decodes”
reports, and both hide behind healthy-looking spectrum displays. The first is a units
trap: GopherTrunk’s gain is in tenths of a decibel. The second is that an
overloaded front end produces samples that still look fine on an FFT — because
constant-envelope modulations like C4FM survive hard limiting —
while the live decode path is dead.
Gain is tenths of a dB
gain: "300" means 30 dB. A bare "30" means 3.0 dB — enough attenuation to make a
workable signal undecodable, with no error anywhere
(#876).
This trap decided a real case: in
#935 a Melbourne CBD P25
site refused to lock, and the investigation went deep into demodulator-mode theories
before the actual problem surfaced — the gain that worked in SDRTrunk (~36 dB) had
never been ported into GopherTrunk’s tenths format. gain: "363" produced an
immediate lock and roughly 2,000 grants in five minutes.
Practical rules:
- When porting a known-good setup from SDR++ or SDRTrunk, multiply the dB figure by 10.
- For survey and field work, prefer a manual gain value found empirically in SDR++ over auto/AGC (#876).
The overload signature
#881 is the reference case.
A wideband VHF device with four control channels never decoded live, while a
near-identical sibling device decoded thousands of TSBKs. The reporter built a
compelling hypothesis about chunk sizes (“~19 dibits per chunk is less than the
24-dibit frame sync”), backed by log evidence — which turned out to be a lock-state
artifact: the no FSW hits in chunk line only fires while unlocked, so the working
device stopped emitting it the moment it locked, not because its chunks grew.
A raw capture settled it. The IQ was hard-saturated:
| Symptom | Looks like | Actually | Fix/Check |
|---|---|---|---|
| ~25% of u8 samples exactly 0 and ~25% exactly 255 (about half rail-pinned) | Strong healthy signal | AGC-driven front-end saturation | Histogram the raw capture; anything beyond a fraction of a percent at the rails is overload |
| Raw IQ RMS near or above 0 dBFS (measured +1.3 dBFS) | — | The ADC is clipping continuously | Target comfortable headroom; see the working sibling for a baseline |
| FFT shows clean, well-shaped carriers | RF path is fine | Constant-envelope C4FM keeps its shape through hard limiting — spectrum is the wrong instrument for overload | Look at the amplitude histogram, not the spectrum |
| The same capture decodes offline (3 of 4 control channels) | Live pipeline bug | Phase/frequency information survives limiting well enough for a forgiving offline decode, while the live path starves | Believe the histogram over the decode result |
wideband front end overloaded WARN |
Noise | The correct diagnosis, emitted by GopherTrunk itself | Act on it: reduce gain |
The confusing part of #881 was that overload coexisted with partial decodability: clipping is not all-or-nothing for angle modulations, so “the FFT looks great and offline replay half-works” does not rule it out.
The counter-intuitive fix: less gain, fixed
On a front end being overloaded by strong in-band or near-band signals, more gain
makes it worse — and AGC, which responds to total power, will happily drive the
device into the rails. The fix in #881 was a fixed gain: "200" (20 dB), replacing
AGC. The general rule:
- On a hot band (VHF high sites, close transmitters), use fixed low gain, not AGC.
- If reducing gain changes the decode markedly, the problem was compression or intermodulation; if a quality deficit is independent of gain across a wide range, it is not overload — see Airspy sample-rate selection for the phase-noise case that gain cannot touch.
- Dropping
sample_rateto escape an oversampling warning is not a lever here: the RTL wideband path snaps back to 2.048 MS/s (#881).
Provenance
- #881 — the rail-pinned-histogram overload signature; the plausible-but-wrong short-chunk hypothesis and its lock-state log artifact; fixed low gain over AGC.
- #935 — the tenths-of-a-dB port from SDRTrunk (
gain: "363") that turned a dead site into ~2K grants in five minutes. - #876 — gain units on the USRP/SoapyRemote path and the prefer-manual-gain field advice.