FM-modulates real Apollo 11 onboard audio onto the 1.25 MHz voice
subcarrier (+/-29 kHz deviation) and demodulates it back, achieving
94.1% correlation with the original. Audio source: NASA/Internet
Archive public domain (Collins bidding farewell to Eagle crew).
- sco_mod: 9-channel FM subcarrier oscillator modulator (inverse of sco_demod),
with round-trip tests proving voltage recovery across all channels
- fm_voice_subcarrier_mod: add audio_input parameter to accept external float
streams (e.g., Apollo mission voice recordings) instead of internal test tone
- loopback_demo.py: streaming TX->RX round-trip with CLI for noise/voice/frames
- agc_loopback_demo.py: full Virtual AGC integration via TCP bridge
Implement the transmit/generate side as streaming GNU Radio blocks,
complementing the existing receive chain. Each block maps to a physical
instrument on CuriousMarc's Keysight bench:
pcm_frame_source - PCM bit stream generator (sync_block + FrameSourceEngine)
nrz_encoder - bits to NRZ waveform (+1/-1) with upsampling
bpsk_subcarrier_mod - NRZ x cos(1.024 MHz) BPSK modulator
fm_voice_subcarrier_mod - 1.25 MHz FM test tone source
pm_mod - phase modulator: exp(j * deviation * input)
usb_signal_source - convenience wrapper wiring all blocks together
Includes GRC YAML definitions for all blocks under [Apollo USB] category,
49 new tests (271 total, all passing), and a loopback test that validates
the full TX->RX round trip including frame recovery with 30 dB AWGN.
Custom renderer with NASA-blue theme, Inter font, signal arc decoration.
Generates 1200x630 PNG per page at build time via astro-opengraph-images.
Head component injects og:image meta tag using getImagePath().
Project scaffold for decoding Apollo USB signals:
- 2287.5 MHz downlink with PM/FM modulation
- 1.024 MHz BPSK subcarrier (PCM telemetry)
- 1.25 MHz FM subcarrier (voice)
- 128-word PCM frames at 50 fps
Based on NAA Course A-624 Study Guide (1965) and Virtual AGC.