
Если вы уже работали с приёмниками SDR и программами SDRSharp и SDR++, то, скорее всего, умеете «ловить» с их помощью FM-радио или радиостанции авиационного диапазона. Об этом я рассказывал в статьях «Этот увлекательный мир радиоприёмников» и «Цифровая радиотехника, первые шаги. Repka Pi + SDR = Сканируем Радиоэфир».
Но что если вам нужно создать свой нестандартный приёмник или другую радиосистему на базе устройства SDR, да ещё без паяльника и составления программ?
Для этого пригоден фреймворк GnuRadio, позволяющий с помощью блочного конструктора собрать нужную цепочку обработки сигналов из готовых или созданных вами блоков. В результате из нарисованной диаграммы вы получите готовую программу для взаимодействия с устройствами SDR и для обработки сигналов.
Фреймворк GnuRadio поддерживает очень большое количество платформ. В этой статье я буду использовать недорогой приёмник RTL-SDR Blog V4.
На базе GnuRadio можно создавать самые разные проекты: от простых приёмников и студенческих работ до систем любительской и профессиональной радиосвязи, а также приложений для тестирования и проведения измерений.
У вас может возникнуть вопрос — зачем использовать конструктор GnuRadio, если есть уже готовые, бесплатные и довольно мощные программы для работы с оборудованием SDR? Разница между готовыми программами и созданием своих на базе GnuRadio — это как разница между покупкой готового приёмника и сборкой собственного из радиодеталей.
Надо сказать, что новичку работа с GnuRadio покажется намного сложнее, чем с готовыми программами типа SDRSharp или SDR++. Но с помощью GnuRadio можно создавать собственные проекты, для которых нет готовых программ. Набравшись опыта, можно, например, передавать принятые сигналы нейросетям, создавая сводки эфиров или погоды. Тут все зависит только от вашей фантазии.
Огромная ценность GnuRаdio — в применении этой программы для обучения радиотехнике, что невозможно при использовании готовых программ.
Я надеюсь, что полученные знания оправдают затраченные усилия, а моя статья поможет сделать первые шаги в освоении GnuRadio.
Итак, я начну рассказ с того, как самому «собрать» несложный FM-приёмник на базе GnuRadio и RTL-SDR Blog V4 (рис. 1).

В этом приёмнике предусмотрена настройка частоты, радиочастотного усиления, регулировка громкости и кнопка включения или отключения звука. Также добавлен анализатор спектра и водопад, которые есть в большинстве готовых программ для SDR-приёмников.
Предполагается, что у вас есть приёмник RTL-SDR Blog V4 с штатной антенной и компьютер Microsoft Windows 11.
Установка GnuRadio
Сначала я расскажу об установке GnuRadio в среде Microsoft Windows 11, а затем проведу вас через процесс сборки, который сводится к редактированию блочной диаграммы приёмника.
Процедура установки GnuRadio для различных платформ описана в документации. Для Microsoft Windows нужно открыть страницу Radioconda. Далее скачайте и запустите программу radioconda-Windows-x86_64.exe.
На экране появится первая панель мастера установки (рис. 2).

Щёлкните здесь кнопку Next. Далее нужно прочитать лицензионное соглашение и перейти к выбору типа установки, щёлкнув кнопку I Agree (рис. 3).

Если выбрать установку для всех пользователей, отметив флажок All Users, придётся получить подтверждение от администратора.
На следующих шагах выберите путь к установке программы Radioconda и щелкните кнопку Install (рис. 4).

После завершения копирования файлов вы увидите панель с сообщением о завершении установки (рис. 5).

Для работы с приёмником RTL-SDR Blog V4 необходимо установить драйвер. Для этого скачайте и запустите программу Zadig с правами администратора.
Подключите модуль RTL-SDR V4 к порту USB вашего компьютера, а затем запустите программу Zadig с правами администратора. Появится окно установки драйвера (рис. 6).

Выберите строку List All Devices в меню Options. Далее в выпадающем меню выберите строку Bulk-In, Interface (Interface 0).
Проверьте, что в поле Driver находится строка RTL2832UUSB, RTL2832UHIDIR, RTL2832U или Blog V4. Также убедитесь, что в поле USB ID находятся значения 0BDA 2838 00, как это показано на рис. Х. Проверьте, что справа от зелёной стрелки выбрано WinUSB.
При ошибках возможна перезапись драйверов других устройств, таких как клавиатура или мышь, так что будьте внимательны.
После проверки щелкните к��опку Replace Driver и дождитесь окончания установки драйвера. В процессе установки у вас будет запрошено подтверждение на выполнение этой операции.
Собираем простейший FM-приёмник
Подключите к порту USB компьютера RTL-SDR Blog V4 с антенной. Я использовал антенну, которая продаётся в комплекте с этим приёмником SDR.
Запустите только что установленную программу GNU Radio Companion, и на экране появится ее окно, где можно создать новый проект (рис. 7).

В этом окне есть блоки Options и Variable.
С помощью блока Options (рис. 8) можно задать общие параметры для диаграммы (графа) вашего проекта. Это имя генерируемого файла программы, тип приложения — с графическим интерфейсом GUI или без него (No GUI), параметры выполнения, имя автора, копирайт, название и описание проекта, параметры генерации кода.

Значение большинства параметров можно оставить по умолчанию.
Для поля ID оставьте значение default.
В поле Title введите название проекта, например, «FM Radio». Поля Author и Copyright позволяют задать имя автора и сведения о правах на проект. В первом из них вы можете ввести свое имя, а во второй, например, строку «MIT».
В поле описания проекта Description введите строку, отражающую назначение проекта, например, «Simple FM Radio».
После того как вы полностью подготовите диаграмму проекта, Gnu Radio Companion создаст на её основе программу на Python, реализующую все необходимые функции. В нашем случае это будет работа с приёмником SDR для прослушивания FM-радиостанций.
В каждой диаграмме есть блок переменных Variable (рис. 9).

При помощи этого блока вы будете создавать переменные для использования в других блоках диаграммы. Пока он нам не понадобится.
Добавляем блок RTL-SDR Source
Этот блок позволяет задавать параметры работы приёмника и служит универсальной точкой входа для обработки реальных радиосигналов в проектах GnuRadio. Он преобразует поток данных от нашего приёмника SDR в поток комплексных чисел.
Поток данных, поступающих от блока RTL-SDR Source, можно обрабатывать с помощью других блоков GNU Radio — демодулировать (FM, AM, SSB, цифровые виды модуляций), фильтровать, записывать в файл, анализировать спектр, декодировать протоколы.
Чтобы добавить блок RTL-SDR Source в проект, используйте панель блоков в правой части окна программы Gnu Radio Companion. Раскройте там раздел OsmoSDR и выберите строку RTL-SDR Source с помощью двойного щелчка левой клавишей мыши (рис. 10).

Теперь этот блок появится в окне программы Gnu Radio Companion. Переместите его мышью в левую часть окна программы (рис. 11).

Вы также можете найти нужный вам блок по его названию, щелкнув значок поиска, расположенного над деревом блоков.
Очень важно правильно настроить параметры блока RTL-SDR Source. Для приёма FM-радио настройка параметров показана на рис. 12.

В поле Sample Rate (sps) введите значение 2.4e6, что соответствует значению 2400000 MS/сек. Это поле задаёт частоту дискретизации, с которой RTL-SDR будет выдавать поток данных.
Частоту Ch0: Frequency (Hz) задайте как 107e6 для приёма сигнала FM-радио с частотой 107 МГц. Если в вашем месте расположения лучше всего принимается FM-радио на другой частоте, укажите значение для этой частоты.
В поле режима управления усилением Ch0: Gain Mode установите значение False для отключения автоматического управления усилением.
Установите аналоговое усиление Ch0: RF Gain (dB) для слабых сигналов в диапазоне от 30 dB до 50 dB.
Параметр Ch0: RF Gain (dB) задаёт усиление в радиочастотном тракте до смесителя, сразу после антенны. Он помогает усиливать слабый сигнал на высокой частоте. При слишком большом значении возможна перегрузка входных цепей приёмника. Позже мы добавим возможность регулирования этого параметра.
Параметры Ch0: IF Gain и BB Gain задают усиление сигнала соответственно на промежуточной частоте (IF) и на последнем этапе обработки, уже после оцифровки. Чрезмерное увеличение этих параметров может привести к повышению уровня шума. Для приёма относительно сильных сигналов FM-радио я установил значения этих параметров равным нулю.
Добавляем анализатор спектра и водопад
Такие программы, как SDRSharp и SDR++, показывают в своём о��не спектрограмму и водопад. С помощью блоков GnuRadio вы тоже сможете использовать эту функциональность в своем приёмнике.
Добавьте в окно проекта блоки QT GUI Frequency Sink и QT GUI Waterfall Sink (рис. 13).

Первый из этих блоков реализует функции анализатора спектра, а второй — водопада.
Для подключения выхода блока RTL-SDR Source ко входам блоков QT GUI Frequency Sink и QT GUI Waterfall Sink используйте левую клавишу мыши. Щелкните ей на выходе блока, помеченного как out, и, не отпуская клавишу, переместите курсор мыши на вход блока, помеченного как In. Появится стрелка, соединяющая выход блока источника сигнала и вход блока, играющего роль приёмника сигнала.
На рис. 14 показаны настройки блока анализатора спектра QT GUI Frequency Sink.

Здесь нужно задать значение центральной частоты отображения спектра Center Frequency (Hz), равное 107e6 для частоты 107 МГц.
Ширину отображаемой полосы частот Bandwidth (Hz) укажите как 2.4e6 и включите отображение сетки (параметр Grid). Остальные параметры оставьте заданными по умолчанию.
Настройте параметры водопада QT GUI Waterfall Sink, как это показано на рис. 15.

Здесь нужно указать значение Center Frequency (Hz), равное 107e6, а также ширину отображаемой полосы частот Bandwidth (Hz), равную 2.4e6. Остальные значение параметров оставьте заданными по умолчанию.
Сохранив диаграмму, запустите её на выполнение клавишей F6, выбрав из меню Run строку Execute или щёлкнув мышью значок треугольника в панели программы GNU Radio Companion. Через некоторое время будет подготовлена и запущена программа на языке Python, а на экране появится окно с данными анализатора спектра и водопадом (рис. 16).

Выделяем нужную частоту блоком Low Pass Filter
На выходе блока RTL-SDR Source вы получаете сразу все станции в полосе приемника, заданной параметром Sample Rate. Я указал здесь значение 2.4 МГц, подходящее для приёмника RTL-SDR Blog V4. Спектр полученного сигнала виден в анализаторе спектра и водопаде.
Добавим блок Low Pass Filter, чтобы оставить только нужную станцию с частотой 107 МГц (как задано в настройках блока RTL-SDR Source).
Кроме того, добавим блоки частотной демодуляции WBFM Receive и блок Audio Sink, отправляющий аудио данные на звуковую карту компьютера для воспроизведения через колонки или наушники (рис. 17).

Установка параметров фильтра Low Pass Filter показана на рис. 18.

Здесь нужно задать параметры Decimation, Sample Rate, Cutoff Freq и Transition Width:
Decimation — коэффициент децимации. Он задаёт во сколько раз уменьшается частота дискретизации сигнала после фильтрации. Задайте этот параметр равным 10.
Sample Rate — частота дискретизации входного сигнала перед фильтром. Задайте здесь значение 2.4e6.
Cutoff Freq — частота среза фильтра, выше которой сигнал значительно ослабляется. Укажите значение 200e3.
Transition Width — ширина переходной зоны между полосой пропускания и полосой заграждения, определяющая, насколько плавно или резко фильтр отсекает частоты выше среза. Укажите значение 50e3.
В блоке WBFM Receive нужно задать параметры Quadrature Rate и Audio Decimation как 240e3 и 5, соответственно (рис. 19).

Здесь параметр Quadrature Rate задаёт частоту дискретизации входного комплексного сигнала после преобразования в квадратурный поток, а параметр Audio Decimation определяет коэффициент децимации, с которым этот поток понижается до частоты в звуковом диапазоне.
Коэффициент децимации — это число, на которое уменьшается частота дискретизации сигнала при понижении его скорости выборок. Процесс децимации снижает объём обрабатываемых данных и позволяет адаптировать поток под нужную частоту.
И, наконец, в блоке Audio Sink выберите из списка Sample Rate значение 48 kHz. Этот параметр задаёт частоту дискретизации звукового сигнала, с которой он будет воспроизводиться через наушники или колонки.
Если всё сделано правильно, то запустив программу на выполнение, вы услышите в колонках или наушниках, подключенных к компьютеру, сигнал принятой радиостанции. Пока для настройки на нужную частоту придётся редактировать соответствующие параметры блоков диаграммы, но скоро мы добавим в окно программы средства регулировки и настройки.
Файл только что описанного проекта FM-приёмника доступен в репозитории на Github. Он был создан в программе GNU Radio Companion версии 3.10.12.0 (Python 3.12.9).
Добавляем регулировки и настройки
В обычном радиоприёмнике как правило есть ручки настройки частоты и регулировки громкости. В наш приёмник, сделанный с помощью GnuRadio, мы добавим такие регулировки:
частота приёма;
усиление радиосигнала;
регулировка громкости;
включение и выключение звука
Полная диаграмма после добавления всех необходимых блоков показана на рис. 20.

В окне программы появились ползунки для регулировки громкости и частоты, поле ввода значения усиления на радиочастоте, а также переключатель, позволяющий включать и отключать звук без изменения громкости (рис. 21).

Добавляем перестройку по частоте
Для настройки приёмника на нужную частоту я добавил блок QT Gui Range, представляющий собой ползунок. Параметры этого блока показаны на рис. 22.

Прежде всего нужно задать значение параметра ID как «freq». При этом создаётся глобальная переменная с именем freq, доступная в других блоках нашей диаграммы. Эта переменная будет хранить текущее значение частоты, на которую настроен наш приёмник.
В полях Start и Stop задайте границы регулировки частоты как 88e6 и 108e6, что соответствует диапазону перестройки приёмника от 88 МГц до 108 МГц. При этом начальное значение частоты Default Value я указал как 107e6 (107 МГц).
Параметр Step задаёт шаг перестройки частоты, я указал 0.1e6. Настраивая значение этого параметра, можно регулировать плавность настройки.
Остальные параметры я оставил в состоянии по умолчанию.
Таким образом, с помощью блока QT Gui Range я добавил в программу ползунок, изменяющий значение переменной freq. Теперь эту переменную нужно указать в тех блоках, в которых ранее была прописана фиксированная частота 107e6 (107 МГц):
RTL-SDR Source — параметр Ch0: Frequency (Hz);
QT GUI Frequency Sink и QT GUI Waterfall Sink — параметр Center Frequency (Hz)
Добавляем изменение аналогового усиления на радиочастоте
В блоке RTL-SDR Source значение аналогового усиления на радиочастоте задаёт параметр Ch0: RF Gain (dB). Для его регулировки я добавил в диаграмму блок QT GUI Entry, позволяющий ввести нужное значение параметра (рис. 23).

Параметр ID этого блока определяет глобальную переменную с именем rf_gain. В эту переменную будет записано необходимое значение усиления.
Чтобы усиление зависело от этой переменной, нужно установить в блоке RTL-SDR Source значение параметра Ch0: RF Gain (dB) как rf_gain.
Регулировка громкости
Для регулировки громкости, а также для включения и выключения звука в диаграмму было добавлено два блока Multiply Const, еще один блок QT GIU Range, а также блок QT GUI Toggle Switch.
Как видно на диаграмме, блоки Multiply Const включены перед блоком Audio Sink. Они позволяют регулировать проходящий через них звуковой сигнал.
У этих блоков всего три параметра — IO Type, Constant и Vector Length.
Параметр IO Type задаёт тип данных на входе и выходе, Constant определяет константу, на которую умножается сигнал, а Vector Length указывает длину обрабатываемого вектора при работе с векторными потоками.
Здесь нужно указать IO Type как float, Constant как volume_gain в первом блоке и как mute_toggle во втором блоке, а Vector Length задайте равной единице.
Второй добавленный мной блок QT GIU Range должен иметь идентификатор volume_gain. При этом укажите для него значение по умолчанию Default Value, равное 0.5, минимальное значение Start, равное 0.0, конечное значение Stop как 1.0 и шаг Step, равный 0.1.
Настройка параметров блока QT GUI Toggle Switch показана на рис. 24.

Обратите внимание, что идентификатор блока указан как mute_toggle. Это имя используется во втором блоке Multiply Const, позволяющем включать или отключать звук без изменения его громкости.
Значение по умолчанию Default Value указано как 1, поэтому звук включен. При этом начальное состояние переключателя Initial State должно соответствовать этому значению и указано как Pressed.
Вы можете скачать файл проекта приёмника FM с регулировками из моего репозитория на Github.
Добавляем стерео
Итак, теперь вы знаете, как с помощью GnuRadio сделать FM-приёмник. Однако у только что описанного приёмника есть существенный недостаток — он не выдает в колонки или в наушники стереосигнал. Между тем, многие FM-станции как раз работают в режиме стерео.
Давайте изменим диаграмму таким образом, чтобы наш приёмник работал в режиме стерео (рис. 25).

Чтобы сделать возможным приём стерео, прежде всего нужно заменить блок WBFM Receive блоком WBFM Receive PLL. Укажите здесь такие же параметры, что и для блока WBFM Receive. Дополнительно убедитесь, что значение Deemphasis Tau равно 75e-6. Этот параметр задаёт постоянную времени фильтра, который компенсирует предыскажение (pre-emphasis) в FM-передаче, усиливая низкие частоты и ослабляя высокие, чтобы восстановить правильный спектр звукового сигнала.
В отличие от блока WBFM Receive у блока WBFM Receive PLL два выхода. Подключите каждый из них к своей цепочке блоков Multiply Const.
Еще одно важное изменение касается блока Audio Sink. В нём нужно задать значение параметра Num Inputs, равное двум. В результате у этого блока будет два входа — для левого и правого канала.
Проект стерео приёмника FM доступен в репозитории на GitHub.
Авиадиапазон
Теперь я расскажу о том, как сделать приёмник на авиадиапазон. Этот приёмник будет принимать сигнал с амплитудной модуляцией на частоте 128.1255 МГц, где аэропорт Внуково непрерывно передаёт сводку погоды. Передачи не зашифрованы и передаются в открытом виде.
Диаграмма приёмника показана на рис. 26.

В окне приёмника отображается водопад и спектр сигнала (рис. 27).

Настройки блока RTL-SDR Source показаны на рис. 28.

Обратите внимание, что в поле Ch0: Frequency (Hz) указана частота 128.1253e6, то есть 128.1253 МГц.
Так как на мой приёмник приходит слабый сигнал, пришлось установить большое усиление в полях Ch0: RF Gain (dB), Ch0: IF Gain (dB), а также Ch0: BB Gain (dB). Также я проводил эксперименты с включением автоматической регулировки усиления, установив для параметра Ch0: Gain Mode значение True.
После блока RTL-SDR Source включен блок Low Pass Filter (рис. 29).

Частота среза Cutoff Freq здесь указана как 1.208e3, а Transition Width — как120e3.
В авиадиапазоне применяется амплитудная модуляция, поэтому для демодуляции я использовал блок AM Demod (рис. 30).

Здесь указаны значения для параметров Channel Rate, Audio Decimation, Audio Pass и Audio Stop.
Скорость дискретизации Channel Rate указана как 240e3 и соответствует частоте сэмплов, поступающих от блока Low Pass Filter.
Значение параметра Audio Decimation, равная пяти, указывает, что после демодуляции частоту аудио сигнала нужно уменьшить в пять раз.
Параметр Audio Pass задаёт частоту среза НЧ-фильтра. В приёмнике я использовал значение 5 КГц.
И, наконец, параметр Audio Stop, значение которого равно 6 КГц, указывает, что начиная с этой частоты нужно подавлять шум.
Между блоками AM Demod и Audio Sink я добавил ещё один фильтр Low Pass Filter для фильтрации на звуковой частоте (рис. 31).

Обратите внимание, что частота среза здесь указана равной 2400 Гц, а значение крутизны задано равным 1000. Этот фильтр не выполняет децимацию и не усиливает сигнал.
Файл проекта приёмника на авиадиапазон вы можете найти в моём репозитории на Github.
Что дальше
Мир GnuRadio огромен, и сейчас я рассказал только как в него войти, собрав простые приёмники для FM-радио и авиадиапазона на базе USB-блока RTL-SDR Blog V4. Надеюсь, вам понравились описанные в статье решения и вы провели собственные эксперименты с GnuRadio.
Если тема будет интересна читателям, я планирую написать новые статьи про GnuRadio. Пишите в комментариях, о каких применениях GnuRadio вам было бы интересно узнать из следующих статей по этой теме.
Автор @AlexandreFrolov
НЛО прилетело и оставило здесь промокод для читателей нашего блога:
-15% на заказ любого VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.
