PCM Telemetry
128-word frames at 51.2 kbps with 32-bit sync correlation, A/D voltage scaling, and automatic complement-on-odd frame detection.
The Apollo Unified S-Band (USB) system was the backbone of all communications between ground stations and Apollo spacecraft from 1967 through 1975. A single 2287.5 MHz carrier handled everything: PCM telemetry, astronaut voice, ranging, and command uplinks. gr-apollo decodes these signals using modern software-defined radio.
gr-apollo provides a set of GNU Radio blocks and pure-Python engines that implement the full Apollo USB downlink demodulation chain. Feed it complex baseband samples and it produces decoded telemetry frames, voice audio, and AGC computer data.
PCM Telemetry
128-word frames at 51.2 kbps with 32-bit sync correlation, A/D voltage scaling, and automatic complement-on-odd frame detection.
Voice Audio
1.25 MHz FM subcarrier demodulated to 300—3000 Hz audio at 8 kHz output rate. Listen to astronaut comms.
Virtual AGC Bridge
TCP bridge to the Virtual AGC emulator. Send uplink commands, receive decoded AGC downlink lists (navigation state, autopilot data, DSKY display).
Test Signal Generator
Synthetic USB baseband generator with configurable SNR, known payloads, and voice. No RF hardware needed to develop and test.
The downlink receiver processes a phase-modulated carrier through five stages. Each stage has a standalone GNU Radio block, or you can use usb_downlink_receiver which chains them together.
flowchart TB
A["Complex<br/>Baseband<br/>5.12 MHz"] --> B["PM Demod<br/><em>Carrier PLL +<br/>phase extraction</em>"]
B --> C["Subcarrier<br/>Extract<br/><em>BPF + translate<br/>1.024 MHz → DC</em>"]
C --> D["BPSK Demod<br/><em>Costas loop +<br/>symbol sync</em>"]
D --> E["Frame Sync<br/><em>32-bit correlator<br/>SEARCH → LOCKED</em>"]
E --> F["PCM Demux<br/><em>128-word frames<br/>+ AGC channels</em>"]
B --> V["Voice<br/>Extract<br/><em>1.25 MHz FM</em>"]
V --> VA["Audio<br/>8 kHz"]
F --> T["Telemetry<br/>PDUs"]
F --> AG["AGC Data<br/>Ch 34/35/57"]
| Parameter | Value |
|---|---|
| Downlink frequency | 2287.5 MHz |
| PM peak deviation | 0.133 rad (7.6 deg) |
| PCM subcarrier | 1.024 MHz, BPSK |
| PCM bit rate | 51.2 kbps (high) / 1.6 kbps (low) |
| Voice subcarrier | 1.25 MHz, FM +/-29 kHz |
| Frame size | 128 words x 8 bits = 1024 bits |
| Frame rate | 50 fps (high rate) |
| Master clock | 512 kHz |
| Baseband sample rate | 5.12 MHz |
gr-apollo splits cleanly into two layers:
Pure-Python engines (no GNU Radio required) — the signal generator, frame sync engine, demux engine, downlink decoder, and AGC bridge client all work standalone. Use these for scripting, testing, or integration with other tools.
GNU Radio blocks (require gnuradio runtime) — each engine is wrapped in a GR block with proper streaming I/O and message ports. Use these in GRC flowgraphs or programmatic top_block scripts.
# Pure Python — always availablefrom apollo import generate_usb_baseband, FrameSyncEngine, DemuxEngine
# GNU Radio blocks — require gnuradio installedfrom apollo import pm_demod, bpsk_demod, pcm_frame_sync, usb_downlink_receivergr-apollo is based on these primary sources: