Sezione 15.5: Ricevitore ottimo Su Capitolo 15: Trasmissione dati in banda base Sezione 15.7: Sincronizzazione dati 

15.6 Gestione degli errori di trasmissione

figure f1.3a.png
La figura a lato, già proposta a pag. 1, ricorda ancora una volta come le conseguenze prodotte dagli errori del decisore siano alcuni bit diversi da quelli trasmessi. Al § 15.4.9.2 siamo giunti al calcolo probabilità di errore Pbite dovuta a rumore additivo, mentre al § 15.2.2.3 è stato illustrato come anche una non perfetta temporizzazione, od una alterazione dell’impulso g(t), possano causare errori di decisione dovuti all’isi. Sempre al primo capitolo è anche mostrata la figura riproposta sotto e che illustra come la Pe, qualunque ne sia la causa, possa essere ridotta adottando tecniche di codifica di canale e controllo di errore, discusse nel seguito.
figure f1.4.png

15.6.1 Controllo di errore

figure f4.19.png
Con questo termine si individuano le strategie atte a proteggere le informazioni da trasmettere, aumentando il numero effettivo dei bit inviati (che passano da fb a fb > fb bit/secondo, vedi figura), in modo che i bit aggiunti siano dipendenti dagli altri, permettendo la gestione degli eventuali errori di trasmissione. Vedremo che la quantità di bit aggiunti, indicata anche come ridondanza (§ 390), può essere appena sufficiente a permettere di accorgersi della presenza di errori di trasmissione, o (se più elevata), può mettere il lato ricevente anche in grado di correggere fino ad una certa percentuale dei bit errati. Sussistono dunque due diverse modalità di gestione degli errori:
Forward error correction o FEC
Qualora il sistema di trasmissione sia da considerare unidirezionale[773]  [773] Oltre al caso banale in cui la comunicazione sia effettivamente half-duplex (nota 16), il canale deve essere considerato unidirezionale anche qualora la trasmissione a distanza riguardi informazioni generate in tempo reale e consumate immediatamente in ricezione, come nel caso televisivo o telefonico, in cui l’attesa di una ritrasmissione introdurrebbe, oltre ad una temporanea interruzione, anche un ritardo aggiuntivo a tutto ciò che viene dopo, impossibile da sostenere in una applicazione interattiva.
Un altro caso di applicazione della tecnica fec riguarda ad es. il caso di informazioni memorizzate in forma numerica su data storage, come as esempio cd/dvd, chip di memoria, hard disk.... in cui pur se possibile ri-leggere le informazioni, ciò non cambierebbe nulla, in quanto l’errore è attribuibile al supporto rovinato, e non al rumore. Per questo i dispositivi di memoria aggiungono una ridondanza ai propri dati, usata per rimediare al possibile deterioramento della loro conservazione, o per segnalare la cella di memoria come inaffidabile.
, e dunque sprovvisto di un canale di ritorno idoneo a chiedere la ritrasmissione dei dati errati, l’unica soluzione consiste nell’aggiunta di una ridondanza sufficiente a correggere direttamente la maggior parte degli eventuali errori. La soluzione prende il nome di correzione di errore in avanti o fec, e si è sviluppata nel contesto della codifica di canale (vedi § 15.6.2), appannaggio del mondo delle telecomunicazioni.
Automatic repeat request o ARQ
Se al contrario è presente un canale di comunicazione a ritroso, e non sussistono rigidi vincoli temporali sul massimo ritardo tra trasmissione e ricezione corretta, allora ci si può accontentare di un minor grado di ridondanza, sufficiente ad accorgersi degli errori, ovvero a rivelarli, ma non a correggerli. Infatti è ora possibile invocare la ritrasmissione del dato errato, dando luogo ad una strategia di richiesta di ripetizione[774]  [774] L’aggettivo automatic si riferisce al fatto che spesso la gestione della ritrasmissione avviene a carico di uno strato protocollare (§ 22.5.2.3) di livello inferiore a quello che effettivamente consuma il messaggio, che in definitiva neanche si avvede della presenza del meccanismo di ritrasmissione. o arq (vedi § 22.6): tale approccio si è sviluppato nel contesto delle reti di computer e della trasmissione dati, ed ha dato origine ai protocolli a finestra (§ 23.1.2.3).
Suddivisione in parole
Le unità informative su cui operano fec e arq in generale non sono singoli bit, ma gruppi di bit denominati parole o word[775]  [775] In generale questo raggruppamento è indipendente da quello in simboli operato dal codificatore di linea multilivello, così come non riflette altre suddivisioni come i bit di un campione quantizzato (§ 4.3) o gli intervalli temporali di una multiplazione (§ 24.2) mediante trame (§ 24.3.1) o pacchetti § 22.5.1., e per questo siamo interessati a valutare come la Pbite calcolata al § 15.4.9.2 influenzi il numero di errori in una parola, dato che da ciò dipende la possibilità di rilevarli e/o correggerli.

15.6.1.1 Errori su parole

Occupiamoci quindi di determinare la probabilità P(i, n) di trovare 0 ≤ i ≤ n bit errati in una parola di n bit, qualora ciascun bit possa essere errato con probabilità p = Pbite e nell’ipotesi che gli eventi di errore siano statisticamente indipendenti (§ 6.1.5), ovvero che il verificarsi o meno di un errore su di un bit non condizioni gli altri.
Per i casi i = 0 (tutti giusti) ed i = n (tutti sbagliati) il risultato è immediato, in quanto risulta P(0, n) = (1 − p)n e P(n, n) = pn. Per 0 < i < n ci troviamo in un classico caso di prove ripetute[776]  [776] Vedi ad es. https://it.wikiversity.org/wiki/Prove_ripetute, in quanto si tratta di osservare l’evento di errore (con probabilità p) su n ripetizioni. La probabilità che ci siano esattamente (ad es. i primi) i bit errati ha valore pi(1 − p)n − i, ma dato che i bit errati possono essere comunque distribuiti su n, e che vi sono ni = n(n − 1)(n − i + 1)i! modi di scegliere i oggetti su n, il risultato cercato è espresso dalla d.d.p. di Bernoulli (vedi § 22.1)
(21.26)
P(i, n) = n(n − 1)(n − i + 1)i! pi (1 − p)n − i
che, se np < 0.1, può essere approssimata come[777]  [777] Dal confronto tra (21.26) e (21.27) osserviamo che l’approssimazione consiste nel considerare (1 − p)n − i ≃ 1. Per verificare che ciò sia lecito qualora np≪1, cerchiamo il valore di p tale che (1 − p)n > 0.9, da cui discende che anche (1 − p)n − i > 0.9 per qualunque i. Dato che si può scrivere (vedi nota 1306 a pag. 22.1) (1 − p)n = nk = 0nkpk > 1 − np, otteniamo la condizione (1 − p)n > 1 − np > 0.9, da cui si ottiene np < 1 − 0.9 = 0.1: ad esempio, se n = 1000 occorre che sia almeno p = 10 − 4. Altrimenti l’approssimazione non è valida, e la (21.28) deve essere verificata; qui sotto mostriamo la d.d.p. di Bernoulli (21.26) per diversi valori di np, evidenziando come qualora np < 0.1 essa risulti monotona decrescente con i.
figure f4.19-bern-a.png
(21.27)
P(i, n) ≈ n(n − 1)(n − i + 1)i! pi
La (21.27) applicata al caso di un singolo errore (i = 1) su n fornisce P(1, n)np[778]  [778]  In linea di principio, dato che la probabilità che solo il primo bit su n sia sbagliato è pari a p(1 − p)n − 1 e che lo stesso risultato si ottiene anche per gli altri n − 1 casi possibili, la probabilità P(1, n) di un solo (generico) bit sbagliato su n è pari a P(1, n) = np(1 − p)n − 1, che si approssima come np qualora si consideri (1 − p)n − 1 ≃ 1 in virtù della condizione np≪1., ovvero la probabilità di un solo bit errato su n è circa pari ad n volte la Pbie nel flusso binario. D’altro canto, per la probabilità di due bit errati su n la (21.27) fornisce P(2, n)12 n(n − 1) p2 e, sempre se np < 0.1, osserviamo che P(2, n)npP(1, n), ovvero inferiore a quella di un solo bit errato. Più in generale, risulta che
(21.28) P(i + 1, n)P(i, n)
e quindi si può considerare la probabilità di ricevere i o più bit errati su n, praticamente uguale a quella di osservare solo i errori. All’aumentare di p e/o di n, l’approssimazione perde validità, e la probabilità P(i, n) può invece aumentare con i, e in tal caso il sistema di trasmissione è praticamente inusabile. E’ questo il motivo per cui non è opportuno che la lunghezza n delle parole[779]  [779] Così come non è opportuno aumentare di troppo la dimensione di un pacchetto dati, anche se in tal modo si riduce l’overhead, vedi § 22.5.1. ecceda il limite np < 0.1 imposto dalla probabilità di errore sul bit p = Pbite offerta dal collegamento.
L’esposizione prosegue introducendo per prime definizioni e soluzioni che realizzano la correzione degli errori, il cui approfondimento è svolto al § 17.4, mentre al § 15.6.3 sono illustrate tre tecniche comunemente utilizzate per la detezione di errore; la descrizione dei protocolli arq è infine rimandata al § 22.6.

15.6.2 Correzione di errore e codifica di canale

Affrontiamo i criteri con cui scegliere i bit di ridondanza allo scopo di realizzare un sistema di tipo fec basato sulle tecniche di codifica di canale, peraltro idonee ad essere utilizzate anche per il caso dei sistemi arq. Descriviamo quindi due semplici metodi di correzione di errore, ossia il codice a ripetizione e l’interleaving.

15.6.2.1 Codice a blocco

La codifica a blocco opera raggruppando k bit consecutivi del messaggio originale, distinti dai precedenti e dai successivi blocchi di k. Per ogni k bit da trasmettere il codificatore produce n = k + q bit in uscita che sono trasmessi al posto dei k di ingresso, da cui dipendono in modo univoco.
Codeword e codebook
figure f4.19b.png
L’operazione di mappatura svolta dal codificatore può essere pensata o realizzata come l’accesso ad una tabella (o memoria) denominata codebook (o cifrario), dove i k bit da codificare rappresentano un indice che individua 2k differenti righe, in cui si trovano scritte le parole di codice (codeword), costituite ognuna da n = k + q bit. Un codice siffatto è detto codice (n, k).
Ridondanza
Esprime la proporzione percentuale tra il numero dei q bit di protezione aggiunti rispetto ai k (di informazione) in ingresso al codificatore, ovvero
ρ = qk ⋅ 100 %
ed è una misura del grado di protezione offerto dal processo di codifica.
Esempio In una trasmissione con ridondanza del 50% per ogni coppia di bit di informazione ne viene inserito uno di protezione.
La presenza di ridondanza fa sì che il numero 2k di codeword esistenti sia inferiore a quello delle 2n possibili configurazioni di n bit, in modo che se un bit di una codeword viene modificato a causa di un errore del decisore, la nuova parola di n bit individua una configurazione che nel codebook non esiste, permettendo così di rivelare e/o correggere l’errore. Ma cosa succede se avviene più di un errore per codeword? Per rispondere, introduciamo un nuovo concetto:
Distanza di Hamming
E’ indicata come dH(ci, cj) e misura la dissimilarità tra due codeword ci, cj, espressa come il numero di posizioni di bit in cui esse sono diverse. Viene calcolata eseguendo l’or esclusivo delle rispettive rappresentazioni binarie, e contando il numero di uni del risultato.
Esempio Con ci = 011010 e cj = 010110 si ottiene il risultato mostrato a lato,
011010 ⊕ 010110 =  ---------------  001100
che evidenzia come le codeword differiscano in due posizioni di bit, e dunque dH(ci, cj) = 2.
Distanza del codice
Individua la minima distanza di Hamming dm tra tutte le possibili coppie di codeword di uno stesso codebook
dm = mini ≠ j dH(ci, cj)
e permette di valutare la capacità di rivelazione e correzione del codebook, in quanto rappresenta il minimo numero di errori necessario a trasformare una codeword in un’altra, almeno nel caso peggiore di due parole a distanza dm.
Rivelazione e correzione di errore
Un codice con distanza dm può
Mentre la prima azione è possibile ogniqualvolta si osservi una codeword cα non presente nel codebook, per intraprendere la seconda occorre operare una decisione relativa a quale sia la codeword realmente trasmessa in base ad un criterio di minima distanza, ovvero scegliendo la codeword più vicina (nel senso della distanza di Hamming) a quella ricevuta:
 = argminci dH(ci, cα)
Esempio Nel caso in cui dm = 3, la presenza di un solo bit errato su n fa sì che la codeword ricevuta differisca da quella trasmessa per un bit, mentre mantiene almeno due bit di differenza rispetto a tutte le altre possibili, permettendo così al ricevitore di correggere l’errore. Se sono invece presenti due errori, la parola ricevuta diviene più vicina ad una codeword diversa da quella trasmessa, ed in tal caso la procedura di correzione sceglierebbe una codeword errata.
E’ quindi un po’ come se attorno ad ogni codeword fosse costruita una sfera contenente tutte le parole di n bit che non sono codeword e che sono distanti dalla codeword al massimo dm − 12 bit: la ricezione di ciascuna di esse comporta la decisione per la codeword al centro della sfera.
Massima distanza minima
Per un generico codice a blocco (n, k) la distanza del codice dm rispetta la diseguaglianza
dm ≤ q + 1
ovvero dm ≤ n − k + 1 dato che n = k + q. Infatti i 2k bit da proteggere sono qualunque, e dunque il contributo di questi k bit alla distanza tra codeword è uno; tale distanza può aumentare al massimo di una ulteriore unità per ognuno dei q bit aggiunti.
Esempio Aggiungendo q = 3 bit di ridondanza si ha dm ≤ q + 1 = 4, e se per una particolare scelta del codebook (ad es. di Hamming, § 17.4.1.1) si ottiene dm = 3, saremo in grado di correggere un errore e rivelarne 2.
Probabilità di errore residua per codeword
Da quanto illustrato fin qui occorre stabilire a priori se utilizzare il codice a fini di correzione oppure di detezione. Indicando con eM il massimo numero di errori che è possibile correggere o rivelare, può essere definita una probabilità residua di errore su parola Pre per descrivere il caso in cui, anche dopo l’esecuzione delle procedure di controllo di errore[780]  [780] Che nel caso di rivelazione richiede la ritrasmissione della parola errata., siano ancora presenti errori, perché in numero superiore ad eM e dunque eccedenti la capacità correttiva del codice. Risulta quindi che Pre = P(i > eM, n) che, nelle condizioni di validità della (21.27), è pari a P(eM + 1, n). In linea generale, la valutazione dell’errore residuo sul bit dipende dal tipo di controllo di errore attuato.
Efficienza
L’efficienza del codice è misurata dal tasso di codifica (code rate)
Rc = kn < 1
che rappresenta la frazione di bit informativi sul totale di quelli trasmessi, e che consente di scrivere la velocità di uscita dal codificatore come
(21.29) fb = fbRc > fb
Esempio In una trasmissione con un tasso di codifica pari a 0.5, il numero di bit uscenti (per unità di tempo) dal codificatore di canale è il doppio del numero dei bit entranti.
L’argomento dei codici a blocco è molto vasto[781]  [781] Senza pretesa di esaustività, possiamo annoverare l’esistenza dei codici di Hamming, di Hadamard, BCH, Reed-Solomon, Reed-Muller, di Golay, di Gallager, turbo, a cancellazione, a fontana, punturati..., e fornisce molteplici soluzioni, la cui trattazione esauriente eccede il livello di approfondimento del presente capitolo (vedi però il § 17.4.1); gli stessi tre casi di controllo di errore trattati al § 15.6.3 (parità, somma di controllo e crc) possono essere inquadrati nel contesto dei codici a blocco. Qui ci limitiamo ad un esempio di codice a correzione molto elementare, il codice a ripetizione, mentre al § 17.4.1.1 è illustrata una tecnica nota come codice di Hamming, in grado di conseguire una efficienza di gran lunga migliore.

15.6.2.2 Codice a ripetizione n:1

Realizza un codice a blocco molto semplice e con proprietà correttive, per il quale k = 1 e le uniche due codeword sono di n bit tutti uguali al bit in ingresso; ponendo ad esempio n = 3 si ottiene il codice a ripetizione 3:1, con codeword 000 ed 111, di cui in
figure f4.19c.png
figura è riportata la disposizione (rappresentate come pallini) in uno spazio vettoriale descritto dai tre bit di codice x1x2x3, ed in cui i cerchi vuoti indicano gli 8-2=6 vettori binari che non sono codeword, scritti in corsivo. Se gli errori sono sufficientemente distanti nel tempo la correzione può basarsi su di una “votazione a maggioranza” (majority voting): sempre nel caso di n = 3 si ottiene dm = 3[782]  [782] Con riferimento alla figura, 3 è il numero di vertici da attraversare, ovvero di errori da subire, per passare da una codeword all’altra., ed il codice è in grado di correggere un errore e rivelarne due[783]  [783] Poniamo di dover trasmettere 0110. La sequenza diventa 000 111 111 000 e quindi, a causa di errori, ricevo 000 101 110 100. Votando a maggioranza, ricostruisco la sequenza corretta 0 1 1 0..
Notiamo come questo codice sia particolarmente poco efficiente, dato che per esso si ottiene un tasso di codifica Rc = kn = 1n; d’altra parte, il codice a ripetizione è uno dei pochi per cui dm = q + 1, e non meno.
Esercizio Calcolare la probabilità di errore residua Pr per un codice a ripetizione 3:1, in presenza di una Pbite = p. Risp. Come discusso il codice può correggere un errore singolo, mentre in presenza di un errore doppio la decisione a maggioranza modifica anche il terzo bit, ed un errore triplo passa inosservato. La (21.27) approssima la probabilità che due o più bit su tre siano errati come[784]  [784] Volendo essere esatti la probabilità di 2 bit errati su 3 è data dalla d.d.p. binomiale (§ 22.1) ed è pari a 3\choose2p2(1 − p) = 3p2(1 − p), a cui va sommata la probabilità di 3 bit errati, pari a p3. Pertanto Pr = 3p2(1 − p) + p3 = 3p2 − 3p3 + p3 = 3p2 − 2p3 ≃ 3p2e, approssimazione legittima se np = 3p≪1. P(2, 3)123 ⋅ 2p2 = 3p2 che è la Pr cercata per codeword. Dato che per il codice a ripetizione ad ogni codeword corrisponde un solo bit del messaggio originario, lo stesso valore di Pr = 3p2 è anche la Pbite residua. Ad esempio, in corrispondenza di una p = 10 − 4 iniziale, dopo decodifica si ottiene una Pbite = 3 ⋅ 10 − 8.
Compromesso banda - potenza
Torniamo su questo argomento (§ 15.4.7) in quanto l’adozione di un codice di canale aumenta di fatto la fb eq. (21.29) e dunque l’occupazione di banda eq. (21.5); non solo, ma a parità di potenza Px ricevuta l’aumento di fb comporta la riduzione di Eb = Pxfb e dunque di EbN0 della stessa frazione, e quindi un peggioramento della Pe di base su cui opera il decodificatore di linea. Evidentemente il miglioramento apportato dalla codifica fec sopperisce anche al peggioramento dovuto all’aumento di banda, che la teoria dell’informazione prevede possa essere ripagato da un minor bisogno di potenza per ottenere le stesse prestazioni.
Esercizio Proseguendo l’esercizio precedente, osserviamo che il codice a ripetizione determina una fb tripla, e dunque un EbN0 ridotto di un terzo, ovvero di circa -4.7 dB inferiore rispetto al caso non codificato. Dalle curve di fig. 15.39 riscontriamo che il miglioramento sulla Pe (da 104 a 3 ⋅ 10 − 8) dovuto al codice corrisponde più o meno allo stesso numero di dB. Per codici più efficienti (con minore aumento di banda come ad esempio il codice di Hamming, vedi § 17.4.1.1) il bilanciamento tra i due effetti conferma il risultato anticipato dal compromesso banda-potenza, qui applicato alla codifica di canale.

15.6.2.3 Interleaving

Le capacità di correzione fino ad ora discusse sono valide purché gli eventi di errore siano statisticamente indipendenti. In realtà gli errori possono presentarsi in maniera non indipendente, e concentrati in un breve intervallo di tempo: questa circostanza è indicata come caso degli errori a pacchetto [785]  [785] In inglese, errori a burst (scoppio). Dovuti a rumori e disturbi di tipo impulsivo, ad esempio a causa di scintille come per motori elettrici o candele di accensione, o fenomeni di fast fading (§ 20.4.4).. In tal caso, si usa ricorrere alla tecnica nota come scrambling[786]  [786] Letteralmente: arrampicamento, ma anche “arruffamento”, vedi scrambled eggs, le uova strapazzate dell’english breakfast. o interleaving[787]  [787] Leave = foglia, sfogliare, rastrellare, ed il termine potrebbe essere tradotto come intercalamento. attuabile a patto di accettare un ritardo di trasmissione. Si tratta infatti di modificare l’ordine dei dati inviati, in modo che gli errori che si manifestano su bit vicini si riflettano in errori su bit... lontani, e quindi appartenenti a codeword differenti, come illustrato in fig. 15.47 in cui i bit sono scritti per righe e letti per colonne. Una analisi più approfondita viene svolta a pag. 1. Ovviamente, occorre prevedere un processo inverso (descrambling o deinterleaving) all’altro capo del collegamento. E’ appena il caso di notare che lo scrambler (similmente al codice di Gray) non altera il numero dei bit trasmessi, e dunque non è una forma di codifica fec.
figure f4.21.png
Figure 15.47 Schema di principio della trasmissione a dati intercalati
La trattazione della codifica di canale di tipo fec prosegue in modo più approfondito al § 17.4, dove sono illustrate le tecniche più avanzate.

15.6.3 Detezione di errore

In questo caso ci si limita a mettere il ricevitore in grado di accorgersi della presenza di errori, senza poterli correggere. Le parole errate possono essere scartate, oppure può esserne richiesta la ritrasmissione.

15.6.3.1 Controllo di parità

Viene comunemente usato nell’ambito della trasmissione asincrona (§ 15.7.1) e sincrona orientata al carattere (pag. 1) per rivelare errori sul bit, e consiste nell’aggiungere alla parola da trasmettere un unico ulteriore bit, in modo che in totale ci sia un numero pari di uni[788]  [788] Ad esempio, alla sequenza 001001 verrà aggiunto uno 0, mentre a 010101 si aggiungerà ancora un 1, perché altrimenti gli uni complessivi sarebbero stati 3, che è dispari., applicando così una regola di parità pari (even). Il caso opposto, ossia l’aggiunta di un bit in modo da rendere dispari il numero di uni, prende nome di parità odd.
In entrambi i casi[789]  [789] Il ricevitore deve comunque essere al corrente del fatto se la parità sia odd o even ! dopo aver raggruppato i bit pervenuti il ricevitore esegue un controllo detto appunto di parità, semplicemente contando[790]  [790] La conta può essere realizzata in forma algoritmica o circuitale, eseguendo la somma modulo due di tutti i bit che compongono la parola (ovvero complementando il risultato, nel caso di parità dispari). La somma modulo due è equivalente all’operazione di or esclusivo, viene a volte indicata con il simbolo , e corrisponde alla regola 0⊕0 = 0, 0⊕1 = 1, 1⊕0 = 1, 1⊕1 = 0. il numero di uni, ed accorgendosi così se nella parola si sia verificato un errore (uno zero divenuto uno o viceversa). In tal caso, il ricevitore invierà all’altro estremo del collegamento una richiesta di ritrasmissione del gruppo di bit errato. Se invece si è verificato un errore che coinvolge due bit della parola, questo passerebbe inosservato, in quanto la parità prescritta verrebbe mantenuta. Infatti, la distanza di Hamming (vedi pag. 1) relativa ad un codebook ottenuto aggiungendo ad ogni possibile parola di k bit il corrispondente di parità, è pari a due[791]  [791] Considerando parole di 3 bit, le codeword (di 4 bit, in cui l’ultimo è una parità pari) risultano: (0000, 0011, 0101, 0110, 1001, 1010, 1100, 1111). E’ facile constatare che ognuna di esse differisce da tutte le altre per almeno due bit..
Esempio: indicando la probabilità di errore sul bit con p (es 10 − 3) ed applicando la (21.27) si ottiene che la probabilità di i = 2 errori su n = 10 bit vale Pworde = 12 n(n − 1) p2 = 4.5 ⋅ 10 − 5, che rappresenta il tasso residuo di errore su parola legato all’uso di un bit di parità: essendo due i bit errati su 10, la Pbite = P{err ⁄ worde}Pworde risulta pari a 210 ⋅ 4.5 ⋅10 − 5 = 0.9 ⋅ 10 − 5, un bel risultato rispetto al 10 − 3 di partenza.
Il concetto di parità può essere esteso calcolando q bit di parità, ognuno a partire da un diverso sottoinsieme dei k bit di ingresso, con sottoinsiemi eventualmente sovrapposti. Un codice del genere prende il nome di codice di Hamming, descritto al § 17.4.1.1.

15.6.3.2 Somma di controllo o checksum

Quando il messaggio è composto da M diverse parole di N bit, la probabilità che almeno una di queste sia errata aumenta in modo circa proporzionale ad M, in base ad un ragionamento del tutto analogo a quello della nota 778.
figure f4.19a.png
Per aumentare le capacità di rivelazione del controllo di parità applicato sulle singole parole (indicato ora come parità di riga, o trasversale), si aggiunge al gruppo di M parole una ulteriore parola (detta somma di controllo o checksum), i cui bit si ottengono applicando il controllo di parità a tutti i bit “omologhi” delle M parole incolonnate, generando così una parità di colonna (o longitudinale), come esemplificato in figura.
A volte, si preferisce calcolare la somma di controllo mediante una operazione di somma modulo uno[792]  [792] La somma modulo uno è l’equivalente binario dell’operazione di somma (decimale) tradizionale, comprese quindi le operazioni di riporto verso le cifre più elevate. Il riporto finale viene poi nuovamente sommato al risultato della somma., direttamente realizzabile in software in modo veloce. In tal caso, il ricevitore calcola una nuova somma di controllo longitudinale, includendo anche la somma di controllo originaria: in assenza di errori, il risultato deve fornire zero.

15.6.3.3 Codice polinomiale e CRC

L’utilizzo di una somma di controllo può produrre risultati scadenti nel caso di una distribuzione temporale dei bit errati particolarmente sfavorevole, mentre la tecnica nota come Cyclic Redundancy Check (o crc)[793]  [793] Tale denominazione indica un’azione di controllo (check) realizzata mediante l’aggiunta di una ridondanza ottenuta applicando un codice ciclico - vedi § 17.4.1.2. garantisce prestazioni più uniformi.
figure f4.19a1.png
Questo metodo consiste nell’aggiungere ad una parola P di k bit che si desidera trasmettere, un gruppo R di q < k ulteriori bit di protezione, calcolati a partire dai primi k, in modo da permettere la detezione di eventuali errori; sotto questo aspetto, il crc rientra nella categoria dei codici a blocco (§ 15.6.2.1).
L’aggettivo polinomiale trae origine dalla associazione tra un numero binario B di n + 1 bit, indicati con bi, i = 0, 1, …n, ed un polinomio[794]  [794] L’insieme di tutti i polinomi di grado minore od uguale ad n costituisce un particolare spazio algebrico, per il quale è possibile dimostrare una serie di proprietà, la cui verifica trascende dallo scopo di questo testo, e che consentono di stabilire le capacità del codice di rivelare gli errori. B(x) a coefficienti binari nella variabile x, di grado n, con espressione
B(x) = bnxn + bn − 1xn − 1 + … + b1x1 + b0
Un codice polinomiale è definito a partire da un polinomio generatore G(x) di grado q, i cui coefficienti binari identificano una parola G = gqgq − 1g1g0 di q + 1 bit.
Indicando ora con P la sequenza dei k bit pi da proteggere, aggiungiamo a destra di questi un gruppo di q bit pari a zero, ottenendo una nuova parola P ⋅ 2q lunga k + q bit, che quindi dividiamo per G (mediante aritmetica modulo due[795]  [795]  Per fissare le idee, consideriamo k = 8 bit a da proteggere, pari a P = 11100110, q = 4 bit di crc, ed un generatore G = 11001.
figure f4.19aa.png
La sequenza P ⋅ 2q risulta pari a 10 0000, e la divisione modulo 2 tra P e G fornisce un quoziente Q = 10110110 (che viene ignorato) ed un resto R pari a 0110. Pertanto, viene trasmessa la sequenza T = P ⋅ 2qR = 11100110 0110 con k + q = 12 bit. La divisione modulo 2 si realizza come mostrato nella figura a lato: considerando i bit più significativi di P ⋅ 2q e G, l’uno nell’uno ci sta una volta, e scriviamo uno come primo bit di Q. Riportiamo ora G sotto P ⋅ 2q, ed anziché sottrarre i bit, ne calcoliamo l’or-esclusivo bit-a-bit, ottenendo 00101, a cui aggiungiamo un uno abbassando il successivo bit (1) di P ⋅ 2q. Stavolta l’uno nello zero ci sta zero volte, e dunque aggiungiamo uno zero a Q, riportiamo cinque zeri (come la lunghezza di G) allineati sotto al resto parziale, eseguiamo l’exor, ed abbassiamo un’altra cifra (1) di P. Il confronto ora è tra il quinto bit da destra del resto parziale (1) ed il bit più significativo (il quinto, 1) di G, ottendo la terza cifra di Q (1). Ripetiamo il procedimento, e quando tutti i bit del divisore sono stati usati, l’ultima operazione fornisce il resto R cercato.
), ottenendo un quoziente Q, ed un resto R con al massimo q bit. Pertanto, possiamo scrivere
P ⋅ 2qG = Q ⊕  RG
Le sequenze Q ed R costituiscono rispettivamente i coefficienti dei polinomi quoziente Q(x) e resto R(x), ottenibili dalla divisione di P(x) ⋅ 2q per G(x). I q bit R del resto sono quindi utilizzati come parola di protezione, in modo da esprimere la sequenza T da trasmettere come T = P ⋅ 2qR di k + q bit, ovvero con i k bit più significativi pari a P ed i q bit in coda pari ad R. Il ricevitore effettua anch’esso una divisione, stavolta tra T e G, che in assenza di errori produce un resto nullo
TG = P ⋅ 2qRG = P ⋅ 2qGRG = Q RGRG = Q
in quanto sommando in aritmetica modulo due un numero per se stesso, si ottiene un risultato nullo. Pertanto, se TG = Q con resto nullo, la parola P è riottenuta semplicemente shiftando T a destra di q posizioni.
Nel caso invece in cui si siano verificati errori, indichiamo con E la sequenza binaria di errore, di lunghezza k + q bit, ognuno dei quali è pari ad uno se in quella posizione si verifica errore, o zero in caso contrario, in modo da rappresentare il segnale ricevuto R come R = TE. Se E ≠ 0 la divisione operata al ricevitore ora fornisce
(21.30) RG = T EG = TGEG = Q EG
e quindi si verifica la presenza di un resto diverso da zero[796]  [796] Dalla (21.30) sembrerebbe che il resto sia E, ma dato che E(x) può avere grado  > q, esso è divisibile per G(x), e dunque il resto non è E - altrimenti, sarebbe possibile correggerlo!! , che indica appunto la presenza di errori, tranne nei casi in cui E risulti perfettamente divisibile per G, evento con bassa probabilità se G è scelto opportunamente. Nel caso in cui q = 1 si ricade nel caso del controllo di parità (§ 15.6.3.1), a cui corrisponde G(x) = x + 1.
Per applicare il metodo, sia il trasmettitore che il ricevitore devono utilizzare lo stesso generatore G(x), per il quale esistono diverse scelte standardizzate[797]  [797] Ecco quattro scelte utilizzate nei sistemi di trasmissione:
crc-12 G(x) = x12 + x11 + x3 + x2 + x + 1
crc-16 G(x) = x16 + x15 + x2 + 1
crc-ccitt G(x) = x16 + x12 + x5 + 1
crc-32 G(x) = x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1
Come discusso, un polinomio di ordine q genera un crc di q bit; pertanto il crc-12, che è usato per caratteri a 6 bit, genera 12 bit di crc, mentre crc-16 e crc-ccitt, utilizzati in America ed in Europa rispettivamente per caratteri ad 8 bit, producono 16 bit di crc. In alcuni standard di trasmissione sincrona punto-punto, è previsto l’uso di crc-32.
. Si può dimostrare che scegliendo G(x) in modo opportuno, il metodo discusso permette di rivelare
Calcolo del CRC
L’aspetto che ha reso popolare questo metodo è la maniera in cui è possibile calcolare i q bit di controllo, che vengono essi stessi indicati come crc. Infatti la divisione binaria illustrata alla nota 795 è realizzabile a livello circuitale in modo relativamente semplice[799]  [799] Vedi ad es. http://en.wikipedia.org/wiki/Computation_of_cyclic_redundancy_checks.
Si tratta di utilizzare un registro a scorrimento controreazionato (vedi figura seguente), in cui i k bit da proteggere sono immessi ad uno ad uno da destra verso sinistra,
figure f4.19ac.png
seguiti da q zeri consecutivi. Per ogni valore immesso, quelli già presenti scorrono a sinistra nel registro, ed il bit che trabocca, oltre a rappresentare una cifra del quoziente, alimenta gli or esclusivi presenti nel registro; questi ultimi sono posti in corrispondenza dei coefficienti di G(x) pari ad uno, tranne che per quello corrispondente ad xq.
Al termine dell’inserimento dei k + q bit di P ⋅ 2q, lo stato del registro a scorrimento costituisce proprio il resto R, da usare come crc. L’esempio in figura rappresenta il caso mostrato alla nota 795, in cui di G(x) = x4 + x3 + 1: con un po’ di pazienza, è possibile verificare che il circuito effettivamente svolge i calcoli prescritti dalla procedura di divisione, e che si ottiene lo stesso risultato.
 Sezione 15.5: Ricevitore ottimo Su Capitolo 15: Trasmissione dati in banda base Sezione 15.7: Sincronizzazione dati