id: apollo_fm_downlink_receiver label: Apollo FM Downlink Receiver category: '[Apollo USB]' flags: [python] parameters: - id: channels label: SCO Channels dtype: raw default: '[1, 5, 9]' - id: fm_deviation_hz label: FM Deviation (Hz) dtype: real default: '500000' - id: sample_rate label: Sample Rate dtype: float default: '5120000' - id: carrier_pll_bw label: Carrier PLL BW dtype: float default: '0.02' inputs: - label: in domain: stream dtype: complex outputs: - label: ch${n} domain: stream dtype: float multiplicity: ${ len(channels) } templates: imports: from apollo.fm_downlink_receiver import fm_downlink_receiver make: >- apollo.fm_downlink_receiver.fm_downlink_receiver( channels=${channels}, sample_rate=${sample_rate}, carrier_pll_bw=${carrier_pll_bw}, fm_deviation_hz=${fm_deviation_hz}) documentation: |- Apollo FM Downlink Receiver -- complete FM demod chain in one block. Demodulates an FM-modulated complex baseband signal and recovers individual SCO analog telemetry channels. Each output port provides a recovered 0-5V sensor voltage for the corresponding SCO channel. Output port ordering matches the channels list: output 0 = channels[0], output 1 = channels[1], etc. Used in FM downlink mode (pre-launch checkout), not PM mode. This is the receive-side counterpart to the FM Signal Source. Parameters: channels: List of SCO channel numbers to decode (1-9) fm_deviation_hz: Expected carrier FM deviation in Hz (default 500 kHz) sample_rate: Baseband sample rate (default 5.12 MHz) carrier_pll_bw: FM carrier recovery loop bandwidth file_format: 1