Коррекция частоты по маяку QO-100 для Gqrx
Одна из проблем, с которой сталкиваешься при работе на спутнике QO-100, заключается в дрейфе LNB. Существует несколько решений, одно из которых – это программная коррекция частоты по маяку со спутника. Используемый мной Gqrx из коробки такого не умеет. К счастью, программа является расширяемой.
Ранее в посте Управляем Gqrx при помощи Python мы установили, что Gqrx можно управлять по TCP-протоколу. Также из release notes мы узнаем, что с версии Gqrx 2.17.7 протокол позволяет включать и выключать запись IQ-данных.
Напрашивается следующий алгоритм:
- Раз в N времени включаем запись IQ-данных во временный файл;
- Открываем файл, переводим содержимое в комплексные числа, считаем FFT, определяем зависимость магнитуды от частоты;
- Среди пиков находим сигнал маяка. Он передается в модуляции 2FSK. Значит, будет два пика. Благодаря WebSDR мы знаем, что частота первого равна в точности 10489500.5 кГц, а второго – 10489500.9 кГц;
- Смотрим, на каких частотах мы приняли маяк. Соответствующим образом корректируем в Gqrx частоту гетеродина LNB. Для этого предусмотрена команда
LNB_LO;
Иллюстрация первых двух шагов:
Здесь я использовал частоту дискретизации поменьше, чтобы на графике можно было что-то разглядеть. Пики маяка видны слева. Сигналы справа – это цифровые виды связи. Между ними находится телеграфный участок. На момент создания записи в телеграфе никто не работал.
Скрипт на 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 все работает как часы:
В ходе экспериментов выяснилось следующее:
- Изначально я использовал простую логику, которая находит первый пик. Увы, это не работает. Бывают сигналы ниже маяка, хотя это и запрещено регламентом работы на QO-100. Необходимо искать оба пика, а также проверять разницу частот между ними;
- Продолжительность записи должна составлять не менее 15 секунд. Иначе можно поймать момент, когда маяк передает долгую несущую. Тогда вместо двух пиков будет только один;
- Звук прерывается на долю секунды в моменты включения / выключения записи, а также при изменении частот. При работе телефоном это не мешает. При работе телеграфом коррекцию я предпочитаю выключать;
- Забавно наблюдать за работой скрипта сразу после подачи питания на LNB. Частота сильно плывет, и пики смазываются. Поначалу скрипт вовсе не может найти маяк, потом начинает настраиваться примерно. По мере стабилизации частоты все начинает работать правильно;
Полученный Python-скрипт можно скачать здесь. Заинтересованным читателям предлагается изучать его самостоятельно.