В этом примере показано, как использовать MATLAB ® и Communications Toolbox™ для извлечения информации о программе или песне от FM-радиостанций с помощью стандарта RDS или RBDS и, опционально, стандарта RadioText Plus (RT +). Можно использовать записанные сигналы или принимать сигналы в режиме реального времени с помощью Радио RTL-SDR или Радио ADALM-PLUTO.
Чтобы запустить этот пример с помощью записанных сигналов, вам нужен Communications Toolbox™. Для приема сигналов в режиме реального времени также необходимо одно из следующего оборудования:
Радио RTL-SDR и соответствующий программный пакет поддержки Communications Toolbox для радио RTL-SDR
Радио ADALM-PLUTO и соответствующий программный пакет Поддержки Communications Toolbox для радио ADALM-PLUTO
Полный список поддерживаемых Communications Toolbox платформ SDR см. в разделе «Поддерживаемые аппаратные средства» Программно определяемого радио (SDR).
RBDS и RDS являются очень похожими стандартами, определяющими, как дополнить FM-радиосигналы дополнительной информацией. RBDS используется в Северной Америке, в то время как RDS первоначально использовался в Европе и развивался до международного стандарта. RBDS и RDS содержат 3 слоя:
Физический слой (слой 1)
Слой канала передачи данных (слой 2)
Слой сеансов и презентаций (уровень 3)
Декодер PHY RDS/RBDS принимает записанный сигнал из файла или прямой сигнал от радио и выполняет следующие шаги:
FM-демодуляция: После демодуляции FM-сигнала сигнал RDS/RBDS находится в полосе 57 кГц +/- 2,4 кГц:
Следует иметь в виду, что сигналы RDS и RBDS передаются с относительно низкой степенью, поэтому они не всегда видны в спектре, как на приведенном выше рисунке.
FM-сигналы содержат пилот-сигнал с частотой 19 кГц, который может использоваться в качестве фазы и опорной частоты для когерентной демодуляции сигнала RDS/RBDS с частотой 57 кГц и стерео-аудио с частотой 38 кГц. Тональные сигналы управления частотой 38 кГц и 57 кГц могут быть сгенерированы путем удвоения и утроения частоты тонального сигнала управления частотой 19 кГц [2].
Этапы обработки для когерентной демодуляции сигнала RDS/RBDS:
Полосовая фильтрация: Приемник проводит полосовую фильтрацию на частотах 19 кГц и 57 кГц, чтобы изолировать тональный сигнал управления и сигнал RDS/RBDS, соответственно.
Тройное увеличение частоты: Увеличение комплексного представления пилот-тонального сигнала 19 кГц до 3-й степени, чтобы утроить его частоту и получить пилот-тональный сигнал 57 кГц.
AM Demodulation: символы RDS и RBDS генерируются со скоростью 1187,5 Гц и модулируются AM на несущей 57 кГц. Сигнал RDS/RBDS 57 кГц может быть когерентно демодулирован с несущей 57 кГц, которая заблокирована в частоте и фазе. Обычно частотно-утроенный пилот-тон 19 кГц достаточен для когерентной демодуляции. Следующие рисунки показывают пилот-тональные сигналы 19 кГц и 57 кГц, сигнал RDS/RBDS 57 кГц и AM-демодулированный сигнал RDS/RBDS основной полосы частот.
В то же время существует несколько FM станций, чей сигнал RDS/RBDS 57 кГц показывает изменяющееся во времени смещение фазы от пилот-тонального сигнала 19 кГц и его трехчастотной версии. Приемник PHY содержит схему Костаса, чтобы компенсировать такие изменяющиеся во времени смещения фазы.
Схема Костаса: Цикл Костаса выполняет 2 ортогональные AM демодуляции, одна демодуляция с синусом 57 кГц и другая с косинусом 57 кГц. Частота дискретизации принимаемого сигнала тщательно выбирается равной 228 кГц, что обеспечивает 4 выборки в цикле 57 кГц. Поэтому задержка на одну выборку пилот-тонального сигнала 57 кГц результатов к смещению фазы на одну четверть длины волны и позволяет нам генерировать косинусоидную волну из синусоиды. Синусоидальный демодулированный сигнал соответствует выходу когерентной демодуляции. Сигнал, демодулированный косинусом, используется для обнаружения фазы ошибки. Продукты сигнала RDS/RBDS 57 кГц с синусоидальными/косинусоидальными волнами фильтруют низкочастотным фильтром, указанным в разделе 1.7 [1]. Продукт из двух выходов фильтра является сигналом ошибки. Чем он больше, тем больше тон пилот-сигнала 19 кГц задерживается, чтобы вести себя больше, как демодулятор на основе косинуса.
Выделение синхроимпульса: Для выполнения декодирования бифазного символа из пилот-сигнала 19 кГц извлекается синхроимпульс, соответствующий скорости символа RDS/RBDS 1187,5 Гц. Обратите внимание, 1187,5 Гц x 16 = 19 кГц. Для расчета смещений частоты частотное деление используется для извлечения синхроимпульса из пилот-сигнала 19 кГц. Поскольку операция деления обеспечивает несколько правильных ответов, сигнал RDS/RBDS основной полосы частот служит обучающими данными, которые помогают в определении желаемого выхода.
Бифазный символьный декодер: RDS и RBDS используют бифазное (bi- -L) кодирование, которое обычно известно как Манчестер-кодирование. За каждый такт символ RDS/RBDS берет два противоположных амплитудных значения, или положительное, сопровождаемое отрицанием, или отрицание, сопровождаемое положительным. Декодер бифазного символа отменяет второй уровень амплитуды, так что каждый символ содержит один и тот же уровень амплитуды в течение всего такта. Новый уровень амплитуды всего синхроимпульса соответствует битовому представлению символа. Следующие два снимка экрана соответствуют формам сигналов # 1-6 на фигуре 2 [1].
Чтобы получить битовое значение каждого символа, форма волны интегрируется в каждом такте, и результат сравнивается с нулем (слайсер).
Дифференциальное декодирование: Наконец, биты дифференциально декодируются, чтобы вернуть дифференциальное кодирование в передатчике.
Слой 2 реализован с использованием системной object™ RBDSDataLinkDecoder. Этот слой отвечает за синхронизацию и коррекцию ошибок.
Битовый выход слоя PHY логически организован в 104-битовых группах, содержащих четыре 26-битовых блока. Каждый блок содержит 16-битное информационное слово и 10 биты четности (см. фигуру 8 в [1]). Отдельное 10-битовое слово смещения добавлено по модулю-2 к битам четности каждого блока.
Синхронизация: Первоначально контуры блоков и групп ищутся исчерпывающе с помощью скользящего окна 104 бит. Для каждого 104-битового окна 4 слова смещения запрашиваются в последних 10 битах каждого 26-битового блока. Слово смещения идентифицируется, если в его блоке не обнаружено битовых ошибок. Когда слова смещения идентифицируются, достигается синхронизация на уровне группы, и исчерпывающая обработка окна скольжения останавливается. Впоследствии следующие 104 бита будут рассматриваться как следующая группа.
Если будущие группы содержат битовые ошибки, и слова смещения не могут быть идентифицированы в их ожидаемом положении, синхронизация может быть потеряна. В этом случае Слой 2 сначала исследует возможность 1-битных пробелов синхронизации, используя тот факт, что первое информационное слово (16 биты) всегда одно и то же для всех битовых групп. Если первое информационное слово найдено дислоцированным на 1 бит (либо влево, либо вправо), синхронизация сохраняется, и контуры группы корректируются соответственно. Если битовые ошибки сохраняются для 25 приемов группы и в то же время синхронизация не может быть восстановлена, используя такие левые/правые 1-битовые сдвиги, то синхронизация теряется, и слой 2 повторно входит в исчерпывающий, основанный на скользящем окне поиск синхронизации.
Коррекция ошибок: Код коррекции ошибок RDS/RBDS является (26, 16) циклическим кодом, укороченным от (341, 331). Реализация коррекции ошибок использует схему сдвигового регистра, описанную в Приложении B к [1].
Слой 2 удаляет биты четности/смещения, поэтому слой 3 принимает группы 64 битов, содержащие четыре 16-битовых блока. Существует до 32 различных типов групп, каждый из которых помечен числом от 0 до 15 и буквой 'A' или 'B', например, 0B, 2A, 3A. Формат каждой группы может быть фиксированным или абстрактным, если эта группа выделена для открытого приложения данных (ODA, см. список в [3]).
Слой 3 реализован с использованием объекта RBDSSessionDecoder System. Эта расшифровка поддержек объекта 0A, 0B, 2 А, 2B, 3 А, 4 А, типов группы фиксированного формата на 10 А.
0A и 0B передают 8-символьную строку, которая обычно изменяется прокруткой текста.
2A и 2B передают более длинные 64 - или 32-символьные строки.
3A регистрирует ODA и задает их выделенный тип группы абстрактного формата.
4A передает системное время.
10A далее классифицирует тип программы (например, 'Football' для типа программы 'Sports').
Для ODA, RDS/RBDS приемник поддерживает декодирование RadioText Plus (RT +). Эта ОПР может разбить длинную 32- или 64-символьную строку из типов групп 2A или 2B на два конкретных типа содержимого (для примера, исполнителя и песни).
Приемник RDS/RBDS расширяется. Реализации ODA могут быть заданы с помощью функции registerODA объекта RBDSSessionDecoder System. Эта функция принимает шестнадцатеричный идентификатор ОПР (идентификаторы ОПР могут быть найдены в [3]), и обрабатывает функции, которые обрабатывают основной тип группы ОПР, а также специфичную для ОПР часть типа группы 3A. Например, объект sessionDecoder RBDSSessionDecoder может быть расширен для RadioText Plus (RT +) с помощью этого кода:
rtID = '4BD7'; % hexadecimal ID of RadioText Plus (RT+) registerODA(sessionDecoder, rtID, @RadioTextPlusMainGroup, @RadioTextPlus3A);
Введите RBDSExample в Командном окне MATLAB или щелкните эту ссылку, чтобы запустить пример.
% Set RDS/RBDS system parameters userInput = helperRBDSInit(); userInput.Duration = 10.8; userInput.SignalSource = 'File'; userInput.SignalFilename = 'rbds_capture.bb'; % userInput.SignalSource = 'RTL-SDR'; % userInput.CenterFrequency = 98.5e6; % userInput.SignalSource = 'ADALM-PLUTO'; % userInput.CenterFrequency = 98.5e6; [rbdsParam, sigSrc] = helperRBDSConfig(userInput); % Create FM broadcast receiver object and configure based on RDS/RBDS parameters fmBroadcastDemod = comm.FMBroadcastDemodulator(... 'SampleRate', rbdsParam.FrontEndSampleRate, ... 'FrequencyDeviation', rbdsParam.FrequencyDeviation, ... 'FilterTimeConstant', rbdsParam.FilterTimeConstant, ... 'AudioSampleRate', rbdsParam.AudioSampleRate, ... 'Stereo', true); % Create audio player player = audioDeviceWriter('SampleRate', rbdsParam.AudioSampleRate); % Layer 2 object datalinkDecoder = RBDSDataLinkDecoder(); % Layer 3 object sessionDecoder = RBDSSessionDecoder(); % register processing implementation for RadioText Plus (RT+) ODA: rtID = '4BD7'; registerODA(sessionDecoder, rtID, @RadioTextPlusMainGroup, @RadioTextPlus3A); % Create the data viewer object viewer = helperRBDSViewer(); % Start the viewer and initialize radio time start(viewer) radioTime = 0; % Main loop while radioTime < rbdsParam.Duration % Receive baseband samples (Signal Source) rcv = sigSrc(); % Demodulate FM broadcast signals and play the decoded audio audioSig = fmBroadcastDemod(rcv); player(audioSig); % Process physical layer (Layer 1) bitsPHY = RBDSPhyDecoder(rcv, rbdsParam); % Process data-link layer (Layer 2) [enabled, iw1, iw2, iw3, iw4] = datalinkDecoder(bitsPHY); % Process session and presentation layer (Layer 3) outStruct = sessionDecoder(enabled, iw1, iw2, iw3, iw4); % View results packet contents (Data Viewer) update(viewer, outStruct); % Update radio time radioTime = radioTime + rbdsParam.FrameDuration; end % Stop the viewer and release the signal source and audio writer stop(viewer); release(sigSrc); release(player);
Приведенный выше снимок экрана иллюстрирует графическое отображение обработанных данных RDS/RBDS.
Базовая информация RDS/RBDS:
Первое поле соответствует типу программы, который передается вторым информационным словом всех типов группы. Если получены 10A типы групп, первое поле также обеспечивает дополнительную характеристику, например, Sports\Football.
Второе поле иллюстрирует 8-символьный текст, передаваемый 0A/0B группами.
Третье поле иллюстрирует более длинный 32/64-символьный текст, передаваемый типами 2A/2B групп.
RadioText Plus (RT +): Этот раздел используется, если какие-либо 3A группы указывают, что RadioText Plus (RT +) ODA использует тип группы абстрактного формата, например, 11A. Затем, после приема этого типа абстрактной группы, 32/64-символьный текст, переданный группами 2A/2B, будет разделен на две подстроки. Кроме того, эти две метки будут обновлены, чтобы охарактеризовать подстроки (такие как Artist и Song).
Приемы типа группы: Таблицы действуют как гистограмма, иллюстрирующая, какие типы групп были получены от станции и с какой частотой. В результате пользователи могут захотеть просмотреть записанные данные для получения дополнительной информации, которая не изображена в графическом средстве просмотра (в частности, системное время в 4A, альтернативные частоты в 0A и т.д.).
Откройте приложения данных (ODA): Если получены какие-либо 3A типы групп, то список встретившихся ODA обновляется с именем ODA и их выделенным типом группы.
Можно дополнительно изучить сигналы RDS/RBDS с помощью пользовательского интерфейса RBDSExampleApp. Вы можете запустить его, нажав на эту ссылку или введя RBDSExampleApp в командном окне:
Этот пользовательский интерфейс позволяет:
Выберите источник сигнала (файл захвата или RTL-SDR или ADALM-PLUTO)
Укажите частоту станции (для RTL-SDR или ADALM-PLUTO)
Запустите слои 1 и 2 приемника RDS/RBDS, хотя сгенерированный код C Это наиболее длительные части цепи RDS/RBDS, и генерация кода может помочь вам достичь обработки в реальном времени.
Отключить воспроизведение аудио
Откройте возможности, такие как Spectrum Analyzer и Time Scopes, которые анализируют принятый сигнал и иллюстрируют процесс декодирования. Включение возможности требует дополнительных вычислительных усилий и может препятствовать декодированию в реальном времени. В этом случае декодирование RDS/RBDS может быть успешным только для записанных сигналов, загруженных из файла.
Кроме того, можно включить флажок 'Журнала данных to файла' в порядок для регистрации дальнейших полей из всех типов групп.
Можно также исследовать реализацию следующих функций и системных объектов:
Национальный комитет по радиосистемам, стандарт RBDS Соединенных Штатов, апрель 1998 года
Дер, Лоуренс. «Учебное руководство по частотной модуляции (FM)». Silicon Laboratories Inc.
Национальный комитет по радиосистемам, Список приложений ОПР в РДС
Спецификация RadioText Plus (RT +)
Джозеф П. Хоффбек, «Обучение коммуникационным системам с Simulink ® и USRP», Ежегодная конференция ASEE, Сан-Антонио, Техас, июнь 2012 года