Недавно увлёкся приёмом телеметрии и SSTV со спутников, благо сейчас энтузиасты организуют различные квесты и акции, используя ресурсы спутников «UMKA-1 (RS40S)», «VIZARD-METEO (RS38S)», «NANOZOND-1 (RS49S)» и «UTMN-2 (RS27S)». Подробнее о них можно посмотреть на сайте R4UAB.
Для приёма телеметрии спутников обычно достаточно простого приемника RTL-SDR, но я уже старый радиолюбитель и обзавёлся навороченным японским трансивером ICOM IC-9700, с помощью которого и собирался заняться приёмом. Но тут вышел облом – трансивер как-то обрабатывает выходной аудиосигнал, что его уже нельзя декодировать пакетным модемом. Выход из положения был найден в создании своего простого SDR приёмника. Подробности под катом.
Для решения проблемы с сигналом нужно было как-то отрегулировать выходные аудиофильтры трансивера, но такой возможности не оказалось. Трансиверы Icom IC-9700 и Icom IC-705 при работе в режиме FM обладают только стандартным набором из 3 фильтров, которые никак не регулируются. Этот путь оказался тупиковым.
Но выяснилась другая возможность – у этих трансиверов есть способ выводить вместо звука сигнал промежуточной частоты приёмного тракта. Частота ПЧ составляет 12 кГц, что очень удобно для последующей обработки. Обычно пользователи Icom не используют эту возможность, но мне она оказалась очень кстати.
Стоит отметить, что поиск на форумах информации о том, как работать с этой ПЧ, создал больше вопросов, чем ответов. Одни пишут, что в стерео режиме выводится сигнал IQ, другие пишут, что это просто ПЧ трансивера. В итоге пришлось идти путём проб и ошибок. Я взял программу HDSDR, настроил её так, чтоб она получала входной сигнал с аудиокарты трансивера, подключенного по USB. Установил приём на частоту 12 кГц в режиме ЧМ и случилось чудо – всё прекрасно декодировалось и я смог принимать FM станции. Настроив выход HDSDR на виртуальный аудиокабель и подключив его выход к UZ7HO SoundModem удалось-таки декодировать пакеты со спутников. На этом можно было бы и успокоиться, но использование HDSDR для этой цели мне показалось избыточным. У программы много настроек, легко что-то сбить и не заметить, да и места на экране она занимает порядочно. В итоге решил сделать свой минималистичный SDR приёмник, который будет служить лишь одной цели – помогать Icom 9700 в приёме пакетов со спутников.
Ранее я не писал сам SDR приёмники, поскольку взгляд в сторону учебников по цифровой обработке сигналов вызывал у меня благоговейный ужас. У меня создалось впечатление, что, не прочитав минимум пару сотен страниц формул и не разобравшись во всех этих зонах Найквиста, преобразованиях Гильберта и Фурье, невозможно сделать что-то полезное. Однако это не совсем так. При ближайшем рассмотрении оказалось, что для реализации всех этих преобразований нужно совсем мало очень простого кода. Или вот, например, для создания цифровых фильтров в учебниках пишут, что нужно обязательно взять что-то типа Matlab или SkiPy, там провести моделирование и только потом закодировать цифровой фильтр. Конечно, можно всё делать именно так, но, как выяснилось, в современных библиотеках уже есть готовые функции, которые сразу синтезируют «достаточно хороший» цифровой фильтр без необходимости предварительного моделирования в научных пакетах.
Я решил написать всё на Rust и по этой причине сразу отправился на crates.io искать подходящие библиотеки. Трудно представить, что до меня никто не решал задач создания SDR, поэтому я надеялся найти на этом сайте всё необходимое. И не ошибся. Для работы со звуковыми картами есть крейт CPAL, который, кстати, может работать в разных операционных системах. С помощью функций этого крейта я организовал ввод ПЧ и вывод декодированного звука. Для реализации приёмника есть крейт с незамысловатым названием SDR. О нём я рассажу поподробнее.
В крейте SDR есть функции смесителей, фильтров и нужного мне декодера FM. Я уже было совсем обрадовался, но рано. Как оказалось при детальном рассмотрении, функции смесителей не работают с вещественными числами, а качество работы декодера FM меня не устроило, да и не смог я найти к нему внятного описания в книгах по ЦОС. Пока я искал как декодировать FM сигнал, я нашёл 4 разных алгоритма, но ни один из них не был похож на тот, что используется в крейте SDR. В итоге я остановился на таком варианте декодера:
При всей непонятности нарисованного, всё это описывается буквально пятью строками кода.
Перед тем как декодировать сигнал, его сначала нужно перенести с несущей ПЧ в 12 кГц в 0 и отфильтровать. При этом образуются так не любимые обычными радиолюбителями сигналы с отрицательной частотой. Лучше даже не пытаться понять, что это такое :). А вот так выглядит подготовка сигнала к декодированию.
Она включает смешивание с сигналами 12 кГц с последующей фильтрацией ФНЧ. Поскольку частота дискретизации у нас 48 кГц, а частота несущей 12 кГц, т.е. ¼, то используется простой хак, когда сигнал для перевода в вид IQ просто умножается на последовательность 0, 1, -1, что работает просто и быстро. Схема в реальности занимает больше места, чем код, который её реализует.
О фильтрах. Это единственное, что в итоге я использовал из крейта SDR. Для создания ФНЧ нужно знать количество коэффициентов фильтра и частоту среза. Количество коэффициентов было оценено по эвристикам и ещё подсмотрено в проектах других SDR, поэтому обошёлся без Matlab. С частотами среза цифровых фильтров FIR я столкнулся впервые. Они задаются не фактической частотой, а долей от частоты дискретизации. В нашем случае это 48 кГц. Фильтры для сигналов IQ должны обеспечить полосу пропускания 12 кГц, но половина этой полосы находится в области отрицательных частот, поэтому частота среза фильтров составляет около 6 кГц. Я использовал частоту среза 0,12. На выходе демодулятора тоже есть ещё один ФНЧ с частотой среза в 12 кГц, т.е. 0,25 говоря по-цифровому.
Вот и весь приёмник. Еще я добавил ему возможность устанавливать из командной строки звуковые интерфейсы для ввода и вывода звука. Вот как выглядит запуск приемника на моём компьютере:
decodfm -i "Microphone (2- USB Audio CODEC )" -o "CABLE-A Input (VB-Audio Cable A)"
Больше никаких настроек не предусмотрено и сломаться нечему. Но рано я радовался, на моём компьютере установлен антивирус Касперского. Он предотвратил запуск моего SDR. Но чтоб это понять, пришлось пару часов в отладчике посидеть. Сам антивирус ничего не сообщал, просто программа вылетала с ошибкой:
Error: A backend-specific error has occurred: Параметр задан неверно. (0x80070057)
Пришлось зайти в настройки Касперского и внести свою программу в список исключений. После этого всё сразу заработало. А вот так выглядят декодированные пакеты в программе UZ7HO:
Попутно оценил качество оптимизации кода компилятором Rust. Если отладочная версия программы загружает процессор на 10-12%, то релизная версия с включенными оптимизациями не загружает процессор более чем на 2%. Т.е. SDR можно запросто запускать фоновым процессом при старте компьютера как демон и больше не вспоминать о его существовании.
Прочитавшим спасибо за внимание! Программу с исходниками можно найти здесь.
Комментарии (5)
Astroscope
13.05.2024 18:18+3Но тут вышел облом – трансивер как-то обрабатывает выходной аудиосигнал, что его уже нельзя декодировать пакетным модемом.
Icom ведет последовательную и настойчивую борьбу против пакета и его частного случая - APRS. Все относительно современные трансиверы Icom, включая наиболее очевидный выбор - FM (FM/DV) автомобилки и портативки, не имеют штатных возможностей подключить внешний TNC и, уж совсем очевидно, ни один трансивер Icom никогда не имел ни встроенного TNC, ни встроенного APRS. Но что даже относительно нишевый 9700 специально портит сигнал до невозможности декодирования (программного) AFSK - это совсем уже отвратительно. Да, это вам, получается, не TS-2000 со встроенным TNC...
Но выяснилась другая возможность – у этих трансиверов есть способ выводить вместо звука сигнал промежуточной частоты приёмного тракта.
Да, у некоторых это прямо напрямую на разъем сзади выводится, а у некоторых требуется простейшая доработка - сам сигнал на поверхности, нужно просто механически вытащить его наружу. Обычно используется для панорамы или второго приемника - сегодня это легко объединить одним простейшим, ведь преселекция уже выполнена силами трансивера, SDR.
nitro80
13.05.2024 18:18Интересно, лично такое отношение к цифре у ICOM?
Astroscope
13.05.2024 18:18+1Интересно, лично такое отношение к цифре у ICOM?
Буду честен, я не вполне понял вопрос.
Icom - довольно крупная компания, а не личность, поэтому роль личности в политике компании, конечно, нельзя недооценивать, особенно в японской компании, но я не знаю, кто принимает такого рода решения - кто-то из правления лично, кто-то из правления коллегиально, либо это исторически сложившаяся политика, которая считается успешной и бездумно продолжается, начавшись однажды. Сложно говорить о личной неприязни крупной компании, потому что крупная компания это не только линейный персонал, но и много управленческих слоев, на любом из которых могут генерироваться те или иные решения.
Что до цифры, применительно к радиолюбительскому сегменту (я не касаюсь коммерческой и служебной связи здесь вообще, там расклады другие), то хотя DV стандарт D-STAR формально является открытым, фактически почти все время его существования только и исключительно Icom производил абонентское и инфраструктурное оборудование для него, что привело к распространенному заблуждению, что D-STAR = Icom. Историческая D-STAR автомобилка от Kenwood - не более чем перебрендированный Icom для внутреннего японского рынка, поэтому не в счет. И только сравнительно недавно появился оригинальной разработки портативный Kenwood (формально говоря, даже две разные последовательные модели), в котором и D-STAR реализован, и APRS, причем оба, что называется, реализованы полноценно. Мечтаем о новой пока что гипотетической автомобилке Kenwood, чтобы точно так же в их стиле - все сразу и лучше всех по качеству реализации каждого. Возможно, такая связь Icom со стандартом связи D-STAR приводит к политике отказа от всего другого, что поддерживается другими производителями. Возможно, причины в чем-то совершенно третьем.
А в это время Kenwood продолжает быть эталоном имплементации как встроенного TNC, так и встроенного APRS. Устройства без встроенного TNC по-прежнему позволяют легко, через стандартный разъем со стандартными уровнями, подключать внешние TNC или DV-модемы. Решения от Yaesu куда как более спорны что по части реализации пакета и APRS, что по части пользовательской эргономики, но в ряде случаев компромисс получается вполне приемлемым.
VT100
ЕМНИП, при получении "отрицательной" частоты просто сдвигается на 180 градусов фаза (инверсия).