Запускаем DAB-мультиплекс у себя дома
Привет, Geektimes.
Цифровое радиовещание постепенно внедряется в различных странах. В Европе и Австралии это стандарт DAB/DAB+, в США HD Radio, в Китае CDR (China Digital Radio). Из плюсов для пользователя — более чистый звук за счет цифрового потока, дополнительные сервисы (например название композиции и имя исполнителя на экране приемника), и, в случае DAB, большее число станций по сравнению с FM. Приемники с поддержкой цифрового радио уже сейчас относительно недороги, их цена начинается примерно от 40$.
Россия пока официально не присоединилась ни к одному из стандартов, но если это произойдет, скорее всего, это будет DAB. Его тестовая эксплуатация уже проводилась в Москве, да и приемники европейского рынка для РФ географически более доступны, чем американские. Новые европейские авто (которых опять же, больше чем американских) часто уже оснащены приемником с DAB. Ну, а пока в тестовых целях, запустить DAB у себя дома, при наличии SDR-трансивера может любой желающий.
(Image Source / Getty)
Подробности под катом (осторожно, много длинных и скучных конфигов).
Как это работает
К сожалению, разные стандарты несовместимы между собой.
Европейский DAB представляет собой MP2 или AAC поток, передаваемый с помощью ODFM в каналах c частотами от 174 до 239МГц. Максимально возможно более 30 каналов, ширина каждого около 1.5МГц, в канале может одновременно передаваться несколько станций. Согласно Википедии, использование DAB при использовании битрейта 192kbps в 3 раза эффективнее по числу станций, чем у обычного FM.
Спектр одного канала DAB на экране SDR выглядит так:
Для сравнения, так при том же масштабе, выглядят FM-станции:
В американском HD Radio пошли по другому пути — цифровые каналы добавили «сбоку» к уже имеющимся FM-станциям. Это позволило не выделять новые частоты и оставить совместимость со старыми приемниками. Минус в том, что в крупных городах FM-эфир и так уже занят. С другой стороны, даже максимальное число в 50 станций для FM это вполне неплохо, слушателям больше скорее всего и не надо.
Спектр HD Radio выглядит так (скриншот с youtube):
Китайский CDR решил копировать американский подход, увы, моего нулевого знания китайского недостаточно чтобы найти по нему более подробную информацию.
Что касается приемников, то их цена на amazon составляет от 30$ за самые простые модели, до >100$ за более продвинутые с тачскрином, Wifi или цветным экраном.
Но «чукча не читатель», так что тестовое радио в формате DAB/DAB+ мы запустим сами. HD Radio запустить увы, не выйдет, формат закрытый, и доступных кодеров для него нет.
Запускаем DAB/DAB+
Процесс на самом деле, не сложный, но весьма кропотливый в плане создания нужных конфигов. Для теста нам понадобится Linux и SDR с возможностью передачи, например HackRF или USRP.
1. Компиляция проекта
Linux нужен для компиляции кодера. Я использовал Ubunty, готовый образ для VirtualBox был скачан с http://www.osboxes.org/ubuntu/.
Компилируем ODR-AudioEnc
Сначала нужно скомпилировать DAB/DAB+ audio encoder, найти его можно на странице github.com/Opendigitalradio/ODR-AudioEnc.
git clone https://github.com/Opendigitalradio/ODR-AudioEnc.git
cd ODR-AudioEnc/
./bootstrap
./configure --enable-alsa --enable-vlc
make
sudo make install
Компилируем ODR-DabMux
ODR-DabMux объединяет цифровые потоки в один мультиплекс. Подробнее на странице github.com/Opendigitalradio/ODR-DabMux.
git clone https://github.com/Opendigitalradio/ODR-DabMux.git
cd ODR-DabMux/
./bootstrap.sh
./configure
make
sudo make install
Компилируем ODR-DabMod
Это модулятор, который собственно и посылает данные в трансмиттер. Принцип сборки тот же, команда для скачивания:
git clone https://github.com/Opendigitalradio/ODR-DabMod.git
Если при сборке не будет хватать каких-либо библиотек, их нужно поставить с помощью apt-get.
Теперь все части проекта собраны, и со всем этим попытаемся взлететь.
2. Конфигурация
К сожалению, USRP не заработал в виртуальной машине, а ставить полноценный Linux на диск было лень. Поэтому я не стал рассматривать режим потокового вещания — мультиплекс был собран из заранее подготовленных mp3-файлов, а получившийся IQ-файл был запущен под Windows. Да в общем, для дома потоковое вещание и не нужно, задачи делать «пиратскую станцию» не было.
Более подробно разные настройки описаны здесь: http://opendigitalradio.github.io/mmbtools-doc/mmbtools.pdf.
Подготовка данных
В нашем мультиплексе будет 2 канала, для которых я скачал с youtube 2 mp3-файла и назвал их (кто бы догадался) соответственно sound01.mp3 и sound02.mp3.
Конвертируем файлы в WAV c битрейтом 48000:
ffmpeg -i sound01.mp3 -ar 48000 sound01.wav
ffmpeg -i sound02.mp3 -ar 48000 sound02.wav
Конвертируем их в формат DAB:
odr-audioenc --dab -b 128 -i sound01.wav -o prog1.mp2
odr-audioenc --dab -b 128 -i sound02.wav -o prog2.mp2
На выходе должно быть 2 файла prog1.mp2 и prog2.mp2.
Создание мультиплекса
Сначала нужно создать файл, описывающий конфигурацию нашей «радиостанции». Напомню, в одном канале DAB может быть множество станций, каждая со своими параметрами.
Создаем файл «config.mux» со следующим текстом:
general {
dabmode 1
nbframes 2000
; Set to true to enable logging to syslog
syslog false
; Enable timestamp definition necessary for SFN
; This also enables time encoding using the MNSC.
tist false
}
remotecontrol { telnetport 0 }
ensemble {
id 0x4fff
ecc 0xec ; Extended Country Code
local-time-offset auto
international-table 1
label "mmbtools"
shortlabel "mmbtools"
}
services {
srv-p1 { label "Station1" }
srv-p2 { label "Station2" }
}
subchannels {
sub-p1 {
type audio
inputfile "prog1.mp2"
bitrate 128
id 10
protection 4
}
sub-p2 {
type audio
inputfile "prog2.mp2"
bitrate 128
id 11
protection 4
}
}
components {
comp-p1 {
service srv-p1
subchannel sub-p1
}
comp-p2 {
service srv-p2
subchannel sub-p2
}
}
outputs { output1 "file://output.eti?type=raw" }
Конфиг описывает каналы, которые будут в мультиплексе и их источники данных. Параметр nbframes указывает, сколько фреймов создать, 2000 фреймов соответствует примерно одной минуте воспроизведения.
Когда файл сохранен, создаем мультиплекс:
odr-dabmux config.mux
На выходе должен получиться файл output.eti, в моем случае его размер составил 12Мб.
Передача
Тут есть две возможности. В «настоящем» Linux odr-dabmod может непосредственно передавать данные в трансивер, но под VM оно не заработало. Поэтому в качестве выходного параметра я указал raw-файл, который будет содержать данные, совместимые с Gnu Radio.
Создаем файл config.ini:
[input]
transport = file
source = output.eti
loop=0
[modulator]
digital_gain=0.9
rate=2048000
[output]
output = file
[fileoutput]
format = complexf_normalised
;format = s8
filename = output.iq
Здесь ключевой момент — выходной формат и его тип. Для USRP я использую формат complexf_normalised, для HackRF по идее, подойдет 8-битный s8.
Сохраняем конфиг, запускаем конвертацию:
odr-dabmod config1.ini
Все! На выходе должен получиться config.iq, в моем случае размером порядка 700Мб на одну минуту записи (формат IQ float). Копируем его на «основной» компьютер, и Linux можно закрывать.
3. Тестирование
Как я уже говорил ранее, DAB-приемника у меня нет, чукча не читатель, радио я вообще не слушаю :) Для тестирования я использовал RTL-SDR «свисток» и бесплатную программу Welle.io.
Первым делом, подключаем приемник, запускаем Welle.io и находим свободный канал. В моем случае, им сказался 12B:
Запоминаем частоту, и создаем простейший граф для передачи в Gnu Radio:
Запускаем, ждем несколько секунд, и… слышим записанную музыку через welle.io.
Убеждаемся, что количество каналов и их названия соответствуют прописанным в конфиге.
Да, весь «передающий комплекс» выглядит вот так:
Заключение
Не боги горшки обжигают, и к современным технологиям вполне можно прикоснуться дома, не отходя от рабочего стола.
Антенна разумеется, была не настроена на нужную частоту (да и антенного анализатора у меня нет), максимальная мощность от USB3 наверное не более 1Вт, да и то она распределена по полосе в 1.5МГц. Так что максимальная дальность передачи получилась примерно 0.5 м.
Если кто-то захочет повторить эксперименты с большей мощностью, поиск на ebay по слову «RF Power Amplifier» дает много полезных ссылок (официально для вещания нужна лицензия, конечно, ну и стоит убедиться что не создаются помехи другим службам).