L'algorithme de Viterbi
Modélisation d'une transmission
numérique
Dans les systèmes de transmission de données, la probabilité
d'erreur est fonction du rapport signal à bruit Eb/N0 du canal à
l'entrée du récepteur. L'évolution des télécommunications
s'accompagne d'une demande toujours plus grande de la qualité
de transmission. Il faut pour cela diminuer le taux d'erreur et par
conséquent accroître le rapport signal à bruit. L'augmentation
de la puissance du signal d'émission et/ou la diminution du facteur
de bruit du canal sont des solutions envisageables. Elles engendrent cependant
des problèmes de coût ou de technologie. L'autre solution
est basée sur l'utilisation des codes correcteurs qui permettent
d'augmenter les performances de transmission tout en conservant le meilleurs
compromis possible entre la bande passante occupée et la puissance
émise.
Un système de transmission numérique peut être schématisé
de la façon suivante :
Figure 1:
Communication numérique
|
Trois opérations sont à effectuer à l'émission.
-
Le codage de source permet de minimiser la quantité d'information
nécessaire pour la transmission du message. La compression de données
est un exemple de codage de source.
-
Le codage de canal sert à lutter contre les perturbations
apportées par le support de la transmission en remplaçant
le message à transmettre par un message moins vulnérable,
en codant ce message par un code convolutif par exemple. L'algorithme de
Viterbi est une technique utilisée pour le décodage de ces
codes.
-
La modulation permet d'adapter les caractéristiques du signal
à celles d'un canal. Les modulations les plus couramment utilisées
sont de type modulation de fréquence ou modulation de phase.
Le canal définit le support de transmission. Son imperfection provoque
l'apparition d'erreurs sur le message transmis. Par exemple pour les communications
par satellite le canal est modélisé par un processus gaussien
caractérisé par sa densité spectrale de bruit N0.
À la réception les opérations inverses sont
à effectuer avant de fournir le message au destinataire.
Codage de canal
Le principe de base du codage de canal consiste à remplacer le message
à transmettre par un message plus long qui contient de la redondance.
Sans redondance, chaque donnée du message est indispensable à
la compréhension du message entier. Toute erreur dans une partie
du message est donc susceptible de changer la signification du message.
L'objectif de la redondance est de faire en sorte que les erreurs ne compromettent
pas la compréhension globale du message.
Du fait de l'adjonction d'une redondance, le message effectivement transmis
est plus long. Un code se caractérise par son rendement R.
Si le codeur génère N bits à partir de K bits d'information,
le rendement R vaut K/N.
Les données générées par le codeur sont
appelées des symboles. Lors du décodage, les symboles
reçus peuvent être des bits ou des mots binaires. Dans
le premier cas, le système est dit à décision dure,
dans le second à décision douce. Un système
à décision douce présente de meilleures performances
qu'un système à décision dure, mais au détriment
d'une complexité plus grande du décodeur de Viterbi.
Il y a deux grandes familles de code.
-
le codage en bloc. Le message décomposé en blocs
de K bits, est remplacé par un bloc de N bits comprenant directement
les K bits d'information et N-K bits de redondance calculés à
partir des bits d'information, le codage d'un bloc se faisant indépendamment
des précédents.
le codage convolutif. À K bits d'information, le
codeur associe N bits codés, mais contrairement au cas précédent.
le codage d'un bloc de K bits dépend non seulement de ce bloc mais
également des blocs précédents.
Les codes convolutifs permettent une correction grossière en atteignant
des taux d'erreurs de 10-6. Par contre les codes en blocs permettent une
correction plus fine en atteignant pour certaines applications des taux
d'erreurs de 10-9. Ces deux codes sont souvent associés pour obtenir
de très bons taux d'erreurs. Le code en bloc constitue un complément
idéal au code convolutif dans les transmissions par satellite
par exemple.
Codage convolutif
Chaque bloc de N éléments binaires transmis (aussi appelés
symboles) dépend non seulement du bloc de K éléments
présents à son entrée mais aussi des m blocs précédents.
Le codeur est constitué de m registres à décalage
de K éléments binaires. Une logique combinatoire constituée
de N générateurs linéaires de fonctions algébriques génère
les blocs de N éléments binaires fournis par le codeur.
figure ici
La longueur du registre à décalage (m+1) définit
la longueur de contrainte. Ce paramètre correspond au degré
de mémoire introduit sur les bits de données. Plus ce paramètre
est grand, plus le code est puissant, mais plus le décodeur est
complexe. La logique combinatoire est caractérisée par ses
polynômes générateurs qui explicitent les positions
du registre à décalage prises en compte dans le calcul des
symboles. Les principaux codes utilisés sont de la forme R=1/N (K=1).
Ce type de code présente un rendement assez faible. Des codes de
rendement plus important en sont dérivés; ces codes sont
dits poinçonnés car ils sont obtenus en supprimant
certains symboles générés par le code 1/N. La loi
de dépoinçonnage se synthétise par une matrice de
dépoinçonnage.
Par exemple le code de rendement 3/4 est obtenu comme suit: soient A
et B, les deux symboles générés à partir d'une
donnée D par un code standard R=1/2 et la matrice de dépoinçonnage
suivante:
A : 1 1 0
B : 1 0 1
"0" signifiant que le symbole n'est pas pris en compte.
Pour trois bits consécutifs "Dn, Dn+1, Dn+2", le codeur standard
génère six symboles dont seulement quatre sont transmis (
An, Bn, An+1, Bn+2).
Le pouvoir de correction d'un code convolutif est défini par
son gain de codage par rapport à un système non codé.
Il dépend à la fois du type de canal de transmission et du
type de modulation utilisée. La figure suivante donne une courbe
de gain de codage type:
Algorithme de Viterbi
Pour expliquer l'algorithme nous allons prendre un exemple simple:
-
longueur de contrainte, K=3
-
rendement : r = 1/N = 1/2
-
polynômes générateurs : A = 7, B=5
Figure 4:
Codeur convolutif, K =3
|
Il existe trois méthodes principales pour représenter les
code convolutifs : diagramme en arbre, en treillis et diagramme d'états.
La représentation en treillis est la plus utilisée
car elle tient compte du temps et du fait que le fonctionnement du codeur
est périodique, c'est à dire que quelque soit l'état
initial du codeur, le motif se répète après m+1 décalages.
Chaque noeud représente un état des bits In/In-1
et chaque arc une transition entre un état et un autre.
Une flèche pointillée correspond à In+1='0' et une
flèche pleine à In+1='1'. Les deux nombres entre parenthèses
sont les symboles (AB) associés à l'état du registre.
Une suite de branches passant par les différents noeuds du treillis
définit un chemin. Dans le treillis pour aller d'un noeud
de départ à un noeud d'arrivée, il existe une infinité
de chemins mais une séquence S(i) ne décrit qu'un seul chemin
C(i). Si la séquence reçue S'(i) est perturbée et
contient quelques erreurs le chemin C'(i) sera différent du chemin
attendu C(i). Ce chemin C'(i) sera d'autant plus proche du chemin C(i)
que le nombre d'erreurs sera faible.
L'algorithme de Viterbi est une méthode qui permet d'estimer
la séquence émise en mesurant l'écart du chemin associé
aux symboles reçus par rapport à chaque chemin possible.
Le chemin ayant le plus faible écart sera considéré
comme le plus représentatif de la séquence émise réellement
et permettra de la reconstituer.
Décodage de Viterbi
Le décodage de Viterbi se décompose en trois opérations.
-
Le calcul des métriques de branches consiste à calculer à
la réception de n symboles (pour un rendement de 1/n) un nombre
représentant la vraisemblance des symboles reçus par rapport
aux 2n symboles possibles. Ces 2n nombres sont les Métriques
de Branches. La vraisemblance s'exprime en général par
le calcul de la distance de Hamming (nombres de bits différents
bit à bit). En reprenant l'exemple précédent (K=3,
r=1/2) avec des symboles exprimés sur 3 bits en décision
douce: les symboles reçus A=6 et B=3, les 4 Métriques de
Branches s'exprime par la formule suivante:
soit
La métrique la plus faible est MB10, ce qui signifie que le
couple de symboles (10) est le plus probable. Cela correspond à
l'intuition car A représentant un '1' correct et B un '0' bruité.
-
Le calcul des métriques de chemin. Cette opération
permet de calculer quel état du registre à décalage
(quel noeud) est le plus probable. Pour chacun des 2k-1
noeuds du
treillis, une nouvelle métrique Métrique de Chemin est
calculée en tenant compte des métriques de chemin du cycle
précédent et des métriques de branches courantes.
Cela représente les probabilités cumulées pour chaque
noeud de faire partie de la séquence émise.
En effet, à chaque noeud arrive deux branches venant de deux noeuds
antécédents. En reprenant le treillis plus avant, le noeud
(01) à T=3 possède deux antécédents: (10) par
la branche a et (11) par la branche b. A chacune de ces branches correspond
une métrique de branche MB(a) et MB(b) et à chacun des noeuds
correspond deux métriques de chemin MC10 et MC11 calculées à
T=2. On supposera que toutes les métriques de chemin sont mises
à 0, à T=0. La métrique de chemin MC01 aura pour valeur
la plus petite des deux valeurs suivantes:
MC11(T=2) + MB(a) et MC11(T=2) + MB(b)
Avant de sélectionner cette métrique la plus faible,
il nous faut faire l'addition des métriques de chemin et des métriques
de branche puis la comparaison des deux métriques. D'où le nom
d'ACS ( Addition Comparaison et Sélection) pour ce bloc.
La décision prise lors du choix entre les deux branches est conservées
dans une mémoire. Cette décision se réduit à
un bit appelé survivant. Ce survivant servira à reconstituer
la séquence émise.
-
La remonté des survivants. Cette opération consiste à
effectuer la sortie des bits décodés en "remontant" la mémoire
des survivants par une méthode de chaînage arrière.
Cette remonté permet, en partant d'un noeud de référence,
de retrouver tous les survivants ayant abouti à ce noeud, et ainsi
de reconstituer la séquence émise. Ce troisième processus
peut se dérouler en parallèle avec les deux premiers.
Une perturbation provoque un écart du chemin estimé par rapport
au chemin réel. Si l'on décode le bit correspondant aux symboles
entrés au même cycle, il sera erroné. Il est donc nécessaire
d'attendre que l'influence du bruit sur les métriques de chemin
soit atténuée, ce qui est possible car le bruit n'est pas
corrélé. En d'autres termes, il faut attendre que tous les
chemins aboutissant aux noeuds traités à un instant donné
aient convergé vers le chemin correct. En théorie le délai
d'attente est infinie. En pratique, il est tronqué à une
valeur appelée Longueur de Troncature (LT) qui dépend
du rendement du code et du type de canal. Ainsi, à l'instant T=n
est décodée la donnée correspondant aux symboles entrés
à T=n-LT.
Paramètre de l'algorithme de Viterbi
Caractéristiques fixées
Le code convolutif
Un des codes convolutifs décrit précédemment est devenu
un standard:
-
longueur de contrainte : 7
-
rendement : 1/2
-
polynômes générateurs : A = 133(1011011); B=171(1111001)
Les rendements poinçonnés les plus utilisés ( 2/3,
3/4, 5/6, 7/8 ) sont dérivés du rendement 1/2.
Fréquence de fonctionnement
Le débit à traiter est un paramètre fondamental car
il fixe en grande partie l'architecture du décodeur de Viterbi et
dépendra de l'application. Des applications couvrent différentes
gammes de débit:
-
faible débit en dessous de 2 Mbits/sec
-
moyen débit environ 10 Mbits/sec
-
haut débit au dessus de 10 Mbits/sec
La technologie
Les technologies actuelles de 0.5 micron voir 0.25 micron nous permettent
sans problème de faire fonctionner un circuit à des fréquences
de l'ordre de 100 Mhz.
Paramètres à évaluer
Champ des symboles d'entrée
La quantification des symboles en entrée du Viterbi (e bits) si
elle est trop importante fait augmenter la complexité du Viterbi.
Des résultats satisfaisants sont obtenus avec des symboles de 4
bits en entrée. Lorsque l'on passe à 3 bits on perd environ
0,5 dB (simulation sur un canal gaussien et rendement 1/2).
Champs des métriques de branche
Le champ des métriques de branche est fonction de celui des symboles
en entrée mais on peut le réduire par compression. Cela est
intéressant pour certain cas, car permet de limiter la taille des
ACS et de conserver de bonnes performances. On essaie de rester pour des
échantillons d'entrée sur 4 bits à des métriques
de branches sur 4 bits. Pour cela suivant le canal on pourra générer
une ROM optimale.
Champs des métriques de chemin
Directement lié au champ des métriques de branches, le champ
des métriques de chemin peut être réduit durant le
calcul dans les ACS sans altérer les performances. Par exemple,
pour b=4 bits (champ des MB), si l'on passe de c= 6 à 5 bits (champ
des MC), on perd 0.2 dB en rendement 1/2.
Renormalisation et choix du noeud de départ
Plusieurs possibilités pour effectuer la renormalisation:
-
renormaliser lorsque les métriques dépasse un seuil fixe,
en soustrayant ce seuil
-
renormaliser à chaque calcul des métriques de branche, en
soustrayant la métrique minimale
-
d'autres méthodes sont envisageables
Suivant la fréquence de fonctionnement désirée il
est possible ou non d'implémenter le calcul de la métrique
minimale (64 comparaisons entre 2 nombres). Sinon on impose un noeud optimal
de départ.
Longueur de troncature
Sa longueur dépend de la façon dont on choisit le noeud de
départ (optimal ou non), et elle devra aussi être augmentée
pour les codes poinçonnés. Là aussi les valeurs adoptées
dépendent des performances recherchées. Il pourra être
utile de rendre programmable ce paramètre, par exemple plusieurs
valeurs de longueur de troncature pour des rendements différents.
Architecture du bloc ACS
Ce bloc, qui constitue la majeure partie du décodeur, demande une
étude optimale de son architecture. Dans un premier temps en fonction
de la fréquence de fonctionnement une mise en parallèle
des processeurs élémentaires ACS sera nécessaire pour
implémenter les calculs. Les traitements séries sont possibles
pour de faible fréquences et par la suite 16 ou 32 ACS double en
parallèle permettent de traiter les fréquences plus élevées.
Ensuite suivant le nombre d'ACS choisi il faut les placer de manière
optimale pour limiter la longueur des fils d'interconnexions.
Choix de la technique de remontée des survivants
Plusieurs techniques sont possibles suivant la fréquence de fonctionnement
désirée:
-
Register Exchange, échange de registres, qui nécessite
de nombreux échanges de données entre les registres et ne
peut donc s'appliquer que pour des fréquences peu élevées
et nécessite une surface d'implémentation importante dès
que la fréquence augmente.
-
Trace-Back, chaînage arrière, son intérêt
est sa faible complexité de par l'utilisation d'une RAM. Mais le
nombre de lectures écritures séquentielles important limite,
là encore, la fréquence de fonctionnement à des fréquences
intermédiaires de l'ordre de 20Mhz.
-
Combinaison des deux méthodes précédentes, ce mode
permet de traiter de fréquences plus importantes tout en limitant
la surface.
Généricité de l'algorithme
de Viterbi