admin / 29.12.2017

GnuRadio: Урок 1, Signal Source, Audio source, фильтры

Gnuradio is a software framework intended in particular to building software defined radio. New functions and new external devices can be added easily by writing plugins. It also has graphical front end to rapidly create software signal processors. I will demonstrate creating software radio receivers with GNUradio and commodity components. Also I will discuss using gnuradio as a general signal processing tool and writing plugins for gnuradio, using processing of electroencephalogram (EEG) as an example.

От обычного радио к программно определяемому радио.

Изначально все компоненты радиоприемников и радиопередатчиков создавались из дискретных компонент. Из отдельных катушек, резисторов, конденсаторов, транзисторов и т.п. собирались устройства, которые применяли определенные математические преобразования к исходному сигналу, принятому в антенне, дабы получить какой-то полезный сигнал на выходе. Например, типичный супергетеродинный приемник осуществляет предварительное усиление сигнала (умножение на константу в идеале), преобразование частоты (перемножение исходного сигнала и сигнала внутреннего генератора — гетеродина), фильтрацию получившегося сигнала полосовым фильтром, детектирование сигнала.

Возьмем более сложную систему — телевизор. Он также может быть описан как совокупность сравнительно простых блоков, осуществляющих простые математические преобразования сигнала: перенос телевизионного сигнала на промежуточную частоту (гетеродин — смеситель), усиление полного сигнала на промежуточной частоте (фильтр, усилитель), выделение несущих звука и изображения (фильтры), детектирование звука и изображения (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-поток данных.

Rencontres Du Film Court Antananarivo

С помощью таких блоков можно разделить обработку сигнала на несколько машин.

Типичный представитель промежуточных блоков — фильтр. Имеется полный набор стандартных 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 мы создаем шаблон нового компонента

Добавляем источник с типом выходных данных float (f).

Это создает структуру директорий:

Нам в первую очередь потребуется отредактировать файлы сsvfile_f_impl.cc и csvfile_f_impl.h. В качестве образца возьмем стандартный компонент чтения из wav-файла, который есть в исходных кодах GNUradio. Нужно также отредактировать xml-файл описания компонента в директории grc. Далее, после компиляции с помощью cmake, получаем нужный компонент.

Abstract licensed under Creative Commons Attribution-ShareAlike 3.0 license

Back

В этой заметке речь пойдет о Software Defined Radio, или SDR. SDR — это когда у вас есть некое специальное устройство для работы с радио-сигналами, подключенное к компьютеру, а софт на компьютере определяет, что именно это устройство будет принимать и передавать. В сущности, SDR — это отладчик для радио. С его помощью вы можете как отлаживать собственное железо, так и искать баги / уязвимости в чужом, а также реверсить закрытые беспроводные протоколы и притворяться приемником или передатчиком, работающим по определенному протоколу.

Почему LimeSDR?

Так вот, упомянутых «устройств для работы с радио-сигналами» существует уже немало. Естественно, все они отличаются по цене и характеристикам.

Самым дешевым решением, пожалуй, является RTL-SDR. Различные его модификации стоят от 10$ до 20$ (я бы советовал версию в алюминиевом корпусе с SMA-разъемом), умеет работать на частоте от 24 МГц до 1766 МГц, имеет 8-и битный АЦП, частоту дискретизации 3.2 MS/s, полоса пропускания составляет 2.4 МГц. При этом устройство работает только как приемник сигнала. По этой причине, а также потому что многие интересные сигналы передаются за пределами поддерживаемых RTL-SDR частот, например, на 2.4 ГГц, это устройство подходит для несколько ограниченного круга задач.

В качестве достаточно дорогого и подходящего для большинства практических задач устройства можно назвать USRP B200. USRP работает на частоте от 70 МГц до 6 ГГц, имеет 12-и битный АЦП, частоту дискретизации 61.44 MS/s и полосу пропускания 56 МГц. Может принимать и передавать сигнал в полнодуплексном режиме. Цена устройства на eBay составляет 600$. Также существует модификация USRP B210, позволяющая принимать и передавать в полнодуплексном режиме сразу два сигнала. То есть, в сущности, это как два USRP B200 в одном устройстве, и цена соответствующая.

Очень интересным в плане отношения цена/качество является LimeSDR:

Устройство стоит 300$, позволяет работать с частотами от 100 КГц до 3.8 ГГц, имеет 12-и битный АЦП, частоту дискретизации 61.44 MS/s и полосу пропускания 61 МГц, может принимать и передавать сигнал в полнодуплесном режиме. То есть, устройство позволяет работать с большинством интересных частот (Bluetooth, GSM, 3G, 4G, GPS, ZigBee, LoRa, …), за исключением разве что 5.8 ГГц. Но это не такая уж большая потеря, если на первых порах вы не собираетесь ковырять Wi-Fi или какие-нибудь беспроводные передатчики видеосигнала.

Притом, что Wi-Fi можно поковырять и на 2.4 ГГц.

Дополнение: 14 сентября 2017 запустилась кампания по сбору средств на производство LimeSDR Mini, аналогичного устройства ценой всего 139$, или даже 99$ для первых покупателей. Основные отличия заключаются в меньшем числе каналов (по одному RX и TX, а не по два), вдвое меньших полосе пропускания и частоте дискретизации (30 МГц и 30.72 MS/s соответственно), а также чуть более узким диапазоном поддерживаемых частот (10 МГц — 3.5 ГГц вместо 100 КГц — 3.8 ГГц), и, конечно же, компактности устройства. Также вместо крохотных u.FL разъемов используются традиционные SMA. Субъективно LimeSDR Mini является куда более привлекательным устройством начального уровня, чем оригинальный LimeSDR.

Дополнение: 19 октября 2017 была анонсирована плата расширения на базе LMS8001, расширяющая диапазон частот LimeSDR или LimeSDR Mini до 10 ГГц. Цена устройства составляет 299$ плюс 15$ за доставку. Интересно, что LimeSDR с такой платой расширения по возможностям сравним с USRP B210, только в два раза дешевле.

Стоит отметить, что существуют и другие железки. В частности, большой популярностью пользуются HackRF One и BladeRF. Более подробный обзор существующих SDR можно найти в статье Roundup of Software Defined Radios на сайте rtl-sdr.com.

Fun fact! Если LimeSDR не укладывается в ваш бюджет, вы можете повторить все инструкции из этой заметки и для другого SDR, в частности, для RTL-SDR, с минимальными изменениями. Для RTL-SDR повторить их будет даже несколько проще, так как весь упомянутый софт работает с ним из коробки, без компиляции самых последних версий из исходников, и так далее.

Настройка окружения

Для взаимодействия с LimeSDR нам понадобится специализированный софт, такой, как Gqrx и GNU Radio (см далее). К сожалению, из коробки они так просто не будут работать с LimeSDR. Информацию о том, как это исправить, мне пришлось собирать буквально по крупицам. В ретроспективе могу сказать, что все свелось тупо к установке наиболее свежих версий следующих пакетов:

  • SoapySDR — представляет открытый обобщенный API на C/C++ для взаимодействия с SDR устройствами;
  • LimeSuite — драйвер и GUI для SDR-платформ на базе LMS7002M (LimeSDR, Novena RF7, и т.д.);
  • gr-osmosdr — источник (source) и сток (sink) OsmoSDR-совместимых устройств для GNU Radio;
  • Gqrx — софтверный приемник для RTL-SDR, USRP и OsmoSDR-совместимых устройств;

В Arch Linux все эти пакеты доступны на AUR и называются soapysdr-git, limesuite-git, gr-osmosdr-git и gqrx-git соответственно. Поскольку эти пакеты в свою очередь имеют зависимости, также из AUR, для их установки не лишено смысла воспользоваться утилитой yaourt или аналогичной, как описано в заметке Управление пакетами в Arch Linux с помощью ABS и pacman. Также был установлен GNU Radio, но в виде штатного бинарного пакета, а не из исходников.

Все названные пакеты ставятся без особых сложностей, если не считать gr-osmosdr-git. Мне пришлось слегка подправить файл PKGBUILD, добавив в аргументы CMake:

cmake -DENABLE_RTL=OFF -DENABLE_RTL_TCP=OFF …

Без этого изменения пакет никак не компилировался:

rtl_source_c.cc:224:9: error: ‘rtlsdr_set_bias_tee’ was not declared
  in this scope

После установки пакетов подключаем к компьютеру LimeSDR и запускаем LimeSuiteGUI. Идем в Options → Connection Settings → Connect. Затем идем в Modules → Device Info, жмем Get Info. Если информация об устройстве успешно читается, это хороший знак. При помощи LimeSuiteGUI вы можете произвести проверку LimeSDR, а также обновить прошивку устройства. Крайне рекомендую сделать это сразу, чтобы потом не ловить непонятные ошибки, например, тупо из-за старой версии прошивки.

Стоит отметить, что есть и другие интересные связанные с SDR утилиты и пакеты, например sdrangel, rx_tools, inspectrum, urh, qspectrumanalyzer и baudline. Кроме того, иногда используют и Audacity, который изначально вообще предназначен для обработки звука. Но рассмотрение этих инструментов уже выходит за рамки данной статьи.

Знакомство с Gqrx

Проверим, что Gqrx нормально работает с LimeSDR. Проще всего это сделать, попытавшись поймать обычное ФМ-радио.

Но сначала нам понадобится антенна. Антенны к LimeSDR подключается через так называемые u.FL разъемы. Для высокочастотного сигнала (выше 1.5 ГГц) антенну нужно подключить к разъему RX1_H, для низкочастотного — к RX1_L.

Для приема ФМ-радио в городских условиях вполне подойдет антенна от GSM-модуля Neoway M590, которая как раз имеет нужный разъем. Впрочем, при использовании такой антенны сигнал будет заметно зашумлен. Лучше подойдет обычный проводок длиной около 15 см. Его можно аккуратно припаять к центру RX1_L на LimeSDR, или к разъему антенны от модуля Neoway M590.

Разобравшись с антенной, настраиваем Gqrx следующим образом:

Окно Configure I/O Devices, на скриншоте изображенное слева, можно найти в меню File → I/O Devices. Вкладка Input Controls, изображенная справа, находится в правой верхней части интерфейса Gqrx.

Если все было сделано правильно, вы сможете поймать на Gqrx ФМ-радио и слышать его в ваших наушниках или колонках (кликабельно, PNG, 697 Кб):

Убедитесь, что Receiver Options у вас выставлены такие же, как в правой части скриншота. В данном примере я поймал радиостанцию 95.2 FM (Rock FM). В вашим городе могут быть другие радиостанции, так что частоту придется подобрать. По так называемому водопаду (waterfall) или спектрограмме (она же сонограмма) в левой нижней части интерфейса легко определить, на каких частотах есть сигнал (желтый цвет), а на каких его нет (синий цвет).

Знакомство с GNU Radio

Еще одним популярным инструментом в мире SDR является GNU Radio. Интересно, что GNU Radio предназначен для каких-то манипуляций не только с радиосигналами, а с сигналами вообще. Например, при желании с помощью GNU Radio можно обрабатывать звук.

Пример ФМ-приемника на GNU Radio был нагуглен здесь. После пары небольших изменений у меня получилась такая схема (кликабельно, PNG, 188 Кб):

Кстати, программа на скриншоте называется gnuradio-companion. Если все было сделано правильно, то после нажатия F6 (или Run → Execute) вы увидите:

… а также услышите звук радиостанции 92.0 FM (Москва FM) в наушниках или колонках.

На случай, если у вас что-то не будет получаться с оригинальным проектом, или автор решит его удалить, модифицированную мной версию можно скачать здесь.

Заключение

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

Немного ссылок по теме.

Где купить:

Тематические блоги:

Где попросить помощи:

Видео-туториалы:

А интересуетесь ли вы SDR и если да, то какие софт и железо используете, и что интересного с их помощью вам удавалось сделать?

Дополнение: См также заметки О работе пультов и радиомодулей на 433 МГц, Наблюдаем за самолетами при помощи RTL-SDR и ADS-B, Как я пробовал использовать RTL-SDR в качестве дешевого анализатора спектра, Изучаем сигналы NRF24L01 с помощью LimeSDR и далее по ссылкам.

Метки: Беспроводная связь, Электроника.

Для того чтобы иметь возможность использовать в GnuRadio RTL2832 донгл в качестве источника сигнала, нужно установить кое-какие недостающие вещи.
Для тех кто владеет английским, ничего интересного тут написано не будет. Все достаточно подробно описано на странице rtl-sdr проекта.
Итак, приступим.

Итак, у нас есть система с уже установленым GnuRadio.

«Antananarivo» — перевод на русский

Приступим к установке rtl-sdr библиотек.

  1. Открываем терминал и обновляем список доступного ПО командой
    sudo apt-get update
  2. Устанавливаем требуемое для сборки rtl-sdr ПО
    sudo apt-get install git cmake libusb-1.0-0-dev libboost-all-dev gnuradio-dev liblog4cpp5-dev swig
  3. Переходим в домашний каталог
    cd ~
    И получаем свежую версию исходных кодов rtl-sdr
    git clone git://git.osmocom.org/rtl-sdr.git
  4. Переходим в каталог с исходным кодом
    cd rtl-sdr/
  5. Компилируем и устанавливаем:
    Создаем внутри каталога папку build
    mkdir build
    Заходим в нее
    cd build/
    Компилируем командами
    cmake -DINSTALL_UDEV_RULES=ON ../
    и
    make
    Затем устранавливаем библиотеку rtl-sdr
    sudo make install
    и
    sudo ldconfig

Итак, библиотеку rtl-sdr мы установили. Теперь установим gr-osmosdr — блок для GnuRadio осуществляющий контроль за различными типами оборудования такого как RTL2832 донглы, FunCube донгл, HackRF, и прочими железками.

  1. Переходим в домашний каталог
    cd ~
  2. Получаем свежую версию gr-osmosdr
    git clone git://git.osmocom.org/gr-osmosdr
  3. Переходим в каталог
    cd gr-osmosdr/
  4. А теперь, грязная шуточка. Так как я устанавливал GnuRadio не через компиляцию (официально рекомендованный метод) самой последней свежей версии, а установкой через пакетный менеджер, и получаетс так, что версия моя немного младше чем требуется, и при попытке компиляции gr-osmosdr вылезет ошибка
    CMake Error at CMakeLists.txt:151 (find_package):
      Could not find a configuration file for package «Gnuradio» that is
      compatible with requested version «3.7.3».  The following configuration files were considered but not accepted:    /usr/lib/i386-linux-gnu/cmake/gnuradio/GnuradioConfig.cmake, version: 3.7.2.1
    Для того чтобы избежать этого, мы подправим конфигурационный файл для cmake.
    Откройте файл CMakeLists.txt и найдите строку
    find_package(Gnuradio 3.7.3 REQUIRED)
    и поправьте ее на
    find_package(Gnuradio 3.7.2 REQUIRED)
    Сохраняем, закрываем файл.Так же поправим место, куда будет копироваться xml файлы блока.
    Откроем в каталоге grc файл CMakeLists.txt и изменим строку
    DESTINATION share/gnuradio/grc/blocks
    на
    DESTINATION /usr/share/gnuradio/grc/blocks
  5. Компилируем и устанавливаем:
    mkdir build
    cd build/
    cmake ../
    make
    sudo make install
    sudo ldconfig
  6. Теперь нам надо заблокировать загрузку стандартных драйверов для донгла.
    Откройте файл /etc/modprobe.d/blacklist.conf и добавьте в его конец
    blacklist dvb_usb_rtl28xxu

Вот впринципе и все.
Запускаем GnuRadio, втыкаем наш донгл, и проверяем.
Блок для нашего донгла находится в разделе Sources.

Запись опубликована автором Igor в рубрике GnuRadio с метками gnuradio, rtl2832.

FILED UNDER : IT

Submit a Comment

Must be required * marked fields.

:*
:*