Tesi di Sistemi / Informatica

Codifica di Hamming


In un sistema di comunicazione reale insieme al segnale utile e' presente anche un segnale con andamento del tutto casuale che prende il nome di rumore o Noise.

Il rumore e' un segnale completamente privo d’informazione e influisce molto soprattutto sulla ricezione, con conseguente perdita sulla qualità' dell'informazione

Alcuni esempi di rumore possono essere il ronzio negli alimentatori, il fruscio degli altoparlanti, o più' banalmente, l'inquinamento acustico nell'aula quando il prof. parla attraverso il canale aria.
Si distingue essenzialmente tra :

Nella comunicazione tra due computer adiacenti ,cioè connessi fisicamente da un canale di comunicazione ad esempio: cavo coassiale, doppino o linea telefonica escludendo la fibra ottica , il rumore acquista una notevole importanza essendo la causa principale nella generazione di errori

Ci sono due approcci al trattamento degli errori



Codici per la correzione degli errori


Normalmente, un frame (a parte i delimitatori) consiste di :

n = m + r

bit, dove:
m bit costituiscono il messaggio vero e proprio;
r bit sono ridondanti, e sono detti reduntant bit (o check bit).
Una sequenza di n bit fatta in tal modo si dice codeword, o parola di codice.
Date due qualunque parole di codice, ad es.:

1000 1001

1011 0001

è possibile determinare il numero di bit che in esse differiscono (tre nell’esempio) tramite un semplice XOR fatto bit a bit.

Tale numero si dice la distanza di Hamming delle due codeword (Hamming, 1956). Se due codeword hanno una distanza di Hamming uguale a d, ci vogliono esattamente d errori su singoli bit per trasformare l'una nell'altra.
Un insieme prefissato di codeword costituisce un codice (code). La distanza di Hamming di un codice è il minimo delle distanze di Hamming fra tutte le possibili coppie di codeword del codice.
Ora, le capacità di rilevare o correggere gli errori dipendono strettamente dalla distanza di Hamming del codice scelto.
In particolare:

Dunque, a seconda degli scopi che si vogliono raggiungere, si progetta un algoritmo per il calcolo degli r check bit (in funzione degli m bit del messaggio) in modo che i codeword di n = m + r bit risultanti costituiscano un codice con la desiderata distanza di Hamming.
Vediamo ora, come esempio, un codice ottenuto mediante l'aggiunta di un bit di parità, calcolato in modo tale che il numero totale di bit uguali ad 1 sia pari (in questo caso si parla di even parity)

<-- m -->     r


1011 0101 1

1000 0111 0

Questo codice, detto codice di parità (parity code) ha distanza di Hamming uguale a due, e dunque è in grado di rilevare singoli errori. Infatti, un singolo errore produce un numero dispari di 1 e quindi un codeword non valido.
 

Come secondo esempio, consideriamo il codice costituito dalle seguenti codeword:
 

00000 00000

00000 11111

11111 00000

11111 11111

Esso ha distanza 5, per cui corregge due errori (cifre sottolineate). Infatti, se arriva
 

00000 00111

si può risalire correttamente al codeword più vicino, che è

00000 11111

Però, se ci sono tre errori ed arriva:

00000 00111

non saremo in grado di ricostruirlo correttamente ; perché esso verrà interpretato erroneamente come:
 

00000 11111

anziché come:
 

00000 00000

Per correggere un singolo errore su m bit, si devono impiegare almeno r check bit, con

ossia sono necessari circa lg2 mbit. Esiste un codice (codice di Hamming) che raggiunge questo limite teorico.

Ora, c'è una semplice tecnica con la quale tale codice può essere impiegato per correggere gruppi contigui di errori (detti burst di errori) di lunghezza massima prefissata.
 

Supponiamo di voler correggere burst di lunghezza k :
 


 
 


Applicazione Metodo di Hamming


Dati i presupposti :
 


Vogliamo creare un codice di  autocorrezione per la codifica e trasmissione dei caratteri ascii stampabili da, una tastiera computer.

Dato che i caratteri sono in numero di 94 sarà necessaria una codifica di 7 bit per la codifica di tutti i caratteri,
infatti:

quindi applicando la formula:


condizione vera quindi : m = 11

scopriamo quanti sono i bit di codice  ridondante necessari per avere una distanza minima di Hamming pari a 3

quindi avremo m(11) = n(7) + r(4) .
 

Metodo

1. Determino la posizione dei bit ridondanti nelle codeword (posizione k[n])
 


2. Determino il valore di k

Scrivo la posizione dei vari bit secondo il codice binario,
e  quindi formo i vari sottinsiemi in base al peso dei bit corrispondenti

 

1)          0  0  0  1                 posizione 1  K[1] = {1,3,5,7,9,11}

2)          0  0  0

3)          0  0 1                 posizione 2   K[2] = {2,3,6,7,10,11}

4)          0  1  0  0

5)          0                 posizione 4  K[3] = {4,5,6,7}

6)          0  0

7)          0  1 1                posizione 8  K[4] ={8,9,10,11}

8)          1  0  0  0

9)          0  0  1

10)        1  0  1  0

11)        1  0  1  1


 

3. calcolo la parità dei bit presenti nella posizione contenuta nei sottoinsiemi

se non trovo la parità’ trasformo il bit di controllo sottinsieme  (posizione  k[n])  in 1

Esempio:

dato il codeword :
 

0 0 0 0 1 0 0 0 0 0 0


da un controllo del sottinsieme  K3 {4,5,6,7} non riscontriamo la parità, quindi si dovrà trasformare il bit di controllo sottinsieme k[3] in posizione 4 da 0 a 1
avremo:
 

0 0 0 1 1 0 0 0 0 0 0


(In rosso il bit modificato nella posizione 4)
 

A questo punto le codeword sono codificate e pronte alla trasmissione.

Il ricevente in possesso della composizione dei sottinsiemi,  dovrà effettuare a sua volta
Il controllo parità allo stesso modo, per cui se non corrisponde la parità:

Dovrà assegnare ad un vettore V di lunghezza k nelle posizioni kn un bit a 1 ad ogni controllo di sottinsieme in cui la parità non sia riscontrata, così otterrà come risultato un vettore V, contenente la posizione (in codice binario) dove l’errore si è verificato, e quindi facilmente potrà modificare la codeword ricostruendo l’originale.

Esempio:

nel caso che l’errore si sia verificato durante il controllo al sottinsieme k[2]
avremo:

V [0][0][1][0]


Da come si vede il numero binario contenuto nel vettore V indica la posizione nella codeword dove si è verificato l’errore , in questo caso 2, quindi facilmente potremo eliminarlo con  un opportuna routine di conversione da binario a decimale e relativa correzione.


Un programma in Visual Basic che simula la procedura è disponibile per essere scaricato cliccando qui
 
 
 
 

   scrivi a schumann