Обзор GNURadio
LVEE Winter 2014
От обычного радио к программно определяемому радио.
Изначально все компоненты радиоприемников и радиопередатчиков создавались из дискретных компонент. Из отдельных катушек, резисторов, конденсаторов, транзисторов и т.п. собирались устройства, которые применяли определенные математические преобразования к исходному сигналу, принятому в антенне, дабы получить какой-то полезный сигнал на выходе. Например, типичный супергетеродинный приемник осуществляет предварительное усиление сигнала (умножение на константу в идеале), преобразование частоты (перемножение исходного сигнала и сигнала внутреннего генератора — гетеродина), фильтрацию получившегося сигнала полосовым фильтром, детектирование сигнала.
Возьмем более сложную систему — телевизор. Он также может быть описан как совокупность сравнительно простых блоков, осуществляющих простые математические преобразования сигнала: перенос телевизионного сигнала на промежуточную частоту (гетеродин — смеситель), усиление полного сигнала на промежуточной частоте (фильтр, усилитель), выделение несущих звука и изображения (фильтры), детектирование звука и изображения (AM детектор, FM детектор), усилители, выделение сигналов цветности (фильтры), детектирование сигналов цветности (FM детекторы), линии задержки (фазовый преобразователь), сумматоры (восстановление R,G,B), схемы синхронизации (пороговый детектор).
Несмотря на чисто аналоговую элементную базу, проектирование сложного радиоэлектронного прибора подобно проектированию программной системы — мы разбиваем систему на слабосвязанные функциональные блоки, блоки разбиваем на подблоки, пока не дойдем до элементарных операций (усиления, фильтрации, детектирования, порогового детектирования и т.д.).
Сейчас, когда частоты цифровой электроники уже довольно глубоко в радиодиапазоне, стало возможным сначала преобразовать сигнал из антенны в цифровую форму и затем делать многие из перечисленных выше операций уже на цифровых процессорах. При этом проектирование системы можно устраивать как средствами обычных языков программирования, так и с помощью старых добрых блок-схем.Программно-определяемые радиосистемы, собственно, и предназначены для такой задачи. Gnuradio — как раз представитель подобного класса систем.
Рассмотрим чуть подробнее возможности современного процессора по обработке радиосигнала. Если мы возьмем диапазон длинных волн (30-300 кГц, километровые волны), то за один период этого сигнала успевает пройти более 10000 тактов процессора. Этого более чем достаточно, чтобы сделать с сигналом все что угодно (например, принять одновременно все длинноволновые станции и записывать каждую из них в отдельный файл). При этом процессор справится даже если мы добавим к ДВ существенный кусок средневолнового диапазона (300 кГц – 3 МГц). Однако выполнить то же самое с наиболее интересными коротковолновым, УКВ и СВЧ диапазонами так просто не получится: в запасе остается слишком мало тактов. Здесь приходится использовать компромисс: с помощью аналоговой электроники часть представляющего интерес диапазона можно перенести по частоте в диапазон от 0 до нескольких мегагерц, а потом уже этот сигнал оцифровывать и обрабатывать с помощью программно-определяемого радио.
Практически те же самые средства, как программные так и аппаратные, работают и в обратную сторону — для подготовки к передаче сигнала в эфир.
Предварительное преобразование и оцифровку сигнала делает специальная аппаратура Universal software radio peripheral (USRP, универсальное внешнее устройство для программного радио). Она содержит в себе предварительный усилитель, преобразователь частоты и АЦП. До недавнего времени это были специализированные и потому сравнительно дорогие устройства (например, USRP фирмы Ettus research стоит порядка $700). Однако несколько лет назад были открыты свойства USRP у сравнительно дешевых устройств для приема DVB-T телевидения на базе чипов Elonics E4000 и Raphael Micro R820T. Эти устройства стоят порядка $20, имеют довольно широкий диапазон частот настройки (54—2200 МГц у E4000, 24—1700 МГц у R820T), большую частоту выборки АЦП (2.5 Ms/s) и приемлемую чувствительность. Недостатки таких приемников DVB-T — закрытость и невозможность передачи сигнала. Подобных недостатков лишен проект HackRF — свободное аппаратное обеспечение с возможностью приема и передачи. Однако, HackRF дороже и может вызвать претензии у служб радиоконтроля и таможни (поскольку является передатчиком).
Архитектура Gnuradio.
Все схемы в GNUradio строятся из блоков. Блок — это элементарная единица обработки сигнала, “черный ящик” с несколькими входами и выходами. Выходы одних блоков можно соединять с однотипными входами других блоков, строя блок-схемы. Блоки можно соединять как программно (внутри программ на Python или C++) так и в графическом редакторе (GNURadio companion). Алгоритм обработки сигнала внутри блока реализуется на C++ (с ассемблерными вставками), для всех блоков существует обвязка на Python.
Блоки делятся на источники (sources), потребители (sinks), промежуточные и т.д. Также имеется большая библиотека графических виджетов, оформленных в виде блоков (поддерживаются Wx- и QT-виджеты).
Источники не имеют входов, зато имеют выходы. К источникам относятся интерфейсы USRP-приемников, программные генераторы сигналов, интерфейсы к микрофонам звуковой карточки, файлы с записями сигналов… Например, описанные в предыдущем разделе приемники DVB-T обрабатываются блоком RTL-SDR.
Потребители (sinks) не имеют выходов, но имеют один или несколько входов. К потребителям относят интерфейсы USRP-передатчиков, выходы звуковой карточки, выводы в файл. Некоторые графические виджеты также относятся к потребителям (например анализатор спектра, осциллограф).
Имеются потребители и источники, конвертирующие сигнал в/из TCP или UDP-поток данных. С помощью таких блоков можно разделить обработку сигнала на несколько машин.
Типичный представитель промежуточных блоков — фильтр. Имеется полный набор стандартных FIR или IIR-фильтров. Также фильтры могут конвертировать частоту выборки сигнала (децимация). Еще один класс промежуточных блоков — детекторы.
Имеются также вспомогательные блоки — например, представляющие глобальные переменные или виджеты для настройки глобальных переменных.
Для примера разберем, как сделать работающий FM-приемник из стандартных компонент GNUradio. Блок-схема самого простого приемника показана на рисунке. Он состоит из источника (RTL-SDR), фильтра нижних частот (селектор сигнала одной станции), FM-детектора, еще ресэмплера и потребителя — аудиокарточки. Частота настройки и частота выборки задаются глобальными переменными. Для удобства работы добавим виджеты настройки и красивую картинку для спектра сигнала. Чтобы превратить эту схему в приемник AM-сигнала, достаточно заменить детектор. Можно устроить одновременный прием двух FM станций, если они помещаются в полосу частот 1 MГц. Для этого можно использовать блок сдвига частоты frequency XLATE.
Нестандартные применения GNUradio и написание своих блоков
Хотя проект GNUradio изначально предназначен для задач обработки радиосигналов, он предоставляет набор стандартных хорошо оптимизированных компонент, пригодных для любой цифровой обработки сигналов. В качестве еще одного примера рассмотрим, как можно обработать данные энцефалограммы человека (запись мозговой активности). Для анализа в энцефалограмме выделяют несколько ритмов, они лежат в разных диапазонах частот (альфа 8—13 Гц, бета 13—30 Гц, гамма > 30 Гц, тета и дельта 1—7 Гц). Для определения активности в этих каналах нужно отфильтровать соответствующие диапазоны частот, по возможности сдвинуть частоты к нулю, продетектировать и усреднить сигнал. Однако данные от энцефалографа поступают в виде csv-файла, который стандартные средства GNUradio читать не умеют. С помощью gr_modtool мы создаем шаблон нового компонента
% gr_modtool newmod csvfile
Добавляем источник с типом выходных данных float (f).
% cd gr_csvfile
% gr_modtool add -t source csvfile_f
Это создает структуру директорий:
% ls gr_csvfile
apps cmake CMakeLists.txt docs examples grc include lib python swig
Нам в первую очередь потребуется отредактировать файлы сsvfile_f_impl.cc и csvfile_f_impl.h. В качестве образца возьмем стандартный компонент чтения из wav-файла, который есть в исходных кодах GNUradio. Нужно также отредактировать xml-файл описания компонента в директории grc. Далее, после компиляции с помощью cmake, получаем нужный компонент.
Abstract licensed under Creative Commons Attribution-ShareAlike 3.0 license
Back