Запускаем DAB-мультиплекс у себя дома

Привет, Geektimes.

Цифровое радиовещание постепенно внедряется в различных странах. В Европе и Австралии это стандарт DAB/DAB+, в США HD Radio, в Китае CDR (China Digital Radio). Из плюсов для пользователя — более чистый звук за счет цифрового потока, дополнительные сервисы (например название композиции и имя исполнителя на экране приемника), и, в случае DAB, большее число станций по сравнению с FM. Приемники с поддержкой цифрового радио уже сейчас относительно недороги, их цена начинается примерно от 40$.

Россия пока официально не присоединилась ни к одному из стандартов, но если это произойдет, скорее всего, это будет DAB. Его тестовая эксплуатация уже проводилась в Москве, да и приемники европейского рынка для РФ географически более доступны, чем американские. Новые европейские авто (которых опять же, больше чем американских) часто уже оснащены приемником с DAB. Ну, а пока в тестовых целях, запустить DAB у себя дома, при наличии SDR-трансивера может любой желающий.

k6rce8vbccstuywusg8ks1ypvwc.jpeg
(Image Source / Getty)

Подробности под катом (осторожно, много длинных и скучных конфигов).

Как это работает


К сожалению, разные стандарты несовместимы между собой.

Европейский DAB представляет собой MP2 или AAC поток, передаваемый с помощью ODFM в каналах c частотами от 174 до 239МГц. Максимально возможно более 30 каналов, ширина каждого около 1.5МГц, в канале может одновременно передаваться несколько станций. Согласно Википедии, использование DAB при использовании битрейта 192kbps в 3 раза эффективнее по числу станций, чем у обычного FM.

Спектр одного канала DAB на экране SDR выглядит так:

vhvrxpbqxv01zeh3dfd79vgbixi.jpeg

Для сравнения, так при том же масштабе, выглядят FM-станции:

4v-hxptupkzj4v56wyiw15vb9si.jpeg

В американском HD Radio пошли по другому пути — цифровые каналы добавили «сбоку» к уже имеющимся FM-станциям. Это позволило не выделять новые частоты и оставить совместимость со старыми приемниками. Минус в том, что в крупных городах FM-эфир и так уже занят. С другой стороны, даже максимальное число в 50 станций для FM это вполне неплохо, слушателям больше скорее всего и не надо.

Спектр HD Radio выглядит так (скриншот с youtube):

yrgndmvs0ptdz60a32m8xed1668.jpeg

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

Что касается приемников, то их цена на amazon составляет от 30$ за самые простые модели, до >100$ за более продвинутые с тачскрином, Wifi или цветным экраном.

ftigahoz4mqxvdvuriguzc9q-bs.jpeg

Но «чукча не читатель», так что тестовое радио в формате 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:

cxclmd0xuxfdrffiloyf1xjxmpy.jpeg

Запоминаем частоту, и создаем простейший граф для передачи в Gnu Radio:

cqwujgyqzl2vj1t7eu2l26dedck.jpeg

Запускаем, ждем несколько секунд, и… слышим записанную музыку через welle.io.

2xrawv5tsbezvfknzsa3jcwctlo.jpeg

Убеждаемся, что количество каналов и их названия соответствуют прописанным в конфиге.

Да, весь «передающий комплекс» выглядит вот так:

kr9bf28cmcwyl_3nysdxmggf7o4.jpeg

Заключение


Не боги горшки обжигают, и к современным технологиям вполне можно прикоснуться дома, не отходя от рабочего стола.

Антенна разумеется, была не настроена на нужную частоту (да и антенного анализатора у меня нет), максимальная мощность от USB3 наверное не более 1Вт, да и то она распределена по полосе в 1.5МГц. Так что максимальная дальность передачи получилась примерно 0.5 м.

Если кто-то захочет повторить эксперименты с большей мощностью, поиск на ebay по слову «RF Power Amplifier» дает много полезных ссылок (официально для вещания нужна лицензия, конечно, ну и стоит убедиться что не создаются помехи другим службам).

© Geektimes