PROJET  MOCAT


 
 

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
\includegraphics[scale=0.7]{com_num.ps}

Trois opérations sont  à effectuer à l'émission.

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.

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:
 

\includegraphics[scale=0.8]{teb.ps}

 Algorithme de Viterbi

Pour expliquer l'algorithme nous allons prendre un exemple simple:
  
Figure 4: Codeur convolutif, K =3
\includegraphics[scale=0.5]{cod3.ps}

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.


  
Figure 5: Treillis, K =3
\includegraphics[scale=0.7]{treillis.ps}

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.
  $MBab= (A \oplus a) + (B \oplus b)$
soit
$MB00= (6 \oplus 0) + (3 \oplus 0)=9$
$MB01= (6 \oplus 0) + (3 \oplus 1)=10$
$MB10= (6 \oplus 1) + (3 \oplus 0)=4$
$MB11= (6 \oplus 1) + (3 \oplus 1)=5$
 
MC11(T=2) + MB(a) et MC11(T=2) + MB(b)
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. 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: 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:

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:
  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:  

Généricité de l'algorithme de Viterbi