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.
45 lines
994 B
YAML
45 lines
994 B
YAML
id: apollo_pm_mod
|
|
label: Apollo PM Mod
|
|
category: '[Apollo USB]'
|
|
flags: [python]
|
|
|
|
parameters:
|
|
- id: pm_deviation
|
|
label: PM Deviation (rad)
|
|
dtype: real
|
|
default: '0.133'
|
|
- id: sample_rate
|
|
label: Sample Rate
|
|
dtype: real
|
|
default: '5120000'
|
|
|
|
inputs:
|
|
- label: in
|
|
domain: stream
|
|
dtype: float
|
|
|
|
outputs:
|
|
- label: out
|
|
domain: stream
|
|
dtype: complex
|
|
|
|
templates:
|
|
imports: from apollo.pm_mod import pm_mod
|
|
make: apollo.pm_mod.pm_mod(pm_deviation=${pm_deviation}, sample_rate=${sample_rate})
|
|
|
|
documentation: |-
|
|
Apollo PM Modulator
|
|
|
|
Applies phase modulation to produce complex baseband signal.
|
|
Takes a composite modulating signal (sum of subcarriers) and outputs
|
|
s(t) = exp(j * pm_deviation * input(t)).
|
|
|
|
The spacecraft PM deviation is 0.133 rad (7.6 degrees) peak.
|
|
This is the transmit-side counterpart to Apollo PM Demod.
|
|
|
|
Parameters:
|
|
pm_deviation: Peak phase deviation in radians (default 0.133)
|
|
sample_rate: Sample rate in Hz (default 5.12 MHz)
|
|
|
|
file_format: 1
|