← На главную

Коррекция частоты по маяку QO-100 для Gqrx

Одна из проблем, с которой сталкиваешься при работе на спутнике QO-100, заключается в дрейфе LNB. Существует несколько решений, одно из которых – это программная коррекция частоты по маяку со спутника. Используемый мной Gqrx из коробки такого не умеет. К счастью, программа является расширяемой.

Ранее в посте Управляем Gqrx при помощи Python мы установили, что Gqrx можно управлять по TCP-протоколу. Также из release notes мы узнаем, что с версии Gqrx 2.17.7 протокол позволяет включать и выключать запись IQ-данных.

Напрашивается следующий алгоритм:

  1. Раз в N времени включаем запись IQ-данных во временный файл;
  2. Открываем файл, переводим содержимое в комплексные числа, считаем FFT, определяем зависимость магнитуды от частоты;
  3. Среди пиков находим сигнал маяка. Он передается в модуляции 2FSK. Значит, будет два пика. Благодаря WebSDR мы знаем, что частота первого равна в точности 10489500.5 кГц, а второго – 10489500.9 кГц;
  4. Смотрим, на каких частотах мы приняли маяк. Соответствующим образом корректируем в Gqrx частоту гетеродина LNB. Для этого предусмотрена команда LNB_LO;

Иллюстрация первых двух шагов:

Поиск пиков при помощи Python и FFT

Здесь я использовал частоту дискретизации поменьше, чтобы на графике можно было что-то разглядеть. Пики маяка видны слева. Сигналы справа – это цифровые виды связи. Между ними находится телеграфный участок. На момент создания записи в телеграфе никто не работал.

Скрипт на Python, при помощи которого был построен график, можно скачать здесь. Также вас может заинтересовать статья Построение диаграмм на Python с помощью Matplotlib, если вдруг вы ее пропустили.

Казалось бы, остальное – дело техники. Но все оказалось не так просто. Когда Gqrx корректирует частоту LNB, то также меняется и частота приема. А ее менять не нужно. Для управления частотой приема в протоколе предусмотрена команда F. Однако данная команда автоматически меняет как частоту, на которую настроен SDR-приемник, так и смещение фильтра (USB / CW-U / ...) в полосе приема. Это не то что нужно.

В идеале хотелось бы иметь отдельные команды – чтение / запись центральной частоты, а также чтение / запись смещения фильтра. Итого четыре команды. Я отправил соответствующий pull request в Gqrx. На момент написания поста он не был принят. А значит, предстоит собрать пропатченный Gqrx. Это не сложно.

Клонируем Gqrx, применяем патч:

$ git clone git@github.com:gqrx-sdr/gqrx.git $ cd gqrx $ git reset --hard 0b4ab30e42c3 $ wget https://eax.me/files/2026/06/gqrx-remote-protocol.patch $ git am gqrx-remote-protocol.patch

Устанавливаем менеджер изолированных окружений micromamba:

$ /bin/bash <(curl -L https://micro.mamba.pm/install.sh)

Создаем окружение с зависимостями:

$ micromamba create -n gqrx \ c-compiler cxx-compiler cmake make pkg-config \ gnuradio-core gnuradio-osmosdr libboost-devel libgl-devel \ pybind11 pulseaudio qt6-gtk-platformtheme qt6-main \ soapysdr-module-lms7 soapysdr-module-plutosdr soapysdr-module-remote \ "sysroot_linux-64=2.17.*" volk

Компилируем Gqrx, используя данное окружение:

$ micromamba run -n gqrx bash -el -c " mkdir -p build && cd build && cmake -DCMAKE_BUILD_TYPE=Release \ -DCMAKE_INSTALL_PREFIX=\$CONDA_PREFIX .. && make -j4 && make install"

Собираем AppImage:

$ APPIMAGE_EXTRACT_AND_RUN=1 \ PREFIX=/home/eax/micromamba/envs/gqrx ./appimage.sh

С пропатченным Gqrx все работает как часы:

Программная коррекция частоты в Gqrx по маяку QO-100

В ходе экспериментов выяснилось следующее:

  • Изначально я использовал простую логику, которая находит первый пик. Увы, это не работает. Бывают сигналы ниже маяка, хотя это и запрещено регламентом работы на QO-100. Необходимо искать оба пика, а также проверять разницу частот между ними;
  • Продолжительность записи должна составлять не менее 15 секунд. Иначе можно поймать момент, когда маяк передает долгую несущую. Тогда вместо двух пиков будет только один;
  • Звук прерывается на долю секунды в моменты включения / выключения записи, а также при изменении частот. При работе телефоном это не мешает. При работе телеграфом коррекцию я предпочитаю выключать;
  • Забавно наблюдать за работой скрипта сразу после подачи питания на LNB. Частота сильно плывет, и пики смазываются. Поначалу скрипт вовсе не может найти маяк, потом начинает настраиваться примерно. По мере стабилизации частоты все начинает работать правильно;

Полученный Python-скрипт можно скачать здесь. Заинтересованным читателям предлагается изучать его самостоятельно.