• Aucun résultat trouvé

D’après les travaux de Shannon, on sait que la transmission fiable sur des canaux comportant des erreurs est possible grâce à un codage approprié. Ces codes sont appelés codes correcteurs d’erreurs. Dans un premier temps nous entendrons par erreurs des altérations et/ou des effacements (section 2.3.1). Par la suite (section 2.3.2 et suivantes) nous nous limiterons aux effacements.

2.3.1 Notions relatives aux codes

Commençons par présenter quelques concepts et outils indispensables à la compréhen-sion des codes dont nous allons parler dans cette thèse. Ces codes travaillent sur des corps finis, qui sont des ensembles d’éléments sur lesquels des opérations sont définies.

Définition On appelle corps fini (ou corps de Galois) un ensemble d’éléments sur lequel sont définies l’addition, la multiplication, la soustraction et la division. Pour chaque entier premier p et entier m, il existe un unique corps fini (à un isomorphisme près) à q = pm éléments noté GF(q) ou Fq.

On peut prendre l’exemple de l’ensemble des entiers modulo p, Z/pZ , qui est un corps fini si et seulement si p est premier. On s’intéressera au cas où q est une puissance de 2, GF(2k). En effet l’addition et la soustraction sur ce corps fini correspondent au XOR bit à bit des éléments, ce qui permet une implémentation efficace sur les processeurs.

Au lieu de décrire le corps fini dans son intégralité, on peut utiliser un élément généra-teur de celui-ci. On obtient alors par des puissances successives de cet élément généragénéra-teur, l’ensemble des éléments du corps fini.

Définition On appelle élément générateur d’un corps fini GF(q) un élément α tel que GF(q) = {1, α, α2, . . . , αq−2}

Les travaux présentés par la suite se concentrent sur des codes correcteurs protégeant une quantité finie de données à la fois qu’on appelle code bloc. Les codes bloc linéaires bénéficient d’une structure d’espace vectoriel qui en font des codes particulièrement pratiques à utiliser.

Définition On appelle code bloc linéaire C de longueur n et de dimension k un sous espace vectoriel de dimension k de l’espace vectoriel Fnq, où Fqdésigne le corps fini à q éléments. On appelle ce code un [n, k]-code. Les éléments deC sont appelés mots de code. Définition On appelle symbole les éléments du corps fini sur lequel travaille le code. Ces symboles composent les mots du code.

A partir de sa longueur et de sa dimension, on peut définir le rendement d’un code. Le rendement, également appelé taux de codage, représente la quantité de redondance ajoutée par le code.

Définition On appelle rendement d’un code de dimension k et de longueur n le rapport R= k/n.

2.3. CODES CORRECTEURS D’ERREURS 29

Définition On appelle matrice génératrice, la matrice de l’application linéaire de Fkqdans Fnqdont l’image est le code. Cette application est aussi appelée encodage. Les lignes de la matrice génératrice G ∈M (Fq)k,n d’un [n, k]-code linéaire forment une base de l’espace vectoriel du code.

Soit X un élément de Fkqet G la matrice génératrice d’un [n, k]-code, X est encodé en un mot de code Y ∈ Fnqpar une multiplication à gauche par la matrice génératrice :

Y = X G (2.5)

Lorsque le vecteur source se retrouve dans le vecteur encodé, on parle d’un code systématique. La matrice génératrice d’un tel code contient alors la matrice identité (à une permutation des colonnes près) :

Gsystematique = [Idk|C] (2.6) On peut définir à partir de là une autre matrice, appelé matrice de parité, dont l’applica-tion correspondante a comme noyaux les éléments du code.

Définition SoitC un [n,k]-code. On dit que H ∈ M (Fq)(n−k),n est une matrice de parité de ce code ssi ∀ X ∈ C ,HX = 0 et H est de rang plein.

Si on possède la matrice génératrice du code sous forme systématique Gsystématique = [Idk|C], alors on peut construire une matrice de parité pour ce code de la façon suivante :

H= [−CT|Idn−k] (2.7)

En effet, soit Y ∈C :

HYT = H(X G)T = HGTXT (2.8) = [−CT|Idn−k][Idk|C]TXT = (−CT +CT)XT = 0 (2.9)

Le décodage d’un code correcteur ayant comme objectif de retrouver la séquence ayant été la plus probablement envoyée, et donc la plus proche de celle reçue, il est nécessaire d’introduire une notion de distance. La distance utilisée est la distance de Hamming qui découle de la fonction de poids de Hamming.

Définition Le poids de Hamming d’une chaîne de symboles sur un alphabet donné est le nombre de symboles différents du symbole nul.

Quand cet alphabet est le corps fini à 2 éléments F2, le poids de Hamming est le nombre de bits égaux à 1.

Définition La distance de Hamming entre 2 chaînes de symboles a et b est le nombre de positions pour lesquelles les symboles correspondant sont différents. Dit autrement, la distance de Hamming est le poids de Hamming de la différence a − b.

L’application de la notion de la distance de Hamming à un code, amène à s’intéresser à la distance séparant les différents vecteurs de cet ensemble, et en particulier le minimum de ces distances : la distance minimale du code.

Définition La distance minimale d’un code linéaire, notée dmin, est la plus petite distance de Hamming qui existe entre deux mots de code différents. A cause de la structure d’espace vectoriel des codes linéaires, c’est aussi le minimum des poids de Hamming de tous les mots de code.

Un [n, k]-code de distance minimale d sera noté [n, k, d]-code. Les capacités de correction d’un code linéaire sont fortement dépendantes de sa distance minimale. En effet celle-ci nous donne une borne sur le nombre de corrections garanties par le code. Un code correcteur de distance minimale dminsera toujours capable de corriger si dmin≥ 2t + e + 1, où e est le nombre d’effacements et t est le nombre d’erreurs. Dans certains cas, il est possible que le code puisse corriger même si l’inégalité précédente n’est pas respectée.

Cette distance minimale possède une borne supérieure qui dépend de la longueur et de la dimension du code. Les codes qui atteignent cette borne supérieure sont appelés codes maximum distance séparable et possèdent une capacité de correction optimale.

Définition Un code linéaire de longueur n et de dimension k est dit MDS si : n − k = dmin− 1. On dit alors que le code atteint la borne de Singleton [106].

2.3.2 Codage pour le canal à effacements

Cette thèse s’intéresse principalement au codage pour la correction des erreurs du canal à effacements. Nous allons donc présenter les principes généraux du fonctionnement et de l’utilisation de ces codes.

Considérons un canal à effacements ayant comme probabilité d’effacement p et sup-posons que nous souhaitons transmettre sur celui ci un message composé de k symboles. On choisit un code correcteur MDS dont le rendement R est inférieur à la capacité du canal 1 − p, afin de permettre une transmission fiable (voir figure 2.3).

L’étape d’encodage consiste à utiliser le code pour transformer les k symboles du message en n symboles encodés. Les n symboles encodés sont alors transmis sur le canal à effacements. En moyenne, pn symboles seront perdus. Le récepteur n’aura alors à sa disposition en moyenne que (1 − p) n symboles. Si le nombre de symboles reçus est supérieur ou égal à k, alors le décodage est possible, et le récepteur peut reconstruire le message original. Dans le cas inverse, le décodage échoue et le récepteur n’aura pas à sa disposition la totalité des symboles source.

2.3.3 Codage par paquets

Contrairement aux codes corrigeant des altérations de données, les codes à effacements travaillent généralement sur les couches hautes de la pile protocolaire (voir section 2.2). Alors que les premiers travaillent sur des petites quantités de données (quelques milliers de bits), les codes à effacements travaillent le plus souvent sur des quantités de données pouvant aller jusqu’à plusieurs méga octets. On les trouve la plupart du temps, juste en dessous de la couche applicative, là où les unités de données transmises sont grandes (paquets IP). C’est pourquoi on les appelle codes correcteurs de niveau applicatif ou codes AL-FEC pour “Application-Level Forward Error Correction”. Ces codes correcteurs de niveau applicatif doivent protéger des ensembles de données divisées en paquets. Le code correcteur et la façon dont le code encode et organise les données est appelé brique AL-FEC. En effet la plupart du temps, le code à effacements ne peut pas être directement utilisé

2.3. CODES CORRECTEURS D’ERREURS 31

FIG. 2.3 – Utilisation d’un code à effacements

sur le flux de paquets. Comme nous allons le voir, certaines opérations de préparation et d’organisation des données sont nécessaires avant d’utiliser le code à effacements.

Comme nous l’avons dit plus tôt, ces paquets ont des tailles qui peuvent atteindre plusieurs milliers d’octets, et rien ne garantit qu’ils soient tous de la même taille. Le cas de paquets de taille variable peut être ramené au cas de paquets de taille constante par l’utilisation de padding (bourrage avec des zéros pour atteindre la taille cible). Nous considérerons donc à partir de maintenant que les paquets d’un flux à protéger ont tous la même taille.

Correspondance symboles/paquets

Les codes de niveau applicatif protégeant ces flux de données doivent être capables de récupérer les effacements de paquets entiers. Nous avons vu précédemment que les codes à effacements sont capables de récupérer des effacements de symboles. Il suffit donc de trouver une correspondance adéquate entre symboles et paquets. Plusieurs solutions sont alors possibles :

1. on considère chaque paquet comme un seul et unique symbole. Ceci nécessite d’avoir des symboles de taille arbitrairement longue, et donc de travailler sur un corps fini très grand. Avec certains codes, l’utilisation de symboles de grande taille peut s’avérer difficile en pratique car les opérations deviennent trop coûteuses (voir section 2.4).

2. on choisit des symboles de petites tailles et on divise chaque paquet en symboles. Il faudra utiliser un code de grande longueur n = NpaquetTaillepaquets/Taillesymbole. La longueur du code dépend, pour certain codes, de la taille du corps fini, et l’utili-sation de grand corps fini n’est pas toujours possible en pratique (voir section 2.4).

Cependant, cette technique a l’avantage de limiter la quantité de padding éventuelle en cas de taille variable, puisqu’il ne faut compléter les paquets que jusqu’à obtenir une longueur multiple de la taille des symboles.

3. on utilise un tableau d’encodage pour faire un encodage par ligne des paquets rangés par colonnes. On range un paquet dans chaque colonne, et les lignes du tableau sont telles que chaque élément du tableau a la taille d’un symbole. On effectue alors l’encodage ligne par ligne, ce qui revient à avoir plusieurs instances du même code qui travaillent en parallèle (voir figure 2.4). Ainsi la dimension du code utilisé est égale au nombre de paquets contenant les données sources à protéger. Il est important de noter que lorsque cette solution est utilisée, chaque instance du code est soumise au même schéma de pertes. Ainsi une part importante du décodage est commune aux différentes instances du code.

Le codage avec des codes travaillant sur le corps fini Fs2, tels que les codes LDPC binaires, peut être vu de différentes manières. Puisque les opérations sur les corps fini binaires sont des XOR, on peut considérer soit qu’il s’agit d’un seul code sur Fs2(première solution), soit qu’il s’agit de s instances différentes d’un même code, travaillant sur F2, utilisées en parallèle (troisième solution).

Lorsque l’on utilise un code avec une longueur et une taille de symbole limitée (comme les codes Reed-Solomon ,voir section 2.4), on utilisera la troisième solution. Par exemple un code Reed-Solomon travaillant sur GF(256) (un symbole correspond à un octet) permettra d’encoder des paquets par bloc de 255. Pour cela on rangera les paquets dans un tableau dont les colonnes ont une largeur égale à un octet, et on encodera ligne par ligne avec un code Reed-Solomon. Ainsi si les paquets sont de taille t bits, le tableau d’encodage possédera t/8 lignes et autant d’instances de code Reed-Solomon travailleront en parallèle.

FIG. 2.4 – Utilisation d’un tableau pour l’encodage de paquets

Transmission des paquets

Indépendamment du découpage des paquets en symboles, il est possible, après l’étape d’encodage, d’effectuer une permutation des symboles. En effet certains codes peuvent être sensibles à la perte de plusieurs symboles consécutifs (pertes en rafale). La permutation