Флоуграфы общего назначения¶
Каталог 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_fc → satnogs_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_*, ни публикации кадров. Отправная точка для
Добавление флоуграфа и режима.