Comments
Transcript
Sistemi di numerazione Numeri negativi e sottrazioni
Sistemi di numerazione Conversione da base qualsiasi in decimale Sistema di numerazione binario Sistema di numerazione esadecimale Conversione decimale binario Conversione decimale esadecimale Conversione binario esadecimale Numeri negativi e sottrazioni Rappresentazioe floating point IEEE 754 Comunicazione L’informazione Misura dell’informazione Entropia La codifica Definizioni Costruzione del codice 1° teorema di Shannon Codifica ottimale di Huffman Codici Codici BCD Codici con 5 o più bit Codice Gray Codici alfanumerici (ASCII) Aritmetica BCD Codici a controllo d’errore Parità semplice ed incrociata Codifica Hamming Codifica CRC A.C. Neve – L’informazione digitale 1 Sistemi di numerazione Conversione da qualsiasi base in decimale Si definisce sistema di numerazione un insieme finito di simboli e di regole, per mezzo delle quali è possibile rappresentare delle quantità, facendo uso dei simboli aggregati in stringhe. Per comprendere il funzionamento di un sistema di numerazione, è opportuno riesaminare il funzionamento di quello decimale il quale è costituito da dieci simboli 0,1,2,3,4,5,6,7,8,9 Si consideri pertanto il numero Z = 3237,66 costituito da 6 cifre, 4 descrittive della parte intera e 2 della parte frazionaria. Posizione 3 Coefficiente 3 Peso 1000 2 2 100 1 3 10 0 7, 1 -1 6 0,1 -2 6 0,01 Questo numero può essere riscritto come: 3 0 0 2 0 3 0 0 0 7 0, 0, 6 0 6 + + + + + o, equivalentemente come Z = 3⋅103 + 2⋅102 + 3⋅101 + 7⋅100 + 6⋅10-1 + 6⋅10-2 Un qualsiasi numero costituito da 4+2 cifre potrà essere scritto nella seguente forma: Z = C3⋅103 + C2⋅102 + C1⋅101 + C0⋅100 + C-1⋅10-1 + C-2⋅10-2 Dove i coefficienti Ci rappresentano le cifre costituenti la stringa di simboli. Si noti che gli indici dei coefficienti coincidono con la numerazione delle posizioni nella stringa. Nell’esempio proposto, la parte intera è costituita da 4 coefficienti aventi posizioni 3,2,1,0, mentre la parte frazionaria è costituita da 2 coefficienti aventi posizioni –1 e –2. In termini ancor più generali, un numero costituito da M cifre intere ed N cifre frazionarie, potrà essere così rappresentato: Z = CM-1⋅10M-1 + CM-2⋅10M-2 +…..C1⋅101 + C0⋅100 + C-1⋅10-1 + C-2⋅10-2 +…..C-N⋅10-N Il sistema di numerazione considerato è anche detto a notazione posizionale in quanto, la quantità rappresentata dipende oltre che dal valore dei singoli coefficienti, anche dalla posizione che questi assumono all’interno della stringa infatti, i due coefficienti pari a 3 danno ben diverso contributo alla A.C. Neve – L’informazione digitale 2 quantità totale in quanto, il primo contribuisce con una quantità pari a 3000 ed il secondo pari solo a 30; lo stesso discorso vale per i due coefficienti pari a 6. Tutta l’analisi fin ora condotta è stata dedicata al sistema di numerazione in base 10 il quale è costituito da 10 simboli esattamente come le dita presenti nelle nostre mani. Riflettendo su questo aspetto, ci si può facilmente rendere conto del fatto che questa scelta oltre ad averci condizionato per molto tempo, non ha oggi nulla di più o di meno di qualsiasi altro sistema di numerazione. E’ pertanto possibile cambiare il sistema di numerazione usato mantenendo inalterate tutte le considerazioni fin ora esposte e, sostituire al 10 il valore della nuova base B usata. Un qualsiasi numero Z espresso in qualsiasi sistema di numerazione potrà essere così espresso: Z = CM-1⋅BM-1 + CM-2⋅BM-2 +…..C1⋅B1 + C0⋅B0 + C-1⋅B-1 + C-2⋅B-2 +…..C-N⋅B-N o, in forma più compatta come: Z= −N ∑C i = M −1 i ⋅ Bi Saranno ora esaminati alcuni esempi di sistemi di numerazione. E’ opportuno evidenziare il che, la scelta del numero di simboli da usare è vincolata solo da due considerazioni: 1) è obbligatorio definire un simbolo rappresentativo della quantità nulla 2) è obbligatorio definire un simbolo rappresentativo della quantità unitaria. Da ciò si desume che il più piccolo sistema di numerazione che si può usare è quello chiamato binario il quale utilizza i simboli 0 e 1. Sistema di numerazione binario In questo sistema di numerazione i simboli usati sono 0 e 1 Si consideri ora la seguente stringa di simboli: Posizione Coefficiente Peso 3 1 8 2 1 4 1 0 2 0 1, 1 -1 1 0,5 -2 1 0,25 La quantità rappresentata da questa stringa risulta: Z = 1⋅23 + 1⋅22 + 0⋅21 + 1⋅20 + 1⋅2-1 + 1⋅2-2 = 8 + 4 + 0 +1 + 0,5 + 0,25 = 13,7510 Come si può notare, la tecnica di conversione è quella introdotta in precedenza con la variante che, in questo caso, il valore della base B è pari a 2. A differenza di tutti gli altri sistemi di numerazione, quello binario consente una conversione in decimale molto più rapida in quanto i coefficienti della stringa possono valere solo 0 o 1 per cui, nello A.C. Neve – L’informazione digitale 3 sviluppo di potenze, non sarà necessario effettuare i vari prodotti ma basterà sommare solo i pesi relativi alle cifre di valore 1. Si consideri questo nuovo esempio: Posizione Coefficiente Peso 4 1 16 3 1 8 2 0 4 1 1 2 0 1, 1 -1 1 0,5 -2 -3 0 1 0,25 0,125 La quantità rappresentata dalla stringa binaria risulterà: Z = 16 + 8 + 2 + 1 + 0,5 + 0,125 = 27,62510 Vengono così sommati i soli pesi dei bit pari a 1. Sistema di numerazione esadecimale Per questo sistema di numerazione sorgono delle difficoltà relative alla scelta dei 16 simboli da usare, si è quindi deciso di utilizzare i 10 simboli del sistema decimale ed in più le prime 6 lettere dell’alfabeto ottenendo così: Esadecimale Decimale 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 A 10 B 11 C 12 D 13 E 14 F 15 Si consideri il seguente esempio: Posizione Coefficiente Peso 3 2 4096 2 A 256 1 0 16 0 F, 1 -1 -2 C 3 0,0625 0,00390625 La quantità rappresentata dalla stringa esadecimale risulterà: Z = 2⋅163 + A⋅162 + 0⋅161 + F⋅160 + C⋅16-1 + 3⋅16-2 = 8192 + 2560 + 0 +15 + 0,75 + 0,01171875 = 10767,7617187510 Anche in questo caso, si riconferma l’unicità della tecnica di conversione. Considerazioni comuni Il massimo valore intero rappresentabile con K cifre risulta pari a BK -1 Con 8 cifre binarie, il massimo valore rappresentabile è pari a 28 – 1 = 255 Con 5 cifre decimali, il massimo valore rappresentabile è pari a 105 –1 = 99999 Con 4 cifre esadecimali, il massimo valore rappresentabile è pari a 164-1 = 65535 Come si può notare, più grande è la base del sistema di numerazione, e minore è il numero di cifre necessarie per rappresentare una stessa quantità e viceversa: 11111111111111112 = 6553510 = FFFF16 A.C. Neve – L’informazione digitale 4 Soprattutto in binario, per le applicazioni elettroniche, è spesso necessario conoscere in anticipo il numero di bit che servono per rappresentare una certa quantità, per es. quanti bit sono necessari per contare in binario fino a 1000010. A questa domanda si risponde determinando il valore di K che soddisfa alla seguente diseguaglianza: 2K ≥ 10000 da cui risulta K ≥ 14 in quanto 214 = 16384 A tal proposito può essere molto utile la seguente tabella: K 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 2K 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 Conversione da decimale in qualsiasi base La conversione di un numero decimale in una qualsiasi base avviene attraverso una serie di operazioni iterative. Considerato un numero decimale costituito da parte intera e parte frazionaria, si deve operare separatamente prima sulla parte intera e poi sulla parte frazionaria. La conversione della parte intera avviene operando su di esso una serie di divisioni successive per la base in cui si vuole pervenire e conservando i resti in ordine inverso a quello di generazione. Queste operazioni terminano con il raggiungimento del quoziente nullo. La conversione della parte frazionaria avviene operando su questa una serie di moltiplicazioni successive (delle sole parti frazionarie di volta in volta ottenute) per la base in cui si vuole pervenire e conservando poi, le parti intere dei risultati ottenuti nell’ordine di generazione. Queste operazioni terminano col raggiungimento di un risultato dotato di parte frazionaria nulla. A.C. Neve – L’informazione digitale 5 Conversione Decimale Binario Si consideri il numero decimale 48,375. La conversione avviene convertendo prima il valore 48 e poi il valore 0,375. 48 : 2 = 24 24 : 2 = 12 12 : 2 = 6 6:2= 3 3:2= 1 1:2= 0 con resto con resto con resto con resto con resto con resto 0,375 x 2 = 0,750 x 2 = 0,500 x 2 = 0 ,750 1 ,500 1 ,000 0 0 0 0 1 1 si ha quindi che 4810 = 1100002 si ha quindi che 0,37510 = 0,0112 Al termine del processo si ha quindi che: 48,37510 = 110000,0112 Si consideri ora il numero decimale 49,7. La conversione avviene convertendo prima il valore 49 e poi il valore 0,7. 49 : 2 = 24 24 : 2 = 12 12 : 2 = 6 6:2= 3 3:2= 1 1:2= 0 con resto con resto con resto con resto con resto con resto 0,700 x 2 = 0,400 x 2 = 0,800 x 2 = 0,600 x 2 = 0,200 x 2 = 0,400 x 2 = 0,800 x 2 = 1 ,400 0 ,800 1 ,600 1 ,200 0 ,400 0 ,800 1 ,600 1 0 0 0 1 1 si ha quindi che 4910 = 1100012 si ha quindi che 0,710 = 0,1011001……2 Al termine del processo si ha quindi che: 49,710 = 110001,1011001…..2 come si può notare, la conversione della parte frazionaria non risulta completa in quanto, il calcolo delle moltiplicazioni successive non potrà mai avere termine. La conversione della parte frazionaria non è pertanto precisa ma è affetta da errore. Riconvertendo in decimale il valore 0,10110012 ora ottenuto, si trova essere pari a 0,6953125 che è inferiore a 0,7 di una quantità pari a 0,0046875. L’errore percentuale commesso sulla parte frazionaria, risulta quindi pari al 0,669%. E’ quindi necessario prolungare il processo di conversione, fino ad ottenere un valore affetto da un errore sufficientemente piccolo da non influenzare l’applicazione che si sta sviluppando. A.C. Neve – L’informazione digitale 6 Conversione Decimale Esadecimale Si consideri il numero decimale 60,87. La conversione avviene convertendo prima il valore 60 e poi il valore 0,87. 60 : 16 = 3 con resto 12 (C) 3 : 16 = 0 con resto 3 0,87 x 16 = 0,92 x 16 = 0,72 x 16 = 0,52 x 16 = 0,32 x 16 = 0,12 x 16 = si ha quindi che 6010 = 3C16 13 ,92 14 ,72 11 ,52 8 ,32 5 ,12 1 ,92 si ha quindi che 0,8710 = 0,DEB851…..16 Al termine del processo si ha quindi che: 60,8710 = 3C,DEB851…..16 Anche in questo caso, la conversione è approssimata. Conversione da Binario in Esadecimale e viceversa La conversione tra sistemi di numerazione con basi qualsiasi e differenti da quella decimale, avviene con una doppia conversione: dalla prima base, in quella decimale e, da quella decimale nella seconda base. Esiste però la possibilità di effettuare la conversione in modo diretto quando le due basi risultano entrambe potenza di due come per es. le basi 2,4,8,16. Si consideri il numero binario 11011000001010012 e lo si converta in esadecimale. La conversione avviene associando i bit in gruppi da quattro a partire dall’estrema destra e convertendo singolarmente questi gruppi in esadecimale: 0110 1100 0010 1001 6 C 2 9 Lo stesso metodo viene usato per la conversione opposta: A 7 B 0 5 1010 0111 1011 0000 0101 A.C. Neve – L’informazione digitale 7 Decimale Binario Ottale Esadecimale 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011 11100 11101 11110 11111 100000 100001 100010 100011 100100 100101 100110 100111 101000 101001 101010 101011 101100 101101 101110 101111 110000 110001 110010 110011 110100 110101 110110 110111 111000 111001 111010 111011 111100 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 20 21 22 23 24 25 26 27 30 31 32 33 34 35 36 37 40 41 42 43 44 45 46 47 50 51 52 53 54 55 56 57 60 61 62 63 64 65 66 67 70 71 72 73 74 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C A.C. Neve – L’informazione digitale 8 Numeri negativi e sottrazioni Il problema dei numeri negativi sarà inizialmente affrontato, in questa nota, operando su campi fissi da 4 bit e, successivamente, generalizzato a n bit. 0000 1111 1110 0 15 0001 0010 1 14 1101 2 0011 3 13 A 12 1100 4 5 11 1011 0100 10 9 1010 1001 0101 6 7 8 Si consideri un registro a 4 bit, le configurazioni definibili al suo interno sono: 00002, 00012, 00102, 00112,………..11102, 11112, alle quali è possibile associare i valori decimali 0,+1,+2,+3, …………….+14,+15, come visibile nel registro circolare A. Come si può notare, con questa tecnica è possibile rappresentare solo numeri positivi. 0110 0111 1000 Si ipotizzi ora di voler rappresentare numeri positivi e negativi. Non avendo il registro alcuna possibilità di discriminare tra numeri positivi e negativi, è evidente la necessità di dover sacrificare uno dei bit del registro per la definizione del segno. Rappresentazione modulo e segno Con questa tecnica, si assegna al bit più significativo il compito di rappresentare il segno: 0 per i numeri positivi e 1 per i numeri negativi come esposto nel registro B. 0000 1111 1110 -7 0 0001 -6 1101 0010 1 2 B -4 1100 0100 4 5 -3 1011 0011 3 -5 -2 6 -1 1010 1001 0 1000 7 0101 0110 0111 Si ha quindi che: 00112 = +310 e poi 10112 = -310 In questo caso si hanno 7 configurazioni per i numeri positivi ed altrettante per quelli negativi con la presenza di due configurazioni per lo zero: 00002 = 10002 = 010 E’ pertanto possibile contare da –710 a +710 o, più in generale, da –(2n-1 –1) fino a +(2n-1-1). Questa tecnica di rappresentazione è però poco usata sia per la presenza di due configurazioni associate allo zero, come pure per le difficoltà che si incontrano nell’effettuare le sottrazioni. Rappresentazione complemento a due Per analogia a quanto avviene nel sistema di numerazione decimale (complemento a 10), si definisce il complemento a 2 di un numero binario ad n bit la quantità: Complemento a 2 di N = 2n - N Come si può notare la somma di un numero ad n bit più il suo complemento a 2 è sempre pari a 2n. A.C. Neve – L’informazione digitale 9 0000 1111 1110 0 -1 0010 1 -2 1101 2 0011 3 -3 C -4 1100 4 0100 Si ha quindi che: +310 = 00112 5 -5 1011 Con questa tecnica, i numero positivi sono rappresentati un binario puro mentre quelli negativi sono rappresentati in complemento a 2. 0001 -6 -8 7 -7 1010 0101 6 1001 -310 = Complemento a 2 di +310 = 11012 0110 0111 1000 Un metodo pratico per ottenere il complemento a 2 di un numero è il seguente: si complementa il numero e poi si somma 1. Analogamente per il processo inverso. si consideri il +310 che in binario è pari a 00112, il suo complemento è uguale a 11002, dopo avergli sommato 1 si ottiene 11012. Come si può osservare dal registro C, con questa rappresentazione esiste una sola configurazione associata allo zero e l’insieme dei numeri positivi è di una unità inferiore a quello dei numeri negativi. E’ pertanto possibile contare da –810 fino a +710 o, più in generale da –2n-1 fino a +2n-1-1. Si noti anche che tutti i numeri positivi hanno il bit più significativo pari a zero mentre tutti i numeri negativi hanno il bit più significativo pari ad uno. Sottrazioni 0000 1111 1110 -1 0 0001 0010 1 -2 1101 2 -4 2 – 5 = -3 4 0100 5 -5 1011 Si ipotizzi di dover effettuare la differenza: 0011 3 -3 1100 E’ evidente che, in un registro a 4 bit, il risultato di una sottrazione non potrà essere più grande di +7 ne inferiore a –8. -6 -7 1010 1001 0101 6 -8 7 1000 0110 0111 In prima ipotesi è possibile, partendo da zero, portare avanti l’indice del registro di due posizioni e poi indietro di cinque ottenendo il risultato corretto. Si può però ottenere lo stesso risultato facendo prima avanzare l’indice di due posizioni, e poi facendo di nuovo avanzare l’indice di (16 – 5) posizioni e cioè di (2n-5) che è il corrispondente complemento a 2. In termini più rigorosi si ha che: S = A – B = A + (-B) = A + (2n – B) = A + complemento a 2 di B Si è quindi trasformata la differenza in una somma. A.C. Neve – L’informazione digitale 10 Esempi: Si considerino i seguenti numeri: +2 = 0010 +5 = 0101 -2 = 1110 -5 = 1011 si effettuino ora le seguenti operazioni: +2 +5 +7 0010 0101 0111 = +7 -2 +5 +3 1110 0101 1 0011 = +3 +2 -5 -3 0010 1011 1101 = -3 -2 -5 -7 1110 1011 1 1001 = -7 Nei sistemi digitali si opera generalmente con campi di dimensioni fisse e pari a 8,16 o 32 bit. Con un campo di 8 bit si potrà contare da –128 fino a +127, ottenendo: -128 +127 +1 0 -1 10000000 01111111 00000001 00000000 11111111 Con un campo di 16 bit si potrà contare da –32768 fino a + 32767 Con un campo di 32 bit si potrà contare da –2147483648 fin a + 2147483647. Esempi: +100 -25 +75 01100100 11100111 1 01001011 +99 -100 -1 01100011 10011100 11111111 A.C. Neve – L’informazione digitale 11 Rappresentazione floating point standard IEEE 754 - 1985 All’interno di un elaboratore, la rappresentazione dei numeri reali in precisione semplice viene realizzata per mezzo della notazione floating point standard IEEE 754 - 1985 la quale utilizza un campo di 32 bit così organizzato: - 1 bit per il segno - 8 bit di esponente “BIASED 127” - 23 bit di parte frazionaria (mantissa) 31 30...............…23 22.........................................................0 S esponente E mantissa F il valore decimale associato alla stringa è dato dalla seguente relazione: N = ( − 1) S ⋅ ( 2 E −127 ) ) ⋅ (1, F ) Il bit 31 rappresenta il segno del numero: 0 se positivo, 1 se negativo. L’esponente E è rappresentato da otto bit senza segno con un bias pari a 28-1-1 = 127, pertanto un numero pari a 2A avrà, nella stringa, un esponete E = A +127. Il valore di E sembrerebbe quindi poter variare tra 0 e 255 quando l’esponente A del numero varia tra -127 e +128, in pratica però lo standard prevede che l’esponete A possa variare solo tra –126 e +127. L’esponente 12810 = 111111112 viene usato per rappresentare una situazione di underflow o di overflow oppure un NaN (Not a Number) quando l’esponente richiesto è più grande del massimo consentito. Se la mantissa è zero, l’esponente 000000002 è usato per indicare lo zero (questo è un caso speciale in quanto il primo uno è normalmente sempre implicito). In decimale, i numeri rappresentabili avranno un range dinamico compreso tra 10+38 e 10-38 consentendo così la rappresentazione di valori sia estremamente grandi che estremamente piccoli. La parte frazionaria (mantissa) è costituita da 23 bit senza segno, il bit meno significativo risulta avere un peso pari a 2-23 il che consente una precisione di una parte su 2+23 equivalente a sette cifre significative decimali. La notazione floating point ha la caratteristica di garantire lo stesso numero di cifre significative, e quindi la stessa precisione di rappresentazione, per tutti i numeri compresi tra 10+38 e 10-38. Nella rappresentazione in doppia precisione si usa un campo di 64 bit così costituito: - 1 bit per il segno - 11 bit di esponente “BIASED 1023” - 52 bit di parte frazionaria (mantissa) In questo caso, la precisione è di quindici cifre significative ed il range tra 10-308 e 10+308. A.C. Neve – L’informazione digitale 12 Esempi: 1) Si consideri il numero decimale -11,375: (-11,375)10 = (-1011,011)2 2+0 = (-1,011011)2 2+3 come si può notare il numero è stato portato nella forma (1,F) 2A si ha quindi che: S=1 E = (3)10 +(127)10 = (130)10 = (10000010)2 F = (0110 1100 0000 0000 0000 000)2 La stringa risulta quindi: 1100 0001 0011 0110 0000 0000 0000 0000 C 1 3 6 0 0 0 0 2) Si consideri il numero decimale +625,00137 (+625,00137)10 = (+1001110001,00000000010110)2 2+0 = (1,00111000100000000010110)2 2+9 come si può notare il numero è stato portato nella forma (1,F) 2A si ha quindi che: S=0 E = (9)10 + (127)10 = (136)10 = (10001000)2 F = (0011 1000 1000 0000 0010 110)2 La stringa risulta quindi: 0100 0100 0001 1100 0100 0000 0001 0110 4 4 1 C 4 0 1 6 3) Si consideri il numero decimale -0,005: (-0,005)10 = (-0,0000000101000111101011100001010)2 2+0 = (1,01000111101011100001010)2 2-8 come si può notare il numero è stato portato nella forma (1,F) 2A si ha quindi che: S=1 E = (-8)10 + (127)10 = (119)10 = (01110111)2 F = (0100 0111 1010 1110 0001 010)2 La stringa risulta quindi: 1011 1011 1010 0011 1101 0111 0000 1010 B B A 3 D 7 0 A A.C. Neve – L’informazione digitale 13 Comunicazione TX Sorgente Codificatore Controllore di canale RX Mezzo trasmissivo Riconoscitore stato di canale Gestore del protocollo Destinatario Gestore del protocollo Codificatore: Trasforma l’informazione nella forma più idonea Mezzo trasmissivo: E’ il supporto fisico sul quale viaggia l’informazione sotto forma di ad essere trasmessa. Genera quindi il messaggio segnale. Controllore di canale: Elabora l’informazione codificata in E’ la parte più critica e più soggetta ad errori. modo che possa viaggiare nel mezzo trasmissivo. Viene così La principale caratteristica è la Banda Passante (Larghezza di canale) che limita la generato il segnale. velocità di trasferimento. Gestore del protocollo: Supervisiona il processo di trasmissione rispettando un insieme di regole che permettono il corretto avvio, trasferimento e chiusura del processo di trasmissione. Riconoscitore dello stato di canale: Estrae l’informazione codificata dalla grandezza fisica usata per il suo trasporto lungo il mezzo trasmissivo. Decodificatore: Riconosce l’informazione codificata e ne valuta la sua correttezza. Gestore del protocollo: Supervisiona il processo di trasmissione rispettando un insieme di regole che permettono il corretto avvio, trasferimento e chiusura del processo di trasmissione. Disturbi e rumori sono le principali cause di errore. Non sono prevedibili nel tempo e nei valori. I disturbi provengono dall’esterno infiltrandosi e propagandosi lungo il sistema di comunicazione (impulsi elettromagnetici). Il rumore viene generalmente generato all’interno del sistema stesso dai vari componenti o dal loro funzionamento. A.C. Neve – L’informazione digitale Decodificatore 14 L’informazione Le basi dell’attuale teoria dell’informazione sono state sviluppate da Shannon e Weaver in “The mathematical theory of communication” Univ. of Illinois Press – 1964 (tradotto da ETAS). Nell’ambito della comunicazione, l’aspetto che più rende interessante un messaggio è il suo carattere di eccezionalità nel senso che, meno prevedibile è la notizia e maggiore è la sensazione di aver aumentato la conoscenza o equivalentemente, di aver diminuito il grado di incertezza. Particolarmente apprezzata è anche la variazione dell’informazione ricevuta. Una stessa informazione viene poi apprezzata in modo differente da due destinatari che dispongono di un differente livello di conoscenze. Da queste considerazioni preliminari appare evidente che nel seguito sarà necessario ricorrere all’uso di concetti e strumenti di tipo probabilistico. E’ infatti evidente che, se il ricevitore è in grado di conoscere con assoluta certezza il contenuto di un messaggio, quest’ultimo non trasporterà alcuna informazione ne sarà in grado di rimuovere incertezza. Una sorgente di informazione è caratterizzata da: 1) Un numero N ≥ 2 di simboli che costituiscono l’alfabeto 2) I simboli stessi x1,x2, … xN 3) La probabilità di ricorrenza di ciascun simbolo p(x1), p(x2), … p(xN) con N ∑ p( x ) = 1 i =1 i Una sorgente di questo tipo è chiamata Sorgente Discreta Senza Memoria. Per una sorgente di dati binari si avrà che: N=2 x1=0, x2=1 p(x1)=0.5, p(x2)=0.5 Per una sorgente alfabetica si avrà che: N = 27 x1=a, x2=b, x3=c ….. x26=z x27=spazio p(x1)=1/27, p(x2)=1/27 ….. p(x27)=1/27 Come affermato da Shannon, in una lingua esistono delle correlazioni sintattiche tra le varie lettere dell’alfabeto (parole con tre consonanti di seguito sono rare, con quattro nessuna) per cui è necessario associare alla sorgente anche le probabilità condizionali dei vari simboli oltre a quelle delle loro ricorrenze. Divenendo così i simboli statisticamente dipendenti, la sorgente avrà bisogno di una memoria e sarà detta Sorgente Discreta Con Memoria. A.C. Neve – L’informazione digitale 15 MISURA DELL’INFORMAZIONE L’idea fondamentale dalla quale nasce la misura dell’informazione si basa sull’ipotesi di esistenza di incertezza in chi deve ricevere l’informazione e che parte di questa incertezza venga rimossa dall’informazione ricevuta. Si considerino due sorgenti di informazione binaria cioè con N = 2 e tali che: per la prima p(x1) = 0.5 e p(x2) = 0.5 per la seconda p(x1) = 0.9 e p(x2) = 0.1 E’ evidente che, nella prima sorgente entrambi i simboli sono in grado di rimuovere la stessa quantità di incertezza poiché sono equiprobabili, mentre nel secondo caso solo il simbolo x2 è in grado di rimuovere una grande quantità di incertezza in quanto la ricezione del primo simbolo è quasi scontata a causa della sua elevata probabilità. La situazione peggiore si ha nel caso in cui p(x1) = 1 e p(x2) = 0 in quanto la certezza di ricevere sempre il simbolo x1 non sarà in grado di fornire alcuna informazione ne di rimuovere incertezza. Si intuisce anche che la situazione ottimale sarà quella con p(x1) = p(x2) = 0.5. Indicando con I(xi) la quantità di informazione associata al simbolo xi si dovrà avere che: 1) Se 2) Se 3) Se p(xi) = p(xj) ⇒ I(xi) = I(xj) p(xi) < p(xj) ⇒ I(xi) > I(xj) p(xi) = 1 ⇒ I(xi) = 0 E’ necessario a questo punto introdurre una ulteriore considerazione: la misura dell’informazione dovrebbe risultare additiva nel senso che l’informazione associata ad un messaggio dovrebbe essere uguale alla somma delle informazioni associate ai simboli che la costituiscono (dal punto di vista delle probabilità si tratta del prodotto delle probabilità) I(xi,xj) = I(xi) + I(xj) La funzione matematica che meglio soddisfa le considerazioni fin ora esaminate è il logaritmo infatti: è una funzione crescente vale zero quando l’argomento è pari ad 1 il logaritmo del prodotto è pari alla somma dei logaritmi si ha quindi che l’informazione associata ad un simbolo xi avente una probabilità pari a p(xi) è: 1 ) = − log 2 ( p ( xi )) p ( xi ) La scelta della base del logaritmo non è un problema in quanto il passaggio da una base ad un’altra implica solo il prodotto per una costante infatti è ben noto che: I ( xi ) = log 2 ( loga(p) = K·logb(p) con K= 1/logb(a) dato che la base di calcolo più diffusa è quella in base 10, si ha che: log 2 N = A.C. Neve – L’informazione digitale 1 ⋅ log10 N = 3.321928 ⋅ log10 N log10 2 16 tutto ciò sarebbe solo equivalente ad una variazione dell’unità di misura. La scelta del logaritmo in base 2 implica una misura dell’informazione espressa in BIT. Questo tipo di misura dell’informazione è utile quando tutti i simboli della sorgente sono equiprobabili. Si può però verificare che, due sorgenti con lo stesso valore di N ma con differenti probabilità dei vari simboli possono, a parità di lunghezza di messaggio, trasportare differenti quantità di informazione. In questo caso si utilizza il valore medio delle informazioni associate ai simboli della sorgente e cioè: N N i =1 i =1 H ( x) = ∑ p( xi ) ⋅ I ( xi ) = ∑ p ( xi ) ⋅ log 2 1 p ( xi ) La quantità H(x) è detta entropia ed è misurata in bit/simbolo. Si può dimostrare che per l’entropia risulta valida la relazione: H ( x) ≤ log 2 N la cui interpretazione ci induce ad affermare che l’entropia assume il valore massimo log2N quando tutti i simboli della sorgente hanno la stessa probabilità pari ad 1/N, sotto queste condizioni si ha infatti che: N 1 1 H ( x) = ∑ p ( xi ) ⋅ log 2 = N ⋅ p ( xi ) ⋅ log 2 i =1 p ( xi ) p ( xi ) risultando però che p(xi) =1/N si ha che: H ( x) = N ⋅ 1 ⋅ log 2 N = log 2 N N L’entropia di una sorgente binaria varia, in funzione della probabilità associata ai suoi due simboli, secondo il seguente andamento: 0.993 1 0.8 Sia p(x1) = x e p(x2) = (1-x) 0.6 con p(x1) + p(x2) = 1 e 0<x<1 H ( x) si ha quindi che: 0.4 1 1 H ( x) = x ⋅ log 2 + (1 − x) ⋅ log 2 ( x) (1 − x) 0.2 0.08 0 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 1.1 1.2 1.3 1.4 1.5 0.01 x A.C. Neve – L’informazione digitale 1.5 17 Esempio: Si consideri una sorgente di informazione capace di emettere tre simboli tali che: p(x1) = 0.5 p(x2) = 0.25 e p(x3) = 0.25 l’informazione associata ai tre simboli risulterà: I(x1) = log2(1/0.5) = log2(2) = 1 bit I(x2) = log2(1/0.25) = log2(4) = 2 bit I(x3) = log2(1/0.25) = log2(4) = 2 bit Esempio: Si considerino due differenti sorgenti di informazione in grado di emettere quattro simboli tali che: Sorgente S1 ⇒ p(x1) = 0,5 p(x2) = 0.25 p(x3) = 0.125 p(x4) = 0.125 Sorgente S2 ⇒ p(x1) = 0,25 p(x2) = 0.25 p(x3) = 0.25 p(x4) = 0.25 Determinare la quantità di informazione associata al messaggio (x1 x3 x2 x1). La quantità di informazione associata al messaggio è data da: 1 1 1 1 1 1 1 1 I T = log 2 ⋅ ⋅ ⋅ = log 2 + log 2 + log 2 + log 2 = p( x1 ) p( x2 ) p( x1 ) p ( x1 ) p( x3 ) p( x 2 ) p( x1 ) p ( x3 ) = I ( x1 ) + I ( x3 ) + I ( x 2 ) + I ( x1 ) Si ha quindi che: Per la sorgente S1 ⇒ IT = 1 + 2 + 3 + 3 = 9 bit Per la sorgente S2 ⇒ IT = 2 + 2 + 2 + 2 = 8 bit Come si può notare, la quantità di informazione relativa a messaggi della stessa lunghezza, può differire a secondo del tipo di sorgente utilizzata. Esempio: Calcolare l’entropia degli esempi precedenti. N H ( x) = ∑ p ( xi ) ⋅ I ( xi ) i =0 1° caso: H(x) = (1/2)*1 + (1/4)*2 + (1/4)*2 = 1.5 bit/simbolo 2° caso: H(x) = (1/2)*1 + (1/4)*2 + (1/8)*3 + (1/8)*3 = 1.75 bit/simbolo 3° caso: H(x) = (1/4)*2 + (1/4)*2 + (1/4)*2 + (1/4)*2 = 2.0 bit/simbolo Come si può notare, la sorgente del terzo caso presenta il più alto valore di entropia che è determinato dal fatto che tutti i simboli sono equiprobabili. A.C. Neve – L’informazione digitale 18 LA CODIFICA L’operazione di codifica serve a trasformare gli N simboli, generati da una sorgente informativa, in una sequenza di bit che dovranno poi essere canalizzati in un mezzo trasmissivo per poter inviare l’informazione da una sorgente ad un destinatario in modo sicuro e veloce. Un codice è caratterizzato da: i simboli usati i quali, aggregati in stringhe, secondo opportune regole, definiscono le parole del codice. L’operazione di generazione di queste parole è detta codifica. - Un codice si dice distinto se tutte le sue parole sono tra loro distinguibili Un codice distinto si dice univocamente decodificabile se tutte le sue parole sono identificabili quando siano inserite in una qualsiasi sequenza di parole in codice. Un codice univocamente decodificabile si dice istantaneamente decodificabile se tutte le sue parole sono identificabili non appena ricevuto l’ultimo bit. Un codice si dice efficiente se usa il minimo numero di bit necessari Un codice si dice ridondante se usa un numero di bit superiore a quello strettamente necessario. Per poter ricostruire il messaggio originale, è necessario che il codice risulti distinto ed univocamente decodificabile. Non è necessario che il codice sia istantaneamente decodificabile a meno che non ci siano problemi di velocità o si usino sistemi che operino in tempo reale. Dal punto di vista dell’efficienza del trasporto dell’informazione, il miglior codice è quello che, mediamente, richiede la trasmissione del minor numero di bit (a parità di informazione). A tal proposito si evidenzia la possibilità di poter far uso di codici a lunghezza fissa o variabile. Nel primo caso, le parole del codice sono tutte costituite dallo stesso numero di bit mentre nel secondo caso le parole sono costituite da un numero differente di bit. - Si dice lunghezza della parola li il numero di bit usati per definire quella parola del codice. Si dice lunghezza media di un codice la quantità: N L = ∑ p ( xi ) ⋅ li bit/parola i =1 Per un codice efficiente a lunghezza fissa si ha che: L = 1 + INT [log 2 ( N − 1)] In un codice numerico, nel quale i simboli sono le dieci cifre decimali, si ha che: N = 10 ed L = 4 bit/parola - Ogni parola sarà quindi costituita da quattro bit. Il problema della lunghezza fissa o variabile è fondamentalmente legato alla probabilità di ricorrenza degli N simboli generati dalla sorgente di informazione. Infatti, se la sorgente emette simboli non equiprobabili sarebbe più conveniente associare ai simboli più probabili delle parole con lunghezza inferiore riducendo così la lunghezza media delle stringhe da trasmettere ed il relativo tempo di trasmissione. Vale quindi il seguente criterio: - Per sorgenti equiprobabili, è più conveniente l’uso di codici a lunghezze fissa mentre per sorgenti non equiprobabili è più opportuno l’uso di codici a lunghezza variabile. A.C. Neve – L’informazione digitale 19 Al fine di poter valutare numericamente la convenienza di una codifica a lunghezza variabile si definisce il coefficiente di efficienza η come: N η= H ( x) = L ∑ p( x ) ⋅ log i =1 i 2 1 p ( xi ) N ∑ p( x ) ⋅ l i =1 i con valori compresi tra 0 ed 1 i Nell’analisi fin ora condotta non si è ancora affrontato il problema della costruzione di un codice per una sorgente non equiprobabile. Proviamo quindi a costruire un codice binario per una sorgente di informazione in grado di emettere quattro diversi simboli x1 ,x2, x3, x4 aventi le seguenti probabilità: p(x1) = 0,5 p(x2) = 0.25 p(x3) = 0.125 p(x4) = 0.125 si considerino ora i seguenti possibili codici: Simbolo x1 x2 x3 x4 Codice 1 Codice 2 Codice 3 Codice 4 Codice 5 Codice 6 p(xi) 0.5 0.25 0.125 0.125 Codice 1 Codice 2 Codice 3 Codice 4 Codice 5 Codice 6 0 0 00 0 0 0 0 1 01 01 10 10 1 00 11 011 110 110 11 11 10 0111 1110 111 L=1.125 L=1.25 L=2 L=1.875 L=1.875 L=1.75 Non è un codice distinto in quanto i simboli x1 e x2 vengono entrambi codificati con 0 per cui in ricezione la decodifica risulterebbe ambigua. La lunghezza del codice è pari a 1.125 bit/parola. E’ un codice distinto ma non univocamente decodificabile infatti: la sequenza di simboli (x3 x4) viene codificata con la stringa 0011, in ricezione però questa stringa può essere decodificata come se fosse la sequenza (x3 x4) o (x1 x1 x4) o (x3 x2 x2) o ancora (x1 x1 x2 x2). La lunghezza del codice è pari a 1.125 bit/parola. E’ un codice istantaneamente decodificabile ed a lunghezza fissa. Dato che ogni parola ha lunghezza 2, ciascuna coppia di bit può essere immediatamente decodificabile alla sua ricezione. La lunghezza del codice è pari a 2 bit/parola. E’ un codice univocamente decodificabile dato che la ricezione di uno 0 indica sempre l’inizio di una nuova parola. Questo codice non è però istantaneamente decodificabile perché la fine di una parola non può essere rilevata se non aspettando l’inizio della successiva. La lunghezza del codice è pari a 1.875 bit/parola. Questo codice è istantaneamente decodificabile dato che la ricezione di uno 0 indica sempre la fine di una parola. La lunghezza del codice è pari a 1.875 bit/parola. Anche questo codice è istantaneamente decodificabile ma la sua lunghezza è di 1.75 bit/parola A.C. Neve – L’informazione digitale 20 Si noti che l’entropia della sorgente usata è pari a: H(x)=(1/2)*log2(1/0.5)+(1/4)*log2(1/0.25)+(1/8)*log2(1/0.125)+(1/8)*log2(1/0.125) = 1.75 bit/simbolo e che nessun codice univocamente decodificabile presente in tabella ha una lunghezza minore di 1.75 bit/simbolo. Questo risultato non è casuale ed è dimostrato dal 1° Teorema di Shannon il quale afferma che gli N simboli di una sorgente discreta senza memoria non possono essere rappresentati da un codice istantaneamente decodificabile di lunghezza inferiore all’entropia della sorgente stessa e cioè: H ( x) ≤ L da questa relazione si ribadisce che il rapporto H(x)/L (cioè il coefficiente di efficienza) non potrà essere maggiore di 1 e pertanto il Codice 6 ha la massima efficienza. Con riferimento alla tabella proposta ed a quanto sostenuto dal teorema di Shannon , si può affermare che non potrà esistere nessun codice istantaneo più corto del Codice 6 e pertanto è inutile prolungare la ricerca di un codice più corto. Si dice prefisso di una parola in codice, una sequenza binaria ottenuta troncando la parola stessa. Per esempio, i prefissi della parola 0101 sono 0, 01, 010 e 0101. Un codice univocamente decodificabile è anche istantaneamente decodificabile se nessuna parola del codice è prefisso di un’altra e cioè se nessuna parola può essere ottenuta aggiungendo cifre binarie ad un’altra parola. Infatti, si consideri il caso in cui sia stato ricevuto il bit finale di una parola di un codice univocamente decodificabile. Se questa parola non può essere riconosciuta senza ambiguità è solo perché questa parola costituisce anche la prima parte di un’altra parola del codice. E’ infine opportuno citare la diseguaglianza di Kraft per la quale: Condizione necessaria e sufficiente per l’esistenza di un codice istantaneo relativo ad una sorgente di N simboli con parole di lunghezza l1, l2, l3, .....lN è che risulti: N ∑2 − li ≤1 i =1 Si noti che la diseguaglianza di Kraft consente di stabilire se, dato un insieme di parole di una certa lunghezza, esiste un codice istantaneamente decodificabile con parole di tale lunghezza. Non fornisce però alcuna informazione sulle sequenze binarie che costituiscono le parole stesse. Le considerazioni fino ad ora sviluppate hanno fornito le conoscenze teoriche e pratiche riguardanti la lunghezza del codice istantaneo più breve ma, resta ancore irrisolto il problema della effettiva costruzione del codice ottimale. Esiste a tal proposito l’algoritmo di Huffman il quale propone un metodo iterativo per la determinazione del codice ottimale per una sorgente non equiprobabile. Si inizia con il suddividere i simboli della sorgente in due gruppi caratterizzati dall’avere somme di probabilità all’incirca uguali. Si assegna poi il bit 0 al primo gruppo ed il bit 1 al secondo gruppo. I gruppi ottenuti vengono di nuovo suddivisi in due sottogruppi aventi ancora la somma delle probabilità all’incirca uguali. Anche ora si assegna il bit zero al primo gruppo ed il bit 1 al secondo gruppo. Si procede in questo modo fino all’esaurimento di tutti i simboli. A.C. Neve – L’informazione digitale 21 Si viene così a determinare un albero la cui percorrenza, attraverso i vari rami, fornisce le parole del codice associate ai vari simboli. Si consideri come esempio la seguente sorgente di simboli non equiprobabili: Simbolo Probabilità A B C D E F G H 0.512 0.128 0.128 0.032 0.128 0.032 0.032 0.008 Con il metodo ora descritto si realizza il seguente albero: A (0.512) A B C D E F G H 0 B (0.128) 0 100 0 BC (0.256) 1 1 0 BCDEFGH (0.488) C (0.128) 101 E (0.128) 110 0 1 DEFGH (0.232) D (0.032) 0 11100 DF (0.064) 1 0 1 F (0.032) DFGH (0.104) G (0.032) 0 1 11101 11110 GH (0.040) 1 H (0.008) 11111 ottenendo il seguente codice ottimale: Simbolo Codice A 0 B 100 C 101 D 11100 E 110 F G H 11101 11110 11111 Si noti che, questo codice non è unico ed una diversa articolazione dell’albero (assegnazione di 0 e 1 oppure di 1 e 0) avrebbe fornito codici differenti ma tutti ottimali. La lunghezza media di questo codice risulta pari a: H L = ∑ p( xi ) ⋅ li = 0.512 ⋅ 1 + 3 ⋅ (0.128 ⋅ 3) + 3 ⋅ (0.032 ⋅ 5) + 0.008 ⋅ 5 = 2.184 bit/parola i= A Lo stesso codice, realizzato a lunghezza fissa, avrebbe richiesto tre bit per simbolo con una lunghezza media pari a 3 bit/parola che è certamente superiore al precedente. L’entropia associata a questa sorgente risulta pari a: H 1 H 1 H ( x) = ∑ p ( xi ) ⋅ log 2 = ∑ p ( xi ) ⋅ 3.321 ⋅ log10 = 2.165 bit/simbolo i= A p ( xi ) i = A p ( xi ) A.C. Neve – L’informazione digitale 22 Il coefficiente di efficienza risulta infine pari a: η = H(x)/L = 2.165/2.184 = 99.1% che è un valore sicuramente buono essendo molto prossimo ad 1. Per un codice a lunghezza fissa di tre bit si sarebbe invece avuto η = 2.165/3 = 72.1%. Esempio: Delle sorgenti proposte, si determini il valore dell’entropia ed un codice ottimizzato. Sorgente S1 ⇒ N = 5 p(x1) = 0.5 p(x2) = 0.25 p(x3) = 0.125 p(x4) = 0.0625 p(x5) = 0.0625 Sorgente S2 ⇒ N = 4 p(x1) = 0.5 p(x2) = 0.25 p(x3) = 0.1875 p(x4) = 0.0625 Per la prima sorgente S1 si ha che: 5 1 H ( x) = ∑ p ( xi ) ⋅ log 2 = 1.875 bit/simbolo i =1 p ( xi ) Un codice ottimale determinato con il metodo di Huffman è il seguente: x1 (0.5) x1 x2 x3 x4 x5 0 0 x2 (0.25) 10 0 x3 (0.125) 110 1 0 x2x3x4x5 (0.5) 1 x3x4x5 (0.25) x4 (0.0625) 0 1110 1 x4x5 (0.125) 1 x5 (0.0625) 1111 La lunghezza media di questo codice è pari a: 5 L = ∑ p ( xi ) ⋅ li = 1.875 bit/parola i =1 L’efficienza di questo codice è pari a: η = H(x)/L = 1.875/1.875 = 100% Codificando questa sorgente con un codice a lunghezza fissa sarebbero stati necessari tre bit per parola e la lunghezza media del codice sarebbe risultata pari a: 5 L = ∑ p ( xi ) ⋅ li = 3.0 bit/parola i =1 A.C. Neve – L’informazione digitale 23 con una efficienza del codice pari a: η = H(x)/L = 1.875/3.0 = 62.5% Per la seconda sorgente S2 si ha che: 5 1 H ( x) = ∑ p ( xi ) ⋅ log 2 = 1.702 bit/simbolo i =1 p ( xi ) Un codice ottimale determinato con il metodo di Huffman è il seguente: x1 (0.5) 0 0 x1 x2 x3 x4 x2 (0.25) 1 10 0 x3 (0.1875) x2x3x4 (0.5) 0 110 1 x3x4 (0.25) 1 x4 (0.0625) 111 La lunghezza media di questo codice è pari a: 5 L = ∑ p ( xi ) ⋅ l i = 1.75 bit/parola i =1 L’efficienza di questo codice è pari a: η = H(x)/L = 1.702/1.75 = 97.25% Codificando questa sorgente con un codice a lunghezza fissa sarebbero stati necessari due bit per parola e la lunghezza media del codice sarebbe risultata pari a: 5 L = ∑ p( xi ) ⋅ l i = 2.0 bit/parola i =1 con una efficienza del codice pari a: η = H(x)/L = 1.702/2.0 = 85.1% Nel caso di sorgenti equiprobabili si ha che: η= log 2 N H ( x) = L 1 + INT [log 2 ( N − 1)] per cui η potrà essere uguale ad 1 solo nel caso in cui il numero N di simboli generati dalla sorgente risulti pari ad una potenza di 2. A.C. Neve – L’informazione digitale 24 CODICI Come si è già detto, si intende per codice un sistema di simboli utilizzati per rappresentare gli elementi di un insieme. I codici sono caratterizzati dai simboli utilizzati i quali, aggregati in maniera opportuna, danno origine alle cosiddette parole del codice. L’operazione di generazione di queste parole è detta codifica, quella inversa è detta decodifica. La necessità di poter disporre di un codice deriva dall’esigenza di dover trasmettere, in modo sicuro e veloce, una certa quantità di informazione da un utilizzatore ad un altro attraverso un supporto fisico detto mezzo di trasmissione. Una volta definiti i simboli utilizzati dal codice e gli elementi dell’insieme che si vogliono rappresentare, è necessario determinare il numero dei simboli che è necessario aggregare tra loro per poter rappresentare univocamente tutti gli elementi dell’insieme considerato. Indicando con K il numero dei simboli usati, con N il numero degli elementi dell’insieme da rappresentare ed n il numero di simboli da aggregare tra loro, si ha che: se Kn < N il codice è ambiguo se Kn = N il codice è efficiente se Kn > N il codice è ridondante Nell’utilizzo pratico, un codice deve sempre risultare non ambiguo. Volendo rappresentare 100 diversi oggetti facendo uso di 3 simboli, sarà necessario aggregare i simboli in stringhe di lunghezza pari almeno a 5. Volendo rappresentare 64 diversi oggetti facendo uso di 2 simboli, sarà necessario aggregare i simboli in stringhe di lunghezza pari almeno a 6. Nel seguito saranno considerati solo codici con K=2 e cioè codici binari e del tipo a lunghezza fissa. La tecnica di codifica più diffusa è quella per carattere, per ogni simbolo esiste una parola del codice per cui un messaggio viene codificato convertendo ogni simbolo del messaggio stesso nella corrispondente parola del codice usato. Codici numerici Questi codici sono esclusivamente usati per la rappresentazione di informazioni numeriche. Affinché un codice numerico possa risultare non ambiguo deve far uso di parole costituite da quattro bit in quanto 24 > 10, questi codici sono detti BCD (Binary Coded Decimal). Ricordando che con 4 bit si possono generare 16 diverse configurazioni, un codice BCD potrà essere ottenuto scegliendo 10 di queste possibili configurazioni ed associandole alle 10 cifre decimali secondo un ordine ritenuto più conveniente. Operando in questi termini si ha la possibilità di generare 16!/(16-10)! = 16!/6! = 29059430000 differenti codici. A.C. Neve – L’informazione digitale 25 Cifra decimale BCD 8421 0 0000 1 0001 2 0010 3 0011 4 0100 5 0101 6 0110 7 0111 8 1000 9 1001 BCD 8421 BCD 2421 Aiken BCD +7+4-2-1 BCD Eccesso-3 BCD 2421 Aiken 0000 0001 0010 0011 0100 1011 1100 1101 1110 1111 BCD +7+4-2-1 BCD Eccesso-3 0000 0011 0111 0100 0110 0101 0101 0110 0100 0111 1010 1000 1001 1001 1000 1010 1111 1011 1110 1100 Questo codice è il più semplice, immediato ed il più diffuso. E’ un codice pesato con pesi 8421 per cui coincide con le prime dieci configurazioni consecutive ottenibili, in binario, con 4 bit. Esistono ben 64 codici con peso 2421 uno dei quali è quello Aiken. Questo codice, oltre che essere pesato è anche autocomplementante. Si dice autocomplementante un codice nel quale il complemento di una qualsiasi parola genera una configurazione di bit ancora appartenente allo stesso codice. Questo è un esempio di codice pesato con pesi positivi e negativi. Per es., la cifra 5 si ottiene dalla somma +7-2, quella 3 da +4-1 ecc. Questo è un codice non pesato. Si genera facendo corrispondere alle cifre decimali, la loro rappresentazione in binario a 4 bit incrementata di 0011 (3). Questo codice non contiene la configurazione 0000 ed è autocomplementante. Parametri caratteristici e definizioni Si dice peso di una configurazione, il numero di bit pari ad 1 presenti in una configurazione. Si dice distanza tra due configurazioni, il numero di bit per i quali le due configurazioni differiscono o, equivalentemente, il numero di bit da invertire per passare da una configurazione all’altra. Si dice distanza di Hamming, la minima distanza tra due qualsiasi configurazioni di un codice. Tutti i codici BCD hanno distanza di Hamming pari ad 1. Più grande è il valore di questo parametro e più sicuro risulterà il codice nei confronti di possibili errori. Si parla di configurazione errata quando, per effetto di una casuale inversione di bit, si verifica che la parola originaria di un codice si trasforma in una parola non appartenente al codice. Si intende per molteplicità di errore, la distanza tra la configurazione originaria e quella errata. Nella pratica coincide con il numero di bit invertiti a causa di un errore. Si può definire la ridondanza di un codice considerando ridondante un codice che utilizza un numero di bit (e non di configurazioni) M = N + k superiore a quello strettamente necessario per rappresentare, in modo non ambiguo, tutti gli N elementi dell’insieme considerato. Alla luce di queste considerazioni, tutti i codici BCD risultano efficienti. I k bit in più sono detti bit di controllo. Si può quindi definire il grado di ridondanza di un codice come il rapporto M/N. A.C. Neve – L’informazione digitale 26 Codici con 5 o più di 5 bit Cifra decimale 0 1 2 3 4 5 6 7 8 9 2 su 5 51111 Shift counter (Johnson) Biquinario Ring counter 2 su 5 00110 00011 00101 01001 01010 01100 10001 10010 10100 11000 51111 00000 00001 00011 00111 01111 10000 11000 11100 11110 11111 Shift counter 00000 00001 00011 00111 01111 11111 11110 11100 11000 10000 Biquinario 01 00001 01 00010 01 00100 01 01000 01 10000 10 00001 10 00010 10 00100 10 01000 10 10000 Ring counter 0000000001 0000000010 0000000100 0000001000 0000010000 0000100000 0001000000 0010000000 0100000000 1000000000 Questo è un codice a 5 bit le cui configurazioni hanno peso costante e pari a 2 infatti, in ogni parola sono presenti sempre e soltanto due bit pari ad 1. Questa tecnica rende più semplice la rilevazione di eventuali errori. Questo codice ha distanza di Hamming pari a 2. Non è un codice pesato. Questo è un codice a 5 bit pesato con pesi pari a 5 1 1 1 1. Risulta autocomplementante e con distanza di Hamming pari ad 1. Questo è un codice a 5 bit non pesato con distanza di Hamming pari ad 1. Si noti che le varie configurazioni vengono generate dallo scorrimento da destra a sinistra di cinque bit pari ad 1 (tipico del contatore Johnson). Questo è un codice pesato a 7 bit nel quale tutte le parole hanno peso costante pari a 2, questa caratteristica consente una più facile individuazione di eventuali errori. I 7 bit di questo codice possono essere considerati appartenenti a due gruppi separati, il primo da 2 bit con pesi 5 e 0 ed il secondo da cinque bit con pesi 43210. In ciascuno di questi due gruppi vi è sempre e soltanto un solo bit pari ad 1. La distanza di Hamming è pari a 2. Questo è un codice pesato a 10 bit con pesi 9876543210. La distanza di Hamming è pari a 2 e le sue parole hanno peso costante pari ad 1. Nonostante questo codice risulti fortemente ridondante, esso è particolarmente sicuro nei confronti di possibili errori. Esempi: 3740 in base 10 equivale a: 0011 0111 0100 0000 0011 1101 0100 0000 0110 1010 0111 0011 01001 10010 01010 00110 0101000 1000100 0110000 0100001 A.C. Neve – L’informazione digitale in codice BCD 8421 in codice BCD 2421 Aiken in codice Eccesso-3 in codice 2 su 5 in codice Biquinario 27 Codice Gray Cifra decimale G3 G2 G1 G0 0 0 0 0 0 1 0 0 0 1 2 0 0 1 1 3 0 0 1 0 4 0 1 1 0 5 0 1 1 1 6 0 1 0 1 7 0 1 0 0 8 1 1 0 0 9 1 1 0 1 10 1 1 1 1 11 1 1 1 0 12 1 0 1 0 13 1 0 1 1 14 1 0 0 1 15 1 0 0 0 Il codice di Gray è un codice non pesato e, fondamentalmente, non è un codice BCD per cui non usa la codifica per carattere. Ogni configurazione è pertanto individualizzata come accade nella rappresentazione dei numeri in binario puro. In un codice Gray, l’ordine delle varie configurazioni è tale che la generica configurazione ha distanza 1 dalla successiva e dalla precedente come pure l’ultima ha distanza 1 dalla prima. Per tali proprietà questo codice è detto monoprogressivo e ciclico. Nella figura sono circoscritti i codici di Gray a 1, 2, 3 e 4 bit. Un codice di Gray ad n bit può essere costruito da quello ad n-1 bit semplicemente ribaltando specularmente il codice ad n-1 bit e premettendo uno 0 alle prime 2n-1 configurazioni ed un 1 alle successive 2n-1. Per questa caratteristica il codice di Gray è anche detto riflessivo. Il codice di Gray è molto utilizzato nei circuiti combinatori che non possono tollerare la commutazione contemporanea di due o più bit. La commutazione contemporanea di più bit non può mai essere ottenuta nei circuiti reali in quanto, vi sarà sempre un bit che commuta prima di tutti gli altri ed un altro che commuterà per ultimo. Il caso più semplice è quello di una porta OR i cui ingressi devono commutare dalla configurazione 01 a quella 10 lasciando l’uscita inalterata al valore 1. Non risultando la commutazione istantanea, si ha che gli ingressi potranno avere le seguenti evoluzioni: 01 Î 11 Î 10 oppure 01 Î 00 Î 10 a secondo che sia più veloce a commutare il primo bit o il secondo. Nel primo caso non ci sono problemi in quanto l’uscita resta fissa sul valore 1, nel secondo caso invece l’uscita va a 0 per un brevissimo intervallo di tempo per poi ritornare subito ad 1, viene così a generarsi un piccolo impulso la cui durata è pari alla differenza tra i due tempi di commutazione che può risultare estremamente pericoloso e di difficilissima rilevazione a causa della breve durata. Questi tipi di impulsi sono detti alee statiche. Il loro modo di verificarsi è imprevedibile in quanto dipendente sia dalla temperatura che dalle tolleranze di produzione. La conversione da Gray in Binario puro si effettua nel seguente modo: si inizia dal bit all’estrema sinistra, i bit del numero binario saranno gli stessi del codice Gray fino al primo 1 compreso, per le altre cifre si ha che: se il bit Gray è pari ad 1, la corrispondente cifra binaria si ottiene complementando la precedente, se invece è pari a 0, coincide con la precedente. 0 1 0 1 Gray 0 1 1 0 Binario puro 1 0 1 0 1 1 0 0 1 1 1 Gray 1 1 0 0 1 0 0 0 1 0 1 Binario puro A.C. Neve – L’informazione digitale 28 La conversione da Binario puro in Gray si effettua invece nel seguente modo: a partire dal bit all’estrema sinistra, si confrontano i bit a coppie successive, se tali bit sono uguali, il bit in Gray sarà pari a 0, se invece sono differenti il bit Gray sarà pari ad 1. Il confronto del primo bit avverrà sempre con lo 0. 0 1 1 1 Binario puro 0 1 0 0 Gray 1 1 0 1 0 0 1 Binario puro 1 0 1 1 1 0 1 Gray Cifra decimale 0 1 2 3 4 5 6 7 8 9 Gray BCD 0000 0001 0011 0010 0110 1110 1010 1011 1001 1000 E’ anche possibile realizzare un codice Gray di tipo BCD che consenta la codifica per carattere. Questo codice, oltre a disporre di solo dieci configurazioni, dovrà rispettare le tipiche caratteristiche del vero codice Gray, dovrà pertanto risultare monoprogressivo, ciclico e riflessivo. Un esempio può essere quello proposto nella tabella seguente. Codici alfanumerici I codici fin ora esaminati vengono utilizzati per la gestione di informazioni puramente numeriche. Nella maggior parte delle applicazioni vi è invece la necessità di dover gestire informazioni nel senso più generale del termine e cioè informazione caratterizzata oltre che da simboli numerici, anche da lettere dell’alfabeto maiuscole e minuscole, vari segni di interpunzione e, soprattutto, caratteri per il controllo della comunicazione. Il codice più diffuso per il trattamento dell’informazione alfanumerica è il codice ASCII (American Standard Code for Information Interchange), questo è un codice a 7 bit che consente la rappresentazione di 128 simboli. Nei sistemi di elaborazione digitali, l’informazione è impacchettata in blocchi elementari da 8 bit (byte) per cui l’ottavo bit resta disponibile per l’utilizzo come bit di parità o per l’ampliamento del codice a 256 simboli (ASCII esteso). Un altro codice molto diffuso è il codice EBCDIC (Extended Binary Coded Decimal Interchange Code), questo è un codice ad 8 bit che consente la rappresentazione di 256 simboli. A.C. Neve – L’informazione digitale 29 ACK BEL BS CAN CR DC1 DC2 DC3 DC4 DEL DLE EM ESC ENQ EOT ETB ETX FF FS GS HT LF NAK NUL RS SI SO SOH SP STX SUB SYN US VT Acknowledge Bell Backspace Cancel Carriage return Device control 1 Device control 2 Device control 3 Device control 4 Delete Data link espace End of medium Escape Enquiry End of trasmission End of trasmission block End of text Formed feed File separator Group separator Horizontal tabulation Line feed Negative acknowledge Null Record separator Shift in Shift out Start of heading Space Start of text Substitute Synchronous Unit separator Vertical tabulation 000 0000 NUL 0001 SOH 0010 STX 0011 ETX 0100 EOT 0101 ENQ 0110 ACK 0111 BEL 1000 BS 1001 HT 1010 LF 1011 VT 1100 FF 1101 CR 1110 SO SI 1111 001 010 011 100 101 DLE DC1 DC2 DC3 DC4 NAK SYN ETB CAN EM SUB ESC FS GS RS US SP ! “ # $ % & ‘ ( ) * + , . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ 110 111 a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ DEL Codice ASCII I tre bit delle colonne sono i più significativi (b6b5b4). I quattro bit delle righe sono i meno significativi (b3b2b1b0) I caratteri del codice che iniziano con 00 (cioè quelli delle prime due colonne) sono detti caratteri di controllo e sono di ausilio alle apparecchiature che utilizzano il codice ASCII. Questi caratteri si possono dividere in quattro tipologie: 1) Controllo di trasmissione: questi caratteri servono per definire la struttura del messaggio e sono in parte correlati al gestore del protocollo. 2) Controllo di stampa: questi caratteri servono a posizionare correttamente il testo sul sistema di visualizzazione (ritorno carrello CR, salto linea LF ecc.). 3) Controllo blocco dati: vengono usati per la gestione di grandi quantità di dati organizzati in file o record. 4) Controllo dei dispositivi: sono utilizzati per il controllo e gestione di dispositivi o di loro particolari funzionalità. Struttura del messaggio: 0000001 intestazione 0000010 SOH STX Testo del messaggio 0000011 ETX L’espressione - Oggi 12 marzo 2000 - viene così codificata: O g g i 1 2 m a r z o 2 0 0 0 4F 67 67 6C 20 31 32 20 6D 61 72 7A 6F 20 32 30 30 30 La sequenza di caratteri è stata rappresentata in esadecimale solo per comodità. A.C. Neve – L’informazione digitale 30 Aritmetica BCD 8421 In alcune applicazioni è spesso necessario eseguire delle operazioni aritmetiche tra numeri espressi in codice BCD 8421. E’ opportuno tener presente che, in questo codice, risultano assenti le ultime 6 configurazioni binarie (1010, 1011, 1100, 1101, 1110 e 1111). Effettuando la somma tra numeri BCD, se il risultato ricade in una di queste ultime configurazioni si dovrà apportare, a queste configurazioni, una correzione che consiste nell’aggiungere un valore pari a 6 = 0110 al valore ottenuto e, facendo propagare il riporto nel modo opportuno. 525 + 311 = 836 0101 0010 0101 + 0011 0001 0001 = 1000 0011 0110 che risulta corretto 649 + 853 = 1502 0110 0100 1001 + 1000 0101 0011 = 1110 1001 1100 + 0110 0110 = 0001 0100 1010 0010 + 0110 = 0001 0101 0000 0010 che risulta errato nella prima ed ultima cifra che risulta nuovamente errato nella terza cifra Si consideri ora questo nuovo esempio: 94 + 94 = 188 1001 0100 + 1001 0100 = 0001 0010 1000 + 0110 = 0001 1000 1000 che sembrerebbe essere corretto in quanto composto tutto da parole BCD8421 si nota però che il risultato,128, è certamente errato nella seconda cifra. Anche in questo caso è necessario operare un aggiustamento. Si renderà pertanto necessario l’aggiustamento quando: 1) la somma delle due cifre risulta maggiore di 9 e minore di F 2) vi è un riporto cioè quando la somma delle due cifre è maggiore di F Si fa notare che i due casi si verificano quando vi è il classico riporto decimale. A.C. Neve – L’informazione digitale 31 Considerazioni applicative Il massimo valore esprimibile con 4 cifre BCD 8421 risulta pari a: 1001 1001 1001 1001 = 999910 come si può osservare sono stati utilizzati 16 bit per contare fino a 999910 Si fa notare che, nel sistema di numerazione binario puro, con 16 bit si sarebbe ottenuto il seguente valore: 11111111111111112 = 6553510 Si può così constatare una elevata mancanza di efficienza nell’uso del codice BCD rispetto al classico sistema di numerazione, che però è ampiamente compensata dalla semplificazione ed invariabilità dell’hardware usato per i collegamenti. Convertitori di codice I convertitori di codice sono dei circuiti combinatori che accettano in ingresso una configurazione di bit appartenente ad un certo codice e, forniscono in uscita la corrispondente configurazione espressa in un altro codice. A.C. Neve – L’informazione digitale 32 Codici a controllo d’errore Durante lo scambio di informazioni tra due unità, fenomeni di disturbo, possono determinare il verificarsi di errori nelle stringhe di bit utilizzate per rappresentare l’informazione stessa, è pertanto evidente la necessita di strumenti e tecniche che consentano la rivelazione ed eventualmente anche la correzione di questi errori. Sorgente Codificatore TX RX Mezzo di trasmissione Decodificatore Utente La tecnica più elementare per il controllo degli errori è la parità semplice, questa consiste nell’aggiungere alla parola del codice un bit in modo tale da rendere pari (o dispari ) il numero complessivo di 1 presenti nella configurazione, si definisce così la parità pari ( o parità dispari ). Il trasmettitore ha pertanto il compito di assemblare la stringa unendo al carattere la relativa parità e trasmettere il tutto. Il ricevitore ha invece il compito di prelevare la stringa di bit, esaminare il carattere, determinare il valore della parità e confrontarla con quella ricevuta, se coincidono la trasmissione è stata corretta altrimenti è evidente che si è verificato un errore. Considerato il carattere ASCII corrispondente alla vocale E, si ha che: P 1 0 0 0 1 0 1 essendo presenti nel carattere 3 bit pari ad 1, il valore del bit di parità dovrà essere uguale ad 1 se si usa la parità pari ( altrimenti 0 se si usa la parità dispari). Si supponga ora che al ricevitore pervenga la stringa seguente: 1 1 0 1 0 1 0 1 essendo presenti nei primi sette bit quattro uno ci si aspetta un bit di parità pari uguale a 0, risultando invece il bit di parità uguale ad 1 è evidente la presenza di un errore che non può essere però individuato e corretto. La parità semplice consente quindi il solo rilevamento di errori di molteplicità dispari e non la correzione. Si fa notare che in caso di errore doppio, cioè di molteplicità due, il controllo di parità non rileva errori. Questa tecnica di controllo è valida quando il canale di trasmissione ha un tasso di errore contenuto, nel caso di trasmissione che utilizzi il codice ASCII la probabilità di errore tollerabile è di 1/8 = 0.125. A.C. Neve – L’informazione digitale 33 Un salto di qualità può essere ottenuto facendo uso della parità incrociata, organizzando i caratteri da trasmettere in gruppi di dimensione fissa ordinati secondo una matrice e inserendo la parità sia per righe che per colonne. Nell’esempio seguente si utilizzano otto caratteri del codice BCD 8421. Trasmesso 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 Ricevuto 1 1 0 0 0 0 1 0 1 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 0 1 1 0 0 1 0 1 0 0 1 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 1 0 1 0 1 0 Come si può osservare dalla tabella di trasmissione, verranno trasmessi N+1 caratteri comprensivi della propria parità. Si ipotizzi ora che durante la trasmissione si verifichi un errore relativo all’1 in grassetto, in questo caso si noterà un errore di parità nella quarta riga ed uno nella seconda colonna, l’incrocio della riga e colonna interessati individuano il bit errato che potrà così essere corretto. Questa tecnica consente anche la rilevazione, ma non la correzione, di errori di molteplicità due 1 0 1 1 0 0 0 0 1 1 0 0 0 1 0 0 0 0 0 0 1 1 0 1 1 1 1 0 1 0 0 1 1 0 1 0 In questa figura si può notare un errore doppio, la parità risulta quindi errata sia sulla quarta e quinta riga che sulla seconda e terza colonna, non è quindi possibile effettuare la correzione dell’errore ma solo la sua rilevazione. 0 1 1 0 1 0 0 1 0 Un altro metodo per il controllo degli errori è la codifica Hamming. Questo codice viene implementato aggiungendo, agli n bit di un qualsiasi codice efficiente, K bit di controllo ognuno dei quali verifica la parità di un gruppo degli M = n + K bit complessivi. Il primo passo consiste nel determinare il numero K di bit che dovranno essere aggiunti a quelli del codice. Dovrà risultare che : ⇒ 2K -1 ≥ M = n + K 2K -1 -K ≥ n si noti che con questo valore di K è possibile l’identificazione di tutti gli M bit della nuova parola. Per codici aventi n = 2,3,4 si ottiene K = 3 Per codici aventi n = 5,6,7,8,9,10,11 si ottiene K = 4 Nella stringa binaria complessiva i bit Ki vengono inseriti nelle posizioni 1,2,4 per codici con n fino a 4 mentre vengono inseriti nelle posizioni 1,2,4,8, per codici con n fino a 11. Regola generale: Per rilevare N errori è necessario un codice con distanza di Hamming pari a N+1 Per correggere N errori è necessario un codice con distanza di Hamming pari a 2N+1 A.C. Neve – L’informazione digitale 34 Per codici con n = 4 la stringa di bit risulta la seguente: 7 n3 6 n2 5 4 n1 K3 3 2 n0 K2 1 k1 K1 rappresenta la parità per i bit (1,3,5,7,) K2 rappresenta la parità per i bit (2,3,6,7,) K3 rappresenta la parità per i bit (4,5,6,7,) Per codici con n = 5 ..... 11 la stringa di bit risulta la seguente: 15 n10 14 n9 13 n8 12 n7 11 n6 10 n5 9 8 n4 K4 7 n3 6 n2 5 4 n1 K3 3 2 n0 K2 1 K1 K1 rappresenta la parità per i bit (1,3,5,7,9,11,13,15,) K2 rappresenta la parità per i bit (2,3,6,7,10,11,14,15) K3 rappresenta la parità per i bit (4,5,6,7,12,13,14,15,) K4 rappresenta la parità per i bit (8,9,10,11,12,13,14,15) In fase di ricezione si rigenerano i valori dei bit Ki relativi alla stringa ricevuta. Se tutti i bit Ki risultano nulli, la trasmissione è stata corretta, altrimenti il valore ottenuto dalla stringa dei vari Ki ordinati per indice decrescente, rappresenta in binario l’indice del bit nel quale si è verificato l’errore. Esempio: TX 7 1 6 0 5 0 4 3 1 2 1 K3 = 1 K2 = 0 K1 = 0 Ipotizzando un errore sul bit 6, la stringa ricevuta risulta la seguente: RX 7 1 6 1 5 0 4 1 3 1 2 0 1 0 In questo caso si ottiene: K3 = 1 K2 = 1 K1 = 0 da cui K3,K2,K1 = 1102 = 610 individuando così l’errore sul bit numero 6. A.C. Neve – L’informazione digitale 35 I codici autocorretivi tipo Hamming sono in grado di rilevare un alto tasso di errori solo se i bit errati sono distribuiti in modo casuale lungo tutto il messaggio per cui, il loro uso è limitato ad applicazioni su brevissime distanze come nel caso di scambio dati tra microprocessore e memorie. Nelle trasmissioni su distanze maggiori, i disturbi hanno, generalmente, una durata molto superiore a quella del singolo bit per cui uno di questi disturbi è in grado di distruggere diversi bit contigui, questo fenomeno è detto errore a raffica (burst error). In questi casi i codici autocorrettivi sono del tutto inadeguati. La tecnica più utilizzata in queste situazioni fa uso dei codici polinomiali o ciclici (CRC Cyclic Redundant Check). Questa tecnica consiste nell’aggiungere, in coda ai bit costituenti il messaggio, una serie di bit opportunamente calcolati. Un messaggio M(x) di N bit viene considerato come un polinomio di grado N+1 i cui coefficienti sono i bit del messaggio stesso. Su questo polinomio saranno poi effettuate delle operazioni in aritmetica modulo-2. Sia il trasmettitore che il ricevitore utilizzano uno stesso polinomio G(x) di grado r, il trasmettitore per calcolare ed aggiungere al messaggio i bit di controllo, il ricevitore per verificare la correttezza del messaggio. Nel caso in cui il messaggio risultasse errato, il ricevitore invierà poi una richiesta di ritrasmissione del messaggio stesso. Il polinomio G(x) dovrà sempre avere il termine di grado 0 cioè l’ultimo bit dovrà essere pari ad 1. La tecnica del CRC consiste nell’aggiungere al messaggio M(x), formato da N bit, un messaggio di controllo R(x) formato da r bit (con r < N) in modo da ottenere un nuovo messaggio T(x) formato da N+r bit che risulti divisibile per G(x). I più diffusi polinomi generatore G(x) sono: CRC-16 = x16 + x15 + x2 + 1 = 1 1000 0000 0000 0101 CRC-CCITT = x16 + x12 + x5 + 1 = 1 0001 0000 0010 0001 Questi codici sono in grado di rilevare: - tutti gli errori singoli e doppi tutti gli errori di molteplicità dispari tutti gli errori burst di lunghezza massima 16 il 99,997% degli errori burst di lunghezza 17 il 99,998% degli errori burst di lunghezza 18 Nel campo delle applicazioni dove è richiesta una precisione quasi assoluta (99,99999998%), si usano polinomi generatori a 32 bit del tipo: CRC-32 = x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x1 +1 A.C. Neve – L’informazione digitale 36 L’algoritmo per il calcolo del messaggio composto T(x) è il seguente: 1) Se r è il grado del polinomio G(x), si aggiungono r bit pari a 0 nelle posizioni meno significative di M(x) ottenendo un nuovo polinomio M’(x) di grado N+r. Tutto ciò equivale a moltiplicare M(x) per xr. 2) Si divide il polinomio M’(x) per il polinomio G(x) usando l’aritmetica modulo-2. (Nell’aritmetica modulo-2 l’addizione o sottrazione tra bit omologhi si può interpretare come una operazione di XOR) 3) Il resto R(x) della divisione sarà poi sommato al polinomio M’(x) per ottenere il blocco T(x). Il controllo in ricezione si effettua dividendo il polinomio T(x) ricevuto per il polinomio generatore G(x), se il resto è nullo la trasmissione è stata corretta, in caso contrario vi sono stati degli errori e si dovrà chiedere la ritrasmissione del messaggio. Esempio: Si consideri il messaggio M(x) = 1100101101101 ed il polinomio generatore G(x) = x4 + x1 + 1 = 10011. Determinare il polinomio T(x). M’(x) = 1 1 0 0 1 0 1 1 0 1 1 0 1 0 0 0 0 1 1 0 0 1 0 0 1 - 1 0 1 1 0 0 - - 1 1 - 1 1 0 1 1 0 1 1 - 0 1 1 0 1 1 0 1 0 0 0 0 : 1 0 0 1 1 x x x x x 0 1 1 1 1 0 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 1 0 0 1 1 - - 1 0 0 1 0 1 0 0 1 1 - - - - 1 1 0 0 0 1 0 0 1 1 - 1 0 1 1 0 1 0 0 1 1 - - 1 0 1 R e s t o Dove xxxxx è il quoziente che però non interessa il polinomio T(x) risulterà quindi: T(x) = 1 1 0 0 1 0 1 1 0 1 1 0 1 0 1 0 1 A.C. Neve – L’informazione digitale 37 In fase di ricezione si effettuerà la divisione di T(x) sempre per il polinomio generatore G(x): 1 1 0 0 1 0 0 1 - 1 0 1 1 0 0 - - 1 1 - 1 1 0 1 1 0 1 1 - 0 1 1 0 1 1 0 1 0 1 0 1 : 1 0 0 1 1 x x x x x 0 1 1 1 1 0 1 1 1 0 0 0 0 0 1 1 1 0 1 1 1 1 0 0 1 1 - - 1 0 0 1 0 1 0 0 1 1 - - - - 1 1 0 1 0 1 0 0 1 1 - 1 0 0 1 1 1 0 0 1 1 R e s t o 0 0 0 0 0 Come si può notare, essendo il resto nullo, la trasmissione è corretta. A.C. Neve – L’informazione digitale 38