Хабрахабр

Как подружить PLUTO и HDSDR

К моему сожалению он работает с кучей софта под LINUX, а вот мой любимый HDSDR его не поддерживает. Не так давно импульсивно купил симпатичный SDR трансивер для детей и юношества – ADALM PLUTO. Недолго думая стал разбираться с этой проблемой и вот что из этого получилось:

Весь софт для PLUTO открытый и находится в свободном доступе. Analog Devices адресует свой PLUTO студентам. Большая часть софта написана под Linux и студентам рекомендуют пользоваться GNU Radio, MATLAB и т.п. На сайте компании есть страничка, на которой можно найти почти всю необходимую информацию о функционировании PLUTO.

SDR с диапазоном от 70МГц до 6ГГц (после раскрытия) всего за 150 американских денег — это чудо. У меня же чисто радиолюбительский интерес к PLUTO. Посмотрите как много там всего интегрировано: Сколько всяких экспериментов можно провести!

Но меня SDR# не устраивает, поскольку мне нужна хорошая поддержка CAT в программе для синхронизации частоты с трансивером. По всей видимости AD считает, что радиолюбители сами должны писать драйвера для популярных программ, поэтому до недавнего времени даже SDR# не поддерживался. Итак, выход один – интегрировать HDSDR и PLUTO самому. HDSDR же хочется попробовать использовать в качестве панорамного приёмника, подключив его к первой промежуточной частоте трансивера.

Эта библиотека служит программным мостом между HDSDR и желаемым SDR приёмником. С помощью гугла я довольно быстро выяснил, что для решения моей задачи нужно создать специальную ExtIO_.dll библиотеку в формате Winrad. Кроме того, на github довольно много готовых реализаций библиотек для различных приёмников: RTL_SDR, LimeSDR и пр. К счастью, интерфейс библиотеки неплохо документирован. Сама же библиотека совсем олдскульная, никаких новых технологий, чистый C89, как писали лет 20 лет назад. Было где подсмотреть как надо писать код. По крайней мере не надо учить новый язык программирования, что уже вселяло надежду на успех.

Для меня самым непонятным моментом явился формат обмена потоковыми данными между приёмником и HDSDR, но об этом чуть ниже. По сути в ExtIO_.dll нужно реализовать с десяток функций, которые позволяют инициализировать оборудование SDR, запускать и останавливать приём сигнала, сохранять и восстанавливать заданные настройки.

На самом деле есть несколько вариантов управления. Теперь возник вопрос как управлять PLUTO программным способом. Последний вариант мне показался более простым и хорошо описанным, поэтому остановился на нём. Я нашёл минимум два: напрямую чипом через библиотеку libad9361.dll, либо через библиотеку IIO. Подробнее описание библиотеки можно посмотреть здесь. В этой библиотеке все настройки оборудования доступны в виде какого-то подобия XML структуры, обращение к отдельному элементу идёт по текстовому названию свойства, что довольно удобно. Таким образом, не нужно реализовывать все настройки SDR в интерфейсе HDSDR, можно обойтись необходимым минимумом. Огромным преимуществом библиотеки является то, что она поставляется с утилитами командной строки, с помощью которых всегда можно быстро поменять нужную настройку приёмника. Потоки данных в IIO: А загрузку какого-нибудь экзотического FIR фильтра можно сделать из командной строки, если вообще когда-нибудь такая необходимость появится.

Несколько сложнее было получить удовлетворительный результат по передаче потоковых данных, тем более ранее опыта работы с SDR у меня не было. Программно научиться управлять PLUTO из HDSDR получилось довольно быстро и просто. Каждый сэмпл это без знаковое 16 битное целое число, из которого только 12 младших бит имеют значение. Тут надо понимать, что данные поступают из SDR приёмника в виде потока I/Q/I/Q … I /Q сэмплов. Какой из них удобнее и лучше не совсем мне понятно. В то же время у HDSDR есть с десяток вариантов принимаемых потоков данных. фактически один в один как отдаёт данные библиотека IIO.
Следующей проблемой стала передача данных между буферами приёма IIO и HDSDR. В результате я остановился на варианте, который в ExtIO называется exthwUSBdata16, т.е. Пришлось сделать промежуточный буфер и передавать поток через него. Последний принимает данные блоками, кратными 512 байтам, а IIO в таком формате выдавать данные не может. Код передачи показан ниже.

DWORD WINAPI GeneratorThreadProc( __in LPVOID lpParameter )
} } gbExitThread = false; gbThreadRunning = false; return 0;
}

Увеличил приоритет потока, в котором крутится цикл до THREAD_PRIORITY_TIME_CRITICAL, увеличивал размер буферов. Используя указанный цикл удалось достичь передачи потока в 4 MS/s, выше этого значения данные не успевают передаваться и приём сигнала идёт с заиканиями, хотя железо вроде способно отдавать и 20 MS/s и даже выше. Причём при увеличении буфера до 1 МБ, нормальный приём был невозможен и на минимальной скорости потока. Без результата. Если есть идеи как повысить скорость, прошу поделиться в комментариях. Больше тут не значит лучше.

Да и на УКВ и СВЧ полосы хватит для большинства задач. Надо сказать, что 4 MS/s для моих целей вполне достаточно, полоса с лихвой перекрывает любой радиолюбительский КВ диапазон. В результате библиотека написана, окно HDSDR с включенным на приём PLUTO выглядит примерно так:

Можете смело использовать его для своих экспериментов с ADALM PLUTO. Весь код библиотеки доступен на github здесь.

73 de R2AJP

Теги
Показать больше

Похожие статьи

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Кнопка «Наверх»
Закрыть