Skip to content

What is gr-apollo?

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"]
ParameterValue
Downlink frequency2287.5 MHz
PM peak deviation0.133 rad (7.6 deg)
PCM subcarrier1.024 MHz, BPSK
PCM bit rate51.2 kbps (high) / 1.6 kbps (low)
Voice subcarrier1.25 MHz, FM +/-29 kHz
Frame size128 words x 8 bits = 1024 bits
Frame rate50 fps (high rate)
Master clock512 kHz
Baseband sample rate5.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 available
from apollo import generate_usb_baseband, FrameSyncEngine, DemuxEngine
# GNU Radio blocks — require gnuradio installed
from apollo import pm_demod, bpsk_demod, pcm_frame_sync, usb_downlink_receiver
  • Python 3.10+
  • uv (for dependency management and running)
  • NumPy (installed automatically)
  • GNU Radio 3.10+ (only for the GR blocks — the pure-Python engines work without it)

gr-apollo is based on these primary sources: