Comparaison de l efficacité de codes correcteurs d erreurs Antoine Taveneaux, antoinetav@yahoo.fr 2 juin 2007 Sommaire 1 Généralités sur les codes correcteurs 2 1.1 Principe général................................... 2 1.2 Notion de distance.................................. 2 1.3 Paramètres d un code................................ 3 1.4 Premiers exemples.................................. 3 2 Les codes de Reed-Solomon 4 2.1 Présentation générale................................. 4 2.2 Le codage....................................... 4 2.3 Le décodage...................................... 4 2.4 Remarque sur le coût des algorithmes....................... 6 3 Les codes CIRC 6 3.1 L entrelacement avec retard............................. 6 3.2 Le codage CIRC................................... 7 3.3 Le décodage...................................... 7 3.4 Avantages de ces codes................................ 8 4 Comparaison des codes 8 4.1 Présentation des tests effectués........................... 8 4.2 Tableaux comparatifs................................ 9 4.3 Analyse des tests................................... 9 Conclusion 10 Références 11 Annexe 1 : construction et implémentation de F 2 k 12 4.4 Construction de F 2 k................................. 12 4.5 Recherche du polynôme irréductible de degré r dans F 2.............. 12 4.6 Implémentation de F 2 k................................ 13 Annexe 2 : illustrations des tests 14 1
Introduction Lors de l acheminement ou du stockage de données, des erreurs peuvent survenir. Dans notre société, où la diffusion de l information est devenue essentielle, il est crucial de pouvoir corriger ces erreurs : c est le rôle des codes correcteurs. Il en existe plusieurs types, que nous allons étudier en détail (sans pour autant toujours présenter d algorithme explicite). Nous comparerons enfin leur efficacité, tant en termes de correction d erreurs qu en vitesse d exécution. 1 Généralités sur les codes correcteurs 1.1 Principe général Le codage consiste à disposer d une fonction de codage ψ, injective mais non surjective, qui transforme un message d entrée m en ψ(m) : un message plus long qui sera transmis à la place de m. Le canal peut brouiller le signal (c est-à-dire que certains bits de ψ(m) peuvent être changés). Puis, on reçoit le message m r. L opération de décodage consiste alors à appliquer une fonction µ telle que µ(m r ) soit, avec une forte probabilité m, le message initial, ou dans certains cas, une réponse d impossibilité de décodage si le nombre d erreurs est trop important. Ainsi, µ est la fonction qui à m r associe l élément le plus proche dans l ensemble des mots de code (l ensemble des mots de la forme ψ(m)), puis applique ψ 1, afin de retrouver le message originel dans la plupart des cas (si le message reçu ne contient pas un nombre trop grand d erreurs). m Codage ψ(m) Transmission m r Décodage µ(m r ) = ψ(m ) Restrictions ψ aléatoire µ On supposera, dans la plupart des cas (sauf dans une certaine mesure pour les CIRC), que ce travail se restreint aux messages d une longueur fixée à l avance, quitte à découper le message en blocs et à les transmettre (en ajoutant éventuellement des caractères de remplissage). On étudie alors des codes par bloc. De plus, on se limitera en général à des mots écrits sur le corps F 2 k, qui correspondent à la représentation informatique de l information. On supposera également que le canal n efface pas de symbole, donc qu un bit peut être changé mais pas supprimé. 1 1.2 Notion de distance La description qui précède faisait appel à la notion de plus proche, donc implicitement de distance. On suppose que m est un n-uplet d éléments d un groupe commutatif. On définit alors la distance de Hamming d(m, m ) comme le nombre d éléments non nuls dans m m. On vérifie alors facilement qu il s agit bien d une distance. Comme on travaille sur ces blocs de longueur fixe, alors on peut définir la distance minimale du code comme la plus petite distance entre deux mots de code. Notons alors d cette distance minimale. Un bloc reçu, m, sera donc associé au mot de code m c si d(m, m c ) < d/2 et s il n existe aucun mot m c de ce type, alors on dit que l on ne peut pas corriger m car, par définition de d, il existe des cas où deux mots de code sont équidistants de m. Ainsi, la difficulté de la recherche d un bon code serait de 1 Certains canaux, par exemple pour la transition de fax par ligne téléphonique, peuvent faire disparaître des bits. 2
réussir à paver V n (avec V le groupe commutatif fini et n la longueur des blocs de mots de code). Ainsi, un des paramètres importants d un code est la distance minimale d de ce code. Codes parfaits Les codes parfaits sont ceux dans lesquels, pour tout n-uplet, il existe un mot du code qui est à une distance strictement inférieure à d/2. Autrement dit, tout mot reçu peut être décodé, ou encore les boules ouvertes de rayon d/2 pavent tout l espace des mots de longueur n : V n. 1.3 Paramètres d un code Si l on code des mots de longueur k et que les mots de code sont de longueur n, et la distance minimale est d, on appelle alors : taux d information, le rapport : k/n, taux de correction le rapport : d/n, on dira qu un code est alors du type (n, k, d). 1.4 Premiers exemples Codes des répétitions Une première idée simple de code correcteur pourrait être de répéter chaque bit un nombre impair de fois, et de chercher le nombre majoritaire de 1 ou de 0 à la réception. Si l on répète 2p+1 fois le bit, k = 1,n = 2p+1 et d = n = 2p+1. Ce code simpliste est très peu performant car son taux d information est infime, mais montre que quelque soit la perturbation du canal (si la probabilité, pour qu un bit soit inversé est différente de 1/2), on peut avoir un code qui permet de décoder un mot de code avec une probabilité aussi grande que l on veut dans [0, 1[. Bits de parités Un autre exemple est le code qui consiste en l ajout d un bit de parité, c est à dire un bit qui correspond à la somme des autres bits (modulo 2). Ce système peut avoir un taux d information aussi proche de 1 que l on souhaite, mais a toujours une distance minimale de 2, et donc, ne permet pas de correction, sauf d un effacement dont on connaît la position. Il permet cependant la détection d une erreur par bloc. Si un bloc est erroné, on peut alors demander un nouvel envoi. Cette méthode peut donc être utilisée avec des canaux introduisant peu d erreurs et dans lesquelles une demande de répétition est possible 2. Les codes de Hamming Les codes de Hamming qui constituent une amélioration des codes par ajout d un bit de parité (en réalité, on peut les voir comme un ajout de bits de parités de certains ensemble de bits du bloc). Nous ne détaillerons pas plus ici leur construction (on peut trouver cette construction dans le cas général, par exemple dans [3]). Dans le cadre de ce travail, nous avons implémenté le code Hamming de longueur 7 qui code 4 bits en 7 bits de distance 4. Afin d illustrer cette partie, nous avons fait une implémentation qui se base sur un dictionnaire (construit systématiquement grâce à la propriété de linéarité de ce code) qui permet de coder et d un système de décodage par étude exhaustive : on cherche le mot à distance inférieure à 2 du mot reçu. On a écrit une procédure qui peut s appliquer au décodage de n importe quel code par bloc dont on dispose du dictionnaire. On peut en effet trouver la distance 2 Ce type de code par somme de contrôle se trouve dans les numéros d inscription au répertoire (utilisés par la sécurité sociale) où la clé est 97, moins la valeur du numéro modulo 97. Ainsi la somme du numéro et de la clé est multiple de 97. On trouve des systèmes identiques dans les codes-barres ou les numéros isbn par exemple. 3
minimale en cherchant le minimum des distances entre deux mots ; ensuite on procède de manière exhaustive pour trouver le mot qui est à une distance inférieure à d/2 du mot reçu. Ainsi, on illustre les concepts présentés dans cette partie. Il est à noter que ces algorithmes sont rapidement impraticables, car la recherche de d à un coût en O(t 2 ), où t est la taille du dictionnaire et le décodage a un coût en O((t.n) d ), avec n la longueur des mots de code : ce qui devient très rapidement impraticable, avec les méthodes implémentées, car t est souvent d une taille en O(exp(k)). 2 Les codes de Reed-Solomon 2.1 Présentation générale Les codes de Reed-Solomon sont des codes cycliques, linéaires, particuliers. Nous allons ici présenter leur construction. Une présentation plus complète peut être trouvée dans [2], [1] ou [3] qui ont servi à la réalisation de cette étude. Nous allons travailler ici sur des mots constitués d éléments de F 2 k dont la construction est décrite en annexe. Les codes de Reedsolomon sont du type (n = 2 k 1, k, n k + 1) pour des mots de F 2 k. Ils constituent une classe de codes intéressante car ils sont optimums, c est à dire qu ils nécessitent le nombre minimum de redondance (n k) pour obtenir une distance minimale donnée, (n k + 1). De plus, il existe des implémentations de codage et de décodage relativement rapides. Nous allons présenter les opérations de codage et de décodage tel qu elles ont été implémentées dans le cadre de ce travail. Enfin, ces codes sont robustes aux bouffées d erreurs telles que l on peut en trouver sur des CD où une rayure de 1mm de largeur détruit environ 1 500 bits par tour. 2.2 Le codage Pour le code du type (n = 2 k 1, k, n k + 1), on choisit, par exemple, le polynôme g de degré n k, tel que α soit un générateur de F 2 k, et : g(x) = n k i=1 (X αi ). On considère alors le message m = (m 1,..., m k ) que l on assimile au polynôme k i=1 m i.x i. On considère alors le polynôme m(x).g(x) = n i=1 m i.xi qui est assimilé à m = (m 1,..., m n) et qui constitue le mot de code associé à m. Ainsi le codage est une multiplication de polynômes de degrés (n k) et k. 2.3 Le décodage Il existe plusieurs méthodes de décodage. Nous avons choisi celle qui est présentée dans [1]. On notera ici r = n d+1. On va décoder le mot m = m +e où m est le message codé envoyé et e l erreur due à la transmission qui a un poids inférieur à r/2. Nous allons alors essayer de retrouver e : une division euclidienne par g suffira pour retrouver le message originel. Transformée de Fourier discrète On a alors l algorithme de transformée de Fourier discrète (noté DF T ) qui transforme le polynôme m = (m 0,...m n 1 ) en DF T (m) = (h 0 = m(α 0 ),..., h n 1 = m(α n 1 )) où α est le générateur du corps F 2 k utilisé pour obtenir le polynôme g. On notera aussi pour b n, DF T b (m) = (m(α 1 ),..., m(α b 1 )). On dispose aussi de l algorithme DF T 1 qui correspond à l évaluation de m en les α i, autrement dit : DF T 1 (m) = (h 0 = m((α 1 ) 0 ),..., h n 1 = m((α 1 ) n 1 )). On remarque que ces opérations sont clairement linéaires. On supposera alors démontré que DF T 1 (DF T (m)) = m pour tout m (cette démonstration se fait sans difficulté). Comme pour 1 i < r, α i est racine de g, DF T r (m ) = DF T r (m + e) = DF T r (m) + DF T r (e) = DF T r (e). Donc pour avoir DF T (e) afin d obtenir e, il suffit de trouver les coefficients suivants de DF T (e). 4
Méthode pour obtenir DF T (e) On va définir ce qu est une suite générée linéairement : Définition 2.3.1. On dit que la suite (x i ) i 0 est générée linéairement par un polynôme de degré a si il existe un polynôme g(x) = X k a 1 X k 1... a k tel que n k, on ait x n = a 1 x n 1 +...+a k x n k. On appelle alors LF SR Π (E 0...b ) la génération de la suite (E i ) i (b k) linéairement liée par Π et telle que ses premiers éléments soient (E 1,..E b ). On va alors montrer le théorème suivant : Théorème 2.3.1. Les coefficients de DF T (e) sont linéairement générés par un polynôme de degré égal au poids de e. Démonstration. On note (E i ) = (e(α 0 ),..., e(α k )...) la suite des coefficients de la transformée de Fourier. Comme α n = 1, alors cette suite est périodique de période n. Donc, la série entière F (X) = i=1 E ix i a bien un sens sur ] 1, 1[. Or on a (car l interversion de l ordre de sommation ne pose pas de problème) : F (x) = i=1 E ix i = i=1 ( n 1 j=0 e jα ij )X i = n 1 j=0 e j( i=1 (αj X) i ) et donc, on a : n 1 1 F (X) = e j 1 α j X = R(X) Π(X) j=0 avec deg(r) < deg(π) et n 1 j=0ete j 0 (1 αj X). Donc Π est de degré égal au poids de e. Et donc, on note Π(X) = X k a 1 X k 1... a k et on a Π(X)F (X) = R(X). Donc, pour n k, le coefficient de X n+k est nul, car deg(r) < deg(π) est la décomposition en série entière est unique. Donc E n a 1 E n 1... a k E n k = 0. Il suffit donc de trouver le polynôme générateur. Algorithme de Berlekamp-Massey Cet algorithme permet de trouver le polynôme qui lie linéairement une suite finie (E 1,..., E r ) donnée en entrée : Algorithme 1 Algorithme de Berlekamp-Massey Entrées : S 1,..., S n : des éléments de F 2 k Sorties : Le polynôme minimal générateur de la suite. b 1 ; e -1 ;L 0 ;Π 1 F 2 k[x] ;ψ 1 F 2 k[x] ; Pour k de 0 à n faire δ S k + L i=1 Π is k i Si (δ > 0) Alors P Π ;Π Π + δ b Xk e ψ ; Fin Si Si (2L k) Alors ψ P ;L (k + 1 L) ;b δ ;e k ; Fin Si Fin Pour Retourner Π L idée de cet algorithme est de prendre successivement les éléments de S k, tout en faisant en sorte qu à la k e itération, le polynôme Π soit bien le polynôme générateur de la suite (S 1,..., S k ). On trouve ainsi le polynôme cherché. Il a un coût en O(r 2 ) car il y a r itérations où l on fait des affectations de polynômes de degré inférieur à r. 5
Opérations de décodages On a donc une méthode pour calculer l erreur. On calcule DF T r (m ) = DF T r (e), puis avec l algorithme de Berlekamp-Massey, on obtient le générateur. Il n y a plus qu à générer les autres éléments pour obtenir DF T (e). On applique ensuite DF T 1 : DF T 1 (DF T (e)) = e. On a donc trouvé l erreur introduite d un poids inférieur à r/2. On a donc m = m + e, le mot de code qu il suffit de décoder en divisant par g. Ainsi on a bien décodé le message à condition que l erreur introduite ait un poids inférieur à r/2. 2.4 Remarque sur le coût des algorithmes Les algorithmes présentés ici peuvent être d un coût assez faible. Si l on a un algorithme pour une transformée de Fourier rapide en O(n log(n)), alors le produit de polynômes pour le codage aurait un coût semblable. Le décodage serait en O(n log(n)) car l algorithme de Berlekamp-Massey a un coût en O(r 2 ), mais en général r est petit devant n, et peut être amélioré en terme de coût. Donc, le coût des algorithmes devrait être assez faible. Cependant, la transformée de Fourier rapide se fait habituellement sur des listes d une longueur égale à une puissance de 2. Il faudrait donc avoir une racine d ordre égal à une puissance de 2, ce qui est bien-sûr impossible (car aucune puissance de 2 ne divise 2 k 1) sans extension algébrique dans F 2 k. Ainsi, pour gagner en performance, il faudrait implémenter la transformée de Fourier discrète rapide pour des listes d une longueur autre qu une puissance de 2 (comme [11] en présente une méthode) ou faire une extension algébrique à F 2 k pour avoir une racine primitive de l unité d ordre 2 k et faire des calculs sur des listes de longueur 2 k. Signalons que, dans l article originel de Irving S. Reed et Gustave Solomon [4] la méthode de décodage avait un intérêt purement théorique car il nécessitait l inversion de C k n matrices de taille k k et donc n était pas réalisable en pratique. Mais les méthodes de décodage sont de plus en plus performantes, comme celle présentée ici, et permettent d utiliser réellement ce code. 3 Les codes CIRC Les codes de Reed-Solomon peuvent être utilisés directement ou peuvent être la base de codes entrelacés : les CIRC (Cross-Interleaved Reed Solomon Code). Ces CIRC se trouvent par exemple sur les supports d enregistrements du type CD ou DVD. Nous allons ici, à titre d exemple, présenter les codes proches de ceux trouvés sur les CD audio 3. 3.1 L entrelacement avec retard L entrelacement consiste à mélanger les blocs, afin qu un bloc soit envoyé de façon diluée. Cette procédure permet en particulier de minimiser l effet d une bouffée d erreurs (due par exemple à une rayure à la surface du CD). Un tableau est appelé entrelaceur : il sert à faire ce travail. Nous allons décrire un entrelacement avec un retard de r sur des blocs de n lettres. On considère alors un tableau de r colonnes et de n lignes. A l initialisation, on considère les r premiers mots (a 1 = (a 1,1,..., a 1,n ),..., a r = (a r,1,..., a r,n )) et on place chaque a k,i dans la (r.i+k) e colonne et dans la i e ligne. Par exemple, l initialisation d un entrelaceur avec un retard de 2 et des mots de taille 4 donnent (on note a 1 = a et a 2 = b) : 3 Ces codes ne sont pas nécessairement exactement les mêmes que ceux des CD audio car ils dépendent du choix de l élément générateur du corps F 256 utilisé ici. Cette information est dans l ouvrage de normalisation, le Red Book, qui n a pas pu être consulté. 6
a 1 b 1 a 2 b 2 a 3 b 3 a 4 b 4 Ensuite, les r premières colonnes sont transmises (en les complétant éventuellement). Puis les colonnes sont toutes décalées de r colonnes vers la gauche (celles qui viennent d être envoyées sont écrasées, et à droite r nouvelles colonnes vierges apparaissent. Cela peut être géré par un tableau circulaire grâce à un curseur qui indique la position de la première colonne). On remplit alors la diagonale comme précédemment. Dans le cas du retard 2 avec des mots de longueur 4, après avoir envoyé (a 1, *, *, *), (b 1, *, *, *) et rempli l entrelaceur on a : c 1 d 1 a 2 b 2 c 2 d 2 a 3 b 3 c 3 d 3 a 4 b 4 c 4 d 4 On envoie alors les r premières colonnes et on poursuit le procédé. Ainsi, on peut coder à la volée l information, sans connaître a priori la longueur du message. Le décodage se fait en remplissant l entrelaceur, colonne par colonne, et en reconstituant les mots. 3.2 Le codage CIRC L idée est de coder avec un premier code C 1 puis d entrelacer et enfin de coder à nouveau avec un deuxième code C 2. Nous nous placerons ici dans un cas précis de code, qui est celui utilisé pour les CD audio. On considère le code de Reed-Solomon (255,251,5). Ce code étant linéaire, il peut être représenté par une matrice génératrice C, on considère alors C, une matrice génératrice, telle que les 251 premières colonnes soient indépendantes. Cette matrice est alors équivalente à G tel que tr G = [I 251, R 251 4 ]. On considère alors R 1 et R 2 respectivement, les matrices formées des 24 et 28 dernières lignes de R 251 4. On vérifie de plus que 4 lignes quelconques de R 2 (et donc de R 1 ) forment un système libre. On admettra alors que les codes linéaires C 1 et C 2 qui sont définis par les matrices [I 24, R 1 ] et [I 28, R 2 ] sont bien de distance 5. Pour coder le CIRC, on code d abord avec le code C 1 (tel que m tr R 1 m), puis les blocs sont entrelacés avec un retard de 4 octets. Ils sont enfin à nouveau codés avec C 2. Donc, de manière asymptotique, le code transforme un bloc de longueur 24 en un bloc de longueur 32. Son taux d information est donc équivalent à 24/32 = 3/4. m Codage C 1 Entrelacement Codage C 2 m r 3.3 Le décodage Le décodage réside dans le fait que l on peut corriger 2 fois plus d effacement que d erreurs. Ainsi on commence par essayer de décoder le message reçu par le décodeur de C 2. Si le bloc contient moins d une erreur, on la corrige, sinon on considère que le bloc a été entièrement effacé, car C 2 permet de corriger une erreur ou d en détecter 4. Ensuite on désentrelace, on obtient donc des mots de codes C 1, éventuellement, en partie effacés. On peut alors corriger jusque à 4 effacements (car la distance est 5). S il y a plus de 4 effacements dans le bloc, on ne peut pas le compléter. On considère alors la matrice H 2 = [ tr R 2, I 4 ]. Si m est un mode de code de C 2, alors H 2 m = 0. Donc, si m = m + e est le mot reçu, tel que e soit l erreur introduite, alors H 2 m = H 2 e, et donc H 2 m V ect(c i ) (avec C i la i e colonne de H 2 ) si et seulement si e est de poids inférieur ou égal à 1 (on suppose ici que e ait un poids inférieur à 5). On peut ainsi corriger une erreur de poids inférieur à 1 dans le message reçu, sinon, on note le bloc comme étant effacé. 7
Ensuite, on désentrelace les blocs. On obtient ainsi des blocs de code C 1 qui contiennent éventuellement des effacements (s il y en a plus que 4, on ne peut pas corriger le mot). Comme précédemment, on définit H 1 = [ tr R 1, I 4 ]. On a donc H 1 m = 0 si m est un mot de code de C 1. Donc, si m contient des effacements aux positions (i 1, i 2, i 3, i 4 ) (quitte à en ajouter), on considère alors m le vecteur égal à m quand le caractère n est pas effacé (c est-à-dire n a pas un indice dans (i 1, i 2, i 3, i 4 )), ou qui est nul quand le caractère de même position dans m est effacé. Donc m i vaut m i ou 0 si m i a été effacés. Donc, si [e i 1, e i2, e i3, e i4 ] sont les coefficients effacé, alors : H 2 m + [C i1, C i2, C i3, C i4 ] tr [e i1, e i2, e i3, e i4 ] = 0, et donc : tr [e i1, e i2, e i3, e i4 ] = [C i1, C i2, C i3, C i4 ] 1 H 2 m. On a donc corrigé jusqu à 4 effacements, mais on ne peut pas en corriger plus. Correction d au plus Correction d au m r + e une erreur de C 1 Désentrelacement plus 4 effacements m et effacement sinon de C 2 3.4 Avantages de ces codes L avantage de ces codes est assez clair : en plus de résister aux erreurs ponctuelles grâce à la correction de C 1, ils résistent à une grande série d erreurs : jusqu à 4 fois (car on a un retard de 4) une série de 4 mots de 32 octets, c est-à-dire 512 octets (ce qui correspond à une rayure de plusieurs millimètres sur un CD). Ainsi ce code est bien adapté aux corrections en grand nombre. De plus les opérations de codage et de décodages sont simples à réalisé, et donc peuvent être faites par un système électronique simple. 4 Comparaison des codes 4.1 Présentation des tests effectués Les test sont effectués sur un fichier image de type.ppm (codé en RVB) de 2 Mo. Nous allons essayer de mesurer différents paramètres des codes étudiés sur cet exemple. Notons que les algorithmes pourraient être adaptés à tous types de fichiers. Les tests sont effectués sur un ordinateur équipé d un processeur Intel Pentium M, cadencé à 1,7 Ghz et de 1 Go de mémoire vive, sous une architecture Linux et avec Objective Caml version 3.09.2. Les test ont été fait sur un code interprété et non compilé. Afin d illustrer cette partie, nous joignons en annexe des illustrations obtenues lors des essais. Comparaison des vitesses de codage et de décodage Ces codes étant souvent utilisés pour transmettre de l information en temps réel, l argument de vitesse est important. Il est à noter, cependant, que les implémentations pourraient être nettement optimisées, comme nous l avons déjà souligné. De plus nous pourrions compiler le code pour gagner sensiblement en vitesse. Nous donnerons alors les vitesses de codage et de décodage, soit lorsque il n y a pas d erreurs soit lorsque des erreur, sont apparues. Résistance au bruit Nous avons programmé une fonction de bruitage qui prend en entrée un entier p et un fichier. Elle change chaque octet de ce fichier (par un octet tiré au hasard) avec une probabilité de 1/p. Nous donnerons alors une valeur approchée de la valeur limite de p pour laquelle le ficher corrigé ne peut plus être récupéré à l identique. 8
Résistance aux bouffées d erreurs Pour ce test, nous simulons une rayure à la surface d un CD : grâce à un outil graphique, on dessine une bande irrégulière sur l image codé. On vérifiera donc si l image est fortement altérée visuellement ou non et nous donnerons une valeur approchée de la largeur maximum de la rayure irrégulière (en pixels) pour que l image soit intacte après décodage. 4.2 Tableaux comparatifs Vitesse Codes Codage Décodage sans Décodage avec erreur erreurs Hamming 80ko/s 3ko/s 1ko/s Reed-Solomon 15ko/s 4,5ko/s de 4,5 à 1 ko/s (255,190,66) CIRC 118ko/s 181ko/s de 180 à 90ko/s Entrelacement 1,3Mo/s 1,3Mo/s 1,3Mo/s Efficacité Codes Résistance Taille de rayure Résistance visuelle au bruit critique aux rayures Reed-Solomon p = 50 5 bonne (255,190,66) CIRC p = 100 20 très bonne Entrelacement p = 0 assez bonne 4.3 Analyse des tests Nous allons alors commenter les tests. Le code de Hamming Le code de Hamming ne permet pas d éliminer le bruit ou une rayure car il corrige chaque octet indépendamment et les opérations de dégradation de l image (dans le brouillage ou la rayure) modifient totalement l octet. Donc, il ne peut pas être corrigé. Ces tests ne sont donc pas réellement adaptés à ce type d erreurs, et donc au test des codes de Hamming. On remarque aussi que la méthode de décodage par étude exhaustive (ie : recherche systématique dans la boule de rayon d/2) est rapidement impraticable. Il n est donc pas réaliste de vouloir décoder de cette manière pour des codes plus longs. Bien que nos tests soient peu adaptés au code de Hamming, il est relativement mauvais par rapport aux codes qui suivent. Le code de Reed-Solomon Afin de pouvoir comparer ce code avec le CIRC, nous avons choisi un code dont le taux d information est proche du CIRC, on a donc choisi (255,190,66). On remarque que la résistance aux bouffées d erreurs, bien quelle soit meilleure que beaucoup d autres codes, est relativement faible par rapport aux CIRC. Mais la résistance au bruit est très importante, car, par exemple, une mauvaise ligne téléphonique a un taux d erreurs de moins de 10 4. Donc, ce code est très performant pour résister au bruit, mais il est peu rapide dans notre implémentaion, pour les raisons exposées au 2.4. Cette vitesse pourrait être sensiblement améliorée avec un algorithme plus rapide pour faire la transformée de Fourier. 9
Les codes CIRC Ces codes résistent très bien aux bouffées d erreurs. Ils ont une capacité de correction du bruit inférieur au code de Reed-Solomon. De plus, ils sont rapides à coder et à décoder et on comprend bien que leurs mises en œuvre dans une électronique simple est plus facile que celle des algorithmes de Reed-Solomon. Le débit atteint ici, avec une optimisation assez limitée, permet de lire de la musique sur un CD audio en temps réel. Enfin, ces codes nous permettent de savoir que l information a été perdue (alors que les codes de Reed-Solomon changeront l information perdue) et nous permettent d extrapoler l information. 4 Entrelacement et amélioration des codes par un entrelacement Un entrelacement avec retard 4 sur des mots de longueurs 24 nous permet de diluer la perte d information due à une rayure. Ainsi, l image perd en netteté mais l on distingue toujours l ensemble de l image. Ainsi, avec leur grande rapidité, ils peuvent être utiles. On pourrait, par exemple, le jumeler avec un système de sommes de contrôle pour détecter des erreurs et extrapoler l image aux blocs erronés. L entrelacement nous a permis de diluer les effacements dans les CIRC. Nous avons donc essayé d entrelacer une nouvelle fois les CIRC, mais, après expérimentation, nous avons constaté que cet entrelacement dilue la perte d information sur l ensemble du message et donc que ce type de code est relativement peu performant face au bruit, il a plutôt tendance à détruire l image intégralement. On perdrait donc la forte capacité des CIRC à corriger les paquets d erreurs. Nous avons ensuite appliqué un entrelacement aux images codées grâce aux codes de Reed-Solomon. En diluant une rayure, elle est mieux corrigée. La capacité à corriger le bruit reste identique. Ainsi nous avons amélioré les performances des codes de Reed-Solomon pour certaines applications. Il peut ensuite être intéressant de faire varier le retard ou la longueur des blocs d entrelacement. Conclusion Nous avons vu que les codes de Reed-Solomon résistent très bien au bruit et donc peuvent être utilisés pour des sondes spéciales, d exploration lointaine, comme les sondes Voyager par exemple. Ils sont relativement compliqués à décoder, mais les techniques de décodage évoluent. Les CIRC sont eux, moins robustes au bruit, mais supportent nettement mieux les bouffées d erreurs, de plus leur décodage est simple et trouvent donc d autres domaines d application comme dans les supports d enregistrement, par exemple. Enfin, nous avons vu que l entrelacement permet d améliorer certains codes, comme par exemple, les codes de Reed-Solomon qui résistent mieux aux bouffées d erreurs s ils sont entrelacés. La technique de l entrelacement est mis en œuvre de manière très puissante dans les Turbo-Codes qui utilisent des méthodes d entrelacement évoluées pour obtenir des codes très performants. 4 C est ce qui se passe sur les systèmes de lecture de CD audio. 10
Références [1] Jean-Guillaume Dumas, Jean-Louis Roch, Eric Tannier et Sébastien Varrette ; Théorie des codes, compression, cryptage, correction, de sciences sup, Dunod, 2006. [2] Michel Demazure ; Cours d algèbre. Primalité, divisibilité, codes, de la Nouvelle bibiliotèque mathématique. Cassini, 1997. [3] F. J. MacWilliams et N. J. A. Sloane ; The Theory of Error-Correcting Codes, de Mathematical Library, North-Holland, 1977. [4] Irving S. Reed et Gustave Solomon, Polynomial Codes Over Certain Finite Fields, dans Society for Industrial and Applied Mathematics, Vol. 8, No. 2, pp. 300-304 (Juin, 1960). [5] Contact avec Claude Berrou, professeur à l ENST Bretagne, co-inventeur des Turbocodes. [6] Contact avec Jean-Guillaume Dumas, maître de conférences à l université Grenoble1. [7] Contact avec Pierre Schramm, étudiant à l École Normale Supérieure de Lyon. [8] Article Red Book (audio CD standard), Wikipedia (en), (version du 18 mai 2007). [9] Article Reed-Solomon error correction, Wikipedia (en), (version du 16 mai 2007). [10] Site internet de l entreprise 4i2i spécialisée dans les codes correcteurs d erreurs (consulté en mai 2007) : http://www.4i2i.com/reed_solomon_codes.htm [11] Joris van der Hoeven ; Article The truncated Fourier transform and applications (consulté en mai 2007) : http://www.math.u-psud.fr/~vdhoeven/publs/2004/issac04.ps.gz [12] Présentation d un projet demandé aux élèves de l école Polytechnique (consulté en mai 2007) : http://www.enseignement.polytechnique.fr/profs/informatique/ Nicolas.Sendrier/X98/projet/ 11
Annexe 1 : construction et implémentation de F 2 k Nous utilisons dans ce travail le corps F 2 8. Nous allons alors expliquer la construction et l implémentation des corps F 2 k pour k N. Cette construction se généralise facilement à F 2 8 pour p premier. Cette présentation est inspirée de [2] et [1]. 4.4 Construction de F 2 k On note F 2 = Z/2Z. On suppose qu il existe un polynôme irréductible de degré k dans F 2 [X]. On donnera une méthode de recherche d un tel polynôme au 4.5. Soit alors P F 2 [X] irréductible de degré r. On a alors : Théorème 4.4.1. F 2 [X]/P est un corps pour les opérations + et.. Démonstration. Les opérations + et. reviennent en réalité à faire les opérations + et. sur F 2 [X] puis à passer modulo P. Ainsi, puisque F 2 [X] est un anneau commutatif, alors F 2 [X]/P est un anneau commutatif unitaire. Montrons alors que tous les éléments de F 2 [X]/P sont inversibles. En effet, pour Q non nul de cet ensemble, nécessairement deg(q) deg(p ). Comme P est irréductible et Q 0 mod P, donc P et Q sont premiers entre eux. Il existe donc deux polynômes A et B tels que P.A + B.Q = 1 et donc B.Q = 1 mod P, donc Q est inversible dans F 2 [X]/P. Ainsi, F 2 [X]/P est un corps de cardinal 2 d que l on notera F 2 d. 4.5 Recherche du polynôme irréductible de degré r dans F 2 Nous allons donner une condition pour qu un polynôme soit irréductible. Commençons par une propriété sur les polynômes contenant un carré. On définit la dérivation formelle de manière habituelle. Théorème 4.5.1. Soit P un polynôme ; il est sans carré si, et seulement si, P GCD(P, P ) = 1 Démonstration. En effet, si P = g 2 h (avec h et g des polynômes tels que g ne soit pas constant). Alors P = 2g gh+g 2 h = g(2g h+gh ), donc pgcd(p, P ) est un multiple de g. Réciproquement, si g = P GCD(P, P ), un polynôme non constant, on prend alors h, un facteur irréductible de g, et on note alors P = hc et P = hd. Donc, en dérivant P, on obtient P = hd = hc + h c et donc h(d c ) = h c. Or, comme h est irréductible et deg(h ) < deg(h), donc h et h sont premiers entre eux. Donc, avec le théorème de Gauss on a que c est un multiple de h. On note c = he et, enfin, P = hc = h 2 e. Démontrons alors un lemme : Lemme 4.5.1. r N divise d N si et seulement si p r 1 divise p d 1. Démonstration. En effet, si d = r.k, alors comme 2 r = 1 mod (2 r 1) Donc 2 d = (2 r ) k = 1 mod 2 r 1. Réciproquement, si 2 d 1 = 0 mod (2 r 1), alors si d = r.k + t est la division euclidienne de d par r, alors 2 d 1 = 2 k.r.2 t 1 = 2 t 1 = 0 mod (2 r 1). Or, comme 0 t < r, alors 2 t 1 = 0 et donc s = 0 et r divise d. On montre alors le théorème qui nous permettra d obtenir un algorithme qui fournit un polynôme irréductible de degré d de F 2 [X] : Théorème 4.5.2. Pour d N, alors le polynôme X 2d X est le produit de tous les polynômes irréductibles (unitaires) dont le degré divise d dans F 2 [X]. 12
Démonstration. Soit P un polynôme irréductible de degré r divisant d, on a que V = F 2 [X]/P est un corps. Dans ce corps, tout élément a un ordre qui divise le cardinal de l ensemble des éléments inversibles (ie : du groupe (V,.)), d après le théorème de Lagrange, et donc divise 2 r 1. Donc, pour X V, X 2r 1 = 1. Or avec le lemme qui précède on a que 2 r 1 divise 2 d 1. Donc X 2d 1 = 1 mod P donc P divise X 2d 1 1 et donc X 2d X. Réciproquement, si P est un diviseur irréductible de X 2d X de degré r, alors dans V = F 2 [X]/P, on a X 2d X = 0. Mais les éléments Q V tels que Q 2d Q = 0 forment un sous-anneau de V. Or, comme X est dans cet ensemble, il est égal à tout V. Donc, pour tous les éléments Q de V on a, Q 2d 1 = 1. Or on sait que V contient des éléments d ordre 2 r 1, donc 2 r 1 divise 2 d 1 et donc, enfin, r divise d. Montrons alors que X 2d X ne possède pas de facteur multiple. Le polynôme dérivé est : 2 d X 2d 1 1 = 1 dans F 2 [X] et donc X 2d X ne contient pas de carré. Ainsi un polynôme P de degré d est irréductible si, et seulement si, il n a aucun facteur commun avec X 2i X pour 0 i d/2. Ainsi, dans le cadre de ce travail, il a été implémenté l algorithme de Ben-Or qui vérifie si P GCD(P, X 2i X) = 1 pour i qui varie de 1 à d/2, afin de déterminer si un polynôme est irréductible dans F 2. Il a aussi été implémenté un générateur d un polynôme irréductible de degré d qui choisit au hasard un polynôme de degré d et teste si il est irréductible jusqu à en obtenir un irréductible (on montre qu un tel algorithme se termine rapidement, en général). 4.6 Implémentation de F 2 k On va alors expliquer comment sont implémentées les opérations sur le corps F 2 k ainsi construit. On suppose qu avec l algorithme précédent, on ait un polynôme P de degré k irréductible de F 2. X est alors un générateur du corps F 2 [X]/P. On construit donc un tableau T de taille 2 k 1 : T[0..2 k 2], tel que T[k]=X k mod P. On représentera un élément de F 2 k par i quand cet élément du corps est X i mod P, et 0 sera représenté par 1. Grâce à T, on va construire Q[0..2 k 2] tel que Q[k] correspond à i tel que X k + 1 = X i = mod P. Dans la suite, il n est utile que de conserver Q. Ainsi, avec le tableau Q, on peut définir les opérations de multiplication, d inversion et d addition (on remarque que l opération d addition et de soustraction sont identiques ici) : pour la multiplication de i et j (qui représentent respectivement X i mod P et X j mod P ), si i et j sont différents de 1, alors le produit vaut (i + j) mod (2 k 1), car X i X j = g i+j, l inversion de X i, représentée par i diffèrent de 1 est alors simplement i mod (2 k 1), l addition X i +X j = X i (1+X.(j i)) est donc représentée par : (i+q[(i j) mod (2 k 1)]) mod (2 k 1). 13
14