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.
59 lines
1.7 KiB
YAML
59 lines
1.7 KiB
YAML
id: apollo_fm_voice_subcarrier_mod
|
|
label: Apollo FM Voice Subcarrier Mod
|
|
category: '[Apollo USB]'
|
|
flags: [python]
|
|
|
|
parameters:
|
|
- id: sample_rate
|
|
label: Sample Rate (Hz)
|
|
dtype: real
|
|
default: '5120000'
|
|
- id: subcarrier_freq
|
|
label: Subcarrier Frequency (Hz)
|
|
dtype: real
|
|
default: '1250000'
|
|
- id: fm_deviation
|
|
label: FM Deviation (Hz)
|
|
dtype: real
|
|
default: '29000'
|
|
- id: tone_freq
|
|
label: Test Tone Frequency (Hz)
|
|
dtype: real
|
|
default: '1000'
|
|
|
|
outputs:
|
|
- label: out
|
|
domain: stream
|
|
dtype: float
|
|
|
|
templates:
|
|
imports: from apollo.fm_voice_subcarrier_mod import fm_voice_subcarrier_mod
|
|
make: >-
|
|
apollo.fm_voice_subcarrier_mod.fm_voice_subcarrier_mod(
|
|
sample_rate=${sample_rate},
|
|
subcarrier_freq=${subcarrier_freq},
|
|
fm_deviation=${fm_deviation},
|
|
tone_freq=${tone_freq})
|
|
|
|
documentation: |-
|
|
Apollo FM Voice Subcarrier Modulator
|
|
|
|
Source block that generates a 1.25 MHz FM subcarrier with a sinusoidal test
|
|
tone. Transmit-side counterpart to the voice subcarrier demodulator.
|
|
|
|
The signal chain is: test tone -> FM modulator -> upconvert to 1.25 MHz
|
|
-> real-valued output. With default parameters this produces a signal
|
|
matching the Apollo USB downlink voice subcarrier (+/-29 kHz deviation).
|
|
|
|
On the real spacecraft, voice audio (300-3000 Hz) drives an FM VCO at
|
|
113 kHz, which is mixed with the 512 kHz master clock and doubled to
|
|
produce the 1.25 MHz FM subcarrier.
|
|
|
|
Parameters:
|
|
sample_rate: Output sample rate in Hz (default 5.12 MHz)
|
|
subcarrier_freq: FM subcarrier center frequency in Hz (default 1.25 MHz)
|
|
fm_deviation: FM deviation in Hz (default +/-29 kHz)
|
|
tone_freq: Internal test tone frequency in Hz (default 1 kHz)
|
|
|
|
file_format: 1
|