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