Tunable AM Broadcast Band receiver. Drag the Tune slider across 540–1700 kHz, drag the Volume slider, hear the station. Waterfall and PSD show what the tuner is on. AM BCB picks up reliably even on a thumbtack antenna — this is the "always works" demo.
rx888.source (32 MS/s real)
→ float_to_complex (imag = 0)
→ freq_shift_cc (-center_freq, retunes live)
→ rational_resampler_ccc (decim=16) → 2 MS/s complex
├→ qtgui_waterfall_sink_c + qtgui_freq_sink_c (±1 MHz around tune)
└→ rational_resampler_ccc (decim=10) → 200 kHz complex
→ analog.am_demod_cf (audio_decim=4, 3 kHz audio LPF) → 50 kHz real
→ rational_resampler_fff (24/25) → 48 kHz
→ multiply_const_ff (volume slider)
→ audio.sink (ALSA default → pulse plugin → host PulseAudio)
The extra decim stage before am_demod_cf keeps the block's
internal optfir.low_pass Parks-McClellan design inside a sane
numerical range — going directly from 2 MS/s to 50 kHz audio asks
for several thousand filter taps and pm_remez bails.
Use this inside the Docker image via the audio + X11 + USB run line
in ../docker/README.md. The container's
audio.sink writes to ALSA's default device, which is wired
through the pulse plugin to the host's PulseAudio/PipeWire — no
contention for /dev/snd. Skip the pulse bind-mount and the audio
sink still fails to open at start.
Same tuning + waterfall + PSD as the audio version, no audio output. Use when running headless / on a host without ALSA / when you only want the visualization.
The whole 0–16 MHz Nyquist span at 32 MS/s real. No tuning, no decimation — useful for spotting the DC spike, image responses, spurious lines, and verifying the hardware is generally alive. Open from GRC manually:
gnuradio-companion /opt/gr-rx888/examples/hf_waterfall_demo.grcA ~493-tap linear-phase half-band low-pass filter (half the taps are
zero by construction, center tap = 0.5, cutoff at fs/4). Drop into
a GRC variable_file_filter_taps block when you want to cascade
cheap decim=2 half-band stages — much cheaper at high sample rates
than a single fat rational_resampler with auto-generated taps.
Typical use (e.g. 32 MS/s → 2 MS/s in four halfband decim=2 stages):
... → freq_shift_cc → rational_resampler_ccc[decim=2, taps=halfband]
→ rational_resampler_ccc[decim=2, taps=halfband]
→ rational_resampler_ccc[decim=2, taps=halfband]
→ rational_resampler_ccc[decim=2, taps=halfband]
→ sink
Worth swapping in when running at 135 MS/s where the single-stage decim is a CPU pig; not necessary for the 32 MS/s booth demo.