Урок 1-й. Создаем простой FM приемник из HackRF в GNU Radio.

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

Описание создания FM радио выполнено по мотивам видеоурока на англоязычном сайте https://greatscottgadgets.com.

Итак, запустите GNU Radio и сохраните проект под удобным для вас названием (у меня это lesson1). При запуске проекта по умолчанию уже имеется два блока Option и Variable:

Блоки Variable определяют значения переменных в программе (или точнее Графе потока данных), в блоке по умолчанию определена переменная samp_rate, которая будет определять частоту дискретизации входного сигнала, мы далее будем использовать, только с другим значением, поскольку заданное по умолчанию для наших целей очень маленькое. Щелкните по данному блоку и в свойствах введите 10000000 (или 10e6):

Следующее, что сделаем, это добавим в рабочее окно программы блок, взаимодействующий с источником сигнала (HackRF) под названием osmocom Source (он генерирует цифровой сигнала по заданным параметрам для дальнейшей программной обработки и визуализации):

Далее проведем некоторые его настройки:

А именно, изменим значение Ch0:Frequency на значение середины FM диапазона 97.6 МГц (97.6е6) и выключим усиление сигнала на входе HackRF (необходимость зависит от расстояния до источника FM радиостанций, в моем они располагаются недалеко).

Для визуализации спектра принимаемых сигналов добавим в программу блок QT GUI Frequency Sink:

Соединим выход блока источника osmocom Source с входом QT GUI Frequency Sink (протянув мышью с зажатой левой клавишей от out до in), и программа готова к первому запуску!

После запуска программы кнопкой:

мы должны увидеть спектр сигнала заданной ширины (10 МГц) относительно некоторого нулевого центрального значения:

Важно! Чтобы правильно остановить работающую программу необходимо не закрыть активное окно, а нажать кнопку «Стоп» в окне GNU Radio:

Для того чтобы на спектре отображались реальные частоты необходимо в блоке QT GUI Frequency Sink прописать реальное значение центральной частоты. Сделаем это правильно, через переменную. Скопируем и вставим блок Variable и введем имя переменной Center_fr, установим для нее значение 97,6 МГц (97.6е6):

В поле Center Frequency блока QT GUI Frequency Sink укажем название нашей переменной:

Также изменим числовое значение на значение переменной в блоке источника сигнала:

Итоговая программа сейчас выглядит так:

После запуска программы мы увидим, что в нижней части графика теперь отображаются реальные частоты спектра:

На графике спектра частот мы видим работу сразу нескольких радиостанций, давайте попробуем послушать одну из них. Для примера выберу радиостанцию на частоте 96 МГц (в моем случае это частота радиостанции «Дорожное радио»). Для этого программно переместим данную частоту в центр окна графика (можно было бы конечно просто изменить центральную частоту, но выберем именно программный способ, чтобы не перенастраивать аппаратную часть HackRF).

Выберете блок умножения Multiply и перетащите его в рабочую область:

В качестве источника второго сигнала выберем генератор Signal Source (он нам даст синтезированный процессором сигнал, который затем побитно перемножится с основным сигналом источника HackRF):

Далее необходимо установить частоту, которая будет равна разности частот между установленной центральной частотой и частотой интересующей нас станции FM диапазона. Создадим переменную channel_DR и присвоим ей значение 96 МГц (96e6):

Теперь изменим значение поля Frequency в блоке Signal Source как показано ниже на рисунке:

И чтобы визуально увидеть, что у нас получилось скопируем блок QT GUI Frequency Sink и подключим его вход к выходу Multiply:

Запустим программу и увидим два графика, на нижнем из них пик выбранной нами радиостанции находится слева от центра, а на верхнем в центра окна.

Теперь демодулируем сигнал выбранной нами радиостанции и преобразуем его в аудиосигнал.

Для этого сначала отфильтруем его. Выберите блок низкочастотного фильтра Low Pass Filter и перетащите в рабочую область:

Подключите выход блока умножения к входу нижних частот и установите частоту среза (Cutoff Freq) — 75 кГц (75e3), ширину перехода (Transition Width) — 25 кГц (25e3). Сузим диапазон частот, параметр децимации (Decimation) зависит от ширины полосы пропускания сигнала, который нас интересует. Сейчас мы принимаем очень широкополосный сигнал с множеством радиостанций. Создадим переменную — channel_width (ширина канала) и присвоим ей значение 200 кГц (200e3) — стандартная ширина канала FM радиостанции.

Теперь мы можем установить значение децимации в блоке фильтра нижних частот исходя из значения ширины канала. Децимация — процесс уменьшения частоты дискретизации. Для этого разделим частоту дискретизации заданную переменной same_rate на ширину канала channel_width:

Decimation= int(samp_rate/channel_width):

Обратите внимание, что в поле Decimation блока Low Pass Filter для его правильной работы необходимо применить оператор int, который преобразует вещественный тип значения частного в целый.

Теперь в наш приемник надо добавить Rational Resampler — компонент, который выполняет передискретизацию с рациональным коэффициентом.  С его помощью, например, можно преобразовать выборку данных с частотой 500 кГц в частоту 48 кГц, которую способен обработать любой драйвер звуковой карты компьютера — собственно, что нам и надо.

Установим значения Interpolation и Decimation для данного блока:

Здесь мы интерполируем частоту на 12 и уменьшаем в 5 раз (получим на выходе 480 000). Дело в том, что фильтр низких частот может уменьшать частоту только в целое число раз, а нам надо изменить частоту дискретизации на значение которое не является целым, для чего и нужен этот блок. Теперь мы можем подключить демодулятор, который преобразует комплексный низкочастотный сигнал в звуковой (WBFM Receive):

WBFM обозначает широкополосная FM модуляция, для настройки блока надо установить значения 2-х параметров:

  1. Квадратурная частота (Quadrature Rate) — частота дискретизации входного сигнала, которая должна быть равна 480 000 (480e3) — собственно мы его задали ранее, выбрав соотношение12/5;
  2. Частота дискретизации аудиосигнала (Audio Decim ation) — установим значение 10.

Таким образом на выходе мы получим 48 000 — данное значение поддерживается любой современной звуковой картой.

Следующим шагом мы подключаем нашу звуковую карту (блок Audio sink):

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

Соединив блоки у нас должно получиться вот так:

Рабочая блок схема FM приемника

Теперь запустив программу мы должны услышать выбранную радиостанцию.

Давайте попробуем научиться регулировать громкость с самой программы. Самый простой метод это умножить на константу аудиосигнал перед блоком Audio Sink. Так и поступим. Найдите в правом окне блок Multiply Const и перетащим в рабочую область программы. Обратите внимание, что вход и выход у данного блока имеют комплексные значения и для его подключения между блоками WBFM Receive и Audio Sink необходимо их переопределить. Для этого в свойстве IO Type меняем complex на float.

При желании можно изменить значение поля Constant на 2 или более и посмотреть, как изменится громкость, но я предлагаю сразу сделать это значение изменяемым в окне работающей программы.

Добавим в наш приемник ползунковый регулятор, для чего вставим блок QT GUI Range и настроим его: ID — audio_gain, Start — 1, Stop — 10 (вполне достаточно), Step — 1

Теперь настроим блок Multiply Const:

Здесь вместо числовой константы пропишем переменную audio_gain.

Поскольку нам не нужен один из графиков спектра частот (нижний блок QT GUI Frequency Sink), деактивируем его (щелкните по нему правой кнопкой мыши и выберите Disable)

Итоговая блок схема будет выглядеть вот так:

Осталось запустить программу и увидеть, а главное услышать, результат.

Далее, для закрепления материала, можете самостоятельно добавить настройку на другие радиостанции. Также попробуйте поменять значение переменной samp_rate на другие допустимые значения и посмотрите на получаемую разницу в выходном звуковом сигнале (у меня лучшее качество получилось при значении дискретизации высокочастотного сигнала 10 000 000 ).

На этом сегодня всё!


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

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