Appunti: Tecniche di rilevazione e correzione degli errori 1 Tecniche di correzione degli errori Le tecniche di correzione degli errori sono catalogabili in: • metodi per il rilevamento degli errori; • metodi per il rilevamento e la correzione degli errori. Vedremo un metodo di rilevazione degli errori, quello basato sul bit di parità, ed uno di correzione degli errori rilevati, il codice Hamming. Un metodo per il rilevamento degli errori: la tecnica del Bit di Parità Sia dunque A l’entità mittente di un messaggio M composto da 8 bit: M = m1 m2 m3 m4 m5 m6 m7 m8 e B l’entità ricevente. Si vuol vedere come l’entità B, una volta ricevuto il messaggio M spedito da A, possa essere sicura della sua bontà (correttezza del messaggio). La tecnica del bit di parità consiste nell’aggiungere al messaggio da trasmettere un bit p, chiamato appunto bit di parità, in modo tale da rendere pari (o dispari, il discorso è simmetrico) il numero degli 1 presenti nel messaggio spedito. Indicando con: M: Messaggio che l’entità A intende spedire; p: bit di parità. MS: Messaggio Spedito; avremo che MS = Mp. L’entità ricevente B all’arrivo del messaggio MS controllerà il numero degli 1 presenti nello stesso: se tale numero è pari, vuol dire che il messaggio è arrivato in modo corretto, per cui escluderà il bit di parità e farà suo il messaggio M; se, invece, il numero degli 1 è dispari, allora capirà che il messaggio arrivato è errato, quindi chiederà nuovamente la trasmissione di MS all’entità A. Ma come fa l’entità emittente a determinare correttamente il bit di parità? E in che modo l’entità ricevente conta il numero di bit uguali ad 1 presenti nel messaggio spedito? Cerchiamo di capire con due esempi: Sia M = 00110110; per cui il numero di 1 presenti nel messaggio = 4, numero pari. Il bit di parità dovrà essere 0 perché, lo ricordiamo, il numero di 1 nel messaggio spedito MS deve essere pari. L’entità emittente calcola il bit di parità effettuando un XOR tra tutti i bit 2 Appunti: Tecniche di rilevazione e correzione degli errori del messaggio M, ovvero: p = m1 ⊕ m2 ⊕ m3 ⊕ m4 ⊕ m5 ⊕ m6 ⊕ m7 ⊕ m8 dove: m1 = 0 m2 = 0 m3 = 1 m4 = 1 m5 = 0 m6 = 1 m7 = 1 m8 = 0 per cui: p= 0 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 0 = 0 Il messaggio spedito è quindi: MS = Mp = 001101100 questo è il bit di parità. Ora B riceve il messaggio e, per rilevare la sua esattezza, effettua un XOR tra tutti i bit di MS, ovvero: m1 ⊕ m2 ⊕ m3 ⊕ m4 ⊕ m5 ⊕ m6 ⊕ m7 ⊕ m8 ⊕ p Il risultato non potrà che essere 0 o 1. Ove esso fosse 0 indicherebbe che MS è arrivato correttamente, altrimenti rileverebbe un errore. Supponiamo che il messaggio sia arrivato correttamente, l’operazione effettuata da B sarebbe: 0⊕0⊕1⊕1⊕0⊕1⊕1⊕0⊕0=0 indica messaggio giusto Supponiamo, invece, che il messaggio arrivi in modo errato. Se, per esempio m6 cambiasse il suo stato da 1 a 0, avremmo una situazione di questo tipo: MS=001101000 questo è il bit errato. per cui l’operazione effettuata da B sarebbe: 0⊕0⊕1⊕1⊕0⊕1⊕0⊕0⊕0=1 da cui si ricava che c’è stato un errore. indica messaggio errato Vediamo un secondo esempio: Sia M = 11010110; per cui il numero di 1 presenti nel messaggio = 5, numero dispari. Da quanto detto risulta che il bit di parità dovrà essere 1. L’entità emittente calcola il bit di parità effettuando un XOR tra tutti i bit del messaggio M, ovvero: p = m1 ⊕ m2 ⊕ m3 ⊕ m4 ⊕ m5 ⊕ m6 ⊕ m7 ⊕ m8 Appunti: Tecniche di rilevazione e correzione degli errori 3 dove: m1 = 1 m2 = 1 m3 = 0 m4 = 1 m5 = 0 m6 = 1 m7 = 1 m8 = 0 per cui: p= 1 ⊕ 1 ⊕ 0 ⊕ 1 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 0 = 1 Il messaggio spedito è quindi: MS = 110101101 questo è il bit di parità. Ora B riceve il messaggio e, per rilevare la sua esattezza, effettua un XOR tra tutti i bit di MS, ovvero: m1 ⊕ m2 ⊕ m3 ⊕ m4 ⊕ m5 ⊕ m6 ⊕ m7 ⊕ m8 ⊕ p Supponiamo che il messaggio arrivi correttamente, l’operazione effettuata da B sarebbe: 1⊕1⊕0⊕1⊕0⊕1⊕1⊕0⊕1=0 indica messaggio giusto Supponiamo, invece, che il messaggio arrivi in modo errato. Se, per esempio, proprio il bit di parità cambiasse il suo stato da 1 a 0, avremmo una situazione di questo tipo: MS=110101100 questo è il bit errato. per cui l’operazione effettuata da B sarebbe: 1⊕1⊕0⊕1⊕0⊕1⊕1⊕0⊕0=1 da cui si ricava che c’è stato un errore. indica messaggio errato Alcune considerazioni: • questo metodo permette di rilevare un errore, non di correggerlo; la correzione dell’errore avviene mediante la ritrasmissione del messaggio; • il posto occupato dal bit di parità nel messaggio MS può essere uno qualsiasi, l’importante è che sia A che B conoscano la sua posizione nel messaggio inviato; • questo metodo introduce un bit aggiuntivo al messaggio vero e proprio; tutti i metodi di correzione e rilevazione degli errori aggiungono una serie di informazioni aggiuntive rispetto al dato di origine; 4 Appunti: Tecniche di rilevazione e correzione degli errori • se, nella trasmissione di un dato, cambiano 2 bit, o comunque un numero pari di bit, il metodo fallisce poiché, B controllando l’esattezza del messaggio, ottiene come risultato 0, come mostra l’esempio che segue. Riprendiamo l’esercizio precedente dove il messaggio spedito è: MS = 110101101 questo è il bit di parità. Supponiamo che cambino i valori di due bit e precisamente m1 ed m2 che invertono il loro stato da 1 a 0. Si ottiene che: MS = 000101101 questi sono i 2 bit errati. L’operazione di controllo effettuata da B è dunque: 0⊕0⊕0⊕1⊕0⊕1⊕1⊕0⊕1=0 indica messaggio giusto da cui si ricava, erroneamente, che non c’è stato errore nella trasmissione. 5 Appunti: Tecniche di rilevazione e correzione degli errori Un metodo per il rilevamento e la correzione degli errori: il Codice di Hamming Questo metodo raggiunge l'obiettivo prefissato mediante la trasmissione di un numero di bit maggiore rispetto al bit di parità; ovvero, per ogni byte il codice di Hamming genera un frame composto da 12 bit. Dato un messaggio M da inviare, il procedimento da applicare per ottenere il frame MS effettivamente trasmesso, consiste nel sistemare i bit su di una griglia di 12 posizioni, dove le posizioni in cui l'indice è potenza di 2 sono occupate dai bit di controllo, mentre tutte le altre ospitano ordinatamente i bit del messaggio M. Vediamo subito un esempio: Sia M = 10110110 con: m1 = 1 m2 = 0 m3 = 1 m4 = 1 m5 = 0 m6 = 1 m7 = 1 m8 = 0 La stringa da trasmettere sarà la seguente: pos 1 0001 h1 20=1 pos 2 0010 h2 21=2 pos 3 0011 m1 pos 4 0100 h3 22=4 pos 5 0101 m2 pos 6 0110 m3 pos 7 0111 m4 pos 8 1000 h4 23=8 pos 9 1001 m5 pos 10 1010 m6 pos 11 1011 m7 pos 12 1100 m8 Figura 1: Codice Hamming Osservando la figura 1 si può notare che per ogni byte da spedire il codice di Hammnig utilizza 4 bit di controllo: h1 h2 h3 h4 nelle posizioni 1, 2, 4 e 8; il codice è quindi completato dai bit del messaggio. Nella seconda riga della stessa figura sono mostrati i valori binari delle posizioni occupabili dai bit; si noti che tutte le posizioni occupate dai bit controllori hanno un solo 1 in tale valore binario, mentre tutte le posizioni occupate dai bit controllati, i bit del messaggio, hanno almeno due 1. Vediamo ora come si determinano i valori dei bit di controllo. Il bit h1 si trova in posizione 1 (valore binario 0001) della stringa del codice Hamming. Esso controlla tutti i bit che nel valore binario della posizione occupata hanno un 1 in quarta posizione incominciando da sinistra, ovvero: h1 controlla m1, posizione 0011 m2, posizione 0101 m4, posizione 0111 m5, posizione 1001 m7, posizione 1011 Il bit h2 si trova in posizione 2 (valore binario 0010) della stringa del codice Hamming. Esso controlla tutti i bit che nel valore binario della 6 Appunti: Tecniche di rilevazione e correzione degli errori posizione occupata hanno un 1 in terza posizione incominciando da sinistra, ovvero: h2 controlla m1, posizione 0011 m3, posizione 0110 m4, posizione 0111 m6, posizione 1010 m7, posizione 1011 Il bit h3 si trova in posizione 4 (valore binario 0100) della stringa del codice Hamming. Esso controlla tutti i bit che nel valore binario della posizione occupata hanno un 1 in seconda posizione incominciando da sinistra, ovvero: h3 controlla m2, posizione 0101 m3, posizione 0110 m4, posizione 0111 m8, posizione 1100 Il bit h4 si trova in posizione 8 (valore binario 1000) della stringa del codice Hamming. Esso controlla tutti i bit che nel valore binario della posizione occupata hanno un 1 in prima posizione incominciando da sinistra, ovvero: h4 controlla m5, posizione 1001 m6, posizione 1010 m7, posizione 1011 m8, posizione 1100 Nel codice così costruito ogni bit del messaggio da spedire, M, è controllato dal almeno due bit di controllo. I valori dei bit di controllo si ottengono mediante un’operazione di XOR tra tutti i bit controllati, per cui avremo che: h1 = m 1 ⊕ m 2 ⊕ m 4 ⊕ m 5 ⊕ m 7 =1⊕0⊕1⊕0⊕1 =1 h2 = m 1 ⊕ m 3 ⊕ m 4 ⊕ m 6 ⊕ m 7 =1⊕1⊕1⊕1⊕1 =1 h3 = m 2 ⊕ m 3 ⊕ m 4 ⊕ m 8 =0⊕1⊕1⊕0 =0 h4 = m 5 ⊕ m 6 ⊕ m 7 ⊕ m 8 =0⊕1⊕1⊕0 =0 Si ricava, quindi, il seguente codice Hamming: MS = 111001100110 dove in neretto sono individuati i bit di controllo. L’entità che riceve il frame verifica la sua bontà mediante un controllo che si basa sull’XOR tra tutti i bit controllati con il proprio bit controllore determinando le somme Si, così come mostrato negli esempi che seguono. Dal valore delle somme Si dipende la correttezza del messaggio; i casi possibili sono due; ovvero: 1. messaggio corretto ! tutti gli Si sono uguali a 0; 7 Appunti: Tecniche di rilevazione e correzione degli errori 2. messaggio errato esiste almeno un Si uguale a 1. In tal caso i valori delle quattro somme S4S3S2S1 indicano la posizione del bit errato. Allo scopo vediamo tre esempi in cui si verificano i seguenti eventi: 1. frame arrivato in modo esatto; 2. frame arrivato in modo errato perché è cambiato un bit del messaggio (bit controllato); 3. frame arrivato in modo errato perché è cambiato un bit controllore. ! Esempio1: Frame arrivato in modo esatto L'entità che riceve il frame determina le somme Si che seguono: S1 = h1 ⊕ m 1 ⊕ m 2 ⊕ m 4 ⊕ m 5 ⊕ m 7 = 1 ⊕ 1 ⊕ 0 ⊕ 1 ⊕ 0 ⊕ 1 S2 = h2 ⊕ m 0 ⊕ m 2 ⊕ m 3 ⊕ m 5 ⊕ m 6 = 0 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 1 ⊕ 1 S3 = h3 ⊕ m 1 ⊕ m 2 ⊕ m 3 ⊕ m 7 =0⊕0⊕1⊕1⊕0 S4 = h4 ⊕ m 4 ⊕ m 5 ⊕ m 6 ⊕ m 7 =0⊕0⊕1⊕1⊕0 =0 =0 =0 =0 indica messaggio giusto Come volevasi dimostrare: tutti gli Si sono uguale a 0, per cui il frame è arrivato in modo corretto. Esempio2: Frame arrivato in modo errato, cambia un bit controllato Supponiamo che il frame arrivi in modo errato; per esempio, m7 inverta il suo stato da 1 a 0; otterremmo che l'entità ricevente leggerà il seguente messaggio: MS = 111001100100 questo è il bit errato. L’entità che riceve verifica l’esattezza del messaggio calcolando i valori di S1, S2, S3 e S4, ovvero: S1 = h1 ⊕ m 1 ⊕ m 2 ⊕ m 4 ⊕ m 5 ⊕ m 7 = 1 ⊕ 1 ⊕ 0 ⊕ 1 ⊕ 0 ⊕ 0 =1 S2 = h2 ⊕ m 1 ⊕ m 3 ⊕ m 4 ⊕ m 6 ⊕ m 7 = 1 ⊕ 1 ⊕ 1 ⊕ 1 ⊕ 1 ⊕ 0 =1 S3 = h3 ⊕ m 2 ⊕ m 3 ⊕ m 4 ⊕ m 8 =0⊕0⊕1⊕1⊕0 =0 S4 = h4 ⊕ m 5 ⊕ m 6 ⊕ m 7 ⊕ m 8 =0⊕0⊕1⊕0⊕0 =1 Il bit errato è quindi quello che si trova nella posizione: S4S3S2S1 = (1011)2, = (11)10 8 Appunti: Tecniche di rilevazione e correzione degli errori (l’undicesima posizione) del codice Hamming. In quella posizione si trova proprio m7; per cui, per ottenere il messaggio corretto, basterà invertire il bit della posizione numero 11, da 0 a 1. La tecnica del Codice di Hamming ha consentito, dunque, di: • rilevare un errore, visto che almeno un valore Si ha assunto valore 1 • correggere l’errore, effettuando il complemento a 1 del bit rilevato errato; ovvero quel bit indicato dalla sequenza S4S3S2S1 Esempio3: Frame arrivato in modo errato: cambia un bit controllore Vediamo un ulteriore esempio, e supponiamo che cambi proprio un bit di controllo, per esempio h4 (da 0 a 1) posto nell’ottava posizione del codice Hamming, ottenendo in output la seguente stringa: MS = 111001110110 questo è il bit errato. L’entità che riceve, verifica l’esattezza del messaggio calcolando i valori di S0, S1, S2 e S3, ovvero: S1 = h1 ⊕ m 1 ⊕ m 2 ⊕ m 4 ⊕ m 5 ⊕ m 7 = 1 ⊕ 1 ⊕ 0 ⊕ 1 ⊕ 0 ⊕ 1 =0 S2 = h2 ⊕ m 1 ⊕ m 3 ⊕ m 4 ⊕ m 6 ⊕ m 7 = 1 ⊕ 1 ⊕ 1 ⊕ 1 ⊕ 1 ⊕ 1 =0 S3 = h3 ⊕ m 2 ⊕ m 3 ⊕ m 4 ⊕ m 8 =0⊕0⊕1⊕1⊕0 =0 S4 = h4 ⊕ m 5 ⊕ m 6 ⊕ m 7 ⊕ m 8 =1⊕0⊕1⊕1⊕0 =1 Il bit errato è quindi quello che si trova nella posizione: S4S3S2S1 = (1000)2, = (8)10 (l’ottava posizione) del codice Hamming. In quella posizione si trova proprio h4, per cui, per ottenere il byte corretto, basterà trascurare il bit sbagliato, visto che era un bit di controllo e non un bit del messaggio. Il byte giusto sarà, quindi, quello che si otterrà eliminando tutti i bit di controllo; ovvero: 10110110 9 Appunti: Tecniche di rilevazione e correzione degli errori Esercizio 4 Determinare il Codice di Hamming del seguente byte: 00001111 m1 = 0 m5 = 1 0001 h1 0010 h2 m2 = 0 m6 = 1 0011 m1 0 0100 h3 m3 = 0 m7 = 1 0101 m2 0 0110 m3 0 m4 = 0 m8 = 1 0111 m4 0 1000 h4 1001 m5 1 1010 m6 1 1011 m7 1 h1 = m1 ⊕ m2 ⊕ m4 ⊕ m5 ⊕ m7 =0 ⊕ 0 ⊕ 0 ⊕ 1 ⊕ 1=0 h2 = m1 ⊕ m3 ⊕ m4 ⊕ m6 ⊕ m7 h3 = m2 ⊕ m3 ⊕ m4 ⊕ m8 =0 ⊕ 0 ⊕ 0 ⊕ 1 ⊕ 1=0 =0 ⊕ 0 ⊕ 0 ⊕ 1 =1 h4 = m5 ⊕ m6 ⊕ m7 ⊕ m8 =1 ⊕ 1 ⊕ 1 ⊕ 1 1100 m8 1 =0 Per cui, il Codice di Hamming è quello che segue: 0001 H1 0 0010 H2 0 0011 M1 0 0100 H3 1 0101 M2 0 0110 M3 0 0111 M4 0 1000 H4 0 1001 M5 1 1010 M6 1 1011 M7 1 1100 M8 1 Ora, supponiamo che durante la trasmissione vari il bit m6; per cui avremo che: 0001 H1 0 0010 H2 0 0011 M1 0 0100 H3 1 0101 M2 0 0110 M3 0 0111 M4 0 1000 H4 0 1001 M5 1 1010 M6 0 1011 M7 1 m1 ⊕ m2 ⊕ m4 ⊕ m5 ⊕ m7 ⊕ h1 = 0 ⊕ 0 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 0 = 0 m1 ⊕ m3 ⊕ m4 ⊕ m6 ⊕ m7 ⊕ h2 = 0 ⊕ 0 ⊕ 0 ⊕ 0 ⊕ 1 ⊕ 0 = 1 m2 ⊕ m3 ⊕ m4 ⊕ m8 ⊕ h3= 0 ⊕ 0 ⊕ 0 ⊕ 1 ⊕ 1 =0 m5 ⊕ m6 ⊕ m7 ⊕ m8 ⊕ h4 = 1 ⊕ 0 ⊕ 1 ⊕ 1 ⊕ 0 =1 Il bit sbagliato è, quindi, quello in posizione 1010; ovvero, proprio m6. Si otterrà quindi il giusto byte effettuando il complemento a 1 del bit m6 che da 0 diventerà 1 ed eliminando i bit di controllo si otterrà il byte che si voleva trasmettere; ovvero: 00001111. 1100 M8 1