Декодер Geoscan¶
satellites/geoscan_gfsk_decoder.grc, режим GFSK_GEOSCAN. Добавлен форком —
в апстриме SatNOGS его нет.
Декодирует телеметрию аппаратов «Геоскан» с GFSK-модуляцией. Разбор кадров выполняют блоки gr-satellites, а не gr-satnogs, — этим флоуграф принципиально отличается от остальных в репозитории.
Предупреждение
Требует установленного gr-satellites.
Зависимость не объявлена ни в CMakeLists.txt, ни в debian/control: без неё
падает сборка всего проекта. См. Установка и сборка.
Параметры¶
Общий набор (см. flowgraph_dispatcher) плюс:
Параметр |
По умолчанию |
Смысл |
|---|---|---|
|
9600 |
скорость передачи; диспетчер подставляет из |
|
435 МГц |
центральная частота приёма |
Внутренние переменные:
audio_samp_rate = 48000
decimation = max(4, satnogs.find_decimation(baudrate, 2, audio_samp_rate))
frame_size (74 байта) — параметр, как и в satellites/fsk_phasma_decoder.grc,
поэтому переопределяется из командной строки: --frame-size=…. Диспетчер его
для режима GFSK_GEOSCAN не передаёт, так что по умолчанию действует 74.
Нижняя граница max(4, …) появилась в форке (коммит «Fix decimation for USP»):
на некоторых бодрейтах satnogs.find_decimation возвращает слишком малое
значение, и последующая целочисленная децимация decimation // 2 обращается в
ноль.
Частота после доплеровской компенсации — baudrate × decimation.
Тракт декодирования¶
Кадры собираются напрямую из потока после доплер-компенсации, минуя всю локальную обработку:
soapy_source → satnogs_doppler_compensation → doppler_corrected
→ satellites_fsk_demodulator (iq=1, samp_rate = baudrate·decimation, subaudio=0)
→ satellites_geoscan_deframer (frame_size=74, threshold=6)
→ zeromq_pub_msg_sink → :zmq_base_port
threshold=6 — допустимое число несовпавших бит в синхрослове. Больше значение —
больше найденных кадров и больше ложных срабатываний.
satellites_fsk_demodulator содержит собственные АРУ, фильтрацию и
восстановление тактовой частоты, поэтому ни clock_recovery_mm, ни
binary_slicer, ни satnogs_frame_decoder здесь не нужны.
Тракт аудио¶
Аудио-ветка не участвует в декодировании — это независимый когерентный контур, нужный только чтобы записать слышимую дорожку:
doppler_corrected ─┬─▶ blocks_delay (512) ──▶ blocks_multiply ──▶ low_pass_filter
│ ▲ (0.625·baudrate,
│ │ децимация decimation/2)
│ blocks_vco_c
│ (−baudrate·decimation)
│ ▲
└─▶ low_pass_filter ──▶ quadrature_demod ──▶ moving_average (1024)
(baudrate·1.75) (1.0) (масштаб 1/1024)
↓
analog_quadrature_demod_cf (0.9)
↓
pfb_arb_resampler → dc_blocker → ZMQ :zmq_base_port+2
Коэффициент передискретизации подобран так, чтобы на выходе получилось ровно
48 кГц: audio_samp_rate / ((baudrate × decimation) / (decimation // 2)).
Остальные ответвления — водопад, IQ на zmq_base_port + 1, UDP-поток — стандартные,
см. Общий скелет.
Формат кадра¶
Дефреймер gr-satellites метаданных не публикует, поэтому JSON-файл кадра содержит только полезную нагрузку:
{
"pdu": "…base64…"
}
Это ожидаемое поведение, а не ошибка. Апстримовый подписчик на таком сообщении падал; форк добавил подстановку пустых метаданных. Подробнее — Выходные данные.
Отладка¶
Записать IQ и разобрать офлайн штатными средствами gr-satellites:
flowgraph_dispatcher --mode GFSK_GEOSCAN --baud 9600 --enable-iq-dump=1 \
--iq-file-path=/tmp/.satnogs/data/iq …
gr_satellites Geoscan-Edelveis --iq --samp_rate <baudrate×decimation> \
--wavfile /tmp/.satnogs/data/iq_cs16_*.raw
Частоту дискретизации придётся указать вручную: в имени файла её нет.
Если кадров нет, а сигнал на водопаде виден, попробуйте поднять threshold в
.grc — но помните, что .grc собирается заново, а сгенерированный .py
коммитить нельзя.
Близнец¶
satellites/usp_fsk_decoder.grc устроен точно так же и отличается двумя
числами — см. Декодер USP (Спутникс).