# Флоуграфы общего назначения Каталог `generic/` — 11 флоуграфов, не привязанных к конкретному спутнику. ## Общий скелет Все флоуграфы `generic/` и `satellites/` построены одинаково. Различается только цепочка демодуляции. ``` soapy_source ──▶ satnogs_doppler_compensation ──┬──▶ satnogs_waterfall_sink → файл (fc32) (по rigctld) │ ├──▶ complex_to_interleaved_short │ (×16384) → ZMQ base+1 │ ├──▶ network_udp_sink (1472 Б) │ └──▶ цепочка демодуляции ──┬─▶ ZMQ base+2 (аудио) └─▶ satnogs_frame_decoder → ZMQ base (кадры) ``` Приёмник настраивается на `rx_freq − lo_offset`, чтобы увести полезный сигнал от постоянной составляющей и зеркала гетеродина; обратный сдвиг делает блок доплер-компенсации. Источник доплеровского сдвига — общая для всех переменная: ```python variable_rigctl = satnogs.rigctl_doppler_correction.make(rx_freq, Hamlib.RIG_MODEL_NETRIGCTL) ``` Адрес `rigctld` подставляется не параметром блока, а фрагментом кода в секции `main_after_init`, скопированным во все флоуграфы: ```python self.variable_rigctl.set_param("rig_pathname", str(self.rigctl_host) + ":" + str(self.rigctl_port)) ``` Выход доплер-компенсации назван виртуальным потоком `doppler_corrected` — от него и ветвятся все потребители. Его частота дискретизации зависит от семейства режима, см. [](../dev/grc-conventions.md). Набор параметров у всех примерно одинаков (см. [](../dispatcher.md)); ниже указаны только отличия каждого файла. --- ## `fm.grc` — узкополосная ЧМ Режимы `FM` и `SSTV`. Кадров не даёт, только аудио. Свои параметры: `deviation` (5 кГц), `max_modulation_freq` (3 кГц). Частота после доплер-компенсации — **48000 Гц**, не зависит от бодрейта. ``` doppler_corrected → low_pass_filter (срез deviation+max_modulation_freq) → analog_quadrature_demod_cf (gain = 48000/(2π·deviation)) → dc_blocker_xx (1024) → ZMQ base+2 ``` Декодера кадров и блока `zeromq_pub_msg_sink` в этом флоуграфе нет вовсе. --- ## `fsk_ax25.grc` — ЧМн с фреймингом AX.25 Режимы `FSK`, `GFSK`, `GMSK`, `MSK` — все четыре сводятся к этому файлу. Свои параметры: `baudrate` (9600), `framing` (`ax25`). ### Когерентный входной каскад Тот же каскад используют `fsk_ax100_mode5/6`, `qubik_telem`, `reaktor_hello_world_fsk9600_decoder`, Geoscan и USP. Он снимает остаточный частотный сдвиг, оценивая среднюю частоту по самому сигналу: ``` doppler_corrected ─┬─▶ blocks_delay (512) ──▶ blocks_multiply ──▶ … │ ▲ └─▶ low_pass_filter ──▶ quadrature_demod ──▶ moving_average (1024) │ blocks_vco_c (−baudrate·decimation) ``` Задержка на половину окна усреднения выравнивает сигнал с оценкой сдвига, а VCO генерирует комплексную экспоненту, которая этот сдвиг вычитает. ### Демодуляция и декодирование ``` → low_pass_filter (децимация) → analog_quadrature_demod_cf → dc_blocker_xx → digital_clock_recovery_mm_xx (omega 2, gain_mu 0.5) → digital_binary_slicer_fb → satnogs_frame_decoder (декодер выбирается по параметру framing) → zeromq_pub_msg_sink ``` --- ## `fsk_ax100_mode5.grc`, `fsk_ax100_mode6.grc` — GOMspace AX.100 Режимы `FSK`/`MSK AX.100 Mode 5` и `Mode 6`. Свои параметры: `baudrate` (9600), `framing` (`ax100_mode5` / `ax100_mode6`). Входной каскад — как у `fsk_ax25.grc`. После декодера кадров добавлена постобработка пакетов: дескремблер, декодер Рида—Соломона CCSDS (`variable_ccsds_rs_decoder`), асинхронный декодер FEC и проверка CRC (`satnogs_crc_async`). Mode 6 дополнительно отрезает заголовок блоком `satnogs_msg_skip_head`. --- ## `bpsk.grc` — двоичная фазовая манипуляция Режим `BPSK`. Свои параметры: `baudrate` (9600), `excess_bw` (0.5), `max_cfo` (2000), `framing` (`ax25`). `sps = 4`, `nfilts = 32`, децимация — `max(4, satnogs.find_decimation(baudrate, 2, 48000, sps))`. Частота после доплер-компенсации — `baudrate × decimation`. ``` doppler_corrected → analog_agc2_xx (опорный уровень 0.5) → low_pass_filter (срез baudrate/2 + excess_bw·baudrate/2 + |max_cfo|, децимация decimation/sps) → digital_pfb_clock_sync_xxx (фильтр «корень из приподнятого косинуса») → digital_constellation_receiver_cb (созвездие BPSK, ±0.25) → satnogs_frame_decoder → zeromq_pub_msg_sink ``` Аудио-ветка отдельная: АРУ → передискретизация к 48 кГц → АРУ → ФНЧ → перенос на 12 кГц (`blocks_rotator_cc`) → действительная часть. То есть в OGG попадает слышимый тон, а не сама модуляция. :::{note} Словарь `available_framings` в этом файле содержит **единственную** запись `ax25`. Передать `--framing=ax100_mode5` для режима `BPSK` нельзя — флоуграф упадёт по ключу. ::: --- ## `afsk1200_ax25.grc` — AFSK 1200 бод Режим `AFSK`. Свои параметры: `mark_frequency` (2200 Гц), `space_frequency` (1200 Гц). Бодрейт из клиента не принимается — он фиксирован конструкцией. --- ## `cw_decoder.grc` — телеграф Режим `CW`. Свои параметры: `bfo_freq` (1 кГц), `wpm` (20). Параметра `baudrate` нет: скорость задаётся в словах в минуту, и диспетчер переименовывает `--baud` в `--wpm`. ``` doppler_corrected → rational_resampler → blocks_rotator_cc (bfo_freq) → variable_cw_decoder (wpm) → zeromq_pub_msg_sink ``` --- ## `sstv_pd120_demod.grc` — SSTV режима PD120 Режим `SSTV_PD120`. Свои параметры: `flip_images`, `sync`. ЧМ-демодуляция → `hilbert_fc` → `satnogs_sstv_pd120_sink`, который сам пишет изображения. Кадров в ZMQ не публикует. Частота после доплер-компенсации — **66560 Гц** (`4*4160*4`), как в `noaa_apt_decoder.grc`, а не 48000: `audio_samp_rate` здесь уходит только в последний ресемплер аудио. Эту же частоту получают водопад и IQ-дамп. :::{note} Режим `SSTV` в этом форке ведёт **не сюда**, а на `fm.grc`. Декодирование изображения доступно только под явным режимом `SSTV_PD120`. ::: --- ## `unknown_transmission.grc` — неизвестный сигнал Режим `UNKNOWN`, он же запасной вариант для любой нераспознанной строки режима. Свои значения по умолчанию: `baudrate` 9600, `samp_rate_rx` 2.048 МГц, `doppler_correction_per_sec` 1 (вместо 20 у остальных). Ничего не декодирует — записывает широкую полосу, чтобы сигнал можно было разобрать потом. --- ## `iq_receiver.grc` — только запись IQ Ни один режим на него не ведёт; запускается вручную. Уникальные параметры: `enable_doppler_correction` (можно отключить компенсацию совсем) и `out_samp_rate`. Ни аудио, ни кадров, ни UDP-потока: только водопад и IQ. --- ## `example_flowgraph.grc` — шаблон Минимальный каркас для нового флоуграфа: источник, доплер-компенсация, водопад, IQ. Ни одного режима, ни `udp_dump_*`, ни публикации кадров. Отправная точка для [](../dev/adding-flowgraph.md).