Salta al contenuto
Note per Studenti Codici a blocco lineari - matrice generatrice, controllo di parità, sindrome e codici di Hamming

Codici a blocco lineari - matrice generatrice, controllo di parità, sindrome e codici di Hamming

In questa pagina 6

I codici a blocco (Codifica di canale - codici a blocco, distanza minima, rivelazione e correzioneLa codifica di canale aggiunge ridondanza ai bit per rivelare o correggere gli errori del canale. Un codice a blocco $(n,k)$ trasforma $k$ bit in $n$ bit (rendimento $R_c=\frac kn$). Con la distanza di Hamming minima $d_{min}$ il codice rivela fino a $d_{min}-1$ errori e ne corregge $t=\left\lfloor\frac{d_{min}-1}2\right\rfloor$ (decodifica a minima distanza). Vale il limite di Singleton $d_{min}\le n-k+1$. Su un canale binario simmetrico con errore $p$, la probabilità di parola sbagliata è $P_w\le\sum_{i>t}\binom nip^i(1-p)^{n-i}$ e, con $p$ piccola, $P_{bit}\approx\frac{d_{min}}n\binom n{t+1}p^{t+1}$.Codifica di canale - codici a blocco, distanza minima, rivelazione e correzione →) si possono descrivere con una tabella di 2k2^k parole, che diventa impraticabile se kk è grande. I codici linearicodici in cui la somma di due parole è ancora una parola: formano uno spazio vettoriale sul campo binario si descrivono con poche righe e si decodificano con un calcolo semplice.

Definizione e distanza minima

Si lavora nel campo binarioi due valori 00 e 11 con somma e prodotto modulo 22: somma e prodotto modulo 22 (1+1=01+1=0). Un codice C\mathcal C è lineare se c,c′∈C⇒c⊕c′∈C\mathbf c,\mathbf c'\in\mathcal C\Rightarrow\mathbf c\oplus\mathbf c'\in\mathcal C (quindi contiene la parola nulla). Conseguenza importante: dH(c,c′)=wH(c⊕c′)⟹dmin=min⁡c≠0wH(c):d_H(\mathbf c,\mathbf c')=w_H(\mathbf c\oplus\mathbf c')\quad\Longrightarrow\quad d_{min}=\min_{\mathbf c\ne\mathbf0}w_H(\mathbf c): la distanza minima è il peso minimoil più piccolo numero di uni tra le parole non nulle delle parole non nulle (non servono tutte le coppie).

Esempio di codice non lineare. 00→000000\to0000, 01→011101\to0111, 10→101110\to1011, 11→111011\to1110: 0111⊕1011=11000111\oplus1011=1100 ma 11001100 non è una parola (11→111011\to1110): non è lineare (anche se è sistematicoi primi kk bit della parola di codice coincidono con i bit di informazione).

Matrice generatrice

Una base di kk parole di codice linearmente indipendentinessuna è somma modulo 22 di altre, messe in righe, forma la matrice generatricematrice k×nk\times n le cui righe sono parole di codice: moltiplicata per la parola di informazione dà la parola di codice GG (k×nk\times n). La parola di informazione m=(m1,…,mk)\mathbf m=(m_1,\dots,m_k) si codifica con c=m G=∑imi gi(somma modulo 2 delle righe selezionate).\mathbf c=\mathbf m\,G=\sum_im_i\,\mathbf g_i\quad(\text{somma modulo }2\text{ delle righe selezionate}). Il codice è sistematico se G=[Ik∣P]G=[I_k\mid P], con PP matrice k×(n−k)k\times(n-k): i primi kk bit sono l'informazione, i restanti n−kn-k sono le parità p=mP\mathbf p=\mathbf mP. Una GG qualsiasi si porta in forma sistematica con somme di righe.

Matrice di controllo di parità e sindrome

La matrice di controllo di paritàmatrice HH tale che una parola è di codice se e solo se cHT=0\mathbf cH^T=\mathbf 0 HH ((n−k)×n(n-k)\times n) è tale che c∈C  ⟺  cHT=0,GHT=0.\mathbf c\in\mathcal C\iff\mathbf cH^T=\mathbf 0,\qquad G H^T=0. Per G=[Ik∣P]G=[I_k\mid P]: H=[PT∣In−k]H=[P^T\mid I_{n-k}] (modulo 2 il segno non conta). Se si riceve r=c⊕e\mathbf r=\mathbf c\oplus\mathbf e (e\mathbf e = vettore di errorevettore con un 11 nelle posizioni in cui il canale ha sbagliato il bit), la sindromevettore s=rHT\mathbf s=\mathbf rH^T: nullo per le parole di codice e dipendente solo dall'errore s=rHT=cHT⏟0⊕eHT=eHT\mathbf s=\mathbf rH^T=\underbrace{\mathbf cH^T}_{0}\oplus\mathbf eH^T=\mathbf eH^T dipende solo dall'errore, non dalla parola trasmessa. Allora:

  • s=0\mathbf s=\mathbf0: r\mathbf r è una parola di codice (nessun errore, oppure un errore che trasforma una parola in un'altra: non rivelabile);
  • s≠0\mathbf s\ne\mathbf0: errore rivelato;
  • per correggere si cerca l'errore più probabile (di peso minimo, il coset leadertra gli errori con una data sindrome, quello di peso minimo, cioè il più probabile) con quella sindrome e lo si sottrae: c^=r⊕e^\hat{\mathbf c}=\mathbf r\oplus\hat{\mathbf e}. Per un errore singolo nella posizione jj, s\mathbf s è la jj-esima colonna di HH: se le colonne sono tutte diverse e non nulle il codice corregge ogni errore singolo.

Inoltre dmind_{min} è il minimo numero di colonne di HH linearmente dipendenti (la somma di dmind_{min} colonne è zero): dmin≥3d_{min}\ge3 se le colonne sono non nulle e distinte, dmin≥2d_{min}\ge2 se sono solo non nulle.

Esempio completo: codice (4,3)(4,3) e sua estensione

Il codice con parole X1=1001X_1=1001, X2=0101X_2=0101, X3=1010X_3=1010 (e le loro somme, in tutto 88 parole) ha k=3k=3, n=4n=4. Riducendo in forma sistematica (X3⊕X1=0011X_3\oplus X_1=0011) si ottiene G=(100101010011),c4=c1⊕c2⊕c3,H=(1111)G=\begin{pmatrix}1&0&0&1\\0&1&0&1\\0&0&1&1\end{pmatrix},\qquad c_4=c_1\oplus c_2\oplus c_3,\qquad H=\begin{pmatrix}1&1&1&1\end{pmatrix} (codice a parità pariil numero di uni di ogni parola è pari). Le 88 parole hanno peso 0,2,2,2,2,2,2,40,2,2,2,2,2,2,4: dmin=2d_{min}=2, rivela 11 errore, ne corregge 00.

Si aggiunge un quinto bit c5=c1⊕c2c_5=c_1\oplus c_2: G′=(100110101100110)G'=\begin{pmatrix}1&0&0&1&1\\0&1&0&1&1\\0&0&1&1&0\end{pmatrix}, H′=(1111011001)H'=\begin{pmatrix}1&1&1&1&0\\1&1&0&0&1\end{pmatrix} (verificato: G′H′T=0G'H'^T=0). Le 88 parole di (5,3)(5,3) hanno pesi 0,2,3,3,3,3,2,40,2,3,3,3,3,2,4: ancora dmin=2d_{min}=2 (la parola 0011000110 ha peso 22). Le colonne di H′H' sono (1,1),(1,1),(1,0),(1,0),(0,1)(1,1),(1,1),(1,0),(1,0),(0,1): non sono tutte distinte, quindi non si corregge. Ricevuta r=11010\mathbf r=11010: s=rH′T=(1+1+0+1, 1+1+0)=(1,0)≠0\mathbf s=\mathbf rH'^T=(1+1+0+1,\ 1+1+0)=(1,0)\ne\mathbf0: errore rivelato; la sindrome (1,0)(1,0) coincide con le colonne 33 e 44 di H′H', quindi un errore singolo può essere in posizione 33 (11010⊕00100=1111011010\oplus00100=11110) o 44 (11010⊕00010=1100011010\oplus00010=11000): 1111011110 e 1100011000 sono entrambe parole di codice ed equidistanti da r\mathbf r, quindi non si può correggere, solo rivelare.

Codici di Hamming

Per m≥2m\ge2 il codice di Hammingcodice con dmin=3d_{min}=3 la cui HH ha per colonne tutte le sequenze non nulle: corregge un errore ha n=2m−1n=2^m-1, k=2m−1−mk=2^m-1-m, dmin=3d_{min}=3 e HH con per colonne tutte le 2m−12^m-1 sequenze binarie non nulle di mm bit (quindi colonne distinte e non nulle: dmin≥3d_{min}\ge3, e 33 colonne distinte sommano a zero, per esempio h1⊕h2⊕h3=0\mathbf h_1\oplus\mathbf h_2\oplus\mathbf h_3=\mathbf0 se h3=h1⊕h2\mathbf h_3=\mathbf h_1\oplus\mathbf h_2). Corregge t=1t=1 errore ed è perfettole sfere di Hamming di raggio tt attorno alle parole riempiono tutto lo spazio senza sovrapporsi (2n−k=1+n2^{n-k}=1+n). Per m=3m=3 si ha l'Hamming (7,4)(7,4): G=(1000110010010100100110001111),H=(110110010110100111001).G=\begin{pmatrix}1&0&0&0&1&1&0\\0&1&0&0&1&0&1\\0&0&1&0&0&1&1\\0&0&0&1&1&1&1\end{pmatrix},\qquad H=\begin{pmatrix}1&1&0&1&1&0&0\\1&0&1&1&0&1&0\\0&1&1&1&0&0&1\end{pmatrix}. Decodifica: si calcola s=rHT\mathbf s=\mathbf rH^T; se s≠0\mathbf s\ne\mathbf0 si inverte il bit jj tale che la colonna jj di HH sia s\mathbf s. Esempio: m=1011\mathbf m=1011 dà c=mG=(1,0,1,1,0,1,0)\mathbf c=\mathbf mG=(1,0,1,1,0,1,0) (parità m1⊕m2⊕m4=0m_1\oplus m_2\oplus m_4=0, m1⊕m3⊕m4=1m_1\oplus m_3\oplus m_4=1, m2⊕m3⊕m4=0m_2\oplus m_3\oplus m_4=0, dalle ultime tre colonne di GG); se si riceve r=(1,0,1,0,0,1,0)\mathbf r=(1,0,1,0,0,1,0) (errore in posizione 44), s=rHT=(1,1,1)\mathbf s=\mathbf rH^T=(1,1,1), uguale alla colonna 44 di HH: si inverte il bit 44 e si ritrova c\mathbf c. (Controllato con Python: tutti i 16⋅7=11216\cdot7=112 errori singoli sono corretti, dmin=3d_{min}=3; con p=10−2p=10^{-2} la probabilità di parola errata è 2,03⋅10−32{,}03\cdot10^{-3}.)

Errori comuni

  • Verificare la linearità guardando solo la parola nulla o la somma di una coppia: serve la chiusura per tutte le somme.
  • Calcolare dmind_{min} su tutte le coppie in un codice lineare (basta il peso minimo) o, al contrario, prenderlo da una riga di GG qualsiasi.
  • Scrivere H=[P∣I]H=[P\mid I] invece di [PT∣I][P^T\mid I] (la trasposta serve alle dimensioni: (n−k)×n(n-k)\times n).
  • Credere che la sindrome non nulla identifichi sempre l'errore: con colonne uguali o per più errori la correzione è ambigua o sbagliata.

Versione ripasso

Esercizi su questo argomento

Teoria collegata