Janvier-Mars 2004
JOSEPH J. BOUTROS
La théorie du codage possède sa propre histoire et son charme particulier puisqu’elle communique avec plusieurs
théories parmi lesquelles figurent la théorie des groupes, l’algèbre, les communications numériques et le
traitement du signal. Une grande partie des outils mathématiques datent du 19ème et du début du 20ème siècle.
Pourtant nous considérons la théorie du codage comme une partie intégrante de la théorie de l’information
fondée par Shannon en 1948. Voici les dates clefs qui ont marqué le domaine depuis la fin des années 40 :
Par manque de place, nous avons omis une dizaine d’articles intéressants. Le lecteur est prié de consulter les
références bibliographiques associées à ce chapitre.
Dans la suite de ce chapitre, nous utiliserons parfois l’expression codage de canal équivalente à celle de code
correcteurs d’erreurs. Le terme codage de canal est synonyme de la transformation appliquée à la séquence des
symboles à transmettre pour l’adapter au canal de transmission. Ainsi, le rôle du codage de canal est de protéger
les données numériques contre les erreurs introduites par le canal de transmission. Le besoin du codage de canal
augmente avec le volume important des données communiquées ou enregistrées. Une théorie fournissant de bons
codes et de bons algorithmes de codage est là pour satisfaire ce besoin. De plus, les progrès techniques des
circuits intégrés et des processeurs de traitement de signal rendent possible la réalisation de ces algorithmes.
Joseph J. Boutros 3
Nous distinguons les deux classes suivantes de codes correcteurs : les codes en blocs et les codes en treillis. La
figure 1 donne un simple résumé de la grande famille de codage. Dans la première classe à droite de la figure,
citons les codes les plus célèbres comme les codes BCH, Reed Solomon, Goppa, Golay et Hamming. La
deuxième classe à gauche de la même figure est moins riche en variété, mais présente beaucoup plus de
souplesse surtout dans le choix des paramètres et des algorithmes de décodage disponibles. Citons par exemple
les codes convolutifs binaires systématiques récursifs très utilisés dans les modulations codées (TCM). Une
troisième classe dite codes concaténés est obtenue par concaténation série, parallèle ou hybride de codes
convolutifs et de codes en blocs. Ainsi, les turbo codes classiques sont construits par concaténation parallèle de
codes convolutifs récursifs. Les codes dits produits sont le résultat de la concaténation de deux codes en blocs.
Une concaténation de plusieurs codes de parité entrelacés donne naissance aux codes à faible densité de
Gallager. Les turbo codes, les codes de Gallager ainsi que les codes produits forment un cas particulier de la
grande famille des codes de Tanner.
Les Codes Récursifs Les Codes Non Récursifs Les Codes Cycliques Les Codes Non Cycliques
Un système de communications relie, par l’intermédiaire d’un canal, une source de données à un utilisateur. Le
canal peut être un câble coaxial, une liaison radioélectrique, une fibre optique ou un support d’enregistrement
comme la bande magnétique. La figure 2 nous montre les différents blocs constituant la chaîne de transmission
numérique. La source fournit de l’information sous forme de symboles. Les symboles appartiennent à un certain
m
alphabet A. Par exemple, l’alphabet binaire est A={0,1}. L’ensemble A est le plus souvent constitué de q=p
éléments, où p et m sont deux entiers naturels. q est le cardinal de l’alphabet.
Les symboles provenant de la source d’information sont traités par un codeur de source. Ce dernier permet de
représenter les données de façon plus compacte (compression de données). A la sortie du codeur de source, les
symboles sont groupés en blocs que l’on appelle mots de source. Les symboles sont ensuite traités par le codeur
de canal qui transforme la séquence des symboles formant le mot de source en une séquence appelée mot de
code.
4 TMC 2004 – Brique ADC
Le mot de code est une nouvelle séquence de symboles plus longue que le mot de source et ayant plus de
redondance. Le modulateur placé après le codeur de canal convertit chaque symbole du mot de code en un signal
analogique choisi dans un ensemble fini de signaux. La suite des signaux analogiques est transmise sur le canal.
Les signaux reçus diffèrent des signaux émis à cause du bruit et des distorsions rencontrées sur le canal. Le
démodulateur effectue une opération de détection en transformant les signaux reçus en une suite de symboles.
Un symbole détecté est la meilleure estimation faite par le démodulateur du signal émis. Le démodulateur
commet parfois des erreurs d’estimation puisque le signal reçu est entaché de bruit. La séquence des symboles
après démodulation s’appelle mot reçu. Les erreurs font que les symboles du mot reçu ne ressemblent pas
toujours à ceux du mot de code.
Le décodeur de canal utilise la redondance contenue dans un mot de code pour corriger les erreurs dans le mot
reçu et fournir une estimation du mot de source. L’estimation est égale au mot de source si le décodeur de canal
arrive à corriger toutes les erreurs. Enfin, le décodeur de source délivre l’information à l’utilisateur en inversant
l’opération du codeur de source.
Nous nous limiterons dans le cadre de ce chapitre à l’étude du codeur et du décodeur de canal. Sans aucune
ambiguïté, puisque les sujets de modulation et de codage de source ne seront pas abordés dans cette étude, nous
parlerons de codeur et de décodeur.
Le modèle de la figure 2 est ainsi valable pour tous les systèmes de transmission mobile de 2ème et 3ème
générations : GSM, IS-95, UMTS, EDGE, Iridium, Skybridge, Globalstar. Sachant que la plupart de ces
systèmes utilisent une modulation QPSK ou un équivalent de cette modulation, nous limitons l’étude des
performances des codes correcteurs d’erreurs sur un canal véhiculant des signaux issus d’une modulation BPSK
( théoriquement équivalente à la QPSK). L’énergie passe-bande moyenne par bit d’information est notée Eb.
L’énergie moyenne par bit codé, associée aux symboles BPSK, est notée Ec. Nous utiliserons le rapport signal-à-
bruit Eb/No, où No/2 est la densité spectrale du bruit passe-bande. Le taux de codage R sera défini au paragraphe
suivant où le codeur lit k bits d'information et fournit n bits codés. D’où la relation Ec=REb. Le rendement R est
équivalent au nombre de bits émis par dimension de la modulation. Il est majoré supérieurement par la capacité
du canal au sens de Shannon, donnée par la théorie de l’information.
La nature de l’interface reliant le démodulateur au décodeur de canal a une influence directe sur la qualité de la
transmission et permet de distinguer deux types de décodage :
1- Le décodage à décisions fermes, dit décodage hard. Le démodulateur fournit au décodeur la valeur des
symboles détectés. Ainsi, le canal équivalent vu par le codage de canal englobant le modulateur, le vrai
canal et le démodulateur est modélisé par un seul bloc à entrée discrète et à sortie discrète appartenant à
l’alphabet des symboles. Par exemple, dans le cas binaire, le codeur et le décodeur entourent un canal
binaire symétrique (BSC) illustré figure 3. Le canal BSC est caractérisé par ses probabilités de transition
p(0/0)=p(1/1)=1-p et p(0/1)=p(0/1)=p, où la probabilité d’erreur est définie par [48]
Joseph J. Boutros 5
2 Ec
p = Q
N0
+∞
+ 2Ec
1-p
0 0 0
p
1 1 1
1-p
− 2Ec
-∞
Canal BSC Canal gaussien
2- Le décodage à décisions souples, dit décodage soft. Le démodulateur fournit au décodeur la probabilité a
posteriori des symboles détectés ou leurs valeurs de confiance. Ainsi, le canal équivalent est un canal
gaussien à entrée binaire ± 2 E c et à sortie réelle prenant toutes les valeurs entre -∞ et +∞, selon une loi
gaussienne. La sortie du canal gaussien est décrite par l’échantillon reçu r=I+b où I est le symbole de la
modulation BPSK et b est un bruit réel additif blanc gaussien de variance N0. En présence
d’évanouissements dus aux trajets multiples, le canal gaussien est remplacé par un canal de Rayleigh à
évanouissements indépendants décrit par r=αI+b, où l’évanouissement réel positif suit la loi de probabilité
-α2
p(α)=2α e .
Les performances du décodage à décisions souples dépassent largement celles du décodage à décisions dures.
Généralement, l’absence de valeurs de confiance à l’entrée du décodeur génère une perte de 2 à 3 dB environ sur
un canal gaussien et beaucoup plus sur un canal de Rayleigh (la valeur exacte dépend de l’ordre de diversité).
Les limites théoriques du décodage dur et du décodage souple sont fixées par la capacité du canal BSC et du
canal gaussien respectivement. La Figure 4 présente la capacité de différents canaux exprimés en bits/dimension
en fonction du rapport signal-à-bruit Eb/N0 exprimé en décibels (dB). D’après les courbes de capacité, il n’existe
aucun code capable de faire tendre le taux d’erreur vers 0 si Eb/N0 est inférieur à –1.6dB (en soft ) et +0.4dB (en
hard). Les mêmes courbes nous renseignent aussi sur la valeur minimale du rapport signal-à-bruit pour un
rendement fixé, e.g. (Eb/N0 )min = 0.2dB pour R=0.5 bit d’information/dimension sur un canal gaussien. La perte
en capacité avec et sans évanouissements est de l’ordre de 2.5 dB pour les grandes valeurs de l’efficacité
spectrale (R>1.0).
2.0
1.0
0.0
-2 -1 0 1 2 3 4 5 6 7 8
Eb/N0 (dB)
Les symboles d’un code correcteur d’erreurs appartiennent à un alphabet fini A ayant q éléments. Dans la
majorité des cas, cet alphabet fini est mathématiquement muni de la structure d’un corps. Ainsi, l’alphabet
contient un élément neutre 0 pour l’opération d’addition + et un élément neutre 1 pour l’opération de
-1
multiplication ×. Tout élément β de A admet un opposé -β, et tout élément non nul de A admet un inverse β .
Ce corps fini à q éléments sera noté GF(q) dans la suite de l’exposé (GF pour Galois Field).
m
La taille de l’alphabet GF(q), résultat direct de l’algèbre des corps de Galois, est de la forme q=p , avec p
premier et m entier positif. p est la caractéristique du corps et pour tout élément β du corps, la somme β +β
+...+β (p fois) est nulle. Tout corps GF(q) admet au moins un élément primitif α qui génère le groupe
multiplicatif GF(q)-{0}. Ainsi, tout élément non nul s’écrit comme une puissance de l’élément primitif. L’ordre
q-1 i
de α est égal à q-1, i.e. q-1 est le plus petit entier tel que α =1. L’ordre d’un élément β=α est égal à (q-
1)/pgcd(q-1,i). Un résultat dérivé des propriétés des corps finis et très utile pour l’étude des codes cycliques est
la factorisation :
x q −1 − 1 = ∏ (x − β )
β ∈GF ( q )−{0}
La construction des corps de Galois GF(q) se base sur l’anneau des entiers Ζ ou sur l’anneau des polynômes
m
GF(p)[x]. Notons que GF(p) est le plus petit sous-corps de GF(q) lorsque q=p .
Considérons l’ensemble des q entiers {0,1,...,q-1}. Munissons cet ensemble d’une addition et d’une
multiplication modulo q. On obtient un anneau quotient, noté Ζ/qΖ. L’anneau quotient Ζ/qΖ est un corps si et
seulement si q est un nombre premier. Dans ce cas, Ζ/qΖ est égal à GF(q) (q=p et m=1) puisque deux corps finis
ayant le même nombre d’éléments sont isomorphes.
La construction de GF(q) à partir de Ζ/qΖ n’est pas très intéressante, il est plus utile de construire les corps de
Galois à partir des anneaux de polynômes. En effet, soit p(x) un polynôme premier de degré m de GF(p)[x]. Ce
dernier est l’anneau des polynômes à coefficients dans GF(p). Nous pouvons construire le corps quotient
m m
GF(p)[x]/p(x), qui contient p éléments (p polynômes de degré inférieur ou égal à m-1). Ce corps n’est autre
m m
que GF(p ) puisqu’il est d’ordre fini p . Lorsque le monôme x est un élément primitif, le polynôme irréductible
p(x) est dit polynôme primitif. Nous décrivons ci-dessous la construction des corps GF(4), GF(8) et GF(16),
extensions du corps de base GF(2). Notons que tous les systèmes de télécommunications utilisent une
représentation binaire ou issue du binaire ce qui limite l’intérêt pratique des corps de Galois au cas p=2.
Rappelons que le corps GF(2) est constitué des deux éléments 0 et 1 où les opérations se font modulo 2.
Construction de GF(4) :
2
q=4 p=2 m=2 p(x)=x +x+1
GF(4)=GF(2)[x]/p(x) où toutes les opérations s’effectuent modulo p(x)
0 1 2 3 2
GF(4)={0, α =1, α =x, α =x+1} et on a x +1=(x+1)(x +x+1)
Construction de GF(8) :
3
q=8 p=2 m=3 p(x)=x +x+1
GF(8)=GF(2)[x]/p(x) où toutes les opérations s’effectuent modulo p(x)
0 1 2 2 3 4 2 5 2 6 2
GF(8)={0, α =1, α =x, α = x , α = x+1, α = x +x, α = x +x+1, α= x +1} et on a
7 3 3 2
x +1=(x+1)(x +x+1)(x +x +1)
Construction de GF(16) :
4
q=16 p=2 m=4 p(x)=x +x+1
GF(16)=GF(2)[x]/p(x) où toutes les opérations s’effectuent modulo p(x)
0 1 2 2 3 3 4 5 2 6 3 2 7 3 8 2 9 3
GF(16)={0, α =1, α =x, α =x , α =x , α =x+1, α =x +x, α =x +x , α =x +x+1, α =x +1, α =x +x,
10 2 11 3 2 12 3 2 13 3 2 14 3 15 2 4
α =x +x+1, α =x +x +x, α =x +x +x+1, α =x +x +1, α =x +1} et on a x +1=(x+1)(x +x+1)(x +x+1)(
4 3 4 3 2
x +x +1)( x +x + x +x+1)
La recherche des polynômes primitifs utilisés dans la construction des corps de Galois, mais aussi pour la
génération des séquences pseudo-aléatoires ainsi que pour la construction des codes récursifs constituant les
Joseph J. Boutros 7
turbo codes, s’effectue de deux façons différentes : un tirage aléatoire suivi d’un test de primalité, ou une
n
factorisation du polynôme x +1 par la méthode de Berlekamp ou Cantor-Zassenhaus.
L’étude de la structure d’un code correcteur et son décodage à décisions dures sont effectués dans l’espace
n
GF(q) muni de la distance de Hamming. Cette distance est égale au nombre de composantes différentes entre
deux vecteurs de longueur n :
n
d H ( x, y ) = ∑ d H ( xi , yi ) = nombre de xi ≠ yi
i =0
Considérons par exemple les deux vecteurs quaternaires (q=4) de longueur 5, x=(1, 2, 0, 0) et y=(1,2,3,3). Dans
ce cas, la distance de Hamming dH(x,y) est égale à 2. Remarquons que dH(x,y)=dH(x-y,0). Par suite, nous
définissons le poids de Hamming WH(x) d’un mot x
W H ( x) = d H ( x,0) = nombre de xi ≠ 0
e.g. le mot binaire (q=2) de longueur 5, x=(1,1,00,1) est de poids de Hamming 3.
Les codes linéaires sont décrits de trois manières différentes. Après la définition des principaux paramètres d’un
code au premier sous-paragraphe, les codes en blocs linéaires seront décrits comme des espaces vectoriels
contruits à partir d’un corps de Galois. Ce sous-paragraphe repose donc sur des outils simples d’algèbre linéaire.
Une classe particulière de codes linéaires dits codes cycliques est étudiée au troisième sous-paragraphe En effet,
la contrainte de cyclicité ajoutée à celle de linéarité engendre une famille très efficace de codes correcteurs. La
description matricielle est remplacée par une description polynômiale. Enfin, le quatrième sous-paragraphe
étudie une description graphique d`un code en blocs. L’outil graphique s’avère parfois très puissant et
s’appliquera aussi aux codes convolutifs de longueur infinie.
Nous exposons de façon très directe et concise la plupart des paramètres associés à un code en blocs. Les
définitions et les théorèmes présentés ne constituent en aucun cas un exposé complet sur les codes qui
nécessiterait des milliers de pages.
Ainsi, selon la définition ci-dessus, un code est une application bijective qui associe à chaque vecteur formé de k
symboles q-aires (k symboles d’information), un vecteur image de longueur n avec des composantes dans le
même alphabet (n symboles codés). Le code ajoute au débit initial n-k symboles supplémentaires. La quantité
k
R = bits d’info/bits codés
n
n’est autre que le rendement de C, appelé aussi taux de codage. L’opération de codage en blocs est sans
mémoire, i.e. les blocs sont codés de manière indépendante sans aucune corrélation entre deux blocs consécutifs.
Les deux paramètres n et k sont respectivement appelés la longueur et la dimension du code C. Sauf quelques
exceptions rares, l’alphabet du code est un corps de Galois GF(q) appelé le corps des symboles. Souvent, les
codes sont binaires et le corps des symboles est le simple ensemble GF(2)={0, 1}. Dans la suite de ce chapitre,
un code en blocs C respectant la définition 1 sera noté [n,k]q.
8 TMC 2004 – Brique ADC
k
Exemple : Considérons le code de Hamming binaire [7, 4]2, où n=7, k=4, q=2. Le code contient q =16 mots de
code de longueur 7 bits chacun. Voici la liste des mots de code :
Le code [7, 4]2 de l’exemple précédent est linéaire. En effet, c’est un sous-espace vectoriel de dimension 4 de
7
l’espace GF(2) : le mot 0=(0000000) appartient au code et la somme de deux mots de code appartient également
au code.
L’ajout de la contrainte de linéarité pourrait nuire à la qualité du code recherché, mais heureusement l’étude des
performances d’ensemble montre que les codes linéaires sont très proches des meilleurs codes en blocs. Ainsi, la
linéarité facilite l’étude des codes en blocs et permet l’utilisation d’outils algébriques très puissants, sans réduire
la classe des codes linéaires à une classe inefficace. Nous supposons que le lecteur est capable de déduire
plusieurs caractéristiques des codes linéaires à partir des propriétés algébriques des espaces vectoriels et des
groupes sous-jacents.
Lorsque le code est linéaire, il est clair que la distance minimale est égale au poids de Hamming minimal car
dH(x,y)=dH(x-y,0)=WH(x-y). En plus la distribution des distances autour du mot 0 sera parfaitement identique à
la distribution des distances autour de n’importe quel mot de code non nul. Le code en blocs linéaire devient
ainsi un ensemble géométriquement uniforme dans l’espace de dimension n.
Toujours dans l’exemple précédent, la distance minimale du code [7,4] est égale à 3. Le lecteur vérifiera que tous
les mots diffèrent de 3 symboles au moins, ou de manière équivalente, que le poids minimal est égal à 3. En
général, un code [n,k]q de distance minimale d sera noté [n,k,d]q.
Sachant que les mots de code les plus proches sont espacés de dHmin, nous pouvons introduire un nombre ν
d’erreurs (modifier ν symboles dans le mot) en restant capable de retrouver le mot de code initial. En effet, si
ν ≤ t = [(d H min − 1) 2] , le mot modifié (le mot erroné) reste dans la boule de rayon t centrée sur le mot initial.
Le code est donc capable de corriger au maximum t symboles erronés situés dans le même mot de code. En plus,
si nous modifions au maximum dHmin-1 symboles dans le mot initial, ceci ne le transforme pas en un deuxième
mot de code. Nous sommes ainsi capable de détecter la présence au maximum de T=dHmin-1 symboles erronés
dans un même mot de code. La définition suivante en découle.
Définition 4 (Capacité)
Les deux quantités t = [(d H min − 1) 2] et T = d H min − 1 sont respectivement appelées capacité de correction et
capacité de détection d’un code correcteur d’erreurs.
La capacité de correction du code n’est pas dépassée si le nombre effectif ν d’erreurs dans le mot erroné vérifie
2ν + 1 ≤ 2t + 1 ≤ d H min . Dans certains canaux de transmission, le démodulateur informe le décodeur sur l’état
Joseph J. Boutros 9
suspect d’un symbole. Ce symbole sera déclaré effacé ou non fiable. Algébriquement, un effacement correspond
à une erreur de position connue, mais d’amplitude inconnue appartenant à GF(q). Une erreur au sens exact a une
position inconnue et une amplitude inconnue appartenant à GF(q)-{0}. Il est évident que la capacité d’un code à
remplir des effacements est égale à sa capacité de détection. En combinant les deux capacités
(correction+effacement), nous pouvons dire que la capacité totale d’un code n’est pas dépassée si
2ν + ρ + 1 ≤ d H min
où ν est le nombre d’erreurs et ρ est le nombre d’effacements. Un décodeur capable de corriger des erreurs et de
remplir des effacements à la fois présente des meilleurs performances qu’un décodeur sans effacement
(purement hard). Cependant, il reste moins efficace qu’un décodeur à entrée souple qui prend ses décisions selon
la métrique euclidienne calculée entre le mot reçu et tous les mots de code.
Selon la définition ci-dessus, nous avons G=[gij], 1 ≤ i, j ≤ n , gi=[gi1,gi2,...,gin]. Soit u=(u1,u2,...,uk) le mot
d’information, i.e. le vecteur contenant les k symboles d’information. Alors nous pouvons écrire la relation
matricielle liant le mot de code c et le mot d’information u :
c = uG
La matrice génératrice d’un code systématique est de la forme G=[I|P], où I est la matrice identité k×k et P est
une matrice de type k×(n-k) qui dépend du code. Cette forme systématique de la matrice G peut être obtenue à
partir de n’importe quelle forme non-systématique sans modifier le code linéaire C, tout simplement en
appliquant des permutations de colonnes et des opérations dans GF(q) sur les lignes. Par la suite, nous pouvons
dire que tout code en blocs linéaire est équivalent à un code systématique.
Exemple : Rappelons que la base d’un espace vectoriel n’est pas unique, d’où la possibilité d’avoir plusieurs
matrices génératrices pour un même code C. Une base possible du code [7, 4, 3]2 est formée de 4 vecteurs bien
choisis dans la table 1. Ainsi, nous construisons comme exemple deux matrices génératrices où la deuxième est
sous forme systématique :
0 0 0 1 0 1 1 1 0 0 0 1 0 1
0 0 1 1 1 0 1 0 1 0 0 1 1 1
G1 = G2 =
0 1 1 0 0 0 1 0 0 1 0 1 1 0
1 1 1 1 1 1 1 0 0 0 1 0 1 1
Exemple : Les matrices de parité associées aux deux matrices génératrices G1 et G2 du code [7,4,3]2 sont
1 1 1 0 1 0 0
H 1 = H 2 = 0 1 1 1 0 1 0
1 1 0 1 0 0 1
Le théorème ci-dessus s’applique facilement à la matrice de parité du code [7,4]2 pour vérifier que la distance
minimale est égale à 3. Ce code est donc capable de corriger 1 bit erroné sur les 7 bits constituant un mot.
⊥ n
Considérons maintenant l’ensemble C des mots de GF(q) qui vérifient
n
< x, y >= ∑ xi y i = 0 ∀x ∈ C et y ∈ C ⊥
i =1
⊥
Il est trivial de montrer que C est un code. Ce code est le complément orthogonal de C, ou le dual de C. Il
n
contient donc tous les mots de GF(q) orthogonaux (produit scalaire nul) aux mots du code C. Si G
(respectivement H) est la matrice génératrcie (respectivement de parité) du code C [n,k]q, alors H
⊥
(respectivement G) est la matrice génératrice (respectivement de parité) du code C . Ceci prouve que le code
⊥ n
dual est un code de longueur n et de dimension n-k, i.e. C [n,n-k]q. Notons enfin que l’espace entier GF(q)
n’est pas nécessairement la somme directe de C et de son dual, ceci est toujours vrai dans le corps des
complexes mais non vrai dans les corps finis.
Dans la famille des codes linéaires, il existe une classe très importante, celle des codes en blocs linéaires et
cycliques. Dans un code cyclique, toute opération de décalage cyclique appliquée à un mot de code fournit un
autre mot de code. La représentation vectorielle et matricielle des codes linéaires est remplacée par une
représentation polynômiale. En effet décaler un mot de code d’une case revient à multiplier le polynôme par
n
l’indéterminée x et prendre le reste modulo x -1. Ainsi, il suffit d’additionner ou de multiplier des polynômes
n n
tout en restant dans l’anneau quotient modulo x -1, i.e. l’anneau GF(q)[x]/(x -1). Voici la définition exacte d’un
code cyclique.
La définition ci-dessus se traduit par les deux propriétés suivantes vérifiées par un code cyclique :
n
− C est un sous-groupe additif de GF(q)[x]/(x -1).
n
− si c(x)∈C et a(x)∈GF(q)[x]/(x -1), alors a(x)c(x)∈C.
4. Tout c(x)∈C s’écrit de manière unique c(x)=u(x)g(x) dans GF(q)[x], avec deg(u(x))<n-r et r=deg(g(x)). La
dimension de C est égale à n-r, i.e. r=deg(g(x))=n-k.
r
5. Si le polynôme générateur est donné par g(x)=g0+g1x+...+grx , alors le code C est généré comme sous-
n
espace de GF(q) par la matrice :
g r ... g1 g0 0 x n−r −1 g ( x)
... ...
= ...
G=
0 gr ... g1 g0 0 xg ( x)
0 gr ... g1 g 0 g ( x)
Preuve.
1. Soit g(x) le polynôme non nul de C de degré minimal r. Nous pouvons toujours transformer g(x) en un
polynôme unitaire en inversant le coefficient dominant. Supposons qu’il existe un deuxième polynôme
unitaire f(x) de degré minimal r. La différence g(x)-f(x) appartient à C et a un degré inférieur à r. Ceci
contredit le fait que r est minimal. Donc g(x) est unique.
2. Soit c(x)∈C. Par division euclidienne, nous pouvons écrire c(x)=u(x)g(x)+r(x) avec deg(r(x))<deg(g(x)).
Mais r(x)=c(x)-u(x)g(x) )∈C. Ceci est une contradiction sauf si r(x)=0.
n n
3. Ecrivons x -1=h(x)g(x)+r(x) dans GF(q)[x], avec deg(r(x))<deg(g(x)). En se plaçant dans GF(q)[x]/(x -1)
nous obtenons r(x)=-h(x)g(x)∈C. Donc r(x)=0.
n
4 et 5. D’après 2., tout mot de code c(x) est de la forme c(x)=u(x)g(x) dans l’anneau quotient GF(q)[x]/(x -1).
Mais deg(c(x))<n et la même expression reste donc valable dans GF(q)[x]. Ainsi, le code est formé de tous
n-r-1
les polynômes multiples de g(x). Les n-r mots g(x),xg(x),...,x g(x) sont linéairement indépendants et
génèrent tous les mots de code. Ils forment donc les lignes de la matrice génératrice. La dimension du code
est égale à k=n-r.
CQFD.
t
La nullité du produit de convolution se traduit par cH =0. H est bien la matrice de parité du code C. En
comparant avec la forme de G dans le théorème, nous concluons que h(x) est le polynôme générateur du code
dual si les symboles sont lus à l’envers. C’est-à-dire que h(x) est le polynôme générateur d’un code équivalent à
C⊥ et que C⊥ est un code cyclique. Sinon, en gardant les symboles du code dans le même ordre mais en
k -1
inversant les coefficients de h(x), nous pouvons dire que C est généré par le polynôme x h(x ). CQFD.
12 TMC 2004 – Brique ADC
Définition 10 (Syndrome)
n
Soit C [n,k]q un code linéaire. Soit v=(vn-1,...,v1,v0)=v(x) un mot quelconque de GF(q) ou de GF(q)[x]. Nous
appelons syndrome de v :
1. Code linéaire de matrice de parité H. Syndrome matriciel :
t
le vecteur s=(sn-k-1,...,s1,s0)=vH
2. Code cyclique de polynôme générateur g(x). Syndrome polynômial :
n-k-1
le polynôme s(x)= sn-k-1x +...+s1x+s0=v(x)modulo g(x)
3. Code cyclique où β1,β2,...,βn-k ∈GF(q) sont les n-k racines de g(x), GF(q)⊂GF(Q). Syndrome algébrique :
les n-k quantités Sj=v(βj) ∈GF(q), j=1,2,...,n-k.
Les syndromes sont utilisés dans les algorithmes de décodage à décisions dures d’un code en blocs. En effet, si
t t t t
v=c+e, où c est un mot de code et e un vecteur d’erreur, alors s=vH =cH +eH =eH . Le syndrome ne dépend que
de l’erreur et pourra être utilisé pour déterminer e. De la même façon, sachant que c(x)=0 modulo g(x) et que
c(βj)=0, losrque v(x)=c(x)+e(x) on a s(x)=e(x) modulo g(x) et Sj=e(βj). Les algorithmes à décisions souples
n’utilisent pas les syndromes. D’ailleurs la notion d’erreur (en sortie du canal) n’existe plus dans ce type
d’algorithmes car l’entrée du décodeur est représentée par des nombres réels.
Depuis l’invention des turbo codes en 1993, nous groupons les codes en blocs et les codes convolutifs dans une
même classe. La plupart des algorithmes récents de codage et de décodage blocs et convolutifs, ainsi que la
description de la structure des codes sont très similaires. Tout code convolutif est facilement convertible en un
code en blocs par troncature ou par terminaison de son treillis. Ceci est souvent le cas dans les systèmes de
transmissions radiomobiles et cablés où l’information est organisée par paquets. Dans la suite de cet exposé,
nous limitons notre étude aux codes convolutifs linéaires binaires, i.e. définis sur le corps GF(2). La
généralisation des résultats aux codes non binaires est immédiate.
La construction des codes convolutifs est directement inspirée de la structure des codes en blocs linéaires
cycliques. Considérons la matrice génératrice suivante :
1 1 1 0 1 1 L
1 1 1 0 1 1
G= 1 1 1 0 1 1 L
1 1 1 0 1 1
M M M
La matrice G est de taille infinie. Elle s’obtient en décalant d’une ligne à l’autre le motif 11 10 11 de 2 colonnes.
Sa forme ressemble à celle d’un code cyclique défini au théorème 2. Cette matrice génère un code linéaire
binaire de longueur infinie et de dimension infinie dont le rendement est égal à ½. En effet, le codeur associé à G
se réalise facilement à l’aide d’un registre à décalage de mémoire 2, 5 connexions et 2 additionneurs. La figure 1
montre la structure de ce codeur.
Joseph J. Boutros 13
s1
e T T
s2
Figure 1 : Codeur convolutif (7,5) non récursif non systématique, R=1/2, L=3.
Il est possible de généraliser la forme de la matrice G en remplaçant le motif 11 10 11 par une sous-matrice
binaire de k lignes et de n×L colonnes. Des copies de cette sous-matrice sont placées tout le long de la diagonale
de G avec des décalages de n colonnes. Le code linéaire binaire infini de rendement R=k/n défini par G est
appelé code convolutif et nécessite k registres à décalage. L’exemple de la figure 1 correspond à un code
convolutif non systématique. Le code est non récursif car les bits de sortie ne sont pas réinjectés dans le registre
à décalage. La longueur du registre à décalage, notée L, est dite longueur de contrainte. Nous appelons mémoire
du code la quantité ν=L-1.
L’entrée du codeur convolutif est formée de k bits à un instant donné, ou de k séquences infinies pour t=0...+∞.
Les k entrées binaires du codeur sont indexées par i, où i=1...k. La séquence infinie associée à une des entrées
s’écrit comme une série en x, où x symbolise un retard d’une période T. Les coefficients de la série sont les bits
de l’entrée correspondante.
+∞
ei ( x) = ∑ eil x l i=1..k
l =0
Le coefficient eil est le bit présent à l’entrée numéro i du codeur à l’instant l . De la même façon les n sorties
binaires du codeur sont indexées par j et s’écrivent comme une série en x.
+∞
s j ( x) = ∑ s jl x l j=1..n
l=0
Nous définissons le polynôme générateur gij(x) qui lie l’entrée i à la sortie j. Le polynôme gij(x) est de degré
inférieur ou égal à L-1. Le coefficient d’indice r du polynôme est égal à un 1 si une connexion existe entre la
sortie j et le r-ième bit du ième registre du codeur. Le code de la figure1 est défini par deux polynômes
2 2
générateurs g1(x)=1+x+x et g2(x)=1+x . L’indice i est souvent omis lorsque k=1. La notation octale est utilisée
2 2
fréquemment, e.g. 1+x+x est remplacé par 7 et 1+x par 5, d’où la notation concise (7,5) qui intègre tous les
paramètres du code. Les sorties se calculent en fonction des entrées à l’aide des polynômes générateurs gij (x) :
k
s j (x ) = ∑ ei ( x) g ij ( x) j=1...n
i =1
Soient E et S les vecteurs définis par
E=[e1(x),e2(x),...,ek(x)] et S=[s1(x),s2(x),...,sn(x)]
Le vecteur de sortie s’exprime en fonction du vecteur d’entrée :
S=EG
où G est la matrice génératrice définie par
14 TMC 2004 – Brique ADC
e s1
T T s0
De manière similaire à un code NRNSC, la sortie d’un codeur convolutif RSC à l’instant t dépend de l’entrée à
l’instant t et de l’état du codeur défini par le contenu de son registre. Quelque soit la valeur de k, un seul registre
suffit pour la construction du codeur (construction dite canonique). Un code RSC ajoute un seul bit de parité aux
k bits d’information de l’entrée, i.e. R=k/(k+1). L’exemple de la figure 2 montre un code RSC à 4 états. Le cas
d’un code RSC avec k et ν quelconques se déduit aisément :
Etat du codeur = ν
ν
Nombre des états = 2
Une transition = k bits
k
Nombre des transitions par état = 2
k ν k+ν
Nombre total des transitions = 2 ×2 =2
Le code RSC est défini par n=k+1 polynômes générateurs, g0(x), g1(x),...,gk(x) :
k g ( x)
si ( x) = ei ( x ) i = 1...k et s0 ( x) = ∑ i ei ( x)
i =1 g 0 ( x )
L’idée d’une représentation graphique d’un code convolutif provient des caractéristiques markoviennes de la
sortie du codeur. Les graphes équivalents à la représentation polynômiale sont souvent plus faciles à manipuler
et permettent de dériver des résultats plus puissants. Tout code convolutif est représenté par trois graphes
équivalents mais différents : l’arbre du code, le treillis du code et le diagramme d’états.
Joseph J. Boutros 15
L’arbre est un graphe de hauteur et de largeur infinies. Un noeud dans l’arbre représente un état possible du
codeur. Une branche symbolise une transition d’un état à l’autre. Classiquement l’arbre commence à son sommet
par l’état 0 (le registre à décalage est initialisé à 0). Tout chemin dans l’arbre du code est une séquence possible
(un mot de code) à la sortie du codeur convolutif. Le treillis est obtenu en repliant l’arbre sur sa largeur. Le
diagramme d’états est à son tour construit en repliant le treillis sur sa longueur.
Incontestablement, le treillis est l’outil graphique le plus performant pour caractériser un code et concevoir des
algorithmes de décodage. Nous illustrons ci-dessous le treillis des deux codes NRNSC (7,5) et RSC (1,5/7) à 4
états.
Cas du code NRNSC R=1/2, g1=7 g2=5 : notons a=00, b=01, c=10, d=11 les 4 états possibles du codeur
convolutif. Les deux bits constituant l’indice de l’état ne sont autres que les deux bits contenus dans le registre à
décalage. Supposons que le codeur est dans l’état a à l’instant t=0. Deux transitions partent de l’état a, la
première a → a correspond à une entrée e=0 et une sortie s=00 ; la seconde a → c correspond à une entrée e=1 et
une sortie s=11. Ces deux transitions restent valables à n’importe quel instant t dans le treillis.
De la même façon, deux transitions partent de l’état c, la première c → b est produite par une entrée e=0 et
génère une sortie s=10 ; la deuxième c → d correspond à e=1 et s=01. Ce raisonnement permet de dessiner le
treillis du code NRNSC entre t=0 et t=+∞. Notons que le treillis devient périodique à partir de la 3ème étape où
l’on retrouve les 8 transitions entre les 4 états. En général, le treillis d’un code convolutif devient répétitif après
L=ν+1 étapes. Le treillis illustré figure 3 indique les deux bits de sortie sur chaque branche. La valeur de l’entrée
est occultée puisqu’une branche descendante correspond à e=1 et une branche montante à e=0.
Etats
00 00 00 00 00
a=00
11 11 11 11 11
11 11 11
b=01
00 00 00
10 10 10 10
c=10
01 01 01 01
01 01 01
d=11
10 10 10
Les mots du code (7,5) sont tous les chemins possibles dans le treillis. Il est facile de vérifier que le code est
linéaire, i.e. le chemin 00...0 appartient au treillis et la somme de deux chemins est un troisième chemin dans le
treillis.
Le chemin a → c → b → a possède le poids de sortie minimal WHmin=5. Nous en déduisons que la distance
minimale dHmin (aussi appelée distance libre dfree) du code convolutif (7,5) est égale à 5.
Cas du code RSC R=1/2, g0=7, g1=5 : les 4 états a, b, c, d sont notés de manière similaire à ceux du code
NRNSC. La structure du treillis est parfaitement identique : deux branches arrivent et partent de chaque état. Le
treillis devient périodique à la 3ème étape, lorsque toutes les transitions sont tracées. La différence entre le code
récursif et non récursif réside dans l’étiquetage binaire des branches. En effet, sachant que le code RSC est
systématique, le 1er bit de sortie est égal à l’entrée. Ainsi les deux bits associés à une branche du treillis de la
figure 3 représente toujours les deux bits de sortie et la valeur de l’entrée est contenue dans le 1er bit. Par
exemple, la transition c → b correspond à e=1 et à s=10.
Remarquons que la distance minimale de ce code RSC est elle aussi égale à 5 et se déduit du chemin a → c → b
→ a. Une entrée non nulle permet de quitter l’état 0 dans les deux cas récursifs et non récursifs. En revanche,
une entrée nulle n’est pas suffisante pour revenir à l’état 0 dans le cas du code RSC, e.g. le retour b → a est
généré par e=0 pour le code NRNSC, et par e=1 pour le code RSC.
16 TMC 2004 – Brique ADC
Deux grandeurs probabilistiques permettent de juger de la qualité de service d’un système de communications
numériques : la probabilité d’erreur par mot de code Pew et la probabilité d’erreur par bit Peb. Les meilleurs
critères d’optimisation appliqués par les décodeurs reviennent à minimiser Pew ou Peb. L’optimisation de Peb est
souvent plus difficile et peut s’effectuer dans certains cas particuliers où la probabilité a posteriori (APP) d’un bit
est accessible. L’algorithme Forward Backward présenté au paragraphe 5 est capable d’évaluer l’APP d’un bit
lorsque le code est représentable par un treillis de complexité raisonnable. Les performances estimées ci-dessous
se limitent au cas d’un décodage minimisant la probabilité d’erreur par mot. En effet, la minimisation de Pew est
équivalente à la maximisation de la probabilité a posteriori par mot p(c|r). Ce critère est nommé critère MAP,
Maximum a Posteriori. En ajoutant l’hypothèse que tous les mots de code sont équiprobables, le critère MAP se
réduit au critère ML qui consiste à maximiser la vraisemblance p(r|c).
Le critère ML utilisé par un décodeur se traduit de 3 manières différentes selon la nature du canal :
− Canal BSC :
Max p(r | c) ⇔ Min d H (r , c )
c∈C c∈C
Le décodeur optimal au sens ML minimise ainsi la distance de Hamming :
n
d H (r , c) = ∑ d H (ri ,c i )
i =1
− Canal Gaussien (AWGN) :
Max p (r | c) ⇔ Min d E (r , c)
c∈C c∈C
Le décodeur optimal au sens ML minimise ainsi la distance euclidienne :
n n 2
d E2 (r , c) = ∑ d E2 (ri ,c i ) = ∑ ri − ci
i =1 i =1
Joseph J. Boutros 17
− Canal de Rayleigh :
Max p(r | c, α ) ⇔ Min d E (r , c | α )
c∈C c∈C
Le décodeur optimal au sens ML est supposé connaître la valeur de l’évanouissement et minimise ainsi la
distance euclidienne :
n n 2
d E2 (r , c | α ) = ∑ d E2 (ri ,c i | α i ) = ∑ ri − α i ci
i =1 i =1
Dans le cas d’un code linéaire, la probabilité d’erreur par mot se calcule en supposant que le mot 00..0 a été
émis. Donc, Pew=Pe|0. En appliquant la borne de l’union P U Ai ≤ ∑ P ( Ai ) , nous pouvons écrire
i i
Pew ≤ ∑ P(0 → c ) (4.1)
c∈C −{0}
où P(0→c) est la probabilité d’erreur par paire égale à la probabilité de décoder c lorsque 0 est émis et se calcule
en supposant que les deux mots 0 et c sont séparés par un hyperplan médiateur.
Lorsque l’entrée du décodeur est ferme (canal BSC), la probabilité d’erreur par paire est majorée par la borne de
Bhattacharyya
WH ( c )
P(0 → c ) ≤ 4 p(1 − p ) (4.2)
Lorsque l’entrée du décodeur est souple (canal gaussien), la probabilité d’erreur par paire est égale à
2E
P(0 → c ) = Q RW H (c) b (4.3)
N 0
Il suffit de combiner les formules 4.1, 4.2 et 4.3 pour obtenir une borne supérieure de la probabilité d’erreur par
mot dans les deux cas de décisions dures et souples.
Le raisonnement ci-dessus montre que la distribution de poids de Hamming d’un code est nécessaire pour
estimer ses performances. Par conséquent, nous définissons les quatre fonctions énumératrices de poids suivantes
[5][45] :
1. Polynôme énumérateur de poids d’un code en blocs, A(x)
n
A(x ) = ∑ ai x i
i =0
où le coefficient ai est égal au nombre de mots de code de poids WH=i.
2. Polynôme énumérateur entrée-sortie d’un code en blocs, A(x,y)
n n
A(x, y ) = ∑ ∑ aij x i y j
i =0 j =0
où le coefficient aij est égal au nombre de mots de code de poids j correspondant à une entrée de poids i (poids
des k bits d’information).
3. Fonction de transfert d’un code convolutif, T(D)
+∞
T ( D ) = ∑ ai D i
i =0
où le coefficient ai est égal au nombre de chemins dans le treillis de poids i.
4. Fonction de transfert entrée-sortie d’un code convolutif, T(I,D)
+∞ +∞
T ( I , D) = ∑ ∑ aij I i D j
i =0 j =0
où le coefficient aij est égal au nombre de chemins dans le treillis de poids j correspondant à une entrée de poids
i.
18 TMC 2004 – Brique ADC
Le canal de Rayleigh à sortie ferme est équivalent à un canal BSC avec évanouissements. La formule 4.2 est
1
toujours valable mais avec une probabilité de transition p ≈ . Ainsi, les expressions de Peb décrites au
Eb
4
N0
sous-paragraphe précédent en fonction de p pour les codes en blocs et les codes convolutifs sont applicables.
La probabilité P(0 → c) d’un canal de Rayleigh à sortie souple est la moyenne sur toutes les valeurs des
évanouissemenents de la probabilité d’erreur par paire conditionnelle
1 1
P(0 → c ) = ∫ P(0 → c | α ) p (α )dα ≤ (4.10)
2 W (c )
α Eb H
1 + R
N 0
La borne ci-dessus nous fournit directement une majoration du taux d’erreur binaire du canal de Rayleigh à
sortie souple comme suit :
Joseph J. Boutros 19
d H min n 1
− pour un code en blocs : Peb ≤ ∑ ai i
(4.11)
n i =d H min E
1 + R b
N 0
+∞ +∞ i 1
− pour un code convolutif : Peb ≤ ∑ ∑ aij j
(4.12)
j =d H min i =1 k E
1 + R b
N 0
Exemple 1
Le système radiomobile américain IS-95, basé sur la technique d`accès multiple CDMA, utilise des codes
convolutifs binaires non récursifs à 256 états. Le premier code de rendement 1/2 et de générateurs (561,753) est
intégré à la liaison descendante. Le deuxième protège la voie montante, il est de rendement 1/3 et les générateurs
sont (557,663,711). La grande mémoire L=9 de ces deux codes leur garantit une grande distance minimale,
dHmin=12 pour le premier code et dHmin=18 pour le deuxième. La Figure 2 illustre les performances du code
(561,753) sur le canal gaussien sans évanouissements.
0
10
Borne theorique
-1
10
-2
10
Pe(bit)
Simulation
-3
10
-4
10
-5
10
-6
10
0.0 1.0 2.0 3.0 4.0
Eb/N0 (dB)
Figure 2 : Performance du code convolutif R=1/2 à 256 états de la liaison descendante du système américain IS-95,
canal AWGN.
Exemple 2
La couche physique du système GSM est dotée d'un code convolutif binaire permettant de protéger les
informations circulant sur les canaux parole et données.
Son rendement est égal à 1/2, sa longueur de contrainte 5 et ses générateurs (23,33).
Ce code à faible complexité présente une distance minimale dHmin=7. Ses performances estimées par simulation
sur ordinateur sont illustrées Figure 3 ci-dessous.
20 TMC 2004 – Brique ADC
0
10
-1
10
-3
10
Canal gaussien
-4
10
-5
10
0 1 2 3 4 5 6 7 8
Eb/N0 (dB)
Figure 3 : Performance du code convolutif R=1/2 à 16 états utilisé dans le système GSM.
5. Algorithmes de décodage.
Nous décrivons dans ce pragarphe trois algorithmes de décodage applicables aux codes en blocs et aux codes
convolutifs. Ces trois algorithmes effectuent leurs opérations sur le treillis représentant la structure du code
[1][5][48][59]. Le premier algorithme décrit ci-dessous est celui de Viterbi [28][56]. C'est un algorithme de
décodage à entrée ferme ou souple mais à sortie toujours dure. Le deuxième algorithme [3][34] du sous-
paragraphe 5.2 est un Viterbi modifié (SOVA) délivrant une sortie souple. Enfin, le dernier sous-paragraphe
présente l'algorithme Forward-Backward [1] capable de calculer la probabilité a posteriori exacte de n'importe
quel paramètre lié au treillis du code. C'est un algorithme de décodage à entrée et sortie souples. L'algorithme de
Viterbi, le SOVA et le Forward-Backward sont couramment utilisés dans les systèmes mobiles et fixes à codage
simple ou concaténé.
La description de l’algorithme de Viterbi (VA) est faite dans le cadre du décodage à maximum de vraisemblance
(à entrée ferme ou souple) des codes convolutifs. La description reste similaire pour le décodage d’une
modulation codée en treillis, d’un code en blocs à partir de son treillis ou pour la détection ML sur un canal avec
interférence entre symboles. Il suffit de modifier la définition de la métrique pour changer le décodage ou la
détection.
Soit C un code convolutif binaire de rendement R=k/n et de longueur de contrainte L. L’algorithme de Viterbi
est le moyen le plus répandu pour le décodage ML lorsque C possède un treillis de taille raisonnable, i.e. un
40 50
nombre d’états inférieur ou égal à 256. Au delà de cette limite, et même pour des treillis à 2 ou à 2 états, une
solution possible est le décodage séquentiel par l’algorithme de Fano (complexité non contrôlable à faible
Joseph J. Boutros 21
Eb/N0). Récemment (depuis 1997), le décodage itératif nous permet de décoder de manière sous-optimal des
1000
codes convolutifs variant dans le temps à 2 états. Comparativement, l’algorithme de Viterbi est de faible
complexité et il est beaucoup plus simple à décrire.
Le décodage à maximum de vraisemblance revient à chercher dans le treillis du code C le chemin le plus proche
de la séquence reçue, i.e. l’observation. La distance employée dans l’algorithme est la distance euclidienne dans
le cas soft (entrée souple) ou bien la distance de Hamming dans le cas hard (entrée ferme). Rappelons que le
k(L-1)
nombre d’états dans le treillis d'un code C non récursif est égal à 2 et que le nombre de transitions par état
k k
est 2 . Chaque noeud dans le treillis est connecté de chaque coté par 2 branches vers les noeuds antérieurs et
k(L-1) k kL
postérieurs. Le nombre total de branches entre deux étapes dans le treillis est 2 ×2 = 2 . La séquence à
décoder étant théoriquement de longueur infinie, on se limite en pratique à la recherche du chemin le plus proche
sur une fenêtre de largeur W. Les chemins manipulés dans le treillis du code sont donc de longueur W branches.
Si l’on essaie d’appliquer une méthode de décodage par recherche exhaustive, nous nous trouvons confrontés à
kL W
la recherche du meilleur chemin parmi (2 ) possibilités. La complexité d’un tel procédé est prohibitive
puisqu’elle est exponentielle en fonction de W. L’algorithme de Viterbi décrit ci-dessous apporte une grande
réduction de la complexité de la recherche.
Description du VA:
k ( L −1)
Le temps est noté par l’indice t. Un état dans le treillis est noté par st à l’instant t, où 0 ≤ st < S = 2 .
T(t,st-1,st) représente la branche à l’instant t dans le treillis associée à la transition de l'état st −1 à l'état st . La
somme des carrés des distances entre le chemin choisi dans le treillis et toute l’observation est dite métrique
cumulée d’un noeud st et elle est notée λ(t, st).
0 1
+∞ +∞
+∞ 1
+∞ +∞
2
Figure 2 : Etat de la fenêtre à l’instant 2
4
Figure 4 : Etat de la fenêtre à l’instant 9
5
Figure 5 : Etat de la fenêtre à l’instant 10
6
Figure 6 : Etat de la fenêtre à l’instant 15
L’algorithme de Viterbi (noté VA) est modifié afin de fournir à sa sortie une valeur de confiance ou de fiabilité
(équivalente à une probabilité a posteriori) associée à chaque bit décodé. La valeur des bits décodés est toujours
donnée par le chemin ayant la métrique cumulée minimale fourni par l’algorithme. Les valeurs de confiance
produites par le VA modifié sont utilisées dans le décodage à décisions souples d’un code externe. Le décodeur
interne basé sur le VA à sorties souples (noté SOVA) reçoit et fournit des valeurs souples, il se comporte ainsi
comme un dispositif amplifiant le rapport signal-à-bruit. Le SOVA améliore donc le gain en rapport signal-à-
bruit dans tout système de codage concaténé, e.g. deux codes convolutifs en série ou en parallèle, un code
Joseph J. Boutros 23
convolutif et un code en blocs, une modulation codée en treillis et un code correcteur, et enfin un code correcteur
d’erreurs suivi d’un canal avec interférence entre symboles. Le gain par rapport au VA classique varie de 1 à
4dB sur un canal gaussien sans décodage itératif. Malgré sa sous-optimalité, le SOVA présente des performances
très proches de l’algorithme Forward-Backward qui calcule de manière exacte les probabilités a posteriori (les
APPs) des bits décodés.
Pour simplifier la description du SOVA, plaçons nous dans le cas d’un code convolutif binaire de rendement 1/n.
Nous avons ainsi deux transitions partant de chaque état et deux transitions arrivant à chaque état dans le treillis.
Ce cas inclut aussi les codes convolutifs k/n obtenus par perforation d’un code 1/n. Le nombre d’états dans le
ν
treillis du code est noté S=2 où ν=L-1 est la mémoire du code.
ν
Supposons que le VA classique prend des décisions avec un délai W suffisamment grand pour que les 2
survivants convergent vers le même chemin avec une très grande probabilité. A l’instant t, l’algorithme de
Viterbi doit choisir un survivant pour l’état 0 ≤ st < S . Ceci est illustré sur la Figure 7. Le VA sélectionne le
chemin ayant la plus petite métrique cumulée. Dans le cas où le canal est un canal gaussien (AWGN) à sortie
souple, les métriques cumulées s’expriment sous la forme :
2
r − x (m) Ec t n
Mm =
2N0
=
N0
∑ ∑ (r
j =t −W i =1
ij − xij( m ) ) 2 m = 1,2
(m)
où xij est le ième bit codé à l’instant j parmi les n bits associés à une branche du chemin d’indice m arrivant à
l’état st. L’échantillon rij est l’observation en sortie du canal correspondant au bit numéro i à l’instant j. Nous
supposons que les symboles (confondus avec les bits) appartiennent à une modulation BPSK, i.e.
xij = ± 2 Ec où Ec est l’énergie moyenne par symbole codé sur fréquence porteuse. En mettant en facteur
2 Ec , nous écrivons les symboles sous la forme xij = ±1 d’où le rapport Ec/N0 apparu dans l’équation
précédente.
Avec les notations définies ci-dessus et en supposant qu’aucune information a priori n’est disponible sur les
chemins dans le treillis, la probabilité que le chemin m soit émis sachant l’observation est proportionnelle à
P( che min m / observation ) α e − M m
Nous indexons le chemin ayant la métrique cumulée minimale par m=1. Ainsi nous avons M 1 ≤ M 2 et le VA
choisit le chemin survivant numéro 1. Après normalisation par la somme des probabilités des deux cas possibles,
la probabilité de choisir le mauvais chemin survivant, à l’instant t et pour l’état st, est égale à :
e−M2 1 1
pst = − M1 −M 2
= M 2 − M1
=
e +e 1+ e 1 + e∆
avec ∆ = M 2 − M 1 ≥ 0 . La probabilité pst approche 0.5 si M2≈M1 et tend vers 0.0 si M2>>M1. L’algorithme
de Viterbi commettra des erreurs avec une probabilité pst sur les e positions où les chemins 1 et 2 ont des bits
(1) (2)
d’information différents uj ≠uj pour les positions j=j1,j2,…,je. Notez que e=2 dans la Figure 7. Les positions
(1) (2)
où uj =uj ne sont pas affectées par la sélection du survivant. Notons Wm la largeur de la fenêtre dans le
treillis où les chemins 1 et 2 arrivant à l’état st ne sont pas confondus. Ainsi, nous avons e bits d’information
différents et Wm-e bits d’information identiques.
(1)
Notons p̂ j la probabilité que le bit uj associé au chemin 1 de l’état st soit erroné. Supposons que les valeurs
ˆj =0
de p̂ j soient stockées en mémoire pour les instants passés j=t-Wm…t-1. Prenons comme valeur initiale p
(le bit décodé reste parfaitment fiable tant que les deux chemins donnent la même valeur). Sachant que
l’algorithme de Viterbi a selectionné le chemin 1, nous pouvons mettre à jours les probabilités d’erreurs des bits
différents selon la formule :
pˆ j ← pˆ j (1 − pst ) + (1 − pˆ j ) pst pour j=j1,j2,…,je
Cette équation nous fournit une approximation de la probabilité d’erreur pour le bit d’information uj. Même si le
SOVA est incapable de fournir l’APP exacte du bit uj, une valeur de confiance µj est facilement obtenue à partir
de p̂ j :
24 TMC 2004 – Brique ADC
1 − pˆ j
µ j = log 0 ≤ µ j < +∞
pˆ j
En combinant les deux équations ci-dessus, nous obtenons une formule de mise à jour des valeurs de confiance :
αµ j + ∆
1 1+ e
µ j ← f ( µ j , ∆) = log αµ j
α e∆ + e
Rappelons que la mise à jour est effectuée sur les positions j=j1,j2,…,je. Le facteur α introduit dans la fonction
f() permet d’éviter les débordements de la valeur de confiance à fort rapport signal-à-bruit. Asymptotiquement,
nous pouvons normaliser la moyenne de la valeur de confiance à 1.0 en choississant le facteur
Ec
α = 4d H min puisque l’effet dominant est déterminé par les chemins les plus proches, avec
N0
2
x ( 2) − x (1) = 8d H min Ec où dHmin est la distance minimale du code convolutif. Une approximation simple et
très pratique de la fonction f() est
f ( µ j , ∆ ) ≈ min( µ j , ∆ / α )
Cette dernière formule permet une mise à jour très rapide de la valeur de confiance sans même connaître la
valeur du rapport Ec/N0.
Nous pouvons maintenant décrire de manière générale les étapes de l’algorithme SOVA :
Stockage:
L’indice t du temps, modulo W+1
Les suites des bits décodés par décisions dures u(st)={ ut-W(st),…, ut(st)}, uj(st)∈±1 pour 0 ≤ st < S .
Les suites de valeurs de confiance µ(st)={ µt-W(st),…, µt(st)} avec 0 ≤ µ j ( st ) < +∞ pour 0 ≤ st < S .
Les valeurs des métriques cumulées λ(t, st) pour 0 ≤ st < S .
Mise à jour:
a) Etape VA classique:
Pour chaque état st, calculer λ(t, st). Stocker la métrique cumulée, le survivant et le bit décidé ut(st).
b) Etape de décision à sortie souple:
Pour chaque état st, stocker la différence des deux métriques
[ ] [
∆ = Max λ (t − 1, st −1 ) + d 2 (T (t , st −1 , st ), observation ) − Min λ (t − 1, st −1 ) + d 2 (T (t , st −1 , st ), observation ) ]
Initialiser µt(st)=+∞.
(1) (2)
Pour j=t-ν en marche arrière jusqu’à t-Wm, comparer les deux chemins convergents en st et si uj (st)≠uj (st)
alors mettre à jour les fiabilités par la formule µj(st)=f(µj(st),∆).
Sortie souple :
L’algorithme fournit une sortie ferme : le bit décodé ut-W associé au meilleur survivant de métrique minimale
λ(t, st) parmi tous les états st.
1 − pˆ t −W
L’algorithme fournit une sortie souple : la valeur souple ut-W× µt-W où µ t −W = log est la valeur de
pˆ t −W
confiance à l’instant t-W du meilleur survivant.
Signalons enfin que les µj ou les p̂ j calculées par le SOVA sont une approximation des probabilités a posteriori.
µ
e j
Si le VA fournit le bit d’information uj, alors APP(u j ) = 1 − APP(u j ) = 1 − p
ˆj = µ
.
1+ e j
Joseph J. Boutros 25
+1
+1
-1 +1 -1 +1
S états
m=1
st
m=2
-1 +1
t-W t-Wm -1 l
La plupart des algorithmes de décodage à entrées souples et fermes détermine le meilleur mot de code sans
aucune optimisation de la probabilité d’erreur des bits contenus dans l’étiquette du mot. L’algorithme Forward-
Backward calcule de manière exacte la probabilité a posteriori de chaque bit associé à un mot de code. C’est un
algorithme à entrée souple et à sortie souple applicable à n’importe quel code ayant une représentation graphique
sous la forme d’un treillis.
La figure 1 illustre le fonctionnement du Forward-Backward. L’entrée (resp. la sortie) scalaire ou vectorielle du
canal est notée Xj (resp. Yj). Le temps est noté j et varie de 0 à N. L’état de départ d’une transition est indexé par
m et celui d’arrivée est indexé par m’. L’algorithme possède trois entrées, la première recevant l’observation, la
deuxième fournit les probabilités a priori des transitions, la troisième décrit la structure du treillis. L’algorithme
délivre à sa sortie la probabilité a posteriori à l’instant j de la transition m→m’.
m temps=j m’
p(Yj |Xj)
1 1
Xj Canal Yj Algorithme σj(m,m’)
2 2
πj(m’|m)
3 3
Structure du treillis
qj(m,m’) 4 4
Sortie :
σj(m, m’) : probabilité a posteriori de la transition m→m’
( ) (
La probabilité a posteriori d’un bit xj notée APP(xj) est définie par APP x j = P x j | Y1 , Y2 ,..., YN et s’obtient )
en additionnant les APP des transitions associées à la valeur xj du bit considéré. Donc
( )
APP x j = ∑ σ j (m, m' )
m,m'| x j
26 TMC 2004 – Brique ADC
Variables :
j : temps variant de 0 à N
Sj : état dans le treillis à l’instant j
γj(m,m’)=P(Sj =m’, Yj| Sj-1=m) : la métrique de l’algorithme
j
αj(m)=P(Sj =m, Y1 ) : probabilité jointe de l’état m et des observations 1 à j
βj(m)=P( Y jN+1 | Sj =m) : probabilité des observations j+1 à N sachant l’état m.
L’algorithme procède en 4 étapes : la première étape fixe les valeurs initiales des α et des β en supposant par
exemple que l’état de départ et l’état d’arrivée sont tous les deux à 0. Le coeur de l’algorithme est constitué
d’une procédure aller et d’une deuxième procédure retour pour le calcul des α et des β. Enfin la dernière étape
évalue les probabilités a posteriori à partir des probabilités jointes α et β et de la métrique γ. Voici donc le
déroulement de l’algorithme :
Initialisation
α 0 (0 ) = 1 et α 0 (m ) = 0 ∀m ≠ 0
β N (0) = 1 et β N (m ) = 0 ∀m ≠ 0
Procédure Aller
α j (m' ) = ∑ γ j (m, m' )α j −1 (m) j = 1...N
m
Procédure Retour
β j (m) = ∑ γ j +1 (m, m' ) β j +1 (m' ) j = N − 1...0
m'
Calcul de l’APP
σ j (m, m' ) = α j −1 (m) γ j (m, m' ) β j (m' )
La métrique de l’algorithme Forward-Backward se calcule par le produit :
γ j (m, m' ) = q j (m, m' ) π j (m' | m) p (Y j | X j )
Les premiers codes dits concaténés ont été proposées par Forney à la fin des années 60 et s'obtiennent par la
mise en cascade de deux codes correcteurs d'erreurs. Le premier code est dit code externe et le deuxième se
nomme code interne. Un exemple très célèbre est celui du code Reed-Solomon [255,223]256 (externe) concaténé
avec un code convolutif (interne) R=1/2 à 64 états. Ce code longtemps utilisé dans les systèmes de transmission
spatiale de la NASA sera remplacé par un turbo code ayant des meilleures performances pour un rapport signal-
à-bruit inférieur à 1dB. En revanche, la concaténation série d'un Reed-Solomon (sur le corps de Galois GF(64)
ou GF(128)) et d'un code convolutif sera adoptée dans le système EDGE (Enhanced Data rates for GSM
Evolution). Cette technique de codage concaténé classique reste moins complexe que les turbo codes et garantit à
fort rapport signal-à-bruit une pente très raide du taux d'erreur binaire.
La Figure 1 montre les performances du système RS+Convolutif à concaténation série sur le canal gaussien. La
zone d'intérêt pratique se situe entre 2.5 et 3.0 dB. Notez la forte et brusque réduction du taux d'erreur par
rapport à la modulation non codée. Le code convolutif est décodé par un algorithme de Viterbi à entrée souple.
Joseph J. Boutros 27
Un désentrelaceur est placé à la sortie du décodeur Viterbi afin de casser les paquets d'erreurs avant le décodage
algébrique du code Reed-Solomon par l'algorithme de Berlekemp-Massey.
0
10
-1
10
-4
10
-5
10
Borne theorique
-6
10
-7
10
-8
10
0 1 2 3 4 5 6 7 8
Eb/N0 (dB)
Soient C1[n1,k1,d1]q et C2[n2,k2,d2]q deux codes linéaires en blocs définis sur le corps GF(q). Le code produit
C=C1×C2 est l’ensemble de toutes les matrices n1×n2 dans lesquelles toute ligne est un mot du code C1 et toute
colonne est un mot du code C2. Lorsque les deux codes C1 et C2 sont systématiques, la structure du code produit
est décrite Figure (2).
k1 n1-k1
k2 Information Parité 1
Les k2×(n1-k1) symboles de parité de C1 sont le résultat de k2 opérations de codage horizontal. Les k1×(n2-k2)
symboles de parité de C2 sont le résultat de k1 opérations de codage vertical. Enfin, les (n1-k1)×(n2-k2) symboles
notés Parité 1-2 s’obtiennent en codant la parité de C2 par n2-k2 codages horizontaux ou en codant la parité de C1
par n1-k1 codages verticaux.
Les codes constituants C1 et C2 peuvent être cycliques, ceci ne garantit pas la cyclicité du code produit. En effet,
le code produit C est cyclique si les deux constituants sont cycliques et si pgcd(n1,n2)=1.
Le décodage à maximum de vraisemblance des codes produits est pratiquement irréalisable. Pour cette raison,
ces codes sont restés dans l'ombre jusqu'au début des années 90 quand l'efficacité du décodage itératif a été
redécouverte. A titre d'exemple, la Figure 3 illustre les performances de deux codes produits binaires sur le canal
gaussien. Le premier est un [20,15]2 et le deuxième un [32,26]2. Le code BCH binaire [20,15] est obtenu par
raccourcissement du code primitif [31,26] et le [32,26] est le résultat d'une simple extension du même [31,26].
Le décodage est itératif (voir paragraphe 6.3), i.e. on applique de manière itérative un décodeur SISO sur le code
horizontal et après sur le code vertical. Le décodeur SISO de la Figure 3 est un algorithme Forward-Backward
opérant sur le treillis BCJR [1] du code BCH.
0
10
-1
10
-2
10
-3
10
BCH(20,15) produit
-4
10
-5
10
BCH(32,26) produit
-6
10
0 1 2 3 4 5
Eb/N0 (dB)
Nous étudions dans ce paragrahe les deux concaténations parallèle et série de codes convolutifs. Les Turbo
Codes initialement découverts ont été construits par deux codes convolutifs systématiques récursifs concaténés
en parallèle et séparés par un entrelaceur [7][8][10][46]. Il est possible de généraliser la concaténation parallèle à
plusieurs codes convolutifs séparés par plusieurs entrelaceurs. Vu le rendement très faible d’une concaténation à
plus de deux niveaux , nous limitons l’étude aux turbo codes parallèles formés seulement de deux codes
convolutifs constituants. Ceci est justifié aussi par les excellentes performances des turbo codes à deux niveaux
après un décodage itératif, malgré leur faible distance de Hamming minimale qui n’augmente pas de façon
linéaire en fonction de la longueur du code. De la même manière, la concaténation série [6][26] revient à mettre
en cascade plusieurs codes convolutifs séparés par des entrelaceurs. Pour les mêmes raisons, nous limitons notre
description aux turbo codes séries construits par la cascade de deux codes séparés par un seul entrelaceur.
Les concaténations les plus célèbres sont la concaténation parallèle et la concaténation série de deux codes
convolutifs. Il est possible de fabriquer des turbo codes hybrides en combinant le série et le parallèle. Notons que
les codes concaténés séries proposés par Forney [26] comprenant par exemple un code Reed-Solomon (code
externe) et un code convolutif (code interne) sont eux aussi une forme de turbo codes séries. L’impossibilité de
décoder le code RS par un décodeur SISO (soft input – soft output) calculant les APPs nous empêche de les
classer dans la famille des turbo codes. En revanche, la grande famille des codes imitant le codage aléatoire
Joseph J. Boutros 29
comprend les turbo codes au sens strict et les codes en blocs concaténés avec un entrelacement aléatoire [35] ou
un entrelacement lignes-colonnes (les codes produits). On pourrait même construire un code produit en
remplaçant la permutation aléatoire d’un turbo code par une permutation lignes-colonnes.
x1
x N bits
C ode C 1
y1
N bits k 1 /n 1 (n 1 -k 1 )×N /k 1 bits
Perm . Π x2
N bits
C ode C 2 y2
N bits k 2 /n 2 (n 2 -k 2 )×N /k 2 bits
En pratique, on prend souvent C1=C2. De plus le code constituant C1 est toujours un code RSC. Les turbo codes
parallèles basés sur les NRNSC ne présentent pas de gain d’entrelacement, i.e. ils ont un grand coefficient
d’erreurs, puisqu’un événement d’erreurs composé d’un nombre fini d’événements simples garde après
entrelacement un nombre fini d’événements simples. D’après la Figure (4), les N bits d’information x sont codés
par le codeur de C1, entrelacés à travers Π et ensuite codés par C2. Chaque code RSC Ci génère (ni-ki)N/ki bits de
parité notés yi. Les bits d’information x=x1 et x2 étant les mêmes à une permutation près, nous ne transmettons
pas l’entrée du code C2 afin d’augmenter le rendement de CP. L’émission des bits x2 est utile seulement pour
doubler la diversité en présence d’évanouissements sur un canal de Rayleigh.
En négligeant la fermeture des deux treillis, le rendement de CP s’obtient par l’expression simple
N R1 R2 R1
R= = = si R1 = R2
J R1 + R2 − R1 R2 2 − R1
Ainsi, le cas le plus fréquent correspond à R=1/3 avec R1=1/2, et en perforant un bit de parité sur deux nous
avons R1=2/3 et R=1/2. Il est préférable de ne pas perforer les bits d’informations afin de garantir une bonne
convergence du décodage itératif. Il est possible d’éviter la perforation des bits de parité en utilisant directement
un code RSC de rendement 2/3, même si le treillis de ce dernier est un peu plus complexe.
Perm utation
x y1 y2
C ode C 1 C ode C 2
Π
K bits k 1 /n 1 k 2 /n 2
N bits J bits
En pratique, on prend un code externe C1 NRNSC ou RSC, mais le code interne C2 doit toujours être RSC. Les
turbo codes séries basés sur un code interne NRNSC ne présentent pas de gain d’entrelacement comme dans le
cas des turbo codes parallèles. D’après la Figure 5, les K bits d’information x sont codés par le codeur de C1,
entrelacés à travers Π et ensuite recodés par C2. Le code externe génère N=K/R1 bits codés y1. Les bits y1
30 TMC 2004 – Brique ADC
contiennent les bits d’information x1 si C1 est un RSC. Le code interne RSC génère J=N/R2 bits codés y2
contenant ses bits d’information x2.
En négligeant la fermeture des deux treillis, le rendement de CS s’obtient par le simple produit
K
R= = R1 × R2
J
Ainsi, le cas le plus fréquent correspond à R=1/2 avec R1=2/3 et R2=3/4. Nous remarquons déjà que les codes
constituant un turbo série ont un rendement plus élevé que ceux constituant un turbo code parallèle. Les treillis
des codes constituant CS sont plus complexes que les treillis de CP. D’un autre coté, la distance de Hamming
minimale de CS, notée dHmin(CS), est beaucoup plus grande que dHmin(CP) car les événements d’erreurs de poids
minimal du code interne C2 sont produits par des événements d’erreurs de C1 qui sont au moins de poids
dHmin(C1).
Le décodeur à maximum de vraisemblance (ML) d’un code concaténé est impossible à réaliser en pratique. Les
codes concaténés (produits, turbos ou autres) sont donc décodés par une technique itérative dite turbo décodage
qui fait appel à un sous-décodeur ML et SISO des codes constituants. Même si le décodage de chaque
constituant est optimal, le décodage itératif global de la concaténation est sous-optimal au sens ML (au sens de la
minimisation de la probabilité d’erreur par mot Pew). Le décodage itératif fonctionne au niveau des bits
d’information et non au niveau des mots de code. Son but est l’estimation de l’APP (probabilité a posteriori) de
chaque bit d’information. Malgré sa sous-optimalité, les performances du décodage itératif tendent vers celles
d’un décodeur ML lorsque le rapport signal-à-bruit augmente.
Sachant que le décodage itératif d’un code concaténé est basé sur le décodage SISO de ses codes constituants,
nous décrivons ci-dessous le décodage à entrée et sortie souples d’un code linéaire C[J,K]2 sur un canal AWGN.
Le schéma général du décodeur SISO est illustré Figure 6.
Soit r=(r1,r2,...,rJ) le vecteur des échantillons réels reçus à l’entrée du décodeur. L’APP d’un bit codé cj, j=1...J,
est égale à
p ( r | c j , c ) P (c j , c )
APP(c j ) = P (c j | r ) = ∑ P(c j , c | r ) = ∑ (1)
c∈C c∈C p(r )
J observations K ou J a posteriori
p(rj/cj) APP(bi) ou APP(cj)
Décodeur SISO
π(bi) ou π(cj) Ext(bi) ou Ext(cj)
K ou J a priori K ou J a priori
structure du code
La vraisemblance p(r|cj,c) est nulle si le jème bit du mot c n’est pas égal à cj. La probabilité a priori de la paire
(cj,c) est elle aussi nulle lorsque le jème bit de c est différent de cj. Sachant que les observations et que les
probabilités a priori sont indépendantes, nous obtenons :
J
APP(c j ) ∝ ∑ p(r | c) P(c) = ∑ ∏ p(rl | cl )π (cl ) (2)
c∈C|c j c∈C|c j l =1
De manière similaire à ce qui précède l’équation (2), l’APP d’un bit d’information bi, i=1...K, est égale à
J
APP(bi ) ∝ ∑ p(r | c) P(c) = ∑ ∏ p(rl | cl )π (cl ) (3)
c∈C|bi c∈C|bi l =1
Joseph J. Boutros 31
Un décodeur SISO reçoit toujours J observations sur les bits codés et calcule K APPs (resp. J APPs) sur les bits
d’information (resp. sur les bits codés). En revanche, nous pouvons lui fournir K probabilités a priori sur les bits
d’information ou J probabilités a priori sur les bits codés, i.e. il existe deux cas possibles pour l’entrée du SISO.
Il est possible aussi d’exiger le calcul de K a priori sur les bits d’information ou J probabilités a priori sur les bits
codés, i.e. il existe deux cas possibles pour la sortie du SISO. Ainsi, pour un code linéaire binaire fixé, nous
avons 4 décodeurs SISO différents. Puisque C peut être systématique ou non-systématique, nous obtenons un
total de 8 versions différentes de décodeurs SISO. Les probabilités a priori calculées par un décodeur SISO sont
dites informations extrinsèques et sont notées Ext(cj) et Ext(bj).
A titre d’exemple, nous développons les équations du SISO lorsque C[J,K]2 est un code en blocs obtenu par la
terminaison d’un code convolutif RSC. Nous supposons aussi que C est un des deux constituants d’un turbo code
parallèle. Dans ce cas, les K bits d’information bi de C sont parmi les J bits codés cj. Nous séparons les K bits
d’information b1, b2, ..., bK et les J-K bits de parité cK+1,cK+2, ..., cJ. Le décodeur reçoit les K a priori π(bi) et
aucune a priori sur les bits de parité, i.e. π(cj)=1/2 pour j=K+1...J. En mettant en facteur l’observation et
l’information a priori du bit bi, la formule (3) devient
K J
APP(bi ) ∝ p (ri | bi ) × π (bi ) × ∑ ∏ p(rl | bl )π (bl ) ∏ p(r j | c j ) (4)
c∈C|bi l =1,l ≠i j = K +1
L'information extrinsèque calculée par le décodeur SISO du RSC se calcule donc par la formule (3ème terme de
l’équation 4) :
K J
Ext (bi ) ∝ ∑ ∏ p(rl | bl )π (bl ) ∏ p(r j | c j ) (5)
c∈C|bi l =1,l ≠i j = K +1
Le décodeur SISO décrit dans ce paragraphe est utilisé comme bloc de base dans le décodage itératif d’un code
concaténé. La somme ∑ est souvent évaluée à l’aide de l’algorithme Forward-Backward [1] qui profite de la
c∈C
structure du treillis pour faciliter la recherche des mots de codes. Le forward-backward peut être remplacé par
une autre version optimale ou sous-optimale comme celles décrites dans les articles [3][34][39].
Enfin, nous clôturons ce chapitre en illustrant les performances d'un turbo code parallèle avec un décodage
itératif basé sur le Forward-Backward. La figure 7 nous montre le taux d'erreur d'un code turbo parallèle pour
deux valeurs de la taille de l'entrelaceur N=1024 et N=65536 sur le canal gaussien. Le rendement global du turbo
code est 1/2 (la limite de Shannon se situe donc à 0.2 dB) et le code constituant est un RSC (23,35) à 16 états.
L'effet des évanouissements et de la diversité sur l'efficacité du code est bien présenté figure 8. Le code est de
rendement 1/3 (la limite de Shannon se situe vers -0.5 dB), la taille de l'entrelaceur est N=4096. Le décodage
itératif a été limité à 4 itérations seulement. Dans cette figure 8, la courbe à l'extrême gauche correspond aux
performances sur le canal gaussien sans évanouissements. Celle située à l'extrême droite montre le taux d'erreur
sur un canal de Rayleigh (un seul trajet à évanouissemnts). En plaçant par exemple 4 antennes de réception bien
décorrélées, il est possible de multiplier l'ordre de diversité par 4 et d'approcher le canal AWGN.
REMERCIEMENTS
L'auteur remercie Sandrine VIALLE-FONTENELLE, docteur-ingénieur à Motorola Research, pour son aide
précieuse dans la rédaction de ce manuscrit.
32 TMC 2004 – Brique ADC
0
10
-1
10
-2
10
Entrelaceur 1024
Rendement 1/2
Pe(bit)
-3 12 Iterations
10
-4
10
Entrelaceur 65536
-5 Rendement 1/2
10
20 Iterations
-6
10
0.0 0.5 1.0 1.5 2.0
Eb/N0 (dB)
Figure 7. Turbo Code Parallèle 1/2, code constituant RSC (23,35), canal AWGN.
0
10
-1
10
-2
10 RAYLEIGH
Pe(bit)
-3
10
2
-4
10 4
8
AWGN
16
-5
10
0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0
Eb/N0 dB
Figure 8. Turbo Code Parallèle 1/3, code constituant RSC (23,35), canal avec évanouissements et une diversité
de réception 2, 4, 8 et 16.
Joseph J. Boutros 33
REFERENCES
[1] L.R. Bahl, J. Cocke, F. Jelinek, J. Raviv, “Optimal decoding of linear codes for minimizing symbol error
rate,” IEEE Trans. on Information Theory, vol. 20, pp. 284-287, March 1974.
[2] G. Battail, M.C. Decouvelaere, P. Godlewsky, “Replication decoding,’’ IEEE Trans. on Inf. Theory, vol. IT-
25, pp. 332-345, May 1979.
[3] G. Battail, “Podération des symboles décodés par l’algorithme de Viterbi,” Annales des Télécommunications,
vol. 42, no. 1-2, pp. 1-8, Janvier-Février 1987.
[5] S. Benedetto, E. Biglieri, V. Castellani, Digital Transmission Theory, Prentice-Hall, Englewood Cliffs, New
Jersey, 1987.
[6] S. Benedetto, G. Montorsi, D. Divsalar, F. Pollara, “Serial concatenation of interleaved codes: Performance
analysis, design and iterative decoding,”TDA Progress Report 42-126, JPL, August 1995.
[7] S. Benedetto, G. Montorsi, “Unveiling turbo-codes: some results on parallel concatenated coding schemes, ”
IEEE Trans. on Inf. Theory,vol. 42, no. 2, pp. 409-429, March 1996.
[8] S. Benedetto, G. Montorsi, “Design of parallel concatenated convolutional codes,” IEEE Trans. Com., vol.
44, no. 5, pp. 591-600, May 1996.
[9] E.R. Berlekamp, Algebraic Coding Theory, McGraw-Hill, New York, 1968.
[10] C. Berrou, A. Glavieux, P. Thitimajshima, “Near Shannon limit error-correcting coding and decoding :
turbo-codes,” Proceedings of ICC'93, Genève, pp. 1064-1070, Mai 1993.
[11] E. Biglieri, D. Divsalar, P.J. McLane, M.K. Simon, Introduction to Trellis-Codes Modulation with
Applications, Macmillan, New York, 1991.
[12] R.E. Blahut, Theory and Practice of Error Control Codes, Addison-Wesley, 1983.
[13] J. Boutros, E. Viterbo, C. Rastello, J.C. Belfiore, “Good Lattice Constellations for both Rayleigh Fading
and Gaussian Channels,” IEEE Trans. on Inform. Theory, vol. 42, no. 2, pp. 502-518, March 1996.
[14] J. Boutros, O. Pothier, “Convergence Analysis of Turbo Decoding,” Canadian Workshop on Information
Theory, Toronto, pp. 25-28, June 1997.
[15] J. Boutros, E. Viterbo, “Signal Space Diversity : a Power and Bandwidth Efficient Diversity Technique for
the Fading Channel,” IEEE Trans. on Inform. Theory, vol. 44, no. 4, July 1998.
[16] J. Boutros, O. Pothier, G. Zémor, “Generalized Low Density (Tanner) Codes : approaching the channel
capacity with simple and easily decodable block codes,” IEEE International Conference on Communications,
Vancouver, June 1999.
[17] J. Boutros, G. Caire, E. Viterbo, E. Sawaya, S. Vialle, “Turbo code at 0.03 dB from capacity limit , ” IEEE
International Symposium on Information Theory, July 2002.
[18] J. Boutros, G. Caire, “Iterative multiuser joint decoding: unified framework and asymptotic analysis, ” IEEE
Trans. on Information Theory, vol. 48, pp. 1772-1793, July 2002.
[19] L.H. Charles Lee, Convolutional coding, fundamentals and applications, Artech House, 1997.
34 TMC 2004 – Brique ADC
[20] G. Cohen, J.L. Dornstetter, P. Godlewski, Codes Correcteurs d'Erreurs, Masson, 1992.
[21] J.H. Conway, N.J.A. Sloane, “Soft Decoding Techniques for Codes and Lattices, including the Golay Code
and the Leech Lattice,” IEEE Trans. Inform. Theory, vol. 32, pp. 41-50, 1986.
[22] D. Divsalar, M.K. Simon, “The Design of Trellis Coded MPSK for Fading Channels: Performance
Criteria,” IEEE Trans. on Communications, vol. 36, pp. 1004-1012, September 1988.
[23] D. Divsalar, S. Dolinar, R.J. McEliece, F. Pollara, “Transfer function bounds on the performance of turbo
codes,” TDA Progress Report 42-121, JPL, August 1995.
[24] P. Elias, “Coding for Noisy Channels,” IRE Convention Record, vol. 3, part 4, pp. 37-46, 1955.
[25] R.M. Fano, “A Heuristic Discussion of Probabilistic Coding,” IEEE Trans. on Inform. Theory, vol. IT-9, pp.
64-74, April 1963.
[27] G.D. Forney, “Maximum-Likelihood Sequence Estimation of Digital Sequences in the Presence of
Intersymbol Interference,” IEEE Trans. Inform. Theory, vol. IT-18, pp. 363-378, May 1972.
[28] G.D. Forney, “The Viterbi algorithm,” Proceedings of the IEEE, vol. 61, no. 3, pp. 268-278, March 1973.
[29] G.D. Forney, Coset Codes, Parts I & II, IEEE Trans. on Inform. Theory, vol. 34, September 1988.
[30] B.J. Frey, D.J.C. MacKay, “Irregular turbo codes,” IEEE Intern. Symp. on Information Theory, June 2000.
[32] R.G. Gallager, Information Theory and Reliable Communication, Wiley, New York, 1968.
[33] M.J.E. Golay, “Note on Digital Coding,” Proc. IRE, vol. 37, P. 657, June 1949.
[34] J. Hagenauer, P. Hoeher, “A Viterbi algorithm with soft-decision outputs and its applications,” Proceedings
IEEE GlobeCom’89, Dallas, Texas, pp. 47.1.1-47.1.7, November 1989.
[35] J. Hagenauer, E. Offer, L. Papke, “Iterative decoding of binary block and convolutional codes,” IEEE
Trans. on Inf. Theory, vol. 42, no. 2, pp. 429-445, March 1996.
[36] R.W. Hamming, “Error Detecting and Error Correcting Codes,” Bell Syst. tech. J., vol. 29, pp. 147-160,
April 1950.
[37] H. Imai, S. Hirakawa, “Multilevel Coding Method using Error-Correcting Codes,” IEEE Trans. on Inform.
Theory, vol. 23, pp. 371-377, 1977.
[38] J. Leech, “Notes on Sphere Packings,” Canadian Journal of Mathematics, vol. 19, pp. 251-267, 1967.
[39] Y. Li, B. Vucetic, Y. Sato, “Optimum Soft-Output Detection for Channels with Intersymbol Interference,”
IEEE Trans. on Inf. Theory, vol. 41, no. 3, May 1995.
[40] S. Lin, D.J. Costello, Error Control Coding: Fundamentals and applications, Englewood Cliffs, NJ, Prentice-
Hall, 1983.
[41] M.G. Luby, M. Mizenmacher , A. Shokrolloahi, D.A. Spielman, “Improved low-density parity-check codes
using irregular graphs ,” IEEE Trans. On Information Theory, vol. 47, pp. 585-598, February 2001.
[42] M.G. Luby, M. Mizenmacher , A. Shokrolloahi, D.A. Spielman, “Improved low-density parity-check codes
using irregular graphs and belief propagation,” IEEE Intern. Symp. On Inf. Theory, August 1998.
Joseph J. Boutros 35
[43] D.J.C. MacKay, “Good error-correcting codes based on very sparse matrices,” IEEE Transactions on
Information Theory, vol. 45, pp. 399-431, March 1999.
[44] D.J.C. MacKay, R.M. Neal, “Near Shannon limit performance of low density parity check codes,”
Electronics Letters, vol. 32, pp. 1645, August 1996.
[45] F.J. MacWilliams, N.J.A. Sloane, The theory of error-correcting codes, North-Holland, Englewood Cliffs,
eight impression, 1993.
[46] L.C. Perez, J. Seghers, D.J. Costello, “A Distance Spectrum Interpretation of Turbo Codes,” IEEE Trans. on
Inf. Theory, vol. 42, no. 6, pp. 1698-1709, November 1996.
[47] O. Pothier, L. Brunel, J. Boutros, “A Low Complexity FEC Scheme based on the Intersection of Interleaved
Block Codes,” IEEE VTC'99, Houston, 18-21 May, 1999.
[48] J.G. Proakis: Digital Communications, New York, McGraw Hill, 3rd edition, 1995.
[49] N. Seshadri, C-E.W. Sundberg, “Multilevel Trellis Coded Modulations for the Rayleigh Fading Channel,”
IEEE Trans. on Communications,vol. 41, no. 9, September 1993.
[50] C.E. Shannon, “A Mathematical Theory of Communication,” Bell Syst. Tech. J., vol. 27, pp. 379-423, July
1948.
[51] C.E. Shannon, “A Mathematical Theory of Communication,” Bell Syst. Tech. J., vol. 27, pp. 623-656,
October 1948.
[52] D. Slepian, “A Class of Binary Signaling Alphabets,” Bell Syst. Tech. J., vol. 35, PP. 203-234, Jan 1956.
[53] R.M. Tanner, “A Recursive Approach to Low Complexity Codes,” IEEE Trans. on Information Theory,
Vol. IT-27, September 1981.
[54] G. Ungerboeck, “Channel Coding with Multilevel/Phase Signals,” IEEE Trans. Inform. Theory, vol. IT-28,
pp. 56-67, January 1982.
[56] A.J. Viterbi, “Error Bounds for Convolutional Codes and an Asymptotically Optimum Decoding
Algorithm,” IEEE Trans. Inf. Theory, vol. IT-13, pp. 260-269, April 1967.
[57] A.J. Viterbi, J.K. Omura, Principles of digital communications and coding, McGraw-Hill, 1979.
[58] L.F. Wei, “Trellis-Coded Modulation with Multi-Dimensional Constellations,” IEEE Trans. Inform. Theory,
vol. IT-33, pp. 483-501, July 1987.
[59] J.K. Wolf, “Efficient Maximum Likelihood Decoding of Linear Block Codes Using a Trellis,” IEEE Trans.
Inf. Theory, vol. IT-24, pp. 76-81, January 1978.
_____________________________
_____________