rds кодер что это
Стандарт RDS — Что это? Как работает? Опускаемся на самый нижний уровень модели OSI
С системой RDS (Radio Data System) сталкивался каждый, кто видел в автомагнитоле название станции вроде «Дорожное радио» или «EUROPE PLUS». Помимо названия, могут отображаться дополнительные данные — название воспроизводимой песни, температура, частота вещания и т.д.
Но как это работает? Как оказалось, полной информации о RDS в рунете практически нет (да и в англоязычном тоже негусто), поэтому данная публикация восполнит этот пробел.
Введение
Радиостанции FM-диапазона существуют и пользуются популярностью довольно-таки давно. Но со временем стало ясно, что помимо звука, не хватает текстовой информации — названия станции, трека, исполнителя песни. Добавить такую возможность можно было только одним способом — помимо звука передавать дополнительный цифровой канал. Причем передавать так, чтобы с одной стороны, данные было несложно декодировать (вычислительные возможности микросхемы в радиоприемнике довольно ограничены), с другой стороны, чтобы не нарушить совместимости с уже имеющимися в продаже приемниками. Задача была решена, так появился стандарт RDS, принятый в 1990м году.
Спектр FM-станций выглядит на SDR-приемнике так:
Видна станция на 100.4МГц, которая будет «использована» в статье.
И второй забавный момент на скриншоте — на частоте 99.4МГц видна слабая по мощности станция, вещающая в «старом» моно-формате.
Спектр современной FM-станции:
На картинке можно видеть (слева-направо) 4 основных компонента:
Модуляция RDS
Для того, чтобы декодировать сигнал, сначала надо понять как он формируется, и здесь довольно-таки много «подводных камней». Основным документом, описывающим RDS, является «EUROPEAN STANDARD EN 50067», eго-то мы и будем изучать.
RDS-кодер, согласно стандарту, выглядит так:
Как можно видеть, сигнал в кодере проходит 5 стадий:
1) Исходный битовый поток. Для его получения RDS-сообщения сначала кодируются в 16-битные пакеты, потом к ним дописывается 10-битный блок контрольной суммы с коррекцией ошибок, в итоге получаются 26-битные блоки, которые и посылаются в кодер. Казалось бы, берем и посылаем? Все сложнее.
2) Битовый поток преобразуется с помощью дифференциального кодирования по следующей таблице:
Единицей кодируется изменение бита, отсутствие изменения кодируется нулем. Это нужно для простой цели — полученный код является независимым к инверсии. Мы можем не знать, что считать «0», а что считать «1», данное кодирование устраняет этот пробел.
Рассмотрим простой пример, пусть передаваемое сообщение — 0010100. Кодируем его по данной таблице, получаем 0011000.
Для декодирования используется другая таблица:
Воспользовавшись ей, получаем исходное сообщение 010100. Смысл действия в том, что если исходное сообщение инвертировано (т.е. 1100111), то декодируя его, все равно получаем тот же результат.
Теперь берем сигнал и посылаем? Еще нет, все сложнее.
Сигнал, показанный под номером «5» на схеме кодера — это фактически и есть наши биты после манчестерского кодирования, только кодер в стандарте рассматривался аппаратный. Он работает следующим образом:
— Битовый поток превращается в последовательность коротких импульсов (цифра «3» на картинке)
— Манчестерское кодирование выполняется с помощью задержки сигнала на пол периода и сложения его с противоположным знаком (цифра «4»).
— Полученный сигнал в виде «всплесков» положительных и отрицательных импульсов, подается на ФНЧ (фильтр низких частот), который выделяет огибающую, показанную под цифрой «5».
Вот теперь-то сигнал можно передавать? Да можно. Но не сразу. Исходная частота цифрового сигнала RDS составляет 1187.5Гц, что слишком мало. Полученный сигнал умножается на другой сигнал с частотой 57КГц, что переносит его на заданную частоту, вспоминаем школьную формулу умножения косинусов:
Полученный сигнал имеет как раз необходимую нам частоту 57КГц, он суммируется с «основным» (звуковым) сигналом, который и транслируется в эфир. Как можно видеть из верхней картинки, добавление частоты 57КГц не затрагивает каналов звука, соответственно не добавляет никаких искажений даже в не имеющие поддержки RDS-приемники.
Демодуляция
Теперь, поняв как получается сигнал, мы можем приступить к демодуляции сигнала с реальной FM-станции. Для этого нужен SDR-приемник, я использовал HackRF, но подойдет и гораздо более дешевый RTL-SDR, купить который можно за 10$ с бесплатной доставкой на eBay.
Шаг 1. WFM-декодер
Т.к. исходный сигнал частотно-модулирован, сначала мы должны получить его в демодулированном виде. Чтобы не писать еще и ЧМ-декодер, воспользуемся пакетом GNU Radio. Запустим GNU Radio Companion и соберем схему, как показано на рисунке.
Мы собираемся принимать FM-станцию на частоте 100.4МГц, для этого мы настраиваем приемник на частоту 99МГц, и программно «сдвигаем» сигнал вверх по частоте на 1.4МГц, домножая его на сигнал с такой частотой. Это сделано потому, что SDR-приемник имеет пик на нулевой частоте относительно центра, и настроиться сразу на станцию мы не можем.
Запускаем «схему», и видим картинку как в учебнике в начале статьи:
Хорошо видны пилот-тон на 19КГц, стерео-сигнал на 38КГц и 2 пика RDS-сигнала вокруг 57КГц.
Шаг 2. Выделение пилот-тона и RDS-сигнала.
Следующим шагом является выделение пилот-тона и сигнала RDS. Для этого используем полосовой фильтр на соответствующие частоты.
Запускаем полученную схему, и видим результат, как в любом «учебнике» по описанию RDS.
Хорошо видны пилот-тон с частотой 19КГц, и 57КГц-сигнал, модулирующий более низкочастотный сигнал с частотой 1187.5Гц.
Шаг 3. Выделение низкочастотного сигнала.
Для получения НЧ-сигнала необходимы 2 шага:
3.1) Получение сигнала 57КГц (3й гармоники пилот-тона).
Мы имеем выделенный фильтром сигнал 19КГц, а как получить из него 57КГц? Для этого вспоминаем школьную математику, формулу куба синуса:
Как нетрудно видеть, куб синуса содержит 2 компоненты: sin(a) и sin(3*a). Т.к. мы работаем с «аналоговыми» блоками, берем в GNU Radio 2 блока — умножитель, и фильтр высоких частот. Убрав sin(a) фильтром на 38КГц, получаем искомые 57КГц.
Готовый результат можно видеть на осцилограмме:
3.2) Обратный перенос частоты
При кодировании сигнал переносился с частоты 1187.5Гц вверх, умножением на 57КГц. Теперь выполняем обратную операцию, переносим сигнал «вниз». Для этого еще раз умножаем его на 57КГц-сигнал. По формуле произведения синусов (школьная программа вещь полезная) получаем 2 компоненты — суммы и разности частоты. Нам нужна именно разность, сумму мы отбрасываем с помощью фильтра низких частот.
Все это делается добавлением блоков в GNU Radio, готовый результат показан на картинке:
Зеленым цветом показан «образцовый» сигнал с частотой 1187.5Гц, чтобы видеть что преобразование выполнено правильно.
Шаг 4. Демодуляция низкочастотного сигнала
Принцип этой части проще всего проиллюстрировать картинкой из стандарта (блок «biphase symbol decoder»).
Демодуляция бифазного сигнала состоит из 2х частей.
— «Переворачивание» сигнала инвертором. Это нужно для возврата от бифазного кодирования, которое рассматривалось выше, к исходному сигналу. Фактически нужно «перевернуть» каждый второй бит, поэтому процесс синхронизирован с тактовым сигналом.
— Суммирование сигналов за период. Положительная сумма соответствует биту «1», отрицательная «0».
Кстати, период 1187.5Гц тоже выбран не случайно — это частота пилот-тона 19КГц, деленная на 16. Все сделано для того, чтобы аппаратная реализация декодера в приемнике была как можно проще и соответственно, дешевле.
После демодуляции сигнал поступает на дифференциальный декодер, который рассматривался выше. Дальше сигнал поступает на модуль коррекции ошибок, но это уже как говорится, другая история, соответствующая второму уровню модели OSI.
Если кому интересно, теоретическую часть можно будет продолжить, и рассмотреть формирование пакетов. Если же кто захочет поэкспериментировать самостоятельно, один из вариантов работающего декодера для RTL-SDR можно найти на github. При желании использовать аппаратный тюнер в своих проектах, можно купить на eBay плату Si4703 FM RDS Tuner, ее цена около 6$.
Software Defined Radio — как это работает? Часть 9
В предыдущей части было рассмотрено декодирование сигналов RDS для FM-радиостанций, и идея следующей статьи возникла сама собой — нужно сделать свой собственный FM-трансмиттер.
Вариантов будет два — простой, и более сложный, с RDS.
Как и в предыдущих случаях, сделаем мы все это в GNU Radio, не написав ни одной строчки кода. Для тех кому интересно, продолжение под катом.
Итак, приступим. Разумеется, для тестов нам понадобится SDR с возможностью передачи (HackRF, USRP, LimeSDR).
FM трансмиттер
Схема простого трансмиттера делается практически в два клика, и надеюсь, никаких сложностей в понимании не представляет. В качестве источника я использую WAV-file, хотя при желании можно использовать и другой источник, например вход звуковой карты.
Собственно, ключевых блоков в этой схеме два — WBFM-трансмиттер и Resampler, преобразующий частоту дискретизации потока. Все значения частоты дискретизации должны соответствовать друг другу, иначе будет пропуск семплов, что на слух будет слышно как щелчки. Блок Multiply Const используется для регулировки входного уровня. Также важно не перепутать, в GNU Radio есть два разных блока для FM — WBFM и NBFM. Нам нужен именно первый, Wide Band FM. Модуляция NFM используется для портативных радиостанций.
В общем, все просто, запускаем, работает. Никаких UI-блоков в схеме нет, так что использовать ее можно и из командной строки (подробнее в 4й части).
Кстати, если посмотреть спектр, то можно убедиться, что передается простой моно сигнал, без каких-либо каналов, пилот-тонов и прочего.
Пора перейти к более сложному варианту.
Трансмиттер с RDS
Схема передатчика с RDS будет разумеется, посложнее. Ее оригинал был взят из примеров gr-rds с небольшими изменениями (оригинальная версия под Windows не заработала, «правильная» версия внизу статьи), рассмотрим, из каких компонентов она состоит.
Верхяя треть схемы — это передача RDS. На входе имеется RDS-энкодер, который исходя из имеющихся данных (имя станции, код страны и пр) формирует RDS-пакеты. Затем битовый поток подвергается дифференциальному кодированию, идея которого — убрать повторяющиеся последовательности вида 001000001. Затем сигнал обрабатывается, и им модулируется «несущая» на 57КГц. Центральная часть — создание звука. Тут формируются каналы L+R и L-R. Снизу в качестве источника звука указан WAV-файл. И наконец, блок Add складывает все это вместе, также к сигналу добавляется пилот-тон на 19КГц и второй тон на 38КГц. Весь этот суммарный сигнал отправляется на частотный модулятор, все это с помощью SDR отправляется в эфир.
По идее, эта схема не является 100% полной, например нет блока предыскажений, фазы тонов на 19, 38 и 57КГц не синхронизированы. С другой стороны, для понимания того, как вообще звук передается в эфир, такой схемы вполне достаточно, желающие могут доработать ее самостоятельно.
При запуске открывается окно, часть параметров можно менять.
Было желание протестировать RDS с реальным приемником, но оказалось что FM-радио — это уже атавизм, и у меня дома его нет. Даже в смартфоне последней модели оно тоже отсутствует. Так что пришлось использовать RTL-SDR V3 и GQRX в качестве контрольного приемника, результат на КДПВ.
Разумеется, перед тестированием необходимо выбрать свободную частоту, чтобы на ней не было станций, ну и желательно не превышать разрешенную мощность. Для тех же, кто захочет получить максимум дальности можно докупить усилитель, желательно сделать антенну на нужную частоту, чтобы был хотя бы диполь 1/4 длины волны.
Заключение
Как можно видеть, в передаче FM-радио в принципе, нет ничего сверхсложного, все вполне реализуемо в GNU Radio (хотя без наличия примеров повторить такое было бы непросто, учитывая что система не документирована вообще никак). Ну теперь, по крайней мере, работающий пример у читателей есть.
Rds кодер что это
Проект по созданию RDS кодера.
Начать нужно с описания текущего положения вещей в RDS вещании в нашем «районе».
Согласно стандарта на RDS передача информации происходит на 3-й гармонике пилот-тона, то есть наш (Российский) стандарт стерео вещания (полярная модуляция) для передачи RDS не пригоден (. хотя. 🙂 )
У нас на сегодняшний момент вещает 8, станций в FM диапазоне (Ретро, Динамит, Европа, Русское, Авто,Радио-7, Общественное Российское радио, Шансон), и 6 в УКВ ( Радио России, Маяк, Авто, Европа, Наше, Love радио). При этом «Наше радио» стерео сигнал передает по стандарту с пилот-тоном.
RDS передают лишь три радиостанции из вышеперечисенных Европа, Авто, Радио-7.
А теперь самое интересное. 🙂
Рекомендации стардарта о процентном соотношении передаваемых групп не соблюдаются ни одной из перечисленных станций.
Две из трех радиотекст передают в поле (группе) предназначенной для передачи названия станции, что является нарушением стандарта.. «. The use of PS to transmit text other than a single eight character name is not permitted. «
Ну а со служебной информацией вообще «засада».. 🙂
Альтернативные частоты какие угодно, есть даже частота телевизионного канала и частота 109,9. интересно для какого приемника.
Только на одной из трех станций установлен регион «Россия», на двух других «Италия» и «Люксембург».
. продолжать можно дальше.
Причина такого положения, на мой взгляд, кроется в некомпетентности обслуживающего персонала. Кодер (наверняка дорогущий) куплен, кое-как введен в эксплуатацию (с установками «по умолчанию»), приемник в машине директора станции чего-то показывает. и ладно. А тонкости со служебной информацией и соблюдением стандарта. да кому они нужны. Грустно.
Кодер получает свое развитие. на сегодняшний (16.01.07г.) день кодер YES_RDS работает. то есть кодирует, модулирует и «выдает» комплексный RDS сигнал на TDA7330, выход которой подключен к СОМ порту. Результат анализируется с помощью программы RDS Decoder 3.0.
03.02.07г. Появилось время для написания нескольких строк. 🙂
Что же «передает» YES_RDS?
Кодер передает радиотекст (реализован режим бегущей строки), ПРАВИЛЬНУЮ служебную информацию (локализация, альтернативные частоты, тип радиопередачи моно/стерео и т.д.), дату и время.
— передается три типа групп: основная группа, группа с дополнительными настройками (установками), группа с информацией о дате и времени.
Радиотекст, в нарушение стандарта, передается в группе, предназначенной для вывода названия радиостанции (см.начало статьи).
Этому послужили несколько причин.
— вывод информации осуществляется на 8-разрядный дисплей (есть приемники с 16-ти разрядным дисплеем, но я таких не видел. :-(. ). То есть, любое сообщение будет делиться на 8-ми символьные «куски», вне зависимости от смыслового значения:
При использовании для передачи радиотекста «основной» группы (ОА) с выводом бегущей строкой эти недостатки отсутствуют.
В любом случае, «прописать» обычный (не бегущая строка) вывод и/или использование «правильной» группы для вывода радиотекста возможно.
Других «отступлений» от требований стандарта нет.
Синхнонизация по пилон-тону аппаратная.
В качестве устройства управления кодером будет применяться или контроллер, или РС. В случае управления от РС кодер будет дополняться устройством сопряжения (что-нибудь типа ATTiny), или I2C через LPT.
В автономном режиме кодер будет передавать текстовое сообщение, длина которого ограничена емкостью 24Схх, текущее время (DS1307, батарейное питание предусмотрено), ну и установки, записаные ранее.
. все что написано со словом «будет», есть в планах и будет реализовано. однако если у Вас есть какие-либо замечания/пожелания, то милости прошу.
DS1307 имеет резервное (батарейное) питание. Напряжение батарейки (она на фото вверху видна) еще до подключения, почему-то оказалось не 3, а 3,41 вольта. Странно.
. пока все. о планах НИ СЛОВА. 🙂
19.02.07г. Кодер работает совместно с «синхронизатором-формирователем».
. пока «напрямую», по проводам. без передачи-приема.
. из особенностей замечено весьма ощутимое влияние «разводки» платы на достоверность приема RDS сигнала..
20.02.07г. YES_RDS прошел проверку «эфиром», точнее «cordless». между приемником и передатчиком около метра, как видно на фото.
. из особенностей. подтверждена необходимость комплексной (LC) нагрузки ЦАПа.
После настройки шумы от RDS в тракте приема-передачи обнаружить не удалось. 🙂
Внимание! Всю настройку аналоговой части поводил Eger. За что ему большой RESPECT! Без его помощи проект вряд ли мог быть осуществлен.
15.03.07г. За прошедшее время было «опробовано» несколько вариантов ЦАП.
Сначала был применен последовательный ЦАП DAC0808.
От его применения пришлось отказаться. Для работы этого, да и любого ЦАП с последовательным вводом, требуется «рабочее» время управляющего контроллера, а время установки данного ЦАП не такое уж и маленькое (3мкС).
Затем был успешно применен ЦАП с параллельным вводом (572ПА1).
При опытной (без эфирной) проверке схема показала очень высокую устойчивость и стабильность в работе.
Далее в схему был «добавлен» блок «синхронизации».
. и.. как это не прискорбно, снова наступило разочарование. Блок синхронизации не удовлетворяет предъявляемым требованиям. (громоздок, не универсален, требует настройки и д.т.).. Поэтому в настоящее время занимаюсь созданием «нормального» блока синхронизации..
20.04.07г. Сегодня состоялась «опытная» проверка «обновленного» YES_RDS кодера.
Результаты экспериментов в течении месяца принесли положительные «плоды».
Кодер работоспособен, помеху не наводит (обнаружить не удалось), достоверность передачи сигнала (информации) не хуже, чем у «официальных» вещателей.
Программа была написана на АлгоритмБилдере. Но с переходом на М8, из-за увеличения объема flash’a, стало возможным писать программу на С.
В настоящий момент, написана программа формирующая огибающую 1187,5Гц с несущей 57кГц. Программа написана на С и ассемблере (компилятор ICC).
В МК «прописан» bootloader (через UART), и перепрограммирование производится без применения программатора. В последующем планируется использовать bootloader для проведения апдейта «прошивки».
Пока все. «
в общем это копия «поста» во вновь открытой теме на форуме (не на моем 🙂 )
. о самых свежих новостях буду писать туда. здесь (на сайте) буду выкладывать «состоявшиеся» реализации..
да. ну и конечно фото:
6.05.07г.
08.05.07г.
09.05.07г.
Буду рад любым конструктивным замечаниям/пожеланиям.
. принимаются заказы на изготовление
12.06.07г.
Из «Истории»:
Внимание! В настоящее время чтение SMS сообщений не реализовано в программе. Это оказалось не нужным. Однако, все «материалы» имеются если появятся желающие, то помогу чем смогу.. Пишите.. 07.11.07г.
02.07.07г.
11.09.07г.
В общем-то, на сегоднящний день проект завершен. Программы написаны. Все работает.
Дальнейшее развитие проекта возможно. но, по всей видимости, несколько в другой «форме». Во всяком случае, YES_RDS ЗАВЕРШЕН.
Функция RDS в магнитоле что это такое и как ее включить
Головное акустическое оборудование в автомобилях используется не только для воспроизведения музыкальных композиций. Разработчики предусматривают дополнительные функции, позволяющие вести телефонный разговор без поднятия трубки или коммутировать камеры кругового или заднего обзора. Еще одной служебной функцией является RDS, но что это в магнитоле и как параметр помогает водителю ориентироваться в дорожной ситуации? Ответы на эти вопросы автовладелец найдет ниже.
Что это такое
При покупке или ознакомлении с техническим описанием или инструкцией по эксплуатации, прилагаемым к головным аудиоустройствам, владельцы задают вопрос: что такое RDS в магнитоле и как управлять этой функцией? Система RDS передает сообщение о дорожной ситуации параллельно с трансляцией радиопередач в диапазоне ультракоротких волн. При отправке информации используется специальный цифровой код, который расшифровывается встроенным в головное устройство процессором со специализированным программным обеспечением.
Услуга появилась в конце 70-х годов в Европе, а с 90-х система присутствует и в России.
Передача сигнала осуществляется отдельной поднесущей частотой. Для получения информации магнитолой требуется активный режим стерео, при слабом сигнале наблюдается пропадание сигнала или снижение периодичности обновления.
Функции RDS
Применение функции приема коротких радиосообщений через автомагнитолу позволяет получать информацию о названии транслируемой передачи или о заторах. Трансляция производится в автоматическом режиме, не отвлекая водителя от управления автомобилем. Для приема информационных сообщений требуется активировать режим RDS на магнитоле. Все функции системы разделены на общие (или базовые) и вспомогательные (список услуг зависит от страны, на территории которой расположена радиостанция).
Базовые
Стандартные функции, поддерживаемые RDS:
Дополнительные
Как включить RDS на магнитоле
Для активации функции RDS в головном устройстве используется отдельная кнопка, расположенная на фронтальной панели. Также возможно управление режимом через меню настройки, информация об особенностях активации имеется в инструкции по настройке. При активации функции следует учитывать, что на территории России задействованы не все каналы передачи информации, радиостанции также не транслируют информацию в эфир.
Минусы RDS
Если пользователь решил включить RDS на магнитоле, то есть риск появления проблемы, связанной с автоматическим сканированием частотного эфира. При этом трансляция выбранной станции прекращается. Причиной является ошибка в алгоритме функционирования, головное устройство воспринимает принимаемую радиостанцию как идентичный сигнал, транслируемый на различных частотах. Из-за этого активируется режим поиска частоты с наиболее мощным и устойчивым сигналом. Для прерывания поиска требуется нажать отдельную кнопку или выключить режим RDS.
Штатные головные устройства автомобилей, предназначенных для европейского рынка, плохо принимают сигнал радиостанций в России. Причиной является активация встроенного усилителя сигналов, который пытается распознать информацию RDS. При этом автоматически усиливаются и помехи, которые заглушают радиосигнал. Рекомендуется отключение службы дорожной информации или корректировка региона приема, которая осуществляется через меню.