Skip to main content

Détection et résolution d'erreurs

Maintenant que l'on sait représenter des nombre et des caractères en binaire, on peut maintenant voir comment faire dans les cas où il pourrait y avoir des erreurs.

Que ce soit dans la mémoire ou lors de communication, ce n'est pas infaillible et 1 seul bit qui change pourrait changer complètement l'information.

Le bit de parité (code auto-verificateur)

Supposons que notre code est le suivant : 01001000 pour calculer la parité paire, il suffit de compter le nombre de 1. Dans ce cas il y a 2 fois 1. Donc le bit de parité est 0.

Si on compte un nombre impair de 1, alors le bit de parité est 1. En bref, il faut que le nombre total de 1 (en comptant à la fois le message et le bit de parité) soit pair.

Et pour la parité impaire, il suffit de faire l'inverse. On s'assure donc que le nombre total de 1 (en comptant message + bit de partité) soit impair.

Ainsi maintenant on peut vérifier un code et savoir si il a été altéré ou non. En revanche cette méthode est limitée, car si il y a un nombre pair d'erreurs, alors le bit de parité ne dédectera rien d'anormal. Aussi, on n'a aucune idée de où se trouve l'erreur.

La double parité (code auto-correcteur)

Maintenant imaginons que l'on a un message plus long. Comme SHUMI par exemple. On va donc le transcrire en binaire (avec le code UTF-8)

Car b7 b6 b5 b4 b3 b2 b1 b0
S 0 1 0 1 0 0 1 1
H 0 1 0 0 1 0 0 0
U 0 1 0 1 0 1 0 1
M 0 1 0 0 1 1 0 1
I 0 1 0 0 1 0 0 1

Maintenant on va faire une parité paire horizontalement et une parité impaire verticalement comme vu précédemment..

Car b7 b6 b5 b4 b3 b2 b1 b0 PP
S 0 1 0 1 0 0 1 1 0
H 0 1 0 0 1 0 0 0 0
U 0 1 0 1 0 1 0 1 0
M 0 1 0 0 1 1 0 1 0
I 0 1 0 0 1 0 0 1 1
PI 1 0 1 1 0 1 0 1

Maintenant en vérifiant tous les bits de parités on peut retrouver une erreur facilement et la corriger

Car b7 b6 b5 b4 b3 b2 b1 b0 PP
S 0 1 0 1 0 0 1 1 0
H 0 1 0 0 1 0 0 0 0
E 0 1 0 0 0 1 0 1 0
M 0 1 0 0 1 1 0 1 0
I 0 1 0 0 1 0 0 1 1
PI 1 0 1 1 0 1 0 1

On peut voir ici qu'il y a eu une erreur au niveau du bit 4 sur le 3e caractère car la parité paire de la ligne et la parité impaire de la colonne ne sont plus correct. A cause de ça notre U est devenu un E.

Mais on sait donc précisément quel bit est la cause de l'erreur et comment le résoudre. En revanche cette méthode nécessite beaucoup de bits de vérification.

Le code de Hamming

Ici on se concentre sur le code de Hamming qui permet de corriger 1 bit en erreur, il existe des variantes plus complexes mais que l'on apprend pas ici.

Création du code de Hamming

Disons que l'on veut stoquer le code S, soit 1010011 en binaire.

Tout d'abord on va faire un tableau pour contenir notre code, mais qui va être un peu plus long pour contenir nos bits de parités

11 10 9 8 7 6 5 4 3 2 1

Maintenant on va bloquer tous les emplacements qui sont des puissances de 2 (qui sont nos bits de parités)

11 10 9 8 7 6 5 4 3 2 1
k4 k3 k2 k1

Ensuite on peut écrire le message à coder dans les bits restants :

11 10 9 8 7 6 5 4 3 2 1
1 0 1 k4 0 0 1 k3 1 k2 k1

Maintenant on liste tous les numéros de bits qui valent 1 dans le tableau et on les convertis en binaire

11 → 1011
9  → 1001
5  → 0101
3  → 0011

Ensuite pour chaque colonne en binaire on va faire une parité de la colonne. Chaque bit de parité trouvé corresponds aux bits de parités dans le tableau.

11 → 1011
9  → 1001
5  → 0101
3  → 0011
     ----
     0100 (k4 = 0, k3 = 1, k2 = 0, k1 = 0)

On peut donc remplacer ces derniers dans le tableau

11 10 9 8 7 6 5 4 3 2 1
1 0 1 0 0 0 1 1 1 0 0

Notre code de Hamming est donc : 10100011100

Vérification et correction dans un code de Hamming

Maintenant quand on veut vérifier un code reçu, voici comment faire. On va partir du code 10101011100 et on va le vérifier (et si besoin corriger)

Tout d'abord on va placer tout ceci dans un tableau avec les bits numérotés :

11 10 9 8 7 6 5 4 3 2 1
1 0 1 0 1 0 1 1 1 0 0

Maintenant on liste tous les bits qui sont a 1 et on convertis leur position en binaire :

11 → 1011
9  → 1001
7  → 0111
5  → 0101
4  → 0100
3  → 0011

Ensuite, on va faire la parité de chaque colonne. Le résultat corresponds à la position du bit en erreur en binaire. Si le résultat done 0 partout, alors il n'y a pas d'erreur détectée.

11 → 1011
9  → 1001
7  → 0111
5  → 0101
4  → 0100
3  → 0011
     ----
     0111 → 7 (le bit 7 doit donc être inversé)

Nous pouvons donc corriger notre code :

11 10 9 8 7 6 5 4 3 2 1
1 0 1 0 0 0 1 1 1 0 0

Pour obtenir le message d'origine il suffit de retirer tous les bits qui sont à des positions qui correspondent à des puissances de 2

11 10 9 8 7 6 5 4 3 2 1
1 0 1 0 0 1 1

Ce qui nous donne donc le message suivant : 1010011 soit S en ASCII. Nous retrouvons donc le même résultat que le message encodé au départ 🎉