Enregistrer un multiplex de radio DAB+

Expérimentons la captation de stations de radio DAB+, voire directement d’un multiplex complet et regardons les outils logiciels et matériels nécessaires.

Le matériel

  • Un ordinateur sous linux (ex raspberry pi)
  • Une antenne accordée sur les fréquences du DAB+ (VHF bande III, entre 180 MHz et 230 MHz)
  • Un récepteur SDR de type clé RTL-SDR.

Un multiplex DAB+ faisant 1.536 MHz de bande passante, le récepteur et le CPU de l’ordinateur doivent supporter au moins cette largeur de bande.

Une antenne DAB+

Au milieu du mat, une antenne DAB+

Une clé RTL-SDR

Une clé RTL-SDR pour faire de la radio logicielle, reliée à l’antenne DAB+

Les logiciels

Après avoir réglé un soucis de droit avec udev, nous nous servirons des outils libres suivants que nous téléchargerons et compilerons :

  • dabtools : un enregistreur de flux brut ETI du multiplex
  • dablin : un lecteur de fichier ETI et démultiplexeur / extracteur d’audio
  • welle-cli : issu du projet welle-io, permet également l’engistrement d’un multiplex

Résolution d’un problème de droit

Sous Debian/Ubuntu, pour utiliser notre périphérique rtl-sdr, il faut accorder certains droits via udev sous peine d’avoir à l’usage le message d’erreur suivant :

Please fix the device permissions, e.g. by installing the udev rules file rtl-sdr.rules

Récupérons l’identifiant constructeur :

$ lsusb
Bus 003 Device 002: ID 0bda:2838 Realtek Semiconductor Corp. RTL2838 DVB-T

En root, créer un fichier /etc/udev/rules.d/20.rtlsdr.rules avec le contenu suivant :

SUBSYSTEM=="usb", ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="2838", GROUP="adm", MODE="0666", SYMLINK+="rtl_sdr"

Relancer udev

sudo systemctl restart udev

Débrancher/rebrancher la clé usb

un lien /dev/rtl_sdr doit maintenant être présent et le périphérique est désormais accessible à tous les users du groupe adm

Source: https://www.instructables.com/rtl-sdr-on-Ubuntu/

dabtools

Nous allons utiliser la commande dab2eti issue du projet dabtools

Compilation

git clone https://github.com/Opendigitalradio/dabtools
cd dabtools
mkdir build
cd build
cmake ..
make
sudo make install

Pour enregistrer le multiplex “towerCast” du Canal 9D (208.064 MHz) avec un gain de +29.7dB

$ dab2eti 208064000 297 > 9D-towercast.eti
Found 1 device(s):
  0:  Realtek, RTL2838UHIDIR, SN: 00000001

Using device 0: Generic RTL2832U OEM
Detached kernel driver
Found Rafael Micro R820T tuner
Supported gain values (29): 0.0 0.9 1.4 2.7 3.7 7.7 8.7 12.5 14.4 15.7 16.6 19.7 20.7 22.9 25.4 28.0 29.7 32.8 33.8 36.4 37.2 38.6 40.2 42.1 43.4 43.9 44.5 48.0 49.6
[R82XX] PLL not locked!
Tuned to 208064000 Hz.
Tuner gain set to 29.70 dB.
Waiting for sync...
Allocating 32 zero-copy buffers
startup_delay=1
Locked
ENSEMBLE_INFO: EId=0xf200, CIFCount = 12 228
SubChId= 1, slForm=1, StartAddress=144, size= 72, bitrate= 96, ASCTy=0x3f
SubChId= 2, slForm=1, StartAddress=216, size= 72, bitrate= 96, ASCTy=0x3f
SubChId= 3, slForm=1, StartAddress=288, size= 72, bitrate= 96, ASCTy=0x3f
SubChId= 4, slForm=1, StartAddress= 72, size= 72, bitrate= 96, ASCTy=0x3f
SubChId= 6, slForm=1, StartAddress=360, size= 36, bitrate= 48, ASCTy=0x3f
SubChId= 8, slForm=1, StartAddress=  0, size= 72, bitrate= 96, ASCTy=0x3f

(Ctrl+C pour arrêter)

dablin

Également issu du projet Open Digital Radio, dablin est un outil permettant de lire un fichier .eti qui est un format conteneur de l’ensemble des données brutes (audio+metadata) d’un multiplex DAB+.

Compilation

sudo apt install libsdl2-dev libmpg123-dev libfaad-dev
git clone https://github.com/Opendigitalradio/dablin
cd dablin
mkdir build
cd build
cmake ..
make
sudo make install

Récupération de la liste des services à l’intérieur du multiplex

$ dablin 9D-towercast.eti 2>&1 | grep "programme service label"
FICDecoder: SId 0xF204: programme service label 'FIP' ('FIP')
FICDecoder: SId 0xF208: programme service label 'Mouv'' ('Mouv'')
FICDecoder: SId 0xF201: programme service label 'France Inter' ('Inter')
FICDecoder: SId 0xF202: programme service label 'France Culture' ('Culture')
FICDecoder: SId 0xF203: programme service label 'France Musique' ('Musique')
FICDecoder: SId 0xF206: programme service label 'France Info' ('Info')

On veut par exemple extraire France Inter (serviceId 0xF204), en gardant le codec audio d’origine sans réencodage (-u) :

dablin 9D-towercast.eti -u -s 0xf204 > france-inter.aac

Vérifions le format de fichier généré

$ file france-inter.aac
0xf204.aac: MPEG-4 LOAS

On peut aussi décoder le flux audio pour avoir du pcm avec -p :

dablin 9D-towercast.eti -p -s 0xf204 > france-inter.pcm

Vérifions également le format de fichier généré

$ file france-inter.pcm
data

Attention, c’est un flux pcm brut sans entête. welle-cli nous a quand même donné quelques indications sur le format :

PCMOutput: format set; samplerate: 48000, channels: 2, output: 32bit float

ajoutons les bonnes entêtes pour générer un .wav valide :

ffmpeg -f f32le -ar 48k -ac 2 -i france-inter.pcm france-inter.wav

Et voilà

welle-cli

Autre méthode d’enregistrement d’un multiplex DAB+ complet avec cette fois la commande welle-cli issu du projet welle-io.

Compilation

sudo apt install git cmake libfftw3-dev libmp3lame-dev libmpg123-dev librtlsdr-dev libfaad-dev libasound2-dev
cd $HOME
mkdir src && cd src
git clone https://github.com/AlbrechtL/welle.io.git && cd welle.io
mkdir build && cd build
cmake .. -DRTLSDR=1 -DBUILD_WELLE_IO=OFF -DBUILD_WELLE_CLI=ON
make
sudo make install

Exemple d’enregistrement du multiplex 11B (dans le répertoire courant) :

$ welle-cli -c 11B -D
$ ls
-rw-r--r-- 1 pi   pi    2310188 sept. 20 14:26  GENERATIONS.wav
-rw-r--r-- 1 pi   pi    2318380 sept. 20 14:26 'CHANTE FRANCE.wav'
-rw-r--r-- 1 pi   pi    2310188 sept. 20 14:26  FG.wav
-rw-r--r-- 1 pi   pi    2310188 sept. 20 14:26  EVASION.wav
-rw-r--r-- 1 pi   pi    2310188 sept. 20 14:26 'TSF JAZZ.wav'
-rw-r--r-- 1 pi   pi    2310188 sept. 20 14:26  Melody.wav
-rw-r--r-- 1 pi   pi    2318380 sept. 20 14:26 'BLEU PARIS.wav'
-rw-r--r-- 1 pi   pi    2318380 sept. 20 14:26 'SUD RADIO.wav'
-rw-r--r-- 1 pi   pi    2310188 sept. 20 14:26 'OUI FM.wav'
-rw-r--r-- 1 pi   pi    2310188 sept. 20 14:26  NOVA.wav
-rw-r--r-- 1 pi   pi    2310188 sept. 20 14:26 'J A Z Z Radio.wav'
-rw-r--r-- 1 pi   pi    2310188 sept. 20 14:26  VOLTAGE.wav
-rw-r--r-- 1 pi   pi    2310188 sept. 20 14:26 'Radio Notre Dame.wav'

Examinons le format généré :

$ file BLEU\ PARIS.wav
BLEU PARIS.wav: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 16 bit, stereo 48000 Hz

Bilan

Ces méthodes sont encore un peu expérimentales. J’arrive bien à récupérer le flux audio brut sans réencodage mais j’aurai aimé un outil d’extraction direct en aac de l’ensemble des flux du multiplex (ça se scripte), voire de faire ça en temps réel. Deplus il serait bon d’avoir des découpes horaires propres “avec raccordement” et sans overlap. Bref encore beaucoup de choses à découvrir dans le domaine…

comments powered by Disqus