Codici di Hamming e CRC
In questa pagina 4
Questa nota mette in pratica la teoria dei codici lineari (Codici a blocco lineari e sindromeUn codice a blocco è lineare se la somma (XOR) di due parole di codice è una parola di codice: allora le parole formano un sottospazio di $\mathbb Z_2^n$. Si descrive con la matrice generatrice $G$ ($n\times k$, $\mathbf c=G\mathbf b$; in forma sistematica $G=\binom{I_k}{A}$) e con la matrice di controllo $H$ ($(n-k)\times n$, $H\mathbf c=\mathbf 0$ se e solo se $\mathbf c\in\mathcal C$; per $G$ sistematica $H=[A\mid I_{n-k}]$). La distanza minima è il peso minimo delle parole non nulle e vale $d_{min}\le n-k+1$ (Singleton). La sindrome $\boldsymbol\sigma=H\tilde{\mathbf c}$ dipende solo dall'errore; la decodifica a distanza minima è $\hat{\mathbf c}=\tilde{\mathbf c}-\varepsilon(\boldsymbol\sigma)$, dove $\varepsilon(\boldsymbol\sigma)$ è il coset leader (vettore di peso minimo con quella sindrome).Codici a blocco lineari e sindrome →) su due codici di uso reale: il codice di Hamming, il più semplice codice correttore, e il CRC (Cyclic Redundancy Check), il codice rivelatore che chiude quasi ogni pacchetto del livello di collegamento (Ethernet, Wi-Fi, ...) e che permette l'ARQ (Tecniche ARQ e loro prestazioniARQ (Automatic Repeat reQuest) rende affidabile un collegamento che sbaglia: il ricevitore risponde a ogni pacchetto con ACK (corretto) o NACK (errato), e il trasmettitore ritrasmette. Con probabilità di pacchetto errato $p$, $t_{RTT}=t_P+t_A+2\tau_P$ e coda sempre piena, il throughput massimo (frazione di tempo d'aria) è: Stop-and-Wait $S=\frac{t_P(1-p)}{t_{RTT}}$; Go-Back-N con $N=t_{RTT}/t_P$ $S=\frac{1-p}{(N-1)p+1}$; Selective Repeat $S=1-p$. Il ritardo medio è $m_{delay}=t_P+\tau_P+\frac p{1-p}t_{RTT}$ (a coda vuota). Sono solo valori massimi: la coda ARQ è stabile solo se $\lambda$ è minore della velocità di servizio, $\lambda<1/m_y$; altrimenti il throughput è $\min(\lambda,\mu)$. L'efficienza (payload) è $\eta=S,L_D/L$.Tecniche ARQ e loro prestazioni →).
Vedi anche Codici a blocco lineari - matrice generatrice, controllo di parità, sindrome e codici di HammingUn codice a blocco è lineare se la somma (bit a bit, modulo 2) di due parole di codice è una parola di codice. Si descrive con la matrice generatrice $G$ ($k\times n$, $\mathbf c=\mathbf mG$) e con la matrice di controllo di parità $H$ ($(n-k)\times n$, $G H^T=0$); in forma sistematica $G=[I_k\mid P]$ e $H=[P^T\mid I_{n-k}]$. La distanza minima è il peso minimo delle parole non nulle. La sindrome $\mathbf s=\mathbf rH^T$ dipende solo dall'errore: se è nulla la parola è valida, altrimenti identifica l'errore (un solo errore ha per sindrome la colonna di $H$ corrispondente). I codici di Hamming $(2^m-1,,2^m-1-m)$ hanno $d_{min}=3$.Codici a blocco lineari - matrice generatrice, controllo di parità, sindrome e codici di Hamming → e, per il CRC nel livello di collegamento, Livello di collegamento e framingIl livello di collegamento (DLL) consegna un frame da un nodo a un nodo adiacente su un collegamento. Servizi: framing, accesso al mezzo (MAC) con indirizzi MAC a 48 bit, controllo di flusso, rilevazione e correzione degli errori. Si divide in DLC (framing, controllo di errore e di flusso) e MAC (accesso al mezzo condiviso). Il framing delimita i frame con un flag: nei protocolli a byte (flag di 8 bit, ESC) si usa il byte stuffing, in quelli a bit (flag 01111110) il bit stuffing, che inserisce uno 0 dopo ogni cinque 1 consecutivi.Livello di collegamento e framing →.
Il codice di Hamming
Idea. Per correggere errore con la decodifica a sindrome basta che ogni errore singolo abbia una sindrome diversa e non nulla: la sindrome di un errore sulla posizione è la colonna di (). Quindi deve avere colonne non nulle e tutte distinte. Con righe ci sono al più colonne non nulle distinte: il codice di Hamming le usa tutte.
Definizione (codice di Hamming). Per ogni è il codice lineare con di tipo che ha per colonne tutte le sequenze binarie non nulle di bit: , .
| tasso | ||
|---|---|---|
| 2 | (è la ripetizione) | 0,333 |
| 3 | 0,571 | |
| 4 | 0,733 | |
| 5 | 0,839 | |
| 6 | 0,905 |
Il tasso tende a al crescere di : più la parola è lunga, meno pesa la ridondanza ( bit di parità). (Le slide del corso citano i codici della famiglia come esistenti per dispari, con e ; la costruzione funziona per ogni , come mostra la tabella.)
Teorema (proprietà del codice di Hamming). (1) . (2) Corregge ogni errore singolo. (3) Per qualunque pattern di errori la decodifica a sindrome sbaglia. (4) È un codice perfetto: le regioni di decisione sono tutte le sfere di raggio attorno alle parole e coprono esattamente tutto lo spazio. Dimostrazione. (1) Colonne non nulle: nessuna parola di peso ; colonne distinte: nessuna parola di peso (la somma di due colonne distinte non è nulla). Tra tre colonne ce ne sono sempre dipendenti: prese due colonne distinte , la loro somma è un'altra colonna non nulla (perché le colonne sono tutte le sequenze non nulle), e . Dunque esiste una parola di peso : (si ricordi che è il numero minimo di colonne di linearmente dipendenti). (2) Un errore singolo in ha sindrome , diversa da ogni altra colonna e non nulla: il coset leader è . (3) Con due errori in e la sindrome è : il decodificatore "corregge" la posizione introducendo un terzo errore. (4) Le sfere di raggio hanno ciascuna elementi e sono : , uguaglianza nel limite di Hamming (Codici a blocco - distanza minima, rivelazione e correzioneLa codifica di canale aggiunge ridondanza in modo mirato: $k$ bit di informazione diventano una parola di codice di $n>k$ bit scelta tra $2^k$ parole ammesse. Se la parola ricevuta non è una parola di codice l'errore è rivelato (e si può chiedere la ritrasmissione, ARQ) oppure corretto (FEC). La qualità dipende dalla distanza minima di Hamming $d_{min}$: si rivelano fino a $d_{min}-1$ errori e se ne correggono $t<d_{min}/2$, ma non contemporaneamente. Per un BSC con $P_{bit}<1/2$ la decisione ottima ML coincide con quella a distanza minima. Limite di Hamming: $k/n\le1-\frac1n\log_2\sum_{r=0}^t\binom nr$.Codici a blocco - distanza minima, rivelazione e correzione →).
In termini di rivelazione e correzione: rivela fino a errori oppure ne corregge ().
L'esempio
Con , e (Codici a blocco lineari e sindromeUn codice a blocco è lineare se la somma (XOR) di due parole di codice è una parola di codice: allora le parole formano un sottospazio di $\mathbb Z_2^n$. Si descrive con la matrice generatrice $G$ ($n\times k$, $\mathbf c=G\mathbf b$; in forma sistematica $G=\binom{I_k}{A}$) e con la matrice di controllo $H$ ($(n-k)\times n$, $H\mathbf c=\mathbf 0$ se e solo se $\mathbf c\in\mathcal C$; per $G$ sistematica $H=[A\mid I_{n-k}]$). La distanza minima è il peso minimo delle parole non nulle e vale $d_{min}\le n-k+1$ (Singleton). La sindrome $\boldsymbol\sigma=H\tilde{\mathbf c}$ dipende solo dall'errore; la decodifica a distanza minima è $\hat{\mathbf c}=\tilde{\mathbf c}-\varepsilon(\boldsymbol\sigma)$, dove $\varepsilon(\boldsymbol\sigma)$ è il coset leader (vettore di peso minimo con quella sindrome).Codici a blocco lineari e sindrome →): le colonne di sono , cioè tutte le sequenze non nulle. La sindrome è un indirizzo: dice quale bit invertire. Le parole hanno pesi con parole: ogni parola ha sette vicine a distanza , sette a distanza e una (la complementare) a distanza (l'insieme delle distanze è lo stesso da ogni parola, come in ogni codice lineare).
Esempio (correzione). , . Il canale inverte il bit : . : riga (bit ): ; riga (bit ): ; riga (bit ): ; , che è la colonna di : si inverte il bit e si ottiene .
Esempio (due errori). Si invertono i bit e : , : il decodificatore inverte il bit e produce , che è una parola di codice, ma quella sbagliata (ha bit di differenza da ).
Prestazioni su un BSC
Sia la probabilità d'errore del canale (BSC senza memoria), . Il corso confronta due modi di usare il (Esercizio - Test del DNA con 4, 5 e 7 provette):
a) Rivelazione. Si sbaglia (errore non rivelato) solo se il pattern d'errore è esso stesso una parola di codice non nulla: peso (7 pattern), peso (7), peso (1): Una stima più rozza conta tutti i pattern a errori: è una sovrastima di un fattore , perché solo pattern su finiscono su una parola di codice. Esempio. : stima rozza , stima corretta , valore esatto (con tutti e tre i termini) .
b) Correzione. La decodifica sbaglia quando ci sono almeno errori: , e con la stima del corso (si trascurano errori) . Esempio. : esatto , stima (). Sul bit di informazione, con ( dei bit di una parola sbagliata), .
Si noti l'enorme differenza: la correzione, per , sbaglia nel dei casi, la rivelazione lascia passare solo lo degli errori. Rivelare è molto più sicuro che correggere, con la stessa ridondanza; il prezzo è dover chiedere la ritrasmissione (ARQ). Per questo i sistemi reali ricorrono all'Hybrid ARQ.
Il codice esteso. Aggiungendo un bit di parità complessiva a un Hamming si ottiene il codice con : corregge errore e rivela (usato nelle memorie ECC).
Il CRC
Dalla parità al polinomio
Un singolo bit di parità non basta: rivela solo un numero dispari di errori. Il CRC (Cyclic Redundancy Check) aggiunge bit di controllo che dipendono da tutto il messaggio in modo che quasi ogni tipo di errore, in particolare quelli a burst (più bit consecutivi sbagliati, tipici dei canali reali), venga rivelato. È un codice lineare con e si descrive con i polinomi su .
Una sequenza di bit si identifica con il polinomio a coefficienti in ; somma e sottrazione sono XOR, il prodotto per è uno scorrimento di posizioni a sinistra. La divisione tra polinomi si fa come la divisione lunga, con sottrazioni = XOR.
Definizione (codice CRC). Si fissa un polinomio generatore di grado , con termine noto (per esempio ). Dato il messaggio di bit, si calcola il resto e si trasmette la parola , cioè il messaggio seguito dagli bit del resto (codice sistematico).
Perché funziona: dà il messaggio seguito da zeri; sommando il resto (che occupa proprio quei posti) si ottiene un polinomio divisibile per , perché e in , quindi . Le parole di codice sono tutti e soli i multipli di di grado . La verifica è la stessa operazione: il ricevitore divide la parola ricevuta per ; resto nullo nessun errore rivelato.
Esempio numerico
Messaggio () e (, ). Si divide per (a ogni passo, dove il bit di testa è , si fa lo XOR con e si prosegue):
11010110110000
11010 xor 10011 = 01001
10011 xor 10011 = 00000
10110 xor 10011 = 00101
10100 xor 10011 = 00111
resto = 1110(i passi sono quelli in cui il bit di testa è ; gli altri si saltano scorrendo). Il resto è , quindi la parola trasmessa è . Verifica del ricevitore: ✓ (nessun errore). Se il canale inverte il terzo bit, , il resto è : errore rivelato. (I calcoli sono verificati al calcolatore.) La sindrome dipende solo dall'errore, come per ogni codice lineare.
Che errori rivela
Con ( = polinomio d'errore), il resto è : un errore non è rivelato se e solo se divide . Ne seguono:
- errore singolo : rivelato sempre se ha almeno due termini (un monomio non è multiplo di );
- errori doppi : rivelati se non divide per nessun minore della lunghezza della parola: succede se è un polinomio primitivo di periodo (per e lo è);
- numero dispari di errori: sempre rivelato se divide (cioè ha un numero pari di termini, perché );
- burst di lunghezza (cioè con e ): sempre rivelati, perché e quindi ;
- un burst di lunghezza esattamente sfugge con probabilità (solo se ), e un burst più lungo sfugge con probabilità .
Verifica numerica con (), parole di bit: tutti i burst di lunghezza – sono rivelati ( su , , , casi non rivelati); dei burst di lunghezza ne sfuggono ; dei di lunghezza , .
Esempi pratici. CRC-16 (CCITT) e CRC-32 (Ethernet, Wi-Fi) di grado : con la probabilità che un errore lungo sfugga è circa . Il calcolo in hardware si fa con un registro a scorrimento di celle e qualche XOR.
Legame con Hamming
Il codice di Hamming è anche ciclico: le sue parole sono i multipli di di grado , e ogni scorrimento ciclico di una parola è ancora una parola. Con la codifica sistematica del CRC le parole sono , hanno peso minimo e sono un codice equivalente a quello della matrice delle note precedenti (stesse proprietà, bit di parità disposti in altro ordine). Quindi il CRC con è un Hamming se il messaggio è lungo bit. Se la parola è più lunga di bit, invece, il polinomio è multiplo di (si fattorizza come ): l'errore doppio non viene più rivelato e scende a . Per messaggi lunghi servono quindi polinomi di grado alto, il cui "periodo" supera la lunghezza della parola.
Errori comuni
- Dire che l'Hamming "corregge 2 errori": con due errori sbaglia sempre, non soltanto a volte.
- Dimenticare che l'errore non rivelato dell'Hamming usato come rivelatore richiede un pattern uguale a una parola di codice ( casi a peso ), non uno qualsiasi di .
- Nel CRC: lo scorrimento va fatto prima della divisione; sottrazioni = XOR, senza riporti.
- Credere che il CRC corregga: serve solo a rivelare (il bit di parità e il CRC hanno la stessa funzione; il CRC è molto più forte).
Versione ripasso
Codice di Hamming (ripasso di Codici a blocco lineari e sindromeUn codice a blocco è lineare se la somma (XOR) di due parole di codice è una parola di codice: allora le parole formano un sottospazio di $\mathbb Z_2^n$. Si descrive con la matrice generatrice $G$ ($n\times k$, $\mathbf c=G\mathbf b$; in forma sistematica $G=\binom{I_k}{A}$) e con la matrice di controllo $H$ ($(n-k)\times n$, $H\mathbf c=\mathbf 0$ se e solo se $\mathbf c\in\mathcal C$; per $G$ sistematica $H=[A\mid I_{n-k}]$). La distanza minima è il peso minimo delle parole non nulle e vale $d_{min}\le n-k+1$ (Singleton). La sindrome $\boldsymbol\sigma=H\tilde{\mathbf c}$ dipende solo dall'errore; la decodifica a distanza minima è $\hat{\mathbf c}=\tilde{\mathbf c}-\varepsilon(\boldsymbol\sigma)$, dove $\varepsilon(\boldsymbol\sigma)$ è il coset leader (vettore di peso minimo con quella sindrome).Codici a blocco lineari e sindrome →): per è il codice con di tipo che ha per colonne tutte le sequenze binarie non nulle di bit: Esempi: dà il , dà il , dà il ; il tasso tende a al crescere di .
Idea della correzione: la sindrome di un errore singolo sulla posizione è la colonna di . Se si inverte il bit . Le colonne devono essere non nulle e tutte distinte.
- : rivela fino a errori oppure corregge errore.
- Con errori la decodifica a sindrome sbaglia sempre: la sindrome è , che viene "corretta" introducendo un terzo errore.
- È un codice perfetto: .
- Codice esteso , con un bit di parità in più: , corregge errore e rivela (usato nelle memorie ECC).
Esempio , correzione. , . Il canale inverte il bit : . La sindrome è : si inverte il bit e si ottiene .
Esempio , due errori. Si invertono i bit e : , . Il decodificatore inverte il bit e produce : una parola di codice, ma quella sbagliata.
Prestazioni su un BSC di probabilità (il corso confronta i due usi del in Esercizio - Test del DNA con 4, 5 e 7 provette):
- Rivelazione: l'errore non è rivelato solo se il pattern d'errore è una parola di codice non nulla: Esempio, : esatto, con la stima.
- Correzione: la decodifica sbaglia con almeno errori: . Esempio, : esatto, con la stima. Sul bit di informazione, con : .
- Con la stessa ridondanza, rivelare è molto più sicuro che correggere (per , contro ); il prezzo è la ritrasmissione (Tecniche ARQ e loro prestazioniARQ (Automatic Repeat reQuest) rende affidabile un collegamento che sbaglia: il ricevitore risponde a ogni pacchetto con ACK (corretto) o NACK (errato), e il trasmettitore ritrasmette. Con probabilità di pacchetto errato $p$, $t_{RTT}=t_P+t_A+2\tau_P$ e coda sempre piena, il throughput massimo (frazione di tempo d'aria) è: Stop-and-Wait $S=\frac{t_P(1-p)}{t_{RTT}}$; Go-Back-N con $N=t_{RTT}/t_P$ $S=\frac{1-p}{(N-1)p+1}$; Selective Repeat $S=1-p$. Il ritardo medio è $m_{delay}=t_P+\tau_P+\frac p{1-p}t_{RTT}$ (a coda vuota). Sono solo valori massimi: la coda ARQ è stabile solo se $\lambda$ è minore della velocità di servizio, $\lambda<1/m_y$; altrimenti il throughput è $\min(\lambda,\mu)$. L'efficienza (payload) è $\eta=S,L_D/L$.Tecniche ARQ e loro prestazioni →).
CRC (Cyclic Redundancy Check), codice lineare sistematico usato per sola rivelazione. Il messaggio di bit e il polinomio generatore di grado (con termine noto ):
- Le parole di codice sono tutti e soli i multipli di di grado . La verifica è la divisione per : resto nullo significa nessun errore rivelato.
- Un errore non è rivelato se e solo se divide . Ogni burst di lunghezza è rivelato; un burst di lunghezza sfugge con probabilità , uno più lungo con probabilità .
- Esempio pratico: CRC-32 (Ethernet, Wi-Fi), con , lascia passare un errore lungo circa .
Esempio numerico CRC. (), (, ). Si divide per con XOR a ogni passo in cui il bit di testa è : il resto è , quindi . Il ricevitore divide per e ottiene . Se il terzo bit viene invertito il resto è : errore rivelato.
Legame con Hamming. Il è ciclico con (1011): usato come CRC su messaggi di bit dà un codice equivalente all'Hamming. Per parole più lunghe di bit, è multiplo di e l'errore doppio non è più rivelato: servono polinomi di grado alto.
Errori tipici:
- Dire che l'Hamming "corregge 2 errori": con due errori sbaglia sempre.
- Contare pattern non rivelati nel come rivelatore: sono solo pattern a peso , a peso e a peso .
- Nel CRC, fare lo scorrimento prima della divisione; sottrazioni = XOR, senza riporti.
- Credere che il CRC corregga: serve solo a rivelare.