Skip to content

Added Silent Disco HackRF Tool using Liquid DSP - #9

Open
daltoncox wants to merge 1 commit into
rfhs:masterfrom
daltoncox:SilentDiscoMultichannel
Open

Added Silent Disco HackRF Tool using Liquid DSP#9
daltoncox wants to merge 1 commit into
rfhs:masterfrom
daltoncox:SilentDiscoMultichannel

Conversation

@daltoncox

Copy link
Copy Markdown

Silent Disco multi-channel receiver (HackRF + liquid-dsp) — simultaneous multi-channel monitoring & live audio

Challenges addressed:

  1. Monitors the DEF CON Silent Disco system and plays the audio, with a channel selection feature supporting more than two Silent Disco channels.
  2. Monitors multiple channels at the same time — 5+ channels played/recorded simultaneously.

What this adds

A standalone C application (build/sdisco) that captures the entire 908–927.5 MHz Silent Disco band with a single HackRF One and FM-demodulates up to 10 channels simultaneously in software on one stream, mixing them into a single live stereo audio output. No GNU Radio / flowgraph required — pure C, built with CMake.

  • Full 45-channel map (5 transmitters A–E × 9 slots) from the TX1345 datasheet, plus the Ultra-900 (-u) map (CH1–CH10, A1–A3)
  • Select any subset at launch: -c A1,B3,E5 (comma/space separated, max 10)
  • Runtime channel switching: 1-9 mutes/unmutes each channel in selection order, 0 toggles all, +/- master volume
  • Auto LO selection nudges the mix off the HackRF DC spur; capture rate auto-picks the smallest 8–20 Msps that covers the selection
  • All selected channels are demodulated in parallel, at the same time, from one 20 Msps capture — the band spans 19.4 MHz, so the full 45-channel set fits in a single stream
  • Up to 10 channels played at once (MAX_DEMOD), each with its own DSP chain (NCO mix → Kaiser FIR channel filter → FM demod → de-emphasis → audio LPF → AGC)
  • Verified 5 simultaneous chains decode distinct audio cleanly: tests/sim_test.c reports RESULT: PASS for 1/2/3/5 channels carrying independent tones
  • One DSP worker thread per channel keeps 10 chains at 20 Msps in real time with audio production held at 48 kHz

Demo-able without hardware

./build/sdisco -s -c A1,B3,E5 synthesizes FM transmitters at true RF frequencies carrying unique 400 Hz-spaced tones — verifies per-channel mixing, routing, and simultaneous multi-channel decode by ear or with tests/sim_test.c.

Signal chain (per channel)

NCO mix-down → Kaiser-windowed-sinc FIR channel-select/decimator (60 dB stopband, ±110 kHz) → FM discriminator (kf from --dev) → de-emphasis (0/50/75 µs) → resample 500 kHz → 48 kHz → 15 kHz audio LPF → peak-envelope AGC → per-chain gain → summed stereo output via PortAudio.

Files

CMakeLists.txt build setup (sdisco + sim_test)
src/main.c CLI, sim source, runtime keys, diagnostics
src/channel.c/h TX1345 A-E + Ultra-900 channel maps
src/hackrx.c/h HackRF int8 I/Q capture ring
src/dsp.c/h multi-channel FM demod DSP engine (parallel chains)
src/audio.c/h PortAudio playback (priming, underrun stats)
src/ring.c/h SPSC rings
tests/sim_test.c offline DSP validation (1/2/3/5+ chains)
tools/ dsp_from_file.c, iqdump_analyze.py (debug aids)
README.md usage, channel maps, architecture, bug log

Tested

  • sim_test 5 → PASS: 1/2/3/5 simultaneous chains each decode their distinct tone with the correct slot routing
  • Verified against live DEF CON RF captures — each selected channel's message is audible and routes to the correct slot; residual in-band static traced to 39+ co-active carriers (RF noise floor), not the DSP

@ZeroChaos-

Copy link
Copy Markdown
Member

Come up to the CTF table and show us it works.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants