Краткая информация о спутнике

DOSAAF-85 (RS44, NORAD ID: 44909, Int'l Code: 2019-096E) - очень популярный у радиолюбителей спутник, созданный специалистами российского предприятия "Информационные спутниковые системы, имени Решетнёва" и студентами Сибирского государственного аэрокосмического университета (СибГАУ) Красноярск.

Спутник назван в честь празднования 85-летия Добровольного Общества Содействия Армии, Авиации и Флоту.

Аппарат был запущен на орбиту 26 декабря 2019 года с космодрома "Плесецк".

Мощность передатчика 5 Вт.

Маяк: 435.605 МГц - передает технологический позывной (RS44).

Транспондер инверсный (SSB, CW):

Земля-космос: 145.965 МГц +/-30 кГц.

Космос-Земля: 435.640 МГц +/-30 кГц.

В виду удачной орбиты спутник находится над горизонтом обычно около 15 минут, что много для низкоорбитальных спутников и удобно для проведения радиосвязей. Достаточно высокая мощность передатчика позволяет использовать на земле антенны с не слишком большим коэффициентом усиления. Особенностью связи со спутником является то, что он не отделился от ракеты-носителя и вся эта конструкция вращается, поэтому сигналы со спутника склонны к замираниям.

Что мне хотелось получить

В виде короткого ТЗ можно описать следующие основные нужные мне функциональные возможности трансивера:

  • Наличие отображения графического спектра сигнала на спутнике и «водопада»

  • Дуплексная работа для мониторинга своего сигнала в реальном времени

  • Прием на диапазоне 70 см в модуляции USB, передача в диапазоне 2 м в модуляции LSB в любом участке линейного транспондера с инверсией частоты

  • Автоматическая коррекция допплеровского сдвига частоты на приём и передачу

  • Управление внешним усилителем мощности при переходе на передачу

  • Возможность управления приёмом/передачей из внешних программ. Прежде всего для работы в FT4 с помощью программы WSJT-X

  • В качестве железного SDR используется ADALM Pluto SDR (или один из многочисленных китайских клонов)

  • Работа под Windows 11

Технологический стек

Список требований не такой большой, но для реализации требующий специальных знаний. Поскольку я не очень глубоко разбираюсь в теме цифровой обработки сигналов, то написание своего SDR представляло некоторую сложность. В сети есть достаточно много SDR в исходных кодах, в которых интересно разобраться, но хотя бы без поверхностного понимания математики обработки сигналов невозможно понять, как всё это работает. Пришлось немного оживить свои знания о преобразовании Фурье, использовании комплексных чисел, почитать про оконные функции, преобразование Гильберта и т.п. Наиболее важно на практике оказалось разобраться как правильно настроить цифровые фильтры, у них бывает несколько параметров и без понимания работы фильтра хорошего результата не добиться. Хотя для начала я просто брал нужные коэффициенты фильтров из работающих опенсорсных проектов и получал неплохие результаты.

Самому писать весь ЦОС у меня не было особого желания, поэтому я обратился за помощью к ИИ в поисках нужных библиотек и примеров кода. Надо сказать, что ИИ очень помог как в генерации отдельных фрагментов кода, так в объяснении работы ЦОС, так что стоит им пользоваться. Но вот чего-то работоспособного ИИ создать не смог, тут уже пришлось всё своими руками делать, что не так уж и плохо для хобби.

В результате поисков я решил остановиться на библиотекe ЦОС liquid-dsp. Она написана на C, а мне нужен был вариант для Rust. На crates.io нашлось несколько оберток для liquid-dsp, но для чистоты кода я выбрал крейт yagi. Это результат частичного портирования liquid-dsp на Rust. Там не перенесены все функции, но почти все нужные мне. Не было функций аналогового модема SSB, но они оказались тривиальными в реализации.

Следующей задачей был выбор библиотеки для создания графического интерфейса. С этим в сообществе Rust всё плохо, поэтому выбор был не таким долгим. Что-то комфортное для пользователя может предложить крейт egui. Он написан под сильным влиянием библиотеки imGui и позволяет создавать так называемый immediate mode графический интерфейс. Ранее с таким не работал, оказалось достаточно просто и занятно. Вполне годится для небольших приложений и, вопреки опасениям, не так сильно нагружает процессор.

С DSP и GUI разобрались. SDR трансиверу нужно уметь работать со звуком: динамиками и микрофоном. Для этих целей практически безальтернативно используется крейт cpal. Я пишу программу под Windows 11 х64, поэтому в основе работы крейта лежит WASAPI. Забегая вперед, отмечу, что с работой WASAPI связаны основные сложности в проекте, чего я совсем не ожидал.

Наконец, для связи с PlutoSDR нужна библиотека libiio. Родной библиотеки iio под Rust нет. Удалось найти вполне рабочий крейт industrial-io, но он оказался недоделанным: не все нужные функции для PlutoSDR там реализованы, да и использовал он устаревшие библиотеки iio не выше 0.25 версии. Пришлось полностью утащить исходники этого крейта к себе в проект для внесения необходимых правок. Стоит упомянуть, что я использую iio версии 0.26. Это последняя рабочая на момент публикации статьи версия перед тем, как был изменён API библиотеки. Доработка industrial-io оказалась интересным опытом – пришлось разобраться детальнее с FFI, bindgen и пр.

Программа SDR трансивера получилась многопоточная, драйверы устройств и обработка сигнала работают каждый в своем потоке. Для взаимодействия потоков основным средством является использование крейта ringbuf, с помощью которого организуются очереди-буферы FIFO. Несмотря на обилие буферов, задержка обработки сигнала получилась вполне комфортная для голосовой связи.

Потоки обработки сигнала

Транспондер спутника RS44 относительно узкополосный – всего 60 кГц, поэтому для SDR выбрал низкую частоту дискретизации сигнала в 96 кГц. Этого достаточно для приёма сигнала со спутника даже с учетом допплеровского сдвига частот. Сигнал маяка спутника так же находится в области видимости спектрограммы.

С выбором звуковой частоты тоже особо мук выбора не было. 48 кГц оптимально для децимации/интерполяции.

А вот с частотой дискретизации PlutoSDR пришлось повозиться. Изначально PlutoSDR рассчитан на широкие полосы приема, достигающие 20 и более МГц, что мне совершенно не было нужно. Обрабатывать такой поток данных в реальном времени новичку достаточно проблематично. Поэтому решил сократить поток до минимума. В обычном режиме минимальная частота дискретизации PlutoSDR порядка 2 МГц, что тоже слишком много. Однако есть еще один режим работы PlutoSDR, требующий загрузки в него специального FIR фильтра-дециматора. В этом режиме частота дискретизации может быть существенно снижена. Для удобства работы я выбрал частоту кратную 96 кГц, в моём случае это получилось 576 кГц.

Таким образом, при приёме сигнала с PlutoSDR я получаю поток с дискретизацией 576 кГц, провожу далее децимацию до 96 кГц. Тут поток делится на два – один уходит для расчета спектрограммы и водопада. Из второго потока фильтром выделяется участок 2800 Гц, на который настроен трансивер, этот сигнал USB демодулируется. Далее идет последняя децимация до 48 кГц звукового потока перед выводом сигнала на динамики.

Поток передачи устроен практически аналогично, но в обратном направлении. Единственным важным отличием является то, что фильтрация сформированного LSB сигнала происходит на промежуточной частоте 3 кГц. Для передачи в трансивере предусмотрены так же компрессор и фильтр высоких частот для голоса (DX фильтр). Вместо голоса еще можно включить просто тональный сигнал 800 Гц для настройки аппаратуры.

В проекте я столкнулся с проблемой - получаю сигнал очень низкого уровня с микрофона. Причём, если использовать виртуальный аудио кабель, уровень получаемого сигнала нелинейно связан с уровнем сигнала на входе кабеля. Я думал, что это проблема библиотеки cpal, переписал всё на чистом WASAPI, но получил ровно такой же результат как в режиме разделения, так и монопольного использования аудиоустройств. В итоге вернулся к использованию cpal, а в тракт передачи включил AGC с высоким коэффициентом усиления. Этот первый программный костыль помогает успешно проводить связи.

Второй костыль для WASAPI связан с решением проблемы, что при отсутствии сигнала с микрофона (или виртуального аудио кабеля) аудиоинтерфейс зависает и приём в трансивере останавливается. В качестве обходного решения я сделал дополнительный звуковой выход, сигнал с которого подмешиваю во входной сигнал с виртуального аудио кабеля. Этот сигнал низкого уровня эффективно отфильтровывается в трансивере, не мешает работать, но не позволяет аудио интерфейсу зависнуть. Надеюсь, знатоки cpal подскажут более элегантное решение проблемы.

Интеграция с другими приложениями

Мне не хотелось тратить много времени на написание SDR и делать из него комбайн со всеми мыслимыми настройками и возможностями. Я выбрал для себя экономный минималистичный дизайн. Мой SDR достаточен для удобного проведения радиосвязей, а все улучшения по звуку и пр. я решил отдать внешним проверенным программам.

PstRotator через Omnirig

Наиболее важная для интеграции программа – это используемая мной для работы со спутниками программа PstRotator. Она выполняет функции получения из Интернета свежей информации об орбитах спутников (TLE), умеет направлять антенны на спутник с помощью поворотных устройств, рассчитывает допплеровский сдвиг частот и умеет управлять настройками частот приёма и передачи трансиверов.

Интерфейс PstRotator
Интерфейс PstRotator

Именно этой возможностью я и решил воспользоваться. PstRotator управляет трансиверами посредством промежуточной программы Omnirig, обеспечивающий унифицированный интерфейс связи с разными трансиверами. Для этого используются различные INI файлы, определяющим способ связи с трансивером определенной модели.

Для простоты разработки я в своем SDR сделал эмуляцию работы CAT интерфейса трансивера Kenwood TS-790.

Замечание: INI файл для трансивера TS-790 не входит в стандартную поставку Omnirig. Он может быть получен на сайте разработчика PstRotator. Для загрузки архива со специальными ini файлами в PstRotator есть отдельный пункт меню. Нужно загрузить архив, извлечь оттуда TS-790.ini и скопировать его в папку ini файлов Omnirig. После этого выбор этого трансивера будет возможен в настройках Omnirig.

Таким образом, SDR трансивер выглядит для PstRotator как TS-790. Соединение между SDR трансивером и Omnirig происходит по последовательному интерфейсу. Для соединения использую com0com эмулятор нуль-модемного кабеля. В программе com0com создаются связанные пары COM портов. Один порт из пары нужно указать в Omnirig при настройке TS-790, второй COM порт нужно указать в настройках SDR.

Виртуальные кабели в com0com
Виртуальные кабели в com0com

После установления соединения в PstRotator достаточно нажать кнопку Up+Down и актуальные частоты приёма и передачи спутника начнут передаваться в SDR трансивер. В PstRotator так же можно указать как часто будет обновляться информация. Имеет смысл установить субсекундный интервал для работы в цифровых видах связи.

WSJT-X

Для работы с цифровым протоколом связи FT4 применяю программу WSJT-X. Для связи между SDR трансивером, прежде всего, нужны 2 виртуальных аудио кабеля. Один кабель подключается в SDR вместо динамика, второй – вместо микрофона. Соответственно в настройках аудио WSJT-X нужно указать эти виртуальные кабели в качестве источников и получателей звукового потока.

Настройка Аудио WSJT-X
Настройка Аудио WSJT-X

Так же для управления режимом передачи в WSJT-X нужно настроить еще одну пару COM портов в программе com0com. В своем SDR сделал управление PTT через манипуляцию сигналами RS232 RTS/CTS. В SDR выбираем в настройках первый порт из пары. А в настройках передачи WSJT-X нужно выбрать второй COM порт из пары, и указать режим RTS. Далее кнопкой проверки убедиться, что SDR переходит в режим передачи. После этого можно работать в FT4.

Настройка PTT WSJT-X
Настройка PTT WSJT-X

Виртуальные аудио кабели можно использовать не только для WSJT-X. Можно подключить к трансиверу с их помощью обработку голоса с микрофона особым эквалайзером и компрессором, а на выход перед динамиками включить, например, программу шумоподавления.

USB HID Реле
USB HID Реле

Для управления усилителем мощности при переходе на передачу я купил недорогое USB HID реле, совместимое с dcttech. Обычно это плата красного цвета с большим USB разъемом и эмулятором USB на микроконтроллере Atmel. При старте трансивер ищет первое попавшееся подключенное к компьютеру реле такого типа и включает его при переходе трансивера на передачу. Выбор пал на реле этого типа, поскольку его поддерживает так же программа SDR Console, которой я пользуюсь большую часть времени.

Советы по использованию SDR

Программа SDR трансивера запускается из командной строки и помимо графического интерфейса выдает в консоль разную отладочную информацию. Интерфейс трансивера в светлой теме выглядит следующим образом:

Если вас заинтересует проведение радиосвязей с помощью данного трансивера, то коротко изложу несколько советов по его использованию:

  • Если ранее не использовали PlutoSDR, то установите на компьютер библиотеку libiio версии 0.26 и проверьте работу PlutoSDR утилитой iio_info.

  • Китайские клоны PlutoSDR дают возможность использовать для соединения с компьютером Ethernet вместо USB. По Ethernet трансивер работает стабильнее. По USB иногда случаются замирания сигнала. Если трансиверу не указать корректный IP адрес, то он по умолчанию подключится по USB. Поэтому уточните IP адрес Ethernet интерфейса Pluto и в настройках трансивера напишите именного его.

  • Я тестировал трансивер с Pluto+ и LibreSDR со собственной прошивкой (о ней писал в прошлых статьях). С другими клонами Pluto так же все должно работать. Но надо иметь в виду, что PlutoSDR должен быть раскрыт на широкий диапазон. Стандартная поставка ADALM PLUTO идет с нижней рабочей частотой 325 МГц – в такой конфигурации передача работать не будет.

  • Трансивер при работе использует первую пару разъёмов RX/TX PlutoSDR. Если нужно работать со второй – нужно добавить свой код настройки в исходники драйвера плуто трансивера.

  • В виду нестабильной работы аудиовхода лучше устанавливать в Windows усиление микрофона на максимум, тогда меньше вероятность возникновения прерывания приема и передачи. AGC в передатчике все сам отрегулирует.

  • По приему в трансивере нет собственного AGC. По умолчанию используются настройки AGC PlutoSDR, но иногда удобнее выбрать ручной режим. Тогда в трансивере можно ползунком выбрать подходящий уровень усиления сигнала.

  • У PlutoSDR нет калибровки RSSI и при работе AGC невозможно узнать реальный уровень усиления. По этой причине в трансивере нет привычного радиолюбителям S-метра. Тем, кого я могу на слух принять, я всегда даю рапорт 59.

  • Шкала спектрограммы имеет цену деления около 10 дБ. Для удобства оценки я сделал отдельно измерение уровня сигнал\шум (SNR). Как мне кажется, знать его значение более полезно, чем абсолютный уровень S. Шумовая полка считается эмпирически, так что на какую-либо точность измерений тут рассчитывать не следует. Включив передачу тонального сигнала, вы должны будете услышать его на спутнике. SNR позволяет примерно оценить насколько хорошо могут вас слышать корреспонденты.

  • Сигнал маяка (морзянкой RS44) не всегда появляется на нужной частоте, даже при условии включения допплер-коррекции. Первым делом стоит проверить свежесть обновления данных TLE. Но и самые свежие данные могут быть не совсем точными. Отклонение по частоте обычно не очень большое и на работу трансивера не влияет. Чтобы быть уверенным, что не вышли за частотные рамки транспондера, стоит выбирать частоту для передачи поближе к центральной частоте транспондера. Во-вторых, не помешает проверка тактового генератора PlutoSDR. Имеет смысл провести калибровку генератора или использовать внешний точный опорный генератор.

  • В трансивере есть ползунок расстройки частоты передачи XIT. Контролируя собственный сигнал, можно немного поправить частоту для более разборчивого приема.

  • Трансивер сам ищет USB реле, настройка реле не предусмотрена. Но если реле найдено, то его название отображается в разделе Advanced settings.

  • С помощью настройки Gain устанавливается уровень передачи PlutoSDR. При отключении передачи уровень выставляется -40.0 dB для совместимости с прошивками PlutoSDR, поддерживающими сигнал PTT.

  • При использовании виртуального аудио кабеля для микрофона (например VB-Cable A), для микрофонного входа нужно указать VB-Cable A Output, а в настройках keepalive указать VB-Cable A Input.

  • Для используемых виртуальных аудио кабелей рекомендую указать разрядность 16 бит и обязательно частоту 48000 Гц. Если у вас два виртуальных кабеля, то настройки надо сделать в 4 местах: для входов и выходов обоих кабелей.

  • Трансивер использует крейт confy для сохранения настроек. TOML файл с настройками сохраняется на компьютере в папке {FOLDERID_RoamingAppData}/sdr4sat/config. При необходимости его можно изменить в текстовом редакторе.

В заключение приведу скриншот одной недавно проведенной с помощью SDR трансивера связи с использованием протокола FT4:

Протокол FT4 связи с F5LMG
Протокол FT4 связи с F5LMG

Исходные тексты и релиз программы трансивера расположены на гитхабе. Буду признателен, если кто то поможет решить проблемы с WASAPI.

Удачного проведения связей через спутник и до встречи в эфире! 73

Комментарии (2)


  1. maxorik
    07.12.2025 17:39

    Отличная работа! Интересно, пробовали ли вы моделировать поведение канала уже на уровне протоколов?

    LEO-траектория даёт предсказуемые RTT-скачки, и современные контроллеры перегрузки (BBR/GCC) реагируют на них не всегда корректно. Сейчас много обсуждают адаптацию транспортного слоя для таких спутников.


    1. lesha108 Автор
      07.12.2025 17:39

      Спасибо за оценку, я пока на совсем любительском уровне этим увлекаюсь, до моделирования канала не дошел пока