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.
81 lines
2.1 KiB
YAML
81 lines
2.1 KiB
YAML
id: apollo_usb_signal_source
|
|
label: Apollo USB Signal Source
|
|
category: '[Apollo USB]'
|
|
flags: [python]
|
|
|
|
parameters:
|
|
- id: sample_rate
|
|
label: Sample Rate (Hz)
|
|
dtype: float
|
|
default: '5120000'
|
|
- id: bit_rate
|
|
label: PCM Bit Rate
|
|
dtype: int
|
|
default: '51200'
|
|
options: ['51200', '1600']
|
|
option_labels: ['51.2 kbps (high rate)', '1.6 kbps (low rate)']
|
|
- id: pm_deviation
|
|
label: PM Deviation (rad)
|
|
dtype: float
|
|
default: '0.133'
|
|
- id: voice_enabled
|
|
label: Voice Subcarrier
|
|
dtype: bool
|
|
default: 'False'
|
|
options: ['True', 'False']
|
|
option_labels: ['Enabled', 'Disabled']
|
|
- id: voice_tone_hz
|
|
label: Voice Test Tone (Hz)
|
|
dtype: float
|
|
default: '1000'
|
|
- id: snr_db
|
|
label: SNR (dB)
|
|
dtype: raw
|
|
default: 'None'
|
|
|
|
inputs:
|
|
- label: frame_data
|
|
domain: message
|
|
optional: true
|
|
|
|
outputs:
|
|
- label: out
|
|
domain: stream
|
|
dtype: complex
|
|
|
|
templates:
|
|
imports: from apollo.usb_signal_source import usb_signal_source
|
|
make: >-
|
|
apollo.usb_signal_source.usb_signal_source(
|
|
sample_rate=${sample_rate},
|
|
bit_rate=${bit_rate},
|
|
pm_deviation=${pm_deviation},
|
|
voice_enabled=${voice_enabled},
|
|
voice_tone_hz=${voice_tone_hz},
|
|
snr_db=${snr_db})
|
|
|
|
documentation: |-
|
|
Apollo USB Signal Source -- complete transmit chain in one block.
|
|
|
|
Generates a PM-modulated complex baseband signal containing:
|
|
- 1.024 MHz BPSK subcarrier with PCM telemetry frames
|
|
- Optional 1.25 MHz FM voice subcarrier (test tone)
|
|
- Optional AWGN noise
|
|
|
|
This is the transmit-side counterpart to the USB Downlink Receiver.
|
|
It mirrors CuriousMarc's bench: individual composable blocks wired
|
|
together as one convenience wrapper.
|
|
|
|
Message input:
|
|
frame_data -- inject custom payload bytes for the next PCM frame
|
|
|
|
Parameters:
|
|
sample_rate: Output sample rate (default 5.12 MHz)
|
|
bit_rate: PCM bit rate -- 51200 (high) or 1600 (low)
|
|
pm_deviation: Peak PM deviation in radians (default 0.133)
|
|
voice_enabled: Include 1.25 MHz FM voice subcarrier
|
|
voice_tone_hz: Voice test tone frequency in Hz
|
|
snr_db: Add AWGN noise at this SNR (None = no noise)
|
|
|
|
file_format: 1
|