fetch_apollo_audio.py downloads Apollo 11 audio highlights from Archive.org
and extracts clips using ffmpeg (48 kHz mono WAV). Supports --list, --clip,
--all with idempotent downloads and progress reporting.
real_signal_demo.py auto-discovers downloaded clips and runs them through the
full USB downlink TX/RX chain (PCM telemetry + FM voice), saving recovered
audio for comparison. Falls back to the bundled demo clip if no downloads exist.
Also adds .gitignore to keep large audio files out of the repo while preserving
the small apollo11_crew.wav demo clip.
The blanket max-age=3600 caused stale HTML pages after redeployment.
Now _astro/* gets immutable (content-addressed filenames) and HTML
pages get no-cache (always revalidate, 304 when unchanged).
Link Mike Stewart's GitHub (thewonderidiot), add the full Apollo
Comms YouTube playlist, and reference Ken Shirriff's PMP and FM
radio posts that directly relate to gr-apollo's block architecture.
FM mode now has the same three-layer architecture as PM mode:
- fm_mod/fm_demod for carrier-level FM modulation
- fm_signal_source/fm_downlink_receiver convenience wrappers
- fm_loopback_demo.py verifying round-trip SCO voltage recovery
Includes GRC YAML for all 4 blocks and doc updates across
blocks reference, SCO guide, and signal architecture pages.
Assembles the complete Apollo USB downlink signal from individual blocks:
PCM frames on 1.024 MHz BPSK + crew voice on 1.25 MHz FM, both PM-modulated
onto a single complex carrier. Receives and splits into decoded PCM frames
and recovered voice audio.
Clean: 399/402 frames, 8s voice. At 25 dB SNR: 395/402 frames.
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.