gr-apollo/grc/apollo_bpsk_subcarrier_demod.block.yml
Ryan Malloy 0ee7ff0ad7 Implement full Apollo USB downlink decoder chain
Complete signal processing pipeline from complex baseband to decoded
PCM telemetry, verified against the 1965 NAA Study Guide (A-624):

Core demod (Phase 1):
  - PM demodulator with carrier PLL recovery
  - 1.024 MHz subcarrier extractor (bandpass + downconvert)
  - BPSK demodulator with Costas loop + symbol sync
  - Convenience hier_block2 combining subcarrier + BPSK

PCM frame processing (Phase 2):
  - 32-bit frame sync with Hamming distance correlator
  - SEARCH/VERIFY/LOCKED state machine, complement-on-odd handling
  - Frame demultiplexer (128-word, A/D voltage scaling)
  - AGC downlink decoder (15-bit word reassembly from DNTM1/DNTM2)

Voice and analog (Phase 3):
  - 1.25 MHz FM voice subcarrier demod to 8 kHz audio
  - SCO demodulator for 9 analog sensor channels (14.5-165 kHz)

Virtual AGC integration (Phase 4):
  - TCP bridge client with auto-reconnect and channel filtering
  - DSKY uplink encoder (VERB/NOUN/DATA command sequences)

Top-level receiver (Phase 5):
  - usb_downlink_receiver hier_block2: one block, complex in, PDUs out
  - 14 GRC block YAML definitions for GNU Radio Companion
  - Example scripts for signal analysis and full-chain demo

Infrastructure:
  - constants.py with all timing/frequency/frame parameters
  - protocol.py for sync word + AGC packet encode/decode
  - Synthetic USB signal generator for testing
  - 222 tests passing, ruff lint clean
2026-02-20 13:18:42 -07:00

63 lines
1.3 KiB
YAML

id: apollo_bpsk_subcarrier_demod
label: Apollo BPSK Subcarrier Demod
category: '[Apollo USB]'
flags: [python]
parameters:
- id: subcarrier_freq
label: Subcarrier Frequency (Hz)
dtype: real
default: '1024000'
- id: bandwidth
label: Bandwidth (Hz)
dtype: real
default: '150000'
- id: bit_rate
label: Bit Rate (bps)
dtype: real
default: '51200'
- id: sample_rate
label: Sample Rate (Hz)
dtype: real
default: '5120000'
- id: decimation
label: Decimation Factor
dtype: int
default: '1'
- id: loop_bw
label: Loop Bandwidth
dtype: real
default: '0.045'
inputs:
- label: in
domain: stream
dtype: float
outputs:
- label: out
domain: stream
dtype: byte
templates:
imports: from apollo import bpsk_subcarrier_demod
make: >-
apollo.bpsk_subcarrier_demod.bpsk_subcarrier_demod(
subcarrier_freq=${subcarrier_freq},
bandwidth=${bandwidth},
bit_rate=${bit_rate},
sample_rate=${sample_rate},
decimation=${decimation},
loop_bw=${loop_bw})
documentation: |-
Apollo BPSK Subcarrier Demodulator
Convenience block combining subcarrier extraction and BPSK demodulation.
Extracts the 1.024 MHz BPSK PCM subcarrier from PM demod output and
recovers the NRZ bit stream.
This is equivalent to subcarrier_extract → bpsk_demod in series.
file_format: 1