Флоуграфы общего назначения

Каталог 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, чтобы увести полезный сигнал от постоянной составляющей и зеркала гетеродина; обратный сдвиг делает блок доплер-компенсации.

Источник доплеровского сдвига — общая для всех переменная:

variable_rigctl = satnogs.rigctl_doppler_correction.make(rx_freq, Hamlib.RIG_MODEL_NETRIGCTL)

Адрес rigctld подставляется не параметром блока, а фрагментом кода в секции main_after_init, скопированным во все флоуграфы:

self.variable_rigctl.set_param("rig_pathname", str(self.rigctl_host) + ":" + str(self.rigctl_port))

Выход доплер-компенсации назван виртуальным потоком doppler_corrected — от него и ветвятся все потребители. Его частота дискретизации зависит от семейства режима, см. Соглашения в .grc.

Набор параметров у всех примерно одинаков (см. flowgraph_dispatcher); ниже указаны только отличия каждого файла.


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 попадает слышимый тон, а не сама модуляция.

Примечание

Словарь 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_fcsatnogs_sstv_pd120_sink, который сам пишет изображения. Кадров в ZMQ не публикует.

Частота после доплер-компенсации — 66560 Гц (4*4160*4), как в noaa_apt_decoder.grc, а не 48000: audio_samp_rate здесь уходит только в последний ресемплер аудио. Эту же частоту получают водопад и IQ-дамп.

Примечание

Режим 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_*, ни публикации кадров. Отправная точка для Добавление флоуграфа и режима.