Сайт TechStop-Ekb.Ru, логотип текстовый.Сайт Тех Стоп Екб Ру, логотип инфографика.

Блок. Частота. Сигнал. Данные. Фильтр. Поток.

#4. Введение в радио конструктор GNU Radio на Python.

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

... Подготовлено по материалам руководств и наставлений Wiki Gnu Radio ...

Что такое GNU Radio?

GNU Radio - это бесплатный набор инструментов для разработки ПО с открытым исходным кодом, который предоставляет блоки обработки сигналов для реализации программных радиомодулей, используемых с недорогим SDR радио донглом ...

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

Зачем мне GNU Radio?

Раньше, при разработке устройств радиосвязи - инженеру приходилось разрабатывать и отлаживать схемы с помощью дорогостоящего оборудования ... Программно-определяемое радио (SDR) берет на себя обработку аналогового сигнала и переносит ее, насколько это физически и экономически возможно, на обработку радиосигнала на компьютере с использованием алгоритмов программного обеспечения ... Зачем изобретать велосипед и заново реализовывать стандартные и отлаженные блоки? ... Вы действительно хотите написать все графические интерфейсы - самостоятельно? ...

GNU Radio - фреймворк, предназначенный для написания приложений обработки сигналов для обычных компьютеров ... Аналоговый сигнал конвертируется в цифровой, состоящий из дискретизированных чисел, взятых через равные промежутки времени, последовательно ... Теперь, когда у нас есть последовательность чисел, наш компьютер может делать с ней - что угодно ... При создании приложения обработки сигналов создается полный граф блоков, называемый блок-графом ...

GNU Radio - это платформа для разработки этих блоков обработки и создания блок-схем, которые включают приложения обработки радиосигналов ... Стандартные блоки ... Генераторы сигналов ... Модуляторы ... Графический интерфейс ... Математические операторы ... Модели каналов ... Фильтры ... Анализ Фурье ... Можно писать свои собственные блоки ... Таким образом, GNU Radio - это, главным образом, фреймворк для разработки блоков обработки сигналов и их взаимодействия ... Задача пользователя - создать из него что-то полезное, хотя оно уже содержит множество полезных рабочих примеров ... Думайте об этом, как - о наборе строительных блоков ...

Блок-граф.

Все блоки в графе имеющие входы и выходы - должны иметь подключения ... Чёрные стрелки - указывают направление движения сигнала в процессе обработки ... Обратите внимание : красная стрелка указывает несоответствие выходных и входных типов данных для последовательно соединённых блоков ...

Созданный блок-граф описывается двумя файлами :
*.grc - графически отображает блоки потока в GRC ...
*.py - содержит фактический Python код обработки потокового графа ...

Типы данных и переменные.

GNU Radio Companion (GRC) использует типы данных Python для представления переменных ... Простейшие типы данных описывают числа ... Числа в Python могут быть числами с плавающей запятой или целыми числами ...
float() - преобразовать целые числа - в числа с плавающей запятой ...
int() - преобразовать числа с плавающей запятой - в целые числа ...
Преобразование типов можно выполнить внутри блоков переменных ...

GRC отображает числа иначе, чем Python ... GRC преобразует все числа в единицы СИ ... Обратите внимание, что GRC может отображать число в формате, отличном от того, который представлен в Python ...

Строки ... Python использует как одинарные, так и двойные кавычки для хранения строк ... Строки можно использовать в качестве переменных в GRC:

Списки и кортежи ... Переменные в GRC могут использовать списки Python ... Переменные в GRC могут использовать кортежи Python ...

Цвета свойств в GNU Radio Companion ... GRC использует цветовую схему для представления типов данных при редактировании свойств блока ...
оранжевый - числа с плавающей точкой, Float 32 ...
зеленый - целые числа, Integer 32 ...
фиолетовый - строка, String, Char / Byte (или Integer 8) ...
не имеют цвета - блоки переменных, поскольку их можно использовать для представления любого типа данных или объекта ...

Блоки GNU Radio реализованы, как - функции ... Блоки - принимают параметры, которые изменяют поведение ... Значение передают через переменные, интегрированные в блоки / функции ... Переменная - может содержать - другую переменную ... Зависимые переменные - зависят друг от друга ... Переменные можно обновлять во время работы потокового графа - с использованием виджетов QT GUI ...

Виджет QT GUI Range создает ползунок, который можно использовать для обновления переменной ...
Id = переменная ... Тип - float ... Start, Stop, Step - настройки начала, конца и шага ...

Виджет QT GUI Chooser создает раскрывающееся меню опций для переменной ...
Id = переменная ... Тип - integer ... Вариант 1, 2, 3 - выбор предустановленных значений ...

Типы данных.

Каждый входной и выходной порт в блоке будет иметь связанный с ним тип данных ... Тип данных определяется цветом порта ввода и вывода ... Смотреть - Справка - Типы данных и связанные с ними цвета ... Наиболее распространенными типами данных в блоках GNU Radio являются ...
Complex Float 32 синего цвета ... Использует пару 32-битных чисел с плавающей запятой для представления реальной и мнимой частей сложной выборки - сложный тип данных ... Таким образом, каждая комплексная выборка имеет размер 64 бита : 32-битное число с плавающей запятой - для действительного компонента и 32-битное число с плавающей запятой - для мнимого компонента ...
Float 32 оранжевого цвета ...
Integer 16 (или short ) желтого цвета ...
Integer 8 (или char / byte ) фиолетового цвета ...

Преобразование типов данных.

Взять блок Random Source ... Установить тип выходных данных = byte ... Параметры случайного источника по умолчанию - будут случайным образом генерировать значения 0 и 1 ...
Добавить блок Throttle, дросселирующе ограничивающий выход случайной частоты выборок - до 32к ... Установить тип проходных данных = byte ...
Подключить виджет QT GUI Time Sink - временной приёмник (прообраз осциллографа) ... QT GUI Time Sink - не имеет типа данных char - выбрать float ... Библиотека блоков GNU Radio поставляется с различными преобразователями типов данных ... Найти блок Char to Float и вставить между дросселем и осциллографом ...
Теперь все блоки - можно соединить, чтобы увидеть отображаемые данные из блока Random Source , которые имеют рандомизированные 0 и 1 - на осциллограмме ...
Преобразование данных выполнено успешно ...

Упаковка бит в байт и распаковка обратно.

Упаковка битов ... Взять блок случайный источник ... Выбрать тип = byte ... Random Source генерит сигналы от min = 0 до max 2 не включительно, то есть от 0 до 1, двоичные сигналы ...
Блок Pack K Bits используется для распараллеливания или упаковки нескольких битов в один байт для представления больших двоичных значений ... Добавить блоки Throttle , Pack K Bits , Char to Float и QT GUI Histogram Sink в блок-граф и соединить их ...
Упаковка битов в байт полезна при представлении двоичных данных, а также при использовании блоков модулятора : Constellation Modulator , GFSK Mod и OFDM Transmitter ...
Объяснение блока упаковки битов ... Настроить К = 4 количество пакуемых битов ... Блок Pack K Bits принимает K бит и помещает их в байт, сначала заполняя младший бит (LSB) ... Случайный источник генерирует последовательные биты, блок Pack K Bits - преобразует их в параллельный байт ...
Четыре бита дают числа от 0 до 2^4 -1=15 ... 16 возможных значений ... Поэтому ось виджета QT GUI Histogram Sink нужно установить, min = -1 ; max = 16, чтобы вместить весь диапазон 0 (-1) ... 15 (+1) возможных значений ...

Распаковка битов ... Распаковка сериализует байт в строку последовательных битов ... Добавить блок Unpack K Bits - между блоком Pack K Bits и блоком Char to Float ... Изменить свойства К = 4 для Unpack K Bits ...
Распаковка начинается с младшего LSB разряда и продолжается до старшего MSB ... Незначащие старшие нули в байте - игнорируются ...
Блок Unpack K Bits полностью меняет операцию входного потока Pack K Bits ... QT GUI Time Sink демонстрирует, что Pack и Unpack - выполняют идеально обратные операции ...

Потоки. Stream.

Блоки в GNU Radio можно соединять с помощью потоков или векторов ... Поток несет 1 выборку для каждого момента времени ... Поток создает сериализованные последовательные данные ... Поток представляет собой скаляр - в каждый момент времени ... Поток должен иметь тип данных, например Float 32 или Byte ...

Блок Signal Source создает поток Complex Float 32 ... Выход блока в каждый момент времени содержит 1 (одну) комплексную выборку - в каждый момент времени существует одна сложная выборка ...

Векторы. Vector.

Векторы содержат несколько выборок за каждый момент времени ... Векторы представляют данные параллельно ... Вектор представляет массив - в каждый момент времени ... GRC использует более светлые цвета для обозначения потоков и более темные цвета для представления векторных выходных данных ...

Преобразование потока в вектор и обратно.

Взять источник Signal Source и настроить частота = 1000, амплитуда = 1 ... Взять другой источник и настроить частота = 100, амплитуда = 0.1, чтобы визуально различать сигналы ... Тип сигналов Cosine ... Initial Phase = 0 ...
Взять блок Streams to Vector и подключить источники ко входам in0 и in1 ...
Блок Streams to Vector действует, как - чередователь ... Блок Streams to Vector берет выборку из порта in0 и помещает ее в первый элемент выходного вектора, а выборку из порта in1 - во второй элемент ... Блок Streams to Vector объединяет два входных последовательных потока в двумерный векторный выходной сигнал ...

К блоку Streams to Vector подключить блок Vector to Stream ... Блок Vector to Stream сериализует вектор в последовательный поток ... Выборки на выходе Vector to Stream, полученные из двух разных источников - будут чередоваться в одном последовательном выводе ... Interleaved Signal Sources - чередующиеся выборки на выходе ...

Иерархический блок Hier и параметры.

Блок Hier используется как оболочка для упрощения нескольких блоков GNU Radio - в один блок, используемый для обработки сигналов ... Примером этого блока будет блок сдвига частоты, который умножает источник сигнала на входной сигнал ...

Frequency Shifter Hierarchical Block - Иерархический блок частотного сдвига ...
Источник сигнала поступает на вход in0 умножителя Multiply ...
Источник Гауссова шума, через ФНЧ Low Pass Filter - поступает на вход in1 умножителя Multiply ...
На выходе умножителя дроссель ограничивает частоту выборки 32k ...
Выделить мышью блоки Signal Source и Multiply, включая связи между ними ... Щёлкнуть правой кнопкой мыши на выделенном и выбрать - Дополнительно - Создать Hier ... Блок-граф создается на новой вкладке GRC ...
Дважды щелкнуть - Параметры - и отредактировать свойства ... Идентификатор : FrequencyShifter ... Название : Блок сдвига частоты ... Генерируемые параметры : блок Hier ...
Категория - это место , где блок можно найти в библиотеке блоков - справа от GRC ... Блок hier будет расположен в разделе GRC Hier Blocks - вместо Core , где расположены остальные блоки GNU Radio ... Сохранить блок-граф ...

Переменные против параметров.

Переменная отличается от параметра в GNU Radio ...
Параметр - создает интерфейс для вышестоящего блока , позволяющий принимать значение из внешнего источника, тогда как ...
Переменная - существует только внутри вышестоящего блока ...
Переменную необходимо преобразовать в параметр, чтобы его можно было обновить из другого блока - в более крупном блок-графе ... Удалить переменную и добавить блок параметров в рабочую область GRC ...

Порты ввода и вывода.

Панель используется для указания входных и выходных портов в более высоком блоке ... Добавить в блок-схему Pad Source и Pad Sink - которые будут действовать как входные и выходные порты ...

Сгенерировать код блока Hier.

Нажать - Создать блок-график - чтобы создать исходный код блока более высокого уровня ... Будут созданы файлы Python .py и файл YAML .yml ...
Для v3.8 - в домашнем каталоге / home / $USER / .grc_gnuradio / ...
Для v3.10 - в каталоге, где сохранен файл .grc ... Создать каталог .grc_gnuradio и скопировать туда файлы .py и .yml ...
GRC необходимо обновить внутренний список блоков, прежде чем блок Frequency Shifter можно будет использовать в блок-графе ... В библиотеке блоков ниже Core появилась новая категория GRC Hier Blocks , и блок сдвига частоты можно использовать в блок-графах ...

Использование блока Hier.

Теперь этот блок можно использовать в блок-графе ... Вернуться в начальный блок-граф и удалить блоки Signal Source и Multiply ... Добавить блок сдвига частоты в рабочую область и соединить его с остальной частью блок-схемы ... Отредактировать свойства блока частотного сдвига , добавив переменные samp_rate и Frequency ...
Запуск блок-графа откроет окно QT GUI Frequency Sink с ползунком QT QUI Range ... Перетаскивание ползунка частоты приведет к передаче значения через параметр блока сдвига частоты , что приведет к изменению центральной частоты сигнала ...

Удаление блока Hier.

Более высокий блок можно очистить из памяти GRC - удалив соответствующие файлы *.py и *.yml ...

Встроенный блок Python.

Это инструмент для быстрого создания прототипа блока - внутри блок-графа ... Добавить блок Python ... Встроенный блок Python имеет два свойства ...
Code - клик-бокс, содержащий ссылку на код Python для блока ... Открыть редактор ... Отобразится приглашение с выбором, какой текстовый редактор использовать для написания кода Python ... Использовать по умолчанию ...
example_Param - входной параметр блока ...

Компоненты блока Python.

В блочном коде Python есть три важных раздела ...
Операторы import - в зеленом поле ... Подключает библиотеки ...
Метод __init__ - в синем поле ... Все инит параметры должны иметь значения по умолчанию ... Принимает example_param параметр с аргументом по умолчанию 1,0 ... Объявляет, что блок имеет вход и выход, что является типом данных GNU Radio np.complex64 Complex Float 32 ... Сохраняет переменную из входного параметра self.example_param ...
Метод work() - в красном поле ... Имеет входные input_items и выходные output_items параметры ... Применяет математическую операцию input_items и сохраняет результат в output_items ... Возвращает количество произведенных выборок ...

Изменение имени параметра.

Код изменен для добавления пользовательского поведения ... Переименовать example_param в - более информативное имя ... Не забывать делать отступы кратными 4 пробелам (4, 8, 12 и т. д.) при начале новых строк в Python ... По умолчанию во встроенном блоке Python используется отступ, кратный 4 пробелам ... Смешение табуляции и пробелов приводит к синтаксической ошибке ... Сохранять код ...

Редактирование входных данных блока.

Блок по умолчанию имеет один вход и один выход, однако для блока нам нужны два входа ... Чтобы добавить вход, добавьте в список второй np.complex64 ...
in_sig = [ np.complex64, np.complex64 ] - заявлены два входа ...
Выполнить математическую операцию - по условию ...

Блок Python с векторами.

Здесь используются векторы ... Прежде чем двигаться дальше - прочтите руководство Потоки и Векторы ... Встроенный блок Python необходимо изменить, чтобы ...
принимать векторные входные данные ...
создавать векторные выходные данные ...
измените типы данных - на плавающие ...

Что касается учебника Потоки и Векторы , с точки зрения более высокого уровня, Потоки - обычно представляют собой частный случай Векторов, которые имеют только один параллельный элемент данных - вместо нескольких ... Вот почему мы можем просто изменить параметры in_sig и out_sig, чтобы использовать векторы, а не - потоки ... Поскольку случай потоков настолько распространен, что у него есть - свой простой синтаксис, тогда как синтаксис векторов - немного сложнее ... В частности, при использовании векторов мы должны указать длину вектора вместе с типом данных элементов в векторах ... Мы делаем это, используя кортеж в Python ...

Предупреждение относительно длины векторов ... Встроенный блок Python имеет одно отличие, которого нет у других модулей ... Прежде чем запустить блок-граф, GRC проверяет - совпадают ли все подключенные типы данных и размеры векторов ... Во время этого процесса значение по умолчанию VectorSize в функции
__init__() = def __init__ (self, VectorSize=16) и это число используется для определения размера векторов для ввода in_sig и вывода out_sig - при определении правильности блок-схемы ...
В этом случае VectorSize=16 ... GRC предполагает, что порты ввода и вывода представляют собой векторы длиной 16, даже если через свойства блока - передается другой параметр (!) ... Случаи, когда GRC - не распознает ошибку длины вектора, но граф потока - аварийно завершает работу после его запуска, например : заявлено, длина = 16, используется = 128 ... Альтернативно, GRC покажет ошибку, если параметр по умолчанию не соответствует размеру вектора других блоков ... Например, в случае, когда длина вектора по умолчанию в коде равна 128, но переданный параметр равен 16 ...

Индексирование потоков.

Для потока входные и выходные данные - могут быть индексированы с использованием как номера порта, так и индекса выборки ...
Индексация на основе номера порта [portIndex] - возвращает все входные выборки для определенного порта ...
Индекс выборки - возвращает конкретный [portIndex] [sampleIndex] ... Двухмерный массив ...

Индексирование векторов.

Входные и выходные _items включают дополнительное измерение при использовании векторов ... Векторы - добавляют дополнительное измерение, представленное ниже как векторный индекс . input_items и output_items, теперь представляют собой - трехмерные массивы : [portIndex] [vectorIndex] [sampleIndex] ...
Индексация на основе portIndex - возвращает двумерный массив всех векторов и выборок ...
Индексирование на основе portIndex и vectorIndex - возвращает одномерный массив образцов ...
Индексирование на основе portIndex , VectorIndex и sampleIndex - возвращает один образец ...

Создание функции максимального удержания.

Функция work() изменена и теперь включает функцию максимального удержания ... Добавить цикл по всем векторам в input_items[0] ...
Для векторного индекса в диапазоне len - вычислить максимальное значение вектора ... Просмотреть каждый из входных образцов и назначить каждому выходному образцу - maxValue ...
Можно запрограммировать несколько векторных портов и отсэмплировать все их - по максимуму значений ...

Передача сообщений блока Python.

Обзор сообщения.

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

Сообщения имеют несколько уникальных свойств ...
* Не существует гарантии, основанной на тактовой частоте выборки, когда сообщения будут доставлены ...
* Сообщения не связаны с конкретным образцом, например тегом ...
* Порты ввода и вывода сообщений не обязательно должны быть подключены в GRC ...
* Порты сообщений используют полиморфный тип (PMT) ...
* Порты сообщений обозначены серым цветом, а их соединения выделены пунктирными линиями ...

Предыстория.

GNU Radio изначально была потоковой системой без какого-либо другого механизма для передачи данных между блоками ... Потоки данных - это модель, которая хорошо работает для выборок, битов и т. д., но на самом деле не является подходящим механизмом для управления данными, метаданными или структурами пакетов (по крайней мере, на каком-то этапе цепочки обработки) ...

Часть этой проблемы - решена введением потока тегов тегов ... Это параллельный поток потоковой передачи данных ... Разница в том, что теги предназначены для хранения метаданных и управляющей информации ... Теги специально связаны с конкретной выборкой в потоке данных и передаются вниз по течению вместе с данными ... Эта модель позволяет другим блокам идентифицировать, что событие или действие произошло или должно произойти с конкретным элементом ... Основное ограничение заключается в том, что поток тегов на самом деле доступен только внутри рабочей функции и течет только в одном направлении ... Его преимущество в том, что он изосинхронен с данными ...

Нам нужна более общая система передачи сообщений по нескольким причинам ...
Первый - заключается в том, чтобы позволить нижестоящим блокам обмениваться данными с вышестоящими блоками ...
Второе - предоставить нам более простой способ взаимодействия между внешними приложениями и GNU Radio ... Интерфейс передачи сообщений GNU Radio обрабатывает эти случаи, хотя и на асинхронной основе ...
Интерфейс передачи сообщений в значительной степени опирается на полиморфные типы (PMT) в GNU Radio ...

Полиморфные типы используются в качестве переносчиков данных из одного блока / потока - в другой, для таких вещей, как теги потоков и интерфейсы передачи сообщений ... PMT могут представлять различные данные, от логических значений до словарей ... В некотором смысле PMT - это способ расширить строгую типизацию C++ чем-то более гибким ...

В Python мы можем использовать динамическую типизацию, и на самом деле существует вспомогательная функция для выполнения этих преобразований (в C++ также есть вспомогательная функция для преобразования в PMT, называемая pmt::mp(), но она - менее мощная и не совсем такая полезная, поскольку типы в C++ всегда - строго известны) ... PMT в Python - достаточно сложная тема и требует отдельного изучения ...

Теги блоков Python.

Обзор тегов ... Теги - это способ передачи информации вместе с оцифрованными радиочастотными образцами - синхронно во времени ... Теги особенно полезны, когда нисходящим блокам необходимо знать, по какой выборке приемник был настроен на новую частоту, или для включения временных меток с конкретными выборками ...

Если сообщения передают информацию асинхронно - без гарантии времени на основе часов, теги - представляют собой информацию, связанную с конкретными радиочастотными выборками ... Теги перемещаются вместе с оцифрованными радиочастотными выборками в потоках и векторах данных, включая Complex Float 32 , Float 32 , Byte и все другие форматы ...

DSP. Фильтр ФНЧ. Low Pass Filter.

FIR Type = Complex Decimating ... Decimation = 1 ... Gain = 1 ... Cutoff Freq = sample rate / 4 ... Transition Width = sample rate / 8 ... Window = Hamming ...

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

Ещё примеры ФНЧ фильтров ...
ФНЧ фильтр Butterworth - это классический фильтр с плоской амплитудно-частотной характеристикой ...
ФНЧ фильтр Kaiser - этот фильтр использует окно Кайзера для управления формой амплитудно-частотной характеристики ...
FIR Filter - фильтр с конечной импульсной характеристикой, который может быть настроен для работы как ФНЧ ...
IIR Filter - фильтр с бесконечной импульсной характеристикой, который также может быть настроен для работы как ФНЧ ...

DSP. ФНЧ. Проектирование кран-фильтров с отводами.

ФНЧ (фильтр нижних частот) может быть реализован в виде кран-фильтра ... Кран-фильтр - это один из способов реализации ФНЧ, который использует комбинацию резисторов и конденсаторов для фильтрации низкочастотных сигналов ... Он может иметь различные конфигурации, такие как RC-кран-фильтр или LC-кран-фильтр, в зависимости от использованных компонентов ...

Заменить фильтр нижних частот на КИХ фильтр с частотным расширением / Frequence Xlating FIR Filter ... Подключить блок : Отводы фильтра нижних частот / Low Pass Filter Taps ...
Блок Low-Pass Filter Taps проектирует набор отводов фильтра, которые можно применить к блокам фильтрации ... Отводы фильтров также могут называться весами или коэффициентами ... Реакция и производительность фильтра - зависят от параметров, введенных пользователем ... Блок Low-Pass Filter Taps сохраняет отводы фильтра в списке в переменной lowPassFilterTaps ...

Ввод фильтров вручную.

Альтернативные методы можно использовать для разработки отводов фильтров, а затем ввести их вручную как переменную Python ... Например, блок Frequency Xlating FIR Filter принимает отводы фильтра, как - массив NumPy ...
Чтобы иметь доступ к функциям и типам данных NumPy, его необходимо сначала импортировать ... Добавьте блок Import ...
Ввести команду import numpy as np ...
Простой фильтр усреднения скользящим окном - moving-average или boxcar - можно спроектировать, установив одинаковые значения всех отводов фильтра ... Это можно сделать с помощью функции NumPy ones() , которая возвращает массив NumPy, состоящий из всех единиц указанной длины ...
Ввести переменную boxcarFilter = np.ones(8)/8 и заменить ею переменную lowPassFilterTaps ...

Фильтр скользящего среднего (moving-average filter) - это один из наиболее распространенных методов фильтрации в цифровой обработке сигналов ... Он используется для сглаживания временных рядов и устранения шумов ... Принцип работы фильтра скользящего среднего заключается в вычислении среднего значения сигнала в окне определенной ширины и замене исходного значения сигнала этим средним значением ... Ширина окна определяет количество соседних отсчетов, которые учитываются при вычислении среднего значения ...

Фильтр от вещественного к комплексному.

Многие из блоков фильтрации имеют опции для выбора комбинаций вещественных или комплексных типов данных для ввода и вывода, а также действительных или комплексных весов фильтра ... Пример метода использования комплексных весов фильтра для преобразования реального сигнала в комплексный ...
LowPassTaps используются в качестве основы для сложного полосового фильтра ...
Путем математических преобразований - центральная частота фильтра нижних частот была перемещена до 1/4 частоты дискретизации, которая теперь является полосовым фильтром ... Частотная характеристика теперь различается между положительными и отрицательными частотами, что может быть свойством сложных фильтров (но - не реальных фильтров) ...

DSP. Изменение частоты дискретизации.

Интерполяция.

Интерполяция - это процесс увеличения частоты дискретизации и, следовательно, доступной полосы пропускания ... В примере показано, как увеличить частоту дискретизации с помощью блока Interpolating FIR Filter ...
Интерполирующий КИХ-фильтр увеличивает частоту дискретизации с 32 кГц до 128 кГц, в 4 раза, благодаря переменной interpolation_rate ...

Децимация.

Если интерполяция - увеличивает частоту дискретизации, децимация - уменьшает частоту дискретизации и доступную полосу пропускания ... Обратите внимание, что полоса пропускания - была уменьшена на коэффициент 1/4 из-за блока Decimating FIR Filter ...

Рациональная повторная выборка скорости.

Интерполирующий КИХ-фильтр и Децимирующий КИХ-фильтр изменяют частоту дискретизации - на целочисленные значения ... Могут возникнуть ситуации, когда частоту дискретизации - необходимо изменить на дробное число, например 2/3 ... Один из способов выполнить дробную повторную выборку - применить интерполяцию на 2 с последующим прореживанием на 3 ... Лучший способ - использовать блок Rational Resampler ...
Заменить Decimating FIR Filter на Rational Resampler ... Обратите внимание, что пропускная способность в этом случае - уменьшена в 2/3 раза за счет блока Rational Resampler - путем математических операций ...

Модуляция и демодуляция.

Узкополосный FM-трансивер.

Narrowband FM transceiver ... Как можно генерировать и принимать узкополосный FM-сигнал (NBFM) ...

Приёмник NBFM ... Данные принимаются от передатчика через ZMQ_SUB_Source с частотой дискретизации 576 кГц ... Он фильтруется до полосы пропускания 6 кГц и прореживается (уменьшается) в 3 раза с помощью FFT_Filter , что дает выходную частоту дискретизации 192 кГц ... Блок NBFM_Receive демодулирует входной сигнал и создает выходную частоту дискретизации 48 кГц, которая соответствует желаемой частоте звука ...

Передатчик NBFM ... Вход микрофона - частота дискретизации 48 кГц ... Звук фильтруется в диапазоне от 300 до 5000 Гц с помощью Band_Pass_Filter ... Большинство репитеров используют тональный сигнал для запуска передатчика ... Signal_Source генерирует тон PL ... Аудиосигнал плюс тон PL - подаются в блок NBFM_Transmit ... Выходная частота дискретизации составляет 192 кГц ... Low_Pass_Filter ограничивает сигнал до 5 кГц ... Блок Repeat интерполирует (умножает) частоту дискретизации на 3, давая выходную частоту 576 кГц ...

Трансивер с одной боковой полосой.

SSB, Single Sideband transceiver ... Как можно генерировать и принимать сигнал с одной боковой полосой (SSB) ...

Метод Weaver для демодуляции SSB ... Традиционно SSB создавался и принимался с использованием узкополосных фильтров или с использованием метода фазировки, требующего фазового сдвига на 90 градусов по всему звуковому спектру ... Третий метод генерации и обнаружения однополосных сигналов - предполагает использование гетеродина с частотой в середине звукового спектра (1500 Гц) для сигналов I и Q отдельно, а затем их добавление или вычитание для восстановления звука верхней или нижней боковой полосы ...

Тестирование ... Блок переменных - определяет частоту дискретизации 256k ... Другой блок переменных - определяет коэффициент прореживания ... Поскольку Audio Sink (динамик) использует частоту дискретизации 32 кГц, мы уменьшим входную частоту дискретизации - в 8 раз ...

Приёмник ... Сигнал от секции передатчика принимается источником ZMQ PULL ... Это несущая 16 кГц с частотой дискретизации 192 кГц ...

Передатчик ... Вход микрофона определяется блоком Audio Source ... Частота дискретизации 48 кГц ... Для оставшейся части блок-схемы используется частота дискретизации 192 кГц ... Это значение было выбрано для обеспечения несущей частоты 16 кГц и 12 выборок за цикл ... Чтобы повысить частоту дискретизации аудиовхода 48 кГц до частоты дискретизации 192 кГц - используется блок Repeat со значением интерполяции = 4 ... Несущий сигнал (в этом примере составляет 16 кГц) генерируется блоком Signal Source ... Чтобы создать сигнал с двойной боковой полосой, сигнал несущей умножается на аудиосигнал ... Полосовой фильтр создает однополосный сигнал, пропуская частоты от 16 300 Гц до 19 000 Гц и отсекая остальные (метод фильтра) ... Это дает сигнал только с одной боковой полосой (верхней) и без несущей ... Звуковые частоты этого сигнала составляют от 300 Гц до 3000 Гц ... В реальном радиопередатчике выходной сигнал полосового фильтра подается на радиочастотное (РЧ) оборудование ... В этом уроке мы отправляем сигнал передачи в сокет данных ZMQ PUSH Sink, подключенный к секции приемника ...

Пошаговое руководство по демодуляции PSK. QPSK.

Здесь мы сосредоточимся - на моделировании, а не на передаче по беспроводной сети ... Будут обсуждаться многие вопросы, связанные с тем, что происходит при передаче и приеме сигналов с реальными аппаратными и канальными эффектами ... Мы настроим симуляцию, а затем шаг за шагом объясним - как восстановить сигнал ... Во время обучения имейте в виду, что это - всего лишь один из способов обработки приема цифрового сигнала ... Для этих этапов разработаны различные алгоритмы и методы, и разные типы цифровых сигналов ведут себя - по-разному ... Здесь мы проходим ряд этапов и используем алгоритмы, доступные в GNU Radio, для приема и демодуляции сигнала PSK ... Однако это руководство - никоим образом не должно означать, что это - единственный способ выполнить эту задачу ...

В версии 3.10 Эквалайзер CMA и Эквалайзер LMS DD - устарели и были заменены на Linear_Equalizer и Adaptive_Algorithm ... Предполагается, что читатель изучит блок-схемы и полученные результаты, но не обязательно будет строить каждую из них ... Однако ссылки на исходные файлы GRC - включены ...

Передача сигнала ... На первом этапе передается сигнал QPSK ... Мы генерируем поток битов и модулируем его в сложное созвездие ... Для этого мы используем блок Constellation Modulator ... Объект созвездия позволяет нам определить, как кодируются символы ... Блок модулятора может затем использовать эту схему модуляции с дифференциальным кодированием или без него ... Модулятор созвездия ожидает упакованные байты, поэтому у нас есть генератор случайных чисел, предоставляющий байты со значениями от 0 до 255 ...

Количеством выборок на символ ... Значение избыточной пропускной способности ... Межсимвольная интерференция / ISI ... Добавление нарушений канала ... Тепловой шум в приемнике, известный как - аддитивный белый гауссов шум (AWGN) ... Часы, определяющие частоту радиостанций ... Восстановление тайминга ... Лучшее время выборки входящих сигналов, чтобы максимизировать отношение сигнал / шум (SNR) ... Блок многофазной синхронизации часов ... Многолучевое распространение ... Фазовая и точная частотная коррекция ... Петля Костаса для синхронизации BPSK, QPSK и 8PSK ... Расшифровка и декодирование сигнала ... Упаковка в байт и распаковка в биты ...

Демодуляция BPSK.

Разница между QPSK и BPSK заключается в количестве бит на символ ... QPSK использует 2-битные символы ; BPSK использует 1-битные символы ... В обоих случаях блок Constellation Modulator использует все 8 входных битов ... Обратите внимание, что объект Созвездие - отличается для QPSK и BPSK ... Объект созвездия позволяет нам определить, как кодируются символы ... При демодуляции BPSK - очень много общих моментов с QPSK ...

Моделирование FSK.

Чтобы смоделировать простые передатчик и приемник с частотной манипуляцией (FSK), никакого специального оборудования - не требуется ... Скорость передачи данных для радиотелетайпа Бодо ... Она определяется как битовое время в 22 миллисекунды, поэтому скорость передачи данных устанавливается равной 1/0,022, что дает 45,4545 ... Стандартные тоны RTTY (радиотелетайпа) 2295 Гц (Mark=1) и 2125 Гц (Пробел=0) - генерируются VCO ... Коэффициент задержки компенсирует задержки обработки схемы ... Преамбула состоит из символа - %, за которым следуют 50 заглавных букв - U, за которыми следует - ] ... Это повторяется четыре раза, чтобы приемник мог синхронизироваться ... Пост-файл-заполнитель отправляется 10 раз ...

Базовое руководство по OFDM.

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

Сдвиг БПФ ... Во всех случаях, когда символы OFDM передаются между блоками, поведением по умолчанию является БПФ-сдвиг этих символов, т. е. несущая постоянного тока находится посередине (точнее, на уровне несущей (N/2), где N - это длина БПФ и индексация несущей начинаются с 0) ... Причина этого соглашения заключается в том, что для работы некоторых блоков - требуется порядок символов со сдвигом БПФ ... Кроме того, при просмотре, OFDM символы, сдвинутые с помощью БПФ - располагаются в своем естественном порядке, т.е. в том виде, в каком они появляются в полосе пропускания ...

Каждый символ OFDM несет в себе 4 символа данных ... Со стороны получателя - необходимы дополнительные усилия ... Преамбула Schmidl & Cox - это метод синхронизации частоты и времени для систем OFDM (ортогональное частотное разделение мультиплексирование) ... Преамбула Schmidl & Cox состоит из двух одинаковых символов, которые используются для оценки времени и частоты приемника ... Она помогает синхронизировать передачу и прием сигналов OFDM, что позволяет эффективно извлекать данные из сигнала ... Этот метод синхронизации имеет высокую устойчивость к помехам и искажениям, что делает его особенно полезным для систем связи, использующих OFDM ... Преамбула состоит из символа - %, за которым следуют 50 символов - U и - ] ... Она повторяется двадцать раз, чтобы приемник мог синхронизироваться ... Заполнитель пост-файла отправляется четыре раза ...

Поскольку отправка случайных двоичных данных - может вызвать ошибки при передаче данных, было обнаружено, что преобразование двоичного файла в кодировку Base64 - сначала работает надежно ... Можно использовать программу постобработки для удаления преамбул и преобразования кода Base64 - обратно в двоичные данные ... Примечания ... Одним из подходов к последующей обработке полученного файла, может быть замена File_Sink - на ZMQ_PUB_Sink ...

Пакетная связь.

Packet Communications ... В этом руководстве представлены методы передачи и получения пакетных данных ... Как было показано в учебных пособиях по QPSK и BPSK, полученный поток битовых данных можно проверить - путем сравнения его с (задержанными) переданными данными ... Однако восстановить выравнивание этих битов - не удалось ... Именно здесь в игру вступает - обработка пакетов ...

Чтобы понять основы обработки пакетов, в этом разделе представлено моделирование передатчика и приемника с использованием стандартных блоков GNU Radio - без какой-либо модуляции или ухудшения качества канала ... Чтобы строб сообщения генерировал PDU - PMT сообщения должен иметь вид инициализации включая u8vector, длину вектора и значения символов ... Блок Async CRC32 вычисляет CRC полезных данных и добавляет к нему значение ...

Переменная, идентификатор = hdr_format ... Средство форматирования протокола генерирует заголовок с длиной / номером пакета и 8-битным CRC ... Код доступа - не создается ... PDU преобразует полученные PDU в поток с тегами, добавляя теги длины ... Мультиплексор Tagged Stream объединяет заголовок и полезную нагрузку ... Блок Header / Payload Demux - синхронизируется с данными заголовка и затем выводит данные полезной нагрузки ...

Использование BPSK с аппаратным моделированием ... Чтобы создать преамбулу, заголовок по умолчанию и данные полезной нагрузки в одном сообщении PDU - был создан блок Embedded Python ... Преамбула состоит из 32 байтов 0x55, дающих чередующиеся 1 и 0 ... Нециклический 32-битный код доступа - 0xe15ae893 ... Длина полезной нагрузки повторяется (16 бит) ... Затем добавляется полезная нагрузка ...

Моделирование пакетной связи с использованием потоков ... Успех этой методологии основан на том, что входной файл дополняется кратным - packet_len байтам, так что последние несколько байтов исходного файла - не теряются в частично необработанном пакете ...

Использование альтернативного блока File Source ... Существует модуль Out-of-Tree (OOT), который считывает текстовый или двоичный файл и создает потоковый вывод с тегами package_len для GNU Radio ... Функционально он заменяет блок File Source и блок Stream to Tagged Stream ... Преимущество этого блока заключается в том, что, когда размер входного файла не кратен длине выбранного пакета, остаток в конце файла не теряется в буфере - блока поток в поток с тегами ... Это исключает необходимость в предварительном процессоре, таком как программа заполнения текста ...

Выводы на основе этой части знаний ...
* BPSK и QPSK - не очень подходят для пакетной передачи из-за необходимости сходимости приемника по фактическим значениям времени и частоты ... Чем дольше время между пакетами данных, тем больше приемнику потребуется для повторной сходимости значений времени и частоты для нового пакета ...
* Поскольку почти вся любительская радиосвязь является полудуплексной и передает пакеты данных, более подходящей модуляцией была бы FSK или AFSK ... По-прежнему будет применяться то же форматирование и восстановление пакетов ...
* Наблюдения ... Во время разработки и тестирования этого руководства - были замечены следующие моменты ... Блоки Header / Payload Demux и Protocol Parser - похоже, работают только с форматом : digital.header_format_crc ... Для блока Correlate Access Code - Tag Stream - требуется объект формата заголовка по умолчанию, и ожидается 32-битный код доступа ...

Передача файлов с использованием пакетов и BPSK.

Для тестирования по беспроводной сети вместо моделирования канала - использовать модуль SDR передачи / приема ...

Отправка нетекстовых файлов ... Можно отправлять любые текстовые, двоичные и другие нетекстовые файлы (например, PDF или PNG) ...

Получение файла .py скрипт получает сигнал BPSK и представляет его потоку Correlate Access Code-Tag ... Этот блок обнаруживает код доступа и передает полезную нагрузку в Stream_CRC32 для проверки правильности CRC ... Если CRC в порядке - данные отправляются в File_Sink ...

Блок EPB : File Source to Tagged Stream - это встроенный блок Python, который заменяет блок File_Source , блок Stream_to_Tagged_Stream и части блока Burst_Shaper ... Блок Python выполняет следующие функции : ...
# отправка преамбулы, чтобы позволить получателю - синхронизироваться ... Преамбула состоит из символа - %, за которым следуют 50 заглавных букв U, за которыми следует - ] ... Это повторяется 100 раз, чтобы приемник мог синхронизироваться ... Пост-файл-заполнитель отправляется 40 раз ...
# прочитать файл частями - Pkt_Len ...
# преобразовать данные - в формат Base64, который выдает 4 байта вывода на каждые 3 байта ввода ...
# отправлять каждый фрагмент Base64 - с измененными тегами package_len ...
# отправлять заполнитель пост-файла, чтобы убедиться, что все буферы - очищены ...

Использование GNU Radio с SDR.

Пошаговое руководство по аппаратному обеспечению ... Введение ... Одна из наиболее простых (и невероятно полезных) вещей, которые вы можете сделать в GNU Radio с приемником, это - создать программный анализатор радиоспектра ... Это также отличный первый шаг, поскольку он позволит убедиться, что ваше оборудование имеет базовую функциональность ... С GNU Radio можно начинать работать, от простых и дешёвых радио приемников, таких как RTL-SDR - до очень высокопроизводительных систем стоимостью в десятки тысяч долларов ...

Для анализатора спектра, мы хотим, чтобы автоматическая регулировка усиления (АРУ) - была отключена, поскольку мы будем просматривать спектр, который часто будет пустым, и сложно определить, присутствует ли сигнал или нет, когда АРУ постоянно регулирует усиление, чтобы полученные пробы - всегда находились на постоянном уровне ... Вы можете думать об АРУ как о чем-то, автоматически регулирующем ручку громкости ... Включение АРУ лучше подходит для приложений, когда вы знаете, что существует сигнал на частоте, на которую вы настроены ...

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

Вопросы аппаратного обеспечения ... Установка частоты дискретизации включает в себя несколько факторов, которые - следует учитывать ... Различные аппаратные устройства имеют ограничения на частоту дискретизации, которую они могут обеспечить ... Некоторые из них, например FunCube Pro+ - имеют фиксированную частоту дискретизации 192 кГц ... Настройка частоты дискретизации потокового графа должна соответствовать ограничениям устройства ... Используемое компьютерное оборудование и ОС - также накладывают ограничения на пропускную способность данных, например : USB2 / USB3 ; скорость процессора ; количество ядер процессора ...

Появление букв O в строке статуса - означает переизбыток данных ... Это связано с тем, что поток входных данных генерирует данные - быстрее, чем компьютер - может их потребить, поэтому это может быть связано с узким местом аппаратуры, или блок-граф пытается сделать слишком много с этими выборками ... Регулировка частоты дискретизации и / или размера входного буфера (если возможно) - может облегчить проблему ...

Audio Sink - приёмник аудио.

Аудиоприемник - позволяет воспроизводить сигнал через динамики или другое аудиоустройство ... Чтобы установить частоту дискретизации звука - нужно понимать, что не все частоты дискретизации могут поддерживаться оборудованием ...
Для типичных приложений следует установить значение 48 кГц ...
Имя устройства - оставить пустым, чтобы выбрать аудиоустройство - по умолчанию ... Имя устройства - зависит от ОС ...
В Linux звуковое устройство выбирается через ALSA, где типичные варианты включают : ... default ( по умолчанию ; обратите внимание, что в большинстве настольных систем этим фактически управляет PipeWire или PulseAudio, чтобы проверить это, вы можете выполнить команду : aplay -L | grep -A1 ^default ) ... plughw:0,0 - это то же самое, что hw:0,0 и включает программную обработку, которая позволяет, например, выбрать частоту дискретизации, которая изначально - не поддерживается звуковой картой ... pipewire (чтобы явно использовать PipeWire) ... pulse (чтобы явно использовать PulseAudio) ... Для пользователей ALSA с проблемами со звуком выполните следующую процедуру : aplay -L ; найти нужную запись и использовать первую строку - в качестве имени устройства ... Если в имени нет пробелов, кавычки - необязательны ...
В Windows зайти в - Настройки - Система - Звук - Вывод ... Списки в разделе Имя - содержат точные имена доступных в настоящее время устройств ... Если к компьютеру подключено новое аудиоустройство, то появится новое имя ... Поскольку большинство имен устройств содержат пробелы - обязательно заключайте аргумент имени в кавычки ...

Количество входов ... 1 - моно ... 2 - стерео ...

Обратите внимание, что для связки блоков Signal Source и Audio Sink - не нужен блок Throttle - Audio Sink должен дросселировать за вас ... Если же, в конечном итоге, дросселированный источник сигнала, уже используется - установить для параметра - блокировать значение = Нет ...

Раздел linux : список всех страниц ...