Les techniques employées ici reposent sur l'utilisation de codes correcteurs ou codes détecteurs d'erreurs qui chacun transforme la suite de bits à envoyer en lui ajoutant de l'information à base de bits de redondance ou bits de contrôle . Le récepteur se sert de cette information ajoutée pour déterminer si une erreur s'est produite et pour la corriger si la technique employée le permet.
La suite de bits correspondant au polynôme R constitue le CRC qui est ajouté à l'information à transmettre, le polynôme total émis est donc E(x)=xrM(x)+R(x) Par exemple, à l'aide du polynôme générateur G(x)=x4+x+1, la suite 1101011011 sera transmise accompagnée du CRC 1110 car
À la réception, on divise le polynôme M' correspondant à la suite totale de bits reçus (information+CRC) par le polynôme générateur. Si le reste calculé est non nul, c'est qu'une erreur s'est produite dans la transmission. Si le reste est nul, on est à peu près sûr (99,975% avec le polynôme générateur x16+x12+x5+1 de la norme V41 du ITU-T) que la transmission s'est faite sans erreur.
Pourquoi cela fonctionne-t-il ?
Il est évident que xrM(x)-R(x) est divisible par G(x), mais en
arithmétique modulo 2 addition et soustraction sont équivalentes (ce
sont des OU exclusifs en fait) donc on a également
E(x)=xrM(x)+R(x)=G(x)Q(x)
montrant que E est un polynôme multiple de G.
Si lors de la transmission des erreurs se sont produites, cela se traduit
par le fait que le polynôme reçu M'(x)=E(x)+T(x), T étant le
polynôme correspondant aux erreurs (T(x)=xi si le ibit a été
inversé).
À la réception le décodeur calcule le reste de
qui est en fait le reste de
puisque E est un multiple de G.
Si ce résultat est non nul, c'est que T est non nul et que des
erreurs se sont produites.
Évidemment, le résultat est également nul si T est un multiple de
G ce qui masque des erreurs, mais le choix judicieux de G permet
de minimiser ces erreurs non détectées.
Enfin, il faut aussi remarquer un inconvénient de cette méthode
qui signale des erreurs de transmission même si celles-ci ont eu
lieu dans le CRC et non dans l'information à transmettre initialement.
Dans ce cas il ne devrait pas être nécessaire de retransmettre
l'information, or c'est ce qui est fait puisque globalement le
transfert (info+CRC) a subi des perturbations.
caractère initial
00
01
10
11
caractère émis
00000
01111
10110
11001
00001
01110
10111
11000
caractères
00010
01101
10100
11011
erronés
00100
01011
10010
11101
possibles
01000
00111
11110
10001
10000
11111
00110
01001
Soit x et y deux caractères d'un alphabet et soit
N la longueur du codage des mots de cet alphabet, xi et yi désignent
respectivement le ibit de x et y.
On peut alors définir la distance
qui permet de compter le nombre de bits qui diffèrent entre x et y.
On définit alors la distance de Hamming par
.
Dans l'exemple choisi ci-dessus, dH=1 dans le premier codage sur
2 bits et dH=3 dans le codage sur 5 bits.
Chaque erreur sur un bit d'un caractère x donne un caractère x'
tel que d(x,x')=1, donc pour pouvoir détecter et corriger une seule
erreur il faut que
et pour corriger 2 erreurs il faut que
.D'une manière générale on détecte et corrige n erreurs quand
la distance de Hamming est 2n+1.
On peut voir ceci dans la figure 1.14 où sont représentés
x et y (2 caractères parmi les plus proches de l'alphabet),
xi et yi des <<déformations>> de x et y après une erreur
et x1' et y1' des <<déformations>> après deux erreurs.
Ainsi, quand on reçoit un caractère x (erroné ou non on ne peut pas
le savoir à l'avance) il suffit de chercher le caractère le plus proche de x selon la distance d pour obtenir
le caractère émis.
Un exemple de code de Hamming est donné par la technique suivante où l'on veut envoyer des caractères codés sur 4 bits de données ABCD. Pour cela on va émettre la suite ABCP2DP1P0 dans laquelle les bits de contrôle Pi sont placés sur les bits de rang 2i et sont définis par
À la réception on calcule
Par exemple, si l'on veut envoyer les 4 bits 0010, on va finalement émettre 0011001. Si l'on reçoit 0010001, on trouve P'2P'1P'0=100 c'est-à-dire 4, donc l'erreur était en 4place. On corrige, pour obtenir 0011001 et un nouveau calcul donne P'2 = P'1 = P'0 = 0 assurant que l'on a corrigé l'erreur. On peut remarquer qu'en fait on a corrigé une erreur qui n'était pas sur les données initiales mais sur les bits de parité rajoutés.