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
59 lines
1.4 KiB
YAML
59 lines
1.4 KiB
YAML
id: apollo_pcm_demux
|
|
label: Apollo PCM Demux
|
|
category: '[Apollo USB]'
|
|
flags: [python]
|
|
|
|
parameters:
|
|
- id: output_format
|
|
label: Output Format
|
|
dtype: string
|
|
default: 'raw'
|
|
options: ['raw', 'scaled', 'engineering']
|
|
option_labels: ['Raw (8-bit)', 'Scaled (voltage)', 'Engineering']
|
|
- id: words_per_frame
|
|
label: Words Per Frame
|
|
dtype: int
|
|
default: '128'
|
|
options: ['128', '200']
|
|
option_labels: ['High Rate (128)', 'Low Rate (200)']
|
|
|
|
inputs:
|
|
- label: frames
|
|
domain: message
|
|
|
|
outputs:
|
|
- label: telemetry
|
|
domain: message
|
|
- label: agc_data
|
|
domain: message
|
|
- label: raw_frame
|
|
domain: message
|
|
|
|
templates:
|
|
imports: from apollo import pcm_demux
|
|
make: >-
|
|
apollo.pcm_demux.pcm_demux(
|
|
output_format=${output_format},
|
|
words_per_frame=${words_per_frame})
|
|
|
|
documentation: |-
|
|
Apollo PCM Frame Demultiplexer
|
|
|
|
Receives complete PCM frames from the frame synchronizer and
|
|
demultiplexes them into individual telemetry words and AGC data.
|
|
|
|
Output ports:
|
|
telemetry: Individual word PDUs with position and value metadata.
|
|
agc_data: AGC channel data (ch 34/35/57) for downlink decoder.
|
|
raw_frame: Complete frame passthrough.
|
|
|
|
A/D scaling (section 5.3):
|
|
code 1 = 0V, code 254 = 4.98V, step = 19.7 mV/LSB
|
|
Low-level inputs have x125 gain (0-40 mV range).
|
|
|
|
Parameters:
|
|
output_format: "raw" (8-bit codes), "scaled" (voltage), "engineering" (named)
|
|
words_per_frame: 128 (high rate) or 200 (low rate)
|
|
|
|
file_format: 1
|