gr-apollo/grc/apollo_usb_signal_source.block.yml
Ryan Malloy 493c21c511 Add transmit chain: 6 composable GR source blocks mirroring CuriousMarc bench
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.
2026-02-21 18:55:50 -07:00

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