logo

 

(Toujours en cours d'écriture...)

Forger des messages RDS (presque) à la main

Pour le fun et comme base pour aller plus loin.

 

Référence principale: La norme Européenne EN50067 (le fichier est peut-être watermarké).

Je n'aborderai pas le coté légal de cette expérience: ne le faites pas. Je ne l'ai jamais fait.

Matériel et logiciels nécessaires:

Concrètement, le RDS (Radio Data System) est ce qui permet entre autres à votre autoradio d'afficher le nom de la station que vous écoutez. Sympathique et inoffensif au premier abord, ce canal de données numérique est aujourd'hui intégré dans le signal de la plupart des stations de radio de la bande FM. Évidemment, sa création n'a pas été issue du (faible) besoin des auditeurs de connaître le nom de tel ou tel produit artiste actuellement en train d'agoniser de chanter mais de la volonté d'un groupe d'entreprises Allemandes de transmettre via des voies déjà établies, des informations routières a destination des automobilistes.

Sans entrer trop dans les détails, une station de radio FM est un signal baseband modulé en fréquence (no shit !) avec généralement une excursion de +/-75kHz.

FM

Ces 150kHz de bande passante peuvent paraître bien amples pour de l'audio, et pour cause: il n'y a pas toujours que de l'audio. Le signal baseband est parfois appelé "multiplex" ou "composite", et porte bien son nom. Voici les composantes et plages qu'on peut identifier dans un multiplex bien fourni:

FM

Dans cet article, j'ignore l'audio et le fonctionnement de la stéréo.
En vrai, ca donne ca (capture d'écran de SDR#):

FM

Le grand pic à 19kHz est le "pilot tone", qui indique que la station émet en stéréo.
Aux alentours de 57kHz (fréquence inaudible, et filtrée par les récepteurs de toute manière), on peut trouver deux petits lobes caractéristiques de l'AM: c'est dans ceux-ci que réside le signal RDS.

Le signal est formé depuis des données numériques, qui sont codées et modulées avant d'être mixées avec l'audio:

FM

Modulation: AM avec porteuse supprimée. 1187.5bits/s. MSB first.

Il n'y a pas a proprement parler de "trame" RDS, car la norme indique que le signal est sensé être un flux continu.
Ce flux peut cependant être décomposé en une suite de "groupes" de 4 "blocs" de 26 bits, comprenant 16 bits d'information et 10 bits de correction d'erreur. Un groupe fait donc 4*26 = 104 bits, parmi lesquels seuls 4*16 = 64 codent l'information.

Il y a 32 types de groupes: 16 types ayant chacun 2 versions, notées 0A, 0B, 1A, 1B...

Une station de radio peut choisir de n'en transmettre qu'un, aucun, 5, 19... plus ou moins régulièrement.

Le premier bloc de chaque groupe contient toujours la même information : le "PI code" (Program Identification) de la station.
En France, ce code 16bits est attribué par le CSA. Une liste complète se trouve ici.
Il est formé ainsi: b15~12: Country code (4bits), b11~b8: Coverage (4bits), reference number (8bits).
Ainsi, France Inter possède le PI F201: F=France (carte page 70), 2=National (page 72), 01=France Inter (CSA).

Le début du second bloc est aussi toujours formé de la même manière. Le reste des blocs sont formes différemment selon le type de groupe.

 

Fixons-nous un objectif: Créer une station de radio diffusant une belle chanson et qui s'identifie par RDS sous le nom "KCBS".

La chaîne de caractères qui s'affiche sur les récepteurs radio indiquant le nom de la station s'appelle techniquement le PSN (Program Service Name). Les informations auxiliaires souvent défilantes (titre de la chanson par exemple) sont appelées RadioText.

La norme indique que le groupe 0 permet de transmettre le PSN. Le groupe 0A est destine aux stations de radio qui souhaitent également transmettre des "tuning information", qui ici ne nous intéressent pas. Le groupe 0B semble être le bon.

La page 21 indique comment sont formes les blocs du groupe 0B:

Le PSN fait au maximum 8 caractères. Vu qu'on ne peut transmettre que deux caractères par groupe, il faut transmettre 4 groupes pour former le nom entier de la station.

L'indication de la position des 2 caractères dans la chaîne complète se fait par le champ "adresse" dans le bloc B par 2 bits.
Le nom de notre station est "KCBS". Sachant que la plupart des récepteurs radio n'attendent pas que les 4 groupes soient reçus pour afficher le nom, on ne pourrait donc transmettre que deux groupes. Pour faire propre, transmettons les 4 pour former la chaîne "--KCBS--". C'est aligné au centre, c'est plus joli.

Premier groupe

Formons le bloc A, constitué du PI. Comme nous n'avons pas de tel code, prennons-en un qui (au 08/08/2015) n'est pas attribué: F849.

Groupe 1
Bloc A Bloc B Bloc C Bloc D
Données Checkbits Données Checkbits Données Checkbits Données Checkbits
1111100001001001 ??????????            

Formons le bloc B:

Groupe 1
Bloc A Bloc B Bloc C Bloc D
Données Checkbits Données Checkbits Données Checkbits Données Checkbits
1111100001001001 ?????????? 0000110011101000 ??????????        

Le bloc C est le même que le bloc A:

Groupe 1
Bloc A Bloc B Bloc C Bloc D
Données Checkbits Données Checkbits Données Checkbits Données Checkbits
1111100001001001 ?????????? 0000110011101000 ?????????? 1111100001001001 ??????????    

Le bloc D contient les deux premiers caractères du nom de la station: "--". La table des caractères est donnée page 74.

Groupe 1
Bloc A Bloc B Bloc C Bloc D
Données Checkbits Données Checkbits Données Checkbits Données Checkbits
1111100001001001 ?????????? 0000110011101000 ?????????? 1111100001001001 ?????????? 0010110100101101 ??????????

 

Second groupe

Bloc A: Pareil
Bloc B: On ne change que l'adresse, qui passe a 01 (1): 0000110011101001
Bloc C: Pareil
Bloc D: On code "KC": 0100101101000011

 

Troisième groupe

Bloc A: Pareil
Bloc B: On ne change que l'adresse, qui passe a 10 (2): 0000110011101010
Bloc C: Pareil
Bloc D: On code "BS": 0100001001010011

 

Quatrième groupe

Bloc A: Pareil
Bloc B: On ne change que l'adresse, qui passe a 11 (3): 0000110011101011
Bloc C: Pareil
Bloc D: On code "--", comme dans le premier groupe: 0010110100101101

 

On a désormais toutes les données utiles (4 groupes de 4 blocs de 16 bits = 4*4*16 = 256 bits), il nous faut maintenant les codes de correction d'erreur pour chaque bloc.

CRC10 (

Ca y est, j'ai la flemme d'écrire.

A suivre: Calcul des codes de correction d'erreur, codage, modulation, multiplexage avec l'audio, transmission.

footer
symbol symbol symbol symbol symbol