Codes correcteurs d`erreurs

Transcription

Codes correcteurs d`erreurs
Codes correcteurs d’erreurs
1
1.1
Partie théorique
Définition
Un code correcteur est une technique de codage de l’information basée sur la redondance, qui
vise à détecter et corriger des éventuelles erreurs de transmission d’un message sur une voie de
communication peu fiable (radio, câble, fibre optique, ....) ou depuis des supports de stockage (CD,
DVD, mémoire) où l’intégrité des données est importante.
1.2
Principe
Prenons l’exemple d’un message simple à transmettre, du type "01234". Si l’on transmet directement la suite de chiffres, l’information sera compacte, délivrera l’information, mais une erreur
en réception du type "01134" sera indétectable. Au contraire, une transmission du type "zéro un
deux trois quatre" est (trop) riche, contient la même information, mais une erreur en réception du
type "zéro un deux trois quatre" sera détectée et correctible. Ce principe de redondance permet
de construire les codes correcteurs d’erreurs.
En pratique, les messages sont transmis sur un canal sous la forme d’une suite de bits (des 0 et
de 1). Les canaux de transmission imparfaits entraînent des erreurs lors des échanges de données
(un zéro qui devient un 1 ou inversement). Par exemple, la probabilité d’erreur sur une ligne
téléphonique est de l’ordre 10−6 . Avec un tel taux d’erreur et une connexion à 1 Mo/s, en moyenne
8 bits erronés sont transmis chaque seconde.
Le principe général des codes correcteurs d’erreur est alors le suivant :
– Chaque suite de bits à transmettre est augmentée par une autre suite de bits dite de redondance ou de contrôle.
– Pour chaque suite de k bits transmise, on ajoute r bits. On dit alors que l’on utilise un code
C(n, k) avec n = k + r.
– À la réception, les bits ajoutés permettent d’effectuer des contrôles
1.3
Le code ISBN
L’International Standard Book Number (ISBN) est un numéro international qui permet d’identifier, de manière unique, chaque livre publié. Le numéro ISBN-10 se compose de trois segments
de longueur variable et d’un segment de longueur fixe. La longueur totale de l’ISBN comprend dix
chiffres (le 1er janvier 2007, la longueur a été étendue à 13 chiffres en ajoutant un groupe initial
de 3 chiffres). Si les quatre segments d’un ancien code ISBN à 10 chiffres sont notés S1 - S2 - S3 S4 :
1
–
–
–
–
S1 identifie un groupe de codes pour un pays, une zone géographique ou une zone de langue.
S2 identifie l’éditeur de la publication.
S3 correspond au numéro d’ordre de l’ouvrage chez l’éditeur.
S4 est un chiffre-clé calculé à partir des chiffres précédents et qui permet de vérifier qu’il n’y
a pas d’erreurs. Outre les chiffres de 0 à 9, cette clé de contrôle peut prendre la valeur X, qui
représente le nombre 10.
Pour calculer S4, on attribue une pondération à chaque position (de 10 à 2 en allant en sens
décroissant) et on fait la somme des produits ainsi obtenus. On conserve le reste de la division
euclidienne de ce nombre par 11. La clé s’obtient en retranchant ce nombre à 11. Si le reste de la
division euclidienne est 0, la clé de contrôle n’est pas 11 (11 - 0 = 11) mais 0. De même, si le reste
de la division euclidienne est 1, la clé de contrôle n’est pas 10 mais la lettre X. Le nombre 11 étant
premier, une erreur portant sur un chiffre entraînera automatiquement une incohérence du code
de contrôle. La vérification du code de contrôle peut se faire en effectuant le même calcul sur le
code ISBN complet, en appliquant la pondération 1 au dixième chiffre de la clé de contrôle (si ce
chiffre-clé est X, on lui attribue la valeur 10) : la somme pondérée doit alors être un multiple de
11.
Ce type de détection est appelé somme de contrôle (cheksum), cas particulier de contrôle par
redondance, qui permet la détection (mais pas la correction) des erreurs. Le principe est d’ajouter
aux données des éléments dépendant de ces dernières et simples à calculer. Cette redondance
accompagne les données lors d’une transmission ou bien lors du stockage sur un support quelconque.
Plus tard, il est possible de réaliser la même opération sur les données et de comparer le résultat
à la somme de contrôle originale, et ainsi conclure sur la corruption potentielle du message.
Pour un code ISBN 5-38733-044, la somme des produits fait 243. Le reste de la division euclidienne de 243 par 11 est 10, et la clé de contrôle est donc 11-10=1. l’ISBN complet est donc
5-38733-044-1. La vérification de la clé complète à 10 chiffres donne la somme pondérée 242, qui
est bien divisible par 11.
1.4
Le Code de Hamming
Un code de Hamming permet la détection et la correction automatique d’une erreur si elle ne
porte que sur une lettre du message. Un code de Hamming est parfait, ce qui signifie que pour
une longueur de code donnée, il n’existe pas d’autre code plus compact ayant la même capacité de
correction. En ce sens, son rendement est maximal.
Le code de Hamming se base également sur un checksum, sous la forme de bits de parité répartis
dans le message à transmettre. Un bit de parité est égal à zéro si la somme des autres bits est
paire. Dans le cas contraire, il est égal à un. Ainsi, si la somme des bits est impair, c’est qu’il y a
eu une erreur de transmission (attention, un nombre pair d’erreurs passe inaperçu). Par exemple,
1011001 (7 bits) devient 01011001 (8 bits).
Un code de Hamming se compose alors de m bits du message à transmettre et de n bits de
contrôle de parité. La longueur totale du message est de 2n − 1, et donc m = (2n − 1) − n. Les
bits de contrôle de parité Ci sont en position 2i , i ≥ 0, et les bits du message Dj occupent le reste
du code. On parle souvent d’un code de Hamming (n+m)-m. Ainsi, la structure d’un code 7-4 est
D3 D2 D1 C2 D0 C1 C0 .
Pour retrouver l’erreur dans un code de Hamming, on regarde les bits de parité. Dans le cas
précédent, si C2 , C1 , C0 ont tous la bonne valeur, il n’y a pas d’erreur. Dans le cas contraire, la
2
valeur des bits de contrôle indique la position de l’erreur entre 1 et 7. Le code de Hamming présenté
ici ne permet de retrouver et corriger qu’une erreur.
Pour connaître quels bits sont vérifiés par chacun des bits de contrôle de parité, il est utile de
construire le tableau suivant : les lignes sont numérotées dans la dernière colonne de 1 à 2n − 1
(dans l’exemple précédent 2n − 1 = 7), chaque nombre est converti en binaire et l’on écrit chaque
bit dans les colonnes de gauche. On colorie de la couleur de Ci les nombres de droite s’il y a un 1
dans dans la colonne Ci . Par exemple, 5 sera annoté en vert et en rouge, car sur la ligne du 5, il y
a un 1 dans les colonnes C2 et C0 . Les bits de contrôle d’une couleur donnée vérifient les bits du
message qui portent la même couleur. Chaque bit de données est coloré d’une manière différente,
ce qui permet de retrouver la position d’une erreur.
C2
0
0
0
1
1
1
1
C1
0
1
1
0
0
1
1
C0
1
0
1
0
1
0
1
décimal
1•
2•
3••
4•
5••
6••
7•••
Ainsi, si l’on souhaite envoyer 1010, le calcul des bits de parité amène à envoyer le message
1010010. Si le message effectivement reçu est 0010010 :
– C0 a la mauvaise valeur, car 0+1+0+0 est impair, donc il y a une erreur en position 7, 5, 3
ou 1.
– C1 a la mauvaise valeur, car 0+0+0+1 est impair, donc il y a une erreur en position 7, 6, 3
ou 2.
– C2 a la mauvaise valeur, car 0+0+1+0 est impair, donc il y a une erreur en position 7, 6, 5
ou 4.
On écrit alors le nombre binaire C2 C1 C0 où Ci vaut 0 si le bit de contrôle Ci a la bonne valeur et
1 sinon. On obtient alors 111, ce qui correspond à 7 en binaire. Le bit erroné est le numéro 7.
Si un des bits de parité Ci est altéré, la technique fonctionne encore. Par exemple, si le message
reçu est 1010011 :
– C0 a la mauvaise valeur, car 0+1+0+0 est impair, donc il y a une erreur en position 7, 5, 3
ou 1.
– C1 a la bonne valeur, car 1+0+0+1 est pair. Il n’y a pas d’erreur en position 7, 6, 3 et 2
– C2 a la bonne valeur, car 1+0+1+0 est pair. Il n’y a pas d’erreur en position 7, 6, 5 et 4.
et C2 C1 C0 =001.
Notons enfin qu’il existe un outil simple permettant de compter le nombre de bits altérés dans
la transmission d’un message d’une longueur donnée : la distance de Hamming. Ainsi, la distance
de Hamming entre 1011101 et 1001001 est 2 car deux bits sont différents. Il est souhaitable d’avoir
une certaine distance entre les mots envoyés, afin de détecter s’il y a eu une erreur de transmission.
Par exemple, si l’on a trois messages à transmettre de trois bits, il vaut mieux choisir les codages
qui sont à distance 2 les uns des autres, par exemple 000, 110 et 101. En effet, si un seul bit est
altéré, on recevra un message impossible. Par contre, en utilisant 000, 001 et 010, un bit altéré
pourrait passer inaperçu.
3
1.5
Code cyclique de redondance - CRC
Ce code utilise une représentation polynomiale des bits à transmettre. Le mot b1 · · · bn est
n
X
représenté par le polynôme P (x) =
bi xn−i . Ainsi, par exemple 1100101 est représenté par le
i=1
polynôme P (x) = x6 + x5 + x2 + 1. Toutes les expressions polynomiales sont manipulées par la
suite avec une arithmétique modulo 2.
Dans le mécanisme de détection d’erreur du CRC, un polynôme prédéfini (appelé polynôme
générateur et noté G(X)) est connu de l’émetteur et du récepteur. La détection d’erreur consiste
pour l’émetteur à ajouter au message à émettre un code de contrôle tel que le polynôme correspondant au message plus le code de contrôle soit divisible par le polynôme générateur choisi, et
de transmettre le message et le polynôme générateur au récepteur. Le message reçu qui contient
les données et le CRC doit être divisible par le polynôme générateur.Il suffit alors au récepteur
de vérifier par une division euclidienne en base 2 que le reste de la division du message par le
polynôme est nul.
Les polynômes générateurs (qui possèdent de bonnes propriétés) souvent utilisés sont
– CRC-12 =x12 + x11 + x3 + x2 + x + 1
– CRC-16 =x16 + x15 + x2 + 1
– CRC-CCITT =x16 + x12 + x5 + 1
– CRC-32 =x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x + 1
Prenons un cas pratique : on choisit le polynôme générateur G(x) = x4 + x2 + x et on le
transforme en un mot binaire, soit 10110. Pour une message 11100111 à transmettre, on ajoute m
zéros à ce mot binaire où m est le degré du polynôme générateur, ce qui donne 111001110000. On
ajoute alors itérativement à ce mot, le mot correspondant au polynôme générateur jusqu ?à ce que
le mot obtenu soit inférieur au polynôme générateur. Ce mot obtenu correspond au CRC à ajouter
au mot avant de l ?émettre. On effectue donc une division euclidienne dans laquelle on ne tient pas
compte du quotient.
1
1
0
1
0
1
1
0
1
1
0
0
0
0
1
1
1
0
0
0
0
1
1
1
0
1
1
1
0
0
0
0
1
0
1
0
1
1
0
1
1
0
0
0
0
1
1
0
0
0
1
1
0
1
1
1
0
0
0
0
1
1
0
1
0
0
0
0
0
0
1
1
0
0
0
1
1
0
0
0
Le CRC est donc 1110 et le mot à transmettre 11100111 1110.
A la réception : on effectue la division, le reste est nul il n’y a donc pas d’erreur.
1.6
D’autres codes
De nombreux autres codes correcteurs existent, et font appel à des notions et outils mathématiques intéressants, mais difficiles à mettre en oeuvre sur un cours restreint sur les codes correcteurs
4
d’erreurs. Parmi ceux ci, on peut citer :
– les codes BCH (Bose, Ray-Chaudhuri et Hocquenghem), qui sont des codes cycliques se
basant sur la théorie des corps finis, et en particulier les extensions de Galois ainsi que les
polynômes.
– le codage de Reed Solomon (utilisé par exemple dans les QR-codes), basé sur les corps de
Galois, et dont le principe est de construire un polynôme formel à partir des symboles à
transmettre et de le sur-échantillonner. Le résultat est alors envoyé, au lieu des symboles
originaux. La redondance de ce sur-échantillonnage permet au récepteur du message encodé
de reconstruire le polynôme même s’il y a eu des erreurs pendant la transmission.
– le code de Reed-Muller (utilisé par les sondes Mariner pour assurer une transmission des
photos de Mars)
2
Codes correcteurs en Python
2.1
Code ISBN
Le code ?? présente un exemple de réalisation d’un code ISBN.
# −∗− c o d i n g : u t f −8 −∗−
ISBN=i n p u t ( " E n t r e r u n c o d e
ISBN=s t r ( ISBN )
a
9
chiffres
:")
somme = 0
for i in range ( 9 ) :
somme = somme + i n t ( ISBN [ i ] ) ∗(10 − i )
r e s t e = somme%11
c h e c k=11− r e s t e
i f r e s t e ==1:
c h e c k=’ X ’
i f r e s t e ==0:
c h e c k =0
ISBNNumber=s t r ( ISBN )+s t r ( c h e c k )
print ( ’ I S B N - - >
’ + ISBNNumber )
Listing 1 – Exemple de réalisation d’un code ISBN
2.2
Code de Hamming
Le code 2 présente un exemple de réalisation d’un code de Hamming 7-4.
5
# −∗− c o d i n g :
import s y s
u t f −8 −∗−
K = 4
def encode ( s ) :
" " " L e c t u r e de p a q u e t s de 4 b i t s a l a f o i s
w h i le l e n ( s ) >= K :
paquet = s [ 0 : K]
s y s . s t d o u t . w r i t e ( Hamming ( p a q u e t ) )
s = s [K : ]
d e f Hamming ( b i t s ) :
""" C a l c u l e t i n s e r t i o n d e s
t1 = p a r i t e ( bits , [ 0 , 1 , 2 ] )
t2 = p a r i t e ( bits , [ 1 , 2 , 3 ] )
t3 = p a r i t e ( bits , [ 0 , 2 , 3 ] )
return b i t s + t 1 + t 2 + t 3
def
bits
de
et
encodage
de Hamming " " "
p a r i t e """
parite (s , indices ) :
" " " C a l c u l d e s b i t s de p a r i t s " " "
sub = " "
for i in i n d i c e s :
s u b += s [ i ]
return s t r ( s t r . c o u n t ( sub , " 1 " ) % 2 )
###################################################################################
# Main
i f __name__ == " _ _ m a i n _ _ " :
c h a i n e=raw_input ( " E n t r e z
encode ( chaine )
le
message :
")
Listing 2 – Code de Hamming 7-4
2.3
Codes CRC
L’écriture d’un code CRC peut se révéler délicate. Heureusement, plusieurs implémentations
sont disponibles gratuitement, dont pycrc ou crcmod
6

Documents pareils

Commentaires

Commentaires De cette façon, le bit de poids faible de la séquence représente le degré 0 du polynôme, le 4ème bit en partant de la droite représente le degré 3 du polynôme (X3 )... Une séquence de n bits consti...

Plus en détail

TD 2 - Les codes correcteurs et les codes détecteurs d`erreurs

TD 2 - Les codes correcteurs et les codes détecteurs d`erreurs On va ajouter itérativement à ce mot, le mot correspondant au polynôme générateur jusqu’à ce que le mot obtenu soit inférieur au polynôme générateur. Ce mot obtenu correspond au CRC à ajouter au mo...

Plus en détail