Salta al contenuto
Note per Studenti Codici di Hamming e CRC

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 11 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 jj è la colonna jj di HH (Hej=hjH\mathbf e_j=\mathbf h_j). Quindi HH deve avere colonne non nulle e tutte distinte. Con n−k=hn-k=h righe ci sono al più 2h−12^h-1 colonne non nulle distinte: il codice di Hamming le usa tutte.

Definizione (codice di Hamming). Per ogni h≥2h\ge2 è il codice lineare con HH di tipo h×nh\times n che ha per colonne tutte le 2h−12^h-1 sequenze binarie non nulle di hh bit: n=2h−1n=2^h-1, k=n−h=2h−h−1k=n-h=2^h-h-1.

hh (n,k)(n,k) tasso k/nk/n
2 (3,1)(3,1) (è la ripetizione) 0,333
3 (7,4)(7,4) 0,571
4 (15,11)(15,11) 0,733
5 (31,26)(31,26) 0,839
6 (63,57)(63,57) 0,905

Il tasso tende a 11 al crescere di hh: più la parola è lunga, meno pesa la ridondanza (h=log⁡2(n+1)h=\log_2(n+1) bit di parità). (Le slide del corso citano i codici della famiglia come esistenti per hh dispari, con n=2h−1n=2^h-1 e k=2h−h−1k=2^h-h-1; la costruzione funziona per ogni h≥2h\ge2, come mostra la tabella.)

Teorema (proprietà del codice di Hamming). (1) dmin=3d_{min}=3. (2) Corregge ogni errore singolo. (3) Per qualunque pattern di 22 errori la decodifica a sindrome sbaglia. (4) È un codice perfetto: le regioni di decisione sono tutte le sfere di raggio 11 attorno alle parole e coprono esattamente tutto lo spazio. Dimostrazione. (1) Colonne non nulle: nessuna parola di peso 11; colonne distinte: nessuna parola di peso 22 (la somma di due colonne distinte non è nulla). Tra tre colonne ce ne sono sempre dipendenti: prese due colonne distinte ha,hb\mathbf h_a,\mathbf h_b, la loro somma è un'altra colonna non nulla hc\mathbf h_c (perché le colonne sono tutte le sequenze non nulle), e ha+hb+hc=0\mathbf h_a+\mathbf h_b+\mathbf h_c=\mathbf0. Dunque esiste una parola di peso 33: dmin=3d_{min}=3 (si ricordi che dmind_{min} è il numero minimo di colonne di HH linearmente dipendenti). (2) Un errore singolo in jj ha sindrome hj\mathbf h_j, diversa da ogni altra colonna e non nulla: il coset leader è ej\mathbf e_j. (3) Con due errori in aa e bb la sindrome è ha+hb=hc\mathbf h_a+\mathbf h_b=\mathbf h_c: il decodificatore "corregge" la posizione cc introducendo un terzo errore. (4) Le sfere di raggio 11 hanno ciascuna 1+n1+n elementi e sono 2k2^k: 2k(1+n)=2k⋅2h=2n2^k(1+n)=2^k\cdot2^h=2^n, 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 →). □\square

In termini di rivelazione e correzione: rivela fino a 22 errori oppure ne corregge 11 (dmin=3d_{min}=3).

L'esempio (7,4)(7,4)

Con G=(I4A)G=\binom{I_4}{A}, A=(110110110111)A=\begin{pmatrix}1&1&0&1\\1&0&1&1\\0&1&1&1\end{pmatrix} e H=[A∣I3]H=[A\mid I_3] (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 HH sono 110,101,011,111,100,010,001110,101,011,111,100,010,001, cioè tutte le 77 sequenze non nulle. La sindrome è un indirizzo: dice quale bit invertire. Le 1616 parole hanno pesi 0,3,4,70,3,4,7 con 1,7,7,11,7,7,1 parole: ogni parola ha sette vicine a distanza 33, sette a distanza 44 e una (la complementare) a distanza 77 (l'insieme delle distanze è lo stesso da ogni parola, come in ogni codice lineare).

Esempio (correzione). b=1011\mathbf b=1011, c=Gb=1011010\mathbf c=G\mathbf b=1011010. Il canale inverte il bit 66: c~=1011000\tilde{\mathbf c}=1011000. σ=Hc~\boldsymbol\sigma=H\tilde{\mathbf c}: riga 11 (bit 1,2,4,51,2,4,5): 1+0+1+0=01+0+1+0=0; riga 22 (bit 1,3,4,61,3,4,6): 1+1+1+0=11+1+1+0=1; riga 33 (bit 2,3,4,72,3,4,7): 0+1+1+0=00+1+1+0=0; σ=(0,1,0)\boldsymbol\sigma=(0,1,0), che è la colonna 66 di HH: si inverte il bit 66 e si ottiene c^=c\hat{\mathbf c}=\mathbf c.

Esempio (due errori). Si invertono i bit 11 e 22: c~=0111010\tilde{\mathbf c}=0111010, σ=h1+h2=110+101=011=h3\boldsymbol\sigma=\mathbf h_1+\mathbf h_2=110+101=011=\mathbf h_3: il decodificatore inverte il bit 33 e produce c^=0101010\hat{\mathbf c}=0101010, che è una parola di codice, ma quella sbagliata (ha 33 bit di differenza da c\mathbf c).

Prestazioni su un BSC

Sia P=PbitP=P_{bit} la probabilità d'errore del canale (BSC senza memoria), n=7n=7. Il corso confronta due modi di usare il (7,4)(7,4) (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 33 (7 pattern), peso 44 (7), peso 77 (1): Pundetected=7P3(1−P)4+7P4(1−P)3+P7 ≃ 7P3(1−P)4.P_{undetected}=7P^3(1-P)^4+7P^4(1-P)^3+P^7\ \simeq\ 7P^3(1-P)^4. Una stima più rozza conta tutti i (73)=35\binom73=35 pattern a 33 errori: 35P3(1−P)435P^3(1-P)^4 è una sovrastima di un fattore 55, perché solo 77 pattern su 3535 finiscono su una parola di codice. Esempio. P=0,05P=0{,}05: stima rozza 0,36 %0{,}36\,\%, stima corretta 7P3(1−P)4=0,071 %7P^3(1-P)^4=0{,}071\,\%, valore esatto (con tutti e tre i termini) 0,075 %0{,}075\,\%.

b) Correzione. La decodifica sbaglia quando ci sono almeno 22 errori: P[c^≠c]=1−(1−P)7−7P(1−P)6P[\hat{\mathbf c}\ne\mathbf c]=1-(1-P)^7-7P(1-P)^6, e con la stima del corso (si trascurano ≥3\ge3 errori) ≃(72)P2(1−P)5\simeq\binom72P^2(1-P)^5. Esempio. P=0,05P=0{,}05: esatto 4,44 %4{,}44\,\%, stima 4,06 %4{,}06\,\% (21⋅0,0025⋅0,773821\cdot0{,}0025\cdot0{,}7738). Sul bit di informazione, con dmin=3d_{min}=3 (37\frac{3}{7} dei bit di una parola sbagliata), P[bℓ≠b^ℓ]≃37(72)P2(1−P)5=9P2(1−P)5P[b_\ell\ne\hat b_\ell]\simeq\frac37\binom72P^2(1-P)^5=9P^2(1-P)^5.

Si noti l'enorme differenza: la correzione, per P=5%P=5\%, sbaglia nel 4 %4\,\% dei casi, la rivelazione lascia passare solo lo 0,075 %0{,}075\,\% 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 (2h−1,⋅)(2^h-1,\cdot) si ottiene il codice (2h,2h−h−1)(2^h,2^h-h-1) con dmin=4d_{min}=4: corregge 11 errore e rivela 22 (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 rr 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 (n,k)(n,k) con n=k+rn=k+r e si descrive con i polinomi su Z2\mathbb Z_2.

Una sequenza di bit (an−1,…,a1,a0)(a_{n-1},\dots,a_1,a_0) si identifica con il polinomio a(x)=an−1xn−1+⋯+a1x+a0a(x)=a_{n-1}x^{n-1}+\dots+a_1x+a_0 a coefficienti in Z2\mathbb Z_2; somma e sottrazione sono XOR, il prodotto per xix^i è uno scorrimento di ii posizioni a sinistra. La divisione tra polinomi si fa come la divisione lunga, con sottrazioni = XOR.

Definizione (codice CRC). Si fissa un polinomio generatore g(x)g(x) di grado rr, con termine noto 11 (per esempio g(x)=x4+x+1↔10011g(x)=x^4+x+1\leftrightarrow10011). Dato il messaggio m(x)m(x) di kk bit, si calcola il resto ρ(x)=(m(x) xr) mod g(x)(deg⁡ρ<r)\rho(x)=\big(m(x)\,x^r\big)\ \mathrm{mod}\ g(x)\qquad(\deg\rho<r) e si trasmette la parola c(x)=m(x) xr+ρ(x)c(x)=m(x)\,x^r+\rho(x), cioè il messaggio seguito dagli rr bit del resto (codice sistematico).

Perché funziona: m(x)xrm(x)x^r dà il messaggio seguito da rr zeri; sommando il resto ρ(x)\rho(x) (che occupa proprio quei rr posti) si ottiene un polinomio divisibile per g(x)g(x), perché m(x)xr=q(x)g(x)+ρ(x)m(x)x^r=q(x)g(x)+\rho(x) e in Z2\mathbb Z_2 ρ+ρ=0\rho+\rho=0, quindi c(x)=q(x)g(x)c(x)=q(x)g(x). Le parole di codice sono tutti e soli i multipli di g(x)g(x) di grado <n<n. La verifica è la stessa operazione: il ricevitore divide la parola ricevuta per g(x)g(x); resto nullo ⇒\Rightarrow nessun errore rivelato.

Esempio numerico

Messaggio m=1101011011\mathbf m=1101011011 (k=10k=10) e g=10011g=10011 (x4+x+1x^4+x+1, r=4r=4). Si divide 1101011011 00001101011011\,0000 per 1001110011 (a ogni passo, dove il bit di testa è 11, si fa lo XOR con gg 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 è 11; gli altri si saltano scorrendo). Il resto è ρ=1110\rho=1110, quindi la parola trasmessa è c=1101011011 1110\mathbf c=1101011011\,1110. Verifica del ricevitore: 11010110111110 mod 10011=000011010110111110\ \mathrm{mod}\ 10011=0000 ✓ (nessun errore). Se il canale inverte il terzo bit, c~=11110110111110\tilde{\mathbf c}=11110110111110, il resto è 1110≠01110\ne0: errore rivelato. (I calcoli sono verificati al calcolatore.) La sindrome e(x) mod g(x)\mathbf e(x)\ \mathrm{mod}\ g(x) dipende solo dall'errore, come per ogni codice lineare.

Che errori rivela

Con c~(x)=c(x)+e(x)\tilde c(x)=c(x)+e(x) (e(x)e(x) = polinomio d'errore), il resto è e(x) mod g(x)e(x)\ \mathrm{mod}\ g(x): un errore non è rivelato se e solo se g(x)g(x) divide e(x)e(x). Ne seguono:

  • errore singolo e(x)=xie(x)=x^i: rivelato sempre se g(x)g(x) ha almeno due termini (un monomio non è multiplo di gg);
  • errori doppi e(x)=xi(1+xj)e(x)=x^i(1+x^j): rivelati se gg non divide 1+xj1+x^j per nessun jj minore della lunghezza della parola: succede se gg è un polinomio primitivo di periodo ≥n\ge n (per g=x3+x+1g=x^3+x+1 e n=7n=7 lo è);
  • numero dispari di errori: sempre rivelato se (x+1)(x+1) divide g(x)g(x) (cioè gg ha un numero pari di termini, perché g(1)=0g(1)=0);
  • burst di lunghezza ≤r\le r (cioè e(x)=xi b(x)e(x)=x^i\,b(x) con deg⁡b<r\deg b<r e b(0)=1b(0)=1): sempre rivelati, perché deg⁡b<deg⁡g\deg b<\deg g e quindi g∤bg\nmid b;
  • un burst di lunghezza esattamente r+1r+1 sfugge con probabilità 2−(r−1)2^{-(r-1)} (solo se b(x)=g(x)b(x)=g(x)), e un burst più lungo sfugge con probabilità 2−r2^{-r}.

Verifica numerica con g=10011g=10011 (r=4r=4), parole di 1414 bit: tutti i burst di lunghezza 11–44 sono rivelati (00 su 1414, 1313, 2424, 4444 casi non rivelati); dei 8080 burst di lunghezza 55 ne sfuggono 10=80/810=80/8; dei 144144 di lunghezza 66, 9=144/169=144/16.

Esempi pratici. CRC-16 (CCITT) g=x16+x12+x5+1g=x^{16}+x^{12}+x^5+1 e CRC-32 (Ethernet, Wi-Fi) gg di grado 3232: con r=32r=32 la probabilità che un errore lungo sfugga è circa 2−32≃2,3⋅10−102^{-32}\simeq2{,}3\cdot10^{-10}. Il calcolo in hardware si fa con un registro a scorrimento di rr celle e qualche XOR.

Legame con Hamming

Il codice di Hamming (7,4)(7,4) è anche ciclico: le sue parole sono i multipli di g(x)=x3+x+1 (1011)g(x)=x^3+x+1\ (1011) di grado <7<7, e ogni scorrimento ciclico di una parola è ancora una parola. Con la codifica sistematica del CRC le 1616 parole sono 0000000, 0001011, 0010110,…,11111110000000,\,0001011,\,0010110,\dots,1111111, hanno peso minimo 33 e sono un codice equivalente a quello della matrice GG delle note precedenti (stesse proprietà, bit di parità disposti in altro ordine). Quindi il CRC con g=x3+x+1g=x^3+x+1 è un Hamming (7,4)(7,4) se il messaggio è lungo 44 bit. Se la parola è più lunga di 77 bit, invece, il polinomio x7+1x^7+1 è multiplo di gg (si fattorizza come (x+1)(x3+x+1)(x3+x2+1)(x+1)(x^3+x+1)(x^3+x^2+1)): l'errore doppio e(x)=1+x7e(x)=1+x^7 non viene più rivelato e dmind_{min} scende a 22. 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 (77 casi a peso 33), non uno qualsiasi di (73)=35\binom73=35.
  • Nel CRC: lo scorrimento m(x)xrm(x)x^r 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 h≥2h\ge2 è il codice con HH di tipo h×nh\times n che ha per colonne tutte le 2h−12^h-1 sequenze binarie non nulle di hh bit: n=2h−1,k=n−h=2h−h−1.n=2^h-1,\qquad k=n-h=2^h-h-1. Esempi: h=3h=3 dà il (7,4)(7,4), h=4h=4 dà il (15,11)(15,11), h=5h=5 dà il (31,26)(31,26); il tasso k/nk/n tende a 11 al crescere di hh.

Idea della correzione: la sindrome σ=Hc~\boldsymbol\sigma=H\tilde{\mathbf c} di un errore singolo sulla posizione jj è la colonna hj\mathbf h_j di HH. Se σ=hj\boldsymbol\sigma=\mathbf h_j si inverte il bit jj. Le colonne devono essere non nulle e tutte distinte.

Proprietà del codice 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 → per il limite di Hamming):

  • dmin=3d_{min}=3: rivela fino a 22 errori oppure corregge 11 errore.
  • Con 22 errori la decodifica a sindrome sbaglia sempre: la sindrome è ha+hb=hc\mathbf h_a+\mathbf h_b=\mathbf h_c, che viene "corretta" introducendo un terzo errore.
  • È un codice perfetto: 2k(1+n)=2n2^k(1+n)=2^n.
  • Codice esteso (2h, 2h−h−1)(2^h,\,2^h-h-1), con un bit di parità in più: dmin=4d_{min}=4, corregge 11 errore e rivela 22 (usato nelle memorie ECC).

Esempio (7,4)(7,4), correzione. b=1011\mathbf b=1011, c=Gb=1011010\mathbf c=G\mathbf b=1011010. Il canale inverte il bit 66: c~=1011000\tilde{\mathbf c}=1011000. La sindrome è σ=(0,1,0)=h6\boldsymbol\sigma=(0,1,0)=\mathbf h_6: si inverte il bit 66 e si ottiene c^=c\hat{\mathbf c}=\mathbf c.

Esempio (7,4)(7,4), due errori. Si invertono i bit 11 e 22: c~=0111010\tilde{\mathbf c}=0111010, σ=h1+h2=h3\boldsymbol\sigma=\mathbf h_1+\mathbf h_2=\mathbf h_3. Il decodificatore inverte il bit 33 e produce 01010100101010: una parola di codice, ma quella sbagliata.

Prestazioni su un BSC di probabilità PP (il corso confronta i due usi del (7,4)(7,4) in Esercizio - Test del DNA con 4, 5 e 7 provette):

CRC (Cyclic Redundancy Check), codice lineare sistematico usato per sola rivelazione. Il messaggio m(x)m(x) di kk bit e il polinomio generatore g(x)g(x) di grado rr (con termine noto 11): ρ(x)=(m(x) xr) mod g(x),c(x)=m(x) xr+ρ(x).\rho(x)=\big(m(x)\,x^r\big)\bmod g(x),\qquad c(x)=m(x)\,x^r+\rho(x).

  • Le parole di codice sono tutti e soli i multipli di g(x)g(x) di grado <n<n. La verifica è la divisione per g(x)g(x): resto nullo significa nessun errore rivelato.
  • Un errore e(x)e(x) non è rivelato se e solo se g(x)g(x) divide e(x)e(x). Ogni burst di lunghezza ≤r\le r è rivelato; un burst di lunghezza r+1r+1 sfugge con probabilità 2−(r−1)2^{-(r-1)}, uno più lungo con probabilità 2−r2^{-r}.
  • Esempio pratico: CRC-32 (Ethernet, Wi-Fi), con r=32r=32, lascia passare un errore lungo circa 2−32≃2,3⋅10−102^{-32}\simeq2{,}3\cdot10^{-10}.

Esempio numerico CRC. m=1101011011\mathbf m=1101011011 (k=10k=10), g=10011g=10011 (x4+x+1x^4+x+1, r=4r=4). Si divide 1101011011 00001101011011\,0000 per 1001110011 con XOR a ogni passo in cui il bit di testa è 11: il resto è ρ=1110\rho=1110, quindi c=1101011011 1110\mathbf c=1101011011\,1110. Il ricevitore divide 1101011011111011010110111110 per 1001110011 e ottiene 00000000. Se il terzo bit viene invertito il resto è 1110≠01110\ne0: errore rivelato.

Legame con Hamming. Il (7,4)(7,4) è ciclico con g(x)=x3+x+1g(x)=x^3+x+1 (1011): usato come CRC su messaggi di 44 bit dà un codice equivalente all'Hamming. Per parole più lunghe di 77 bit, x7+1x^7+1 è multiplo di gg e l'errore doppio 1+x71+x^7 non è più rivelato: servono polinomi di grado alto.

Errori tipici:

  • Dire che l'Hamming "corregge 2 errori": con due errori sbaglia sempre.
  • Contare (73)=35\binom73=35 pattern non rivelati nel (7,4)(7,4) come rivelatore: sono solo 77 pattern a peso 33, 77 a peso 44 e 11 a peso 77.
  • Nel CRC, fare lo scorrimento m(x)xrm(x)x^r prima della divisione; sottrazioni = XOR, senza riporti.
  • Credere che il CRC corregga: serve solo a rivelare.

Esercizi su questo argomento

Lezioni in cui compare

Teoria collegata