Salta al contenuto
Note per Studenti Codici di Shannon, Huffman ed Elias e codifica aritmetica

Codici di Shannon, Huffman ed Elias e codifica aritmetica

In questa pagina 9

Il teorema di Shannon (Codici a prefisso - Kraft-McMillan e limiti di Shannon sulla lunghezza mediaLa codifica di sorgente senza perdite associa a ogni parola emessa dalla sorgente una parola di codice binaria (o $M_y$-aria) di lunghezza variabile, in modo invertibile; la qualità si misura con la lunghezza media $L_y=\sum p_{\underline x}(\underline a),l(\underline a)$. In un codice a prefisso nessuna parola è l'inizio di un'altra, quindi la decodifica è istantanea. Kraft-McMillan: ogni codice decodificabile ha $\sum M_y^{-l_i}\le1$, e se interi $l_i$ la soddisfano esiste un codice a prefisso con quelle lunghezze. Shannon: $\frac{H(\underline x)}{\log_2M_y}\le L_y<\frac{H(\underline x)}{\log_2M_y}+1$ per il codice a prefisso ottimo, con $L_y=\frac{H}{\log_2M_y}$ solo se le probabilità sono potenze di $\frac1{M_y}$.Codici a prefisso - Kraft-McMillan e limiti di Shannon sulla lunghezza media →) dice che esiste un codice a prefisso con lunghezza media tra Hlog⁡2My\frac{H}{\log_2M_y} e Hlog⁡2My+1\frac{H}{\log_2M_y}+1. In questa nota si costruiscono tre codici concreti: Shannon, il codice ottimo di Huffman, e Elias (da cui la codifica aritmetica).

Versione per Ing. Elettronica: Codici di Shannon-Fano e di HuffmanIn un codice ottimo le parole più probabili non sono più lunghe di quelle meno probabili e le due parole più lunghe differiscono solo per l'ultimo simbolo. Shannon-Fano costruisce l'albero dall'alto dividendo ripetutamente i simboli in due gruppi di probabilità quasi uguali; Huffman lo costruisce dal basso unendo ogni volta i due simboli meno probabili ed è sempre ottimo tra i codici a prefisso. La lunghezza media $L_y$ è la somma delle probabilità dei nodi uniti, l'efficienza è $\eta=\frac{H}{L_y}$.Codici di Shannon-Fano e di Huffman →. Versione per Ing. delle Telecomunicazioni: Codifica di sorgenteLa codifica di sorgente senza perdita assegna ai simboli (o a parole di $N$ simboli) parole di codice di lunghezza variabile, corte per i simboli probabili, con una mappa invertibile. Un codice a prefisso è sempre decodificabile; Kraft-McMillan: se il codice è decodificabile $\sum M^{-l_i}\le1$ e viceversa esiste un codice a prefisso con quelle lunghezze. Shannon: $L\ge\frac{H}{\log_2M}$ e esiste un codice con $L<\frac{H}{\log_2M}+1$ (lunghezze $\lceil\log_M\frac1p\rceil$). Shannon-Fano divide dall'alto, Huffman unisce dal basso i due meno probabili ed è ottimo; raggruppare simboli e la codifica aritmetica si avvicinano al limite.Codifica di sorgente →. Entropia: Entropia - informazione di un evento, disuguaglianza di Jensen e valore massimoL'informazione di un evento di probabilità $P$ è $i=\log_2\frac1P$ bit (zero per l'evento certo, additiva per eventi indipendenti). L'entropia di una variabile aleatoria discreta è l'informazione media, $H(x)=E[i_x(x)]=\sum_aP_x(a)\log_2\frac1{P_x(a)}$; vale $0\le H(x)\le\log_2M$ con $M$ cardinalità dell'alfabeto, e il massimo $\log_2M$ si raggiunge se e solo se i simboli sono equiprobabili (dimostrazione con la disuguaglianza di Jensen, perché il logaritmo è strettamente concavo).Entropia - informazione di un evento, disuguaglianza di Jensen e valore massimo →.

Codice di Shannon(-Fano)

Definizione. Per una sorgente con parole a‾i∈Dx\underline a_i\in\mathcal D_x di probabilità pip_i, il codice di Shannon ha lunghezze li=⌈log⁡1/Mypi⌉=⌈log⁡My1pi⌉,per My=2: li=⌈−log⁡2pi⌉=⌈i(a‾i)⌉.l_i=\left\lceil\log_{1/M_y}p_i\right\rceil=\left\lceil\log_{M_y}\frac1{p_i}\right\rceil,\qquad\text{per }M_y=2:\ l_i=\left\lceil-\log_2p_i\right\rceil=\left\lceil i(\underline a_i)\right\rceil.

La lunghezza è l'informazione dell'evento arrotondata per eccesso. Si è già dimostrato che soddisfa Kraft-McMillan (quindi esiste un codice a prefisso con queste lunghezze) e che H(x‾)≤Ly<H(x‾)+1(My=2).H(\underline x)\le L_y<H(\underline x)+1\quad(M_y=2). Le parole si ricavano dalle lunghezze: si ordinano per lunghezza crescente e si assegna a ciascuna le prime lil_i cifre binarie del numero ci=∑j<i2−ljc_i=\sum_{j<i}2^{-l_j}, oppure si disegna l'albero e si sceglie per ogni lunghezza un nodo non discendente di quelli già scelti. Sono possibili più assegnazioni equivalenti (scambiando 00 e 11 si ottiene un altro codice con le stesse lunghezze).

Se le probabilità sono potenze di 12\frac12 (pi=2−kip_i=2^{-k_i}), li=kil_i=k_i esatto e Ly=∑ipiki=HL_y=\sum_ip_ik_i=H: il codice di Shannon è ottimo.

Esempio. p=(12,14,18,18)p=\left(\frac12,\frac14,\frac18,\frac18\right), My=2M_y=2: l1=log⁡1/212=1l_1=\log_{1/2}\frac12=1, l2=2l_2=2, l3=l4=3l_3=l_4=3. Un codice a prefisso è a1→0a_1\to0, a2→10a_2\to10, a3→110a_3\to110, a4→111a_4\to111 (scambiando 00 e 11 in qualche nodo dell'albero si ottengono altri codici a prefisso con le stesse lunghezze). Lunghezza media Ly=1⋅12+2⋅14+3⋅18+3⋅18=1,75L_y=1\cdot\frac12+2\cdot\frac14+3\cdot\frac18+3\cdot\frac18=1{,}75 bit =H=H.

Esempio con probabilità non diadiche. p=(0,51; 0,27; 0,13; 0,09)p=(0{,}51;\ 0{,}27;\ 0{,}13;\ 0{,}09). Informazioni 0,971; 1,889; 2,943; 3,4740{,}971;\ 1{,}889;\ 2{,}943;\ 3{,}474 bit, quindi l=⌈⋅⌉=1,2,3,4l=\lceil\cdot\rceil=1,2,3,4 e Ly=0,51⋅1+0,27⋅2+0,13⋅3+0,09⋅4=0,51+0,54+0,39+0,36=1,80 bit.L_y=0{,}51\cdot1+0{,}27\cdot2+0{,}13\cdot3+0{,}09\cdot4=0{,}51+0{,}54+0{,}39+0{,}36=1{,}80\ \text{bit}. Kraft: 12+14+18+116=1516≤1\frac12+\frac14+\frac18+\frac1{16}=\frac{15}{16}\le1 ✓. Parole: 0, 10, 110, 11100,\ 10,\ 110,\ 1110. Entropia H=1,70H=1{,}70 bit, quindi 1,70≤1,80<2,701{,}70\le1{,}80<2{,}70 ✓, efficienza η=HL=0,945\eta=\frac HL=0{,}945.

Il codice di Shannon non è ottimo in generale (nell'esempio si vedrà Huffman con 1,711{,}71 bit), perché arrotonda ogni simbolo separatamente.

Codici ottimi

Definizione. Un codice di sorgente è ottimo se ha la lunghezza media minima tra i codici a prefisso per quella sorgente.

Due proprietà di un codice a prefisso ottimo guidano la costruzione.

Teorema 1. In un codice a prefisso ottimo le parole di probabilità più bassa hanno lunghezza maggiore o uguale: se p(x1)<p(x2)p(x_1)<p(x_2) allora l(y1)≥l(y2)l(y_1)\ge l(y_2).

Dimostrazione (per assurdo). Se fosse p(x1)<p(x2)p(x_1)<p(x_2) e l(y1)<l(y2)l(y_1)<l(y_2) in un codice ottimo, si scambiano le parole: x1→y2x_1\to y_2, x2→y1x_2\to y_1. Il nuovo codice è ancora a prefisso e la variazione della lunghezza media è ΔL=p(x1)[l(y2)−l(y1)]+p(x2)[l(y1)−l(y2)]=[p(x1)−p(x2)][l(y2)−l(y1)]<0,\Delta L=p(x_1)\left[l(y_2)-l(y_1)\right]+p(x_2)\left[l(y_1)-l(y_2)\right]=\left[p(x_1)-p(x_2)\right]\left[l(y_2)-l(y_1)\right]<0, perché il primo fattore è negativo e il secondo positivo: la lunghezza media scende, e il codice di partenza non era ottimo. Assurdo. ■\blacksquare

Teorema 2. Nel dizionario di un codice a prefisso ottimo ci sono almeno due parole di lunghezza massima b‾′\underline b' e b‾′′\underline b'' che differiscono solo nell'ultimo simbolo.

Dimostrazione (per assurdo). Si prende una parola b‾\underline b di lunghezza massima lmax⁡l_{\max} e il suo "fratello", cioè la sequenza che differisce da b‾\underline b solo nell'ultimo simbolo (in un codice binario: …0\dots0 e …1\dots1 con lo stesso inizio). Se il fratello non fosse una parola di codice, nessuna parola del codice potrebbe stare sotto di lui (sarebbe più lunga di lmax⁡l_{\max}) né sopra di lui (sarebbe prefisso di b‾\underline b e il codice non sarebbe a prefisso). Allora si potrebbe accorciare b‾\underline b togliendo l'ultimo simbolo: il codice resterebbe a prefisso e la lunghezza media scenderebbe, contro l'ipotesi di ottimalità. Quindi il fratello è una parola di codice, e ha anch'esso lunghezza lmax⁡l_{\max}. ■\blacksquare

I due teoremi dicono che la coppia di simboli meno probabili può essere messa come "fratelli" in fondo all'albero: è il passo della procedura di Huffman.

Procedura di Huffman (codice binario)

Dati i simboli con probabilità pip_i:

  1. Ordinare le probabilità in ordine decrescente.
  2. Unire i due simboli di probabilità più bassa in un unico simbolo "nodo" di probabilità la somma; ai due rami che partono dal nodo si assegnano le etichette 00 e 11 (una per ramo).
  3. Ripetere da 1 sulla lista ridotta (un elemento in meno), finché resta un solo nodo (la radice, probabilità 11).
  4. Leggere le parole di codice sui rami, dalla radice a ciascuna foglia.

Il codice dipende dalle scelte (quale ramo è 00, come si ordinano probabilità uguali) ma la lunghezza media è sempre la stessa, ed è la minima. Controllo utile: LyL_y è anche la somma delle probabilità dei nodi interni (compresa la radice =1=1), perché ogni passaggio dall'albero aggiunge 11 bit a tutte le parole sotto quel nodo.

Esempio 1 (44 simboli). p=(0,4; 0,3; 0,2; 0,1)p=(0{,}4;\ 0{,}3;\ 0{,}2;\ 0{,}1) per a4,a3,a2,a1a_4,a_3,a_2,a_1 (il simbolo aia_i ha p=0,1 ip=0{,}1\,i).

  • Passo 1: si uniscono 0,20{,}2 e 0,10{,}1 in un nodo da 0,30{,}3.
  • Passo 2: ora ci sono 0,4; 0,3; 0,30{,}4;\ 0{,}3;\ 0{,}3; si uniscono i due 0,30{,}3 in un nodo da 0,60{,}6.
  • Passo 3: si uniscono 0,40{,}4 e 0,60{,}6 nella radice. Con 00 al ramo di probabilità maggiore a ogni unione: a4→0a_4\to0, a3→10a_3\to10, a2→110a_2\to110, a1→111a_1\to111. Lunghezza media Ly=0,4⋅1+0,3⋅2+0,2⋅3+0,1⋅3=1,9L_y=0{,}4\cdot1+0{,}3\cdot2+0{,}2\cdot3+0{,}1\cdot3=1{,}9 bit; controllo con i nodi: 0,3+0,6+1=1,90{,}3+0{,}6+1=1{,}9 ✓. L'entropia è H=1,846H=1{,}846 bit, quindi η=1,8461,9=0,972\eta=\frac{1{,}846}{1{,}9}=0{,}972, contro il codice a lunghezza fissa con 22 bit (η=1,8462=0,923\eta=\frac{1{,}846}2=0{,}923).

Esempio 2 (55 simboli). p=(0,12; 0,22; 0,17; 0,11; 0,38)p=(0{,}12;\ 0{,}22;\ 0{,}17;\ 0{,}11;\ 0{,}38) per a1,…,a5a_1,\dots,a_5. Ordinati: 0,38 (a5); 0,22 (a2); 0,17 (a3); 0,12 (a1); 0,11 (a4)0{,}38\,(a_5);\ 0{,}22\,(a_2);\ 0{,}17\,(a_3);\ 0{,}12\,(a_1);\ 0{,}11\,(a_4).

  1. Si uniscono i due più bassi 0,120{,}12 e 0,110{,}11: nodo 0,230{,}23.
  2. Lista 0,38; 0,23; 0,22; 0,170{,}38;\ 0{,}23;\ 0{,}22;\ 0{,}17: si uniscono 0,220{,}22 e 0,170{,}17: nodo 0,390{,}39.
  3. Lista 0,39; 0,38; 0,230{,}39;\ 0{,}38;\ 0{,}23: i due più bassi sono 0,380{,}38 e 0,230{,}23: nodo 0,610{,}61.
  4. Rimangono 0,390{,}39 e 0,610{,}61: radice. Un codice risultante: a5→00a_5\to00, a2→10a_2\to10, a3→11a_3\to11, a1→011a_1\to011, a4→010a_4\to010 (lunghezze 2,2,2,3,32,2,2,3,3 per a5,a2,a3,a1,a4a_5,a_2,a_3,a_1,a_4). Ly=0,12⋅3+0,22⋅2+0,17⋅2+0,11⋅3+0,38⋅2=0,36+0,44+0,34+0,33+0,76=2,23 bit.L_y=0{,}12\cdot3+0{,}22\cdot2+0{,}17\cdot2+0{,}11\cdot3+0{,}38\cdot2=0{,}36+0{,}44+0{,}34+0{,}33+0{,}76=2{,}23\ \text{bit}. Controllo con i nodi: 0,23+0,39+0,61+1=2,230{,}23+0{,}39+0{,}61+1=2{,}23 ✓. L'entropia è H=2,163H=2{,}163 bit (2,163≤2,23<3,1632{,}163\le2{,}23<3{,}163 ✓). Con il codice di Shannon le lunghezze sarebbero 4,3,3,4,24,3,3,4,2 e Ly=2,85L_y=2{,}85 bit: peggiore.

Esempio 3 (sorgente con 0,51; 0,27; 0,13; 0,090{,}51;\ 0{,}27;\ 0{,}13;\ 0{,}09). Si uniscono 0,130{,}13 e 0,090{,}09 (nodo 0,220{,}22), poi 0,220{,}22 e 0,270{,}27 (nodo 0,490{,}49), poi 0,490{,}49 e 0,510{,}51. Codice: a1→0a_1\to0, a2→10a_2\to10, a3→110a_3\to110, a4→111a_4\to111 (lunghezze 1,2,3,31,2,3,3). Ly=0,51+0,54+0,39+0,27=1,71L_y=0{,}51+0{,}54+0{,}39+0{,}27=1{,}71 bit; nodi: 0,22+0,49+1=1,710{,}22+0{,}49+1=1{,}71 ✓. Rispetto al codice di Shannon (1,801{,}80 bit) l'ultimo simbolo perde un bit: a4a_4 ha 33 bit anziché 44.

Grafico interattivo: Albero di Huffman per le probabilità 0,51; 0,27; 0,13; 0,09: i rami 0 e 1 partono dai nodi con probabilità 1, 0,49, 0,22; le foglie sono le parole a₁ → 0, a₂ → 10, a₃ → 110, a₄ → 111

Ottimalità. Per i teoremi precedenti il codice ottimo ha i due simboli meno probabili come fratelli di lunghezza massima, e il problema si riduce a un codice con un simbolo in meno e probabilità pa+pbp_a+p_b (il nodo unito). Ripetendo, si ottiene che la procedura di Huffman produce un codice ottimo. Per alfabeti MyM_y-ari si uniscono a ogni passo gli MyM_y nodi meno probabili (aggiungendo all'inizio simboli fittizi di probabilità zero, in modo che il numero di simboli sia 1 mod (My−1)1\bmod(M_y-1)).

Codice di Elias e codifica aritmetica

Il codice di Elias non richiede di ordinare né di costruire un albero: usa la retta reale.

Costruzione. Si fissa un ordine dei simboli a1,…,aNa_1,\dots,a_N (per esempio quello naturale). Si divide l'intervallo [0,1)[0,1) in NN sottointervalli contigui di ampiezze p1,…,pNp_1,\dots,p_N. Per ogni simbolo aia_i si prende il punto medio mim_i del suo intervallo. La parola di codice è formata dalle prime lil_i cifre dopo la virgola dello sviluppo binario di mim_i, con li=⌈−log⁡2pi⌉+1.\boxed{l_i=\left\lceil-\log_2p_i\right\rceil+1.}

Perché funziona. Scrivere mim_i con lil_i cifre significa troncarlo, e il troncamento è ≤mi\le m_i e dista da mim_i meno di 2−li≤pi22^{-l_i}\le\frac{p_i}2 (infatti 2−li=2−⌈−log⁡2pi⌉−1≤pi22^{-l_i}=2^{-\lceil-\log_2p_i\rceil-1}\le\frac{p_i}2). Il punto troncato e il segmento [troncato,troncato+2−li)[\text{troncato},\text{troncato}+2^{-l_i}) stanno quindi dentro l'intervallo di aia_i (che si estende per pi2\frac{p_i}2 a destra e a sinistra di mim_i). Intervalli diversi sono disgiunti, quindi nessuna parola è prefisso di un'altra: il codice è a prefisso.

Esempio (m=0,01m=0{,}01 in binario →14\to\frac14). Un numero binario 0,b1b2b3…0{,}b_1b_2b_3\dots vale ∑bk2−k\sum b_k2^{-k}: 0,010{,}01 è 14\frac14, 0,101=12+18=0,6250{,}101=\frac12+\frac18=0{,}625.

Esempio (p=0,51; 0,27; 0,13; 0,09p=0{,}51;\ 0{,}27;\ 0{,}13;\ 0{,}09, ordine naturale).

Simbolo Intervallo Punto medio mim_i li=⌈−log⁡2pi⌉+1l_i=\lceil-\log_2p_i\rceil+1 mim_i in binario Parola
a1a_1 [0; 0,51)[0;\ 0{,}51) 0,2550{,}255 1+1=21+1=2 0,0100 0001…0{,}0100\,0001\dots 0101
a2a_2 [0,51; 0,78)[0{,}51;\ 0{,}78) 0,6450{,}645 2+1=32+1=3 0,1010 0101…0{,}1010\,0101\dots 101101
a3a_3 [0,78; 0,91)[0{,}78;\ 0{,}91) 0,8450{,}845 3+1=43+1=4 0,1101 1000…0{,}1101\,1000\dots 11011101
a4a_4 [0,91; 1)[0{,}91;\ 1) 0,9550{,}955 4+1=54+1=5 0,1111 0100…0{,}1111\,0100\dots 1111011110

Conversione di 0,2550{,}255: 0,255⋅2=0,51→00{,}255\cdot2=0{,}51\to0; 0,51⋅2=1,02→10{,}51\cdot2=1{,}02\to1 (resta 0,020{,}02); 0,02⋅2=0,04→00{,}02\cdot2=0{,}04\to0; …\dots quindi 0,0100…0{,}0100\dots e le prime due cifre sono 0101. Il codice è a prefisso (01, 101, 1101, 1111001,\ 101,\ 1101,\ 11110).

Lunghezza media Ly=0,51⋅2+0,27⋅3+0,13⋅4+0,09⋅5=1,02+0,81+0,52+0,45=2,80L_y=0{,}51\cdot2+0{,}27\cdot3+0{,}13\cdot4+0{,}09\cdot5=1{,}02+0{,}81+0{,}52+0{,}45=2{,}80 bit =1,80+1=1{,}80+1 (una cifra in più del codice di Shannon).

Grafico interattivo: Codice di Elias per le probabilità 0,51; 0,27; 0,13; 0,09: l'intervallo [0, 1) è diviso in quattro segmenti di ampiezza pari alle probabilità e di ciascuno si prende il punto medio (0,255; 0,645; 0,845; 0,955), di cui si scrivono in binario le prime cifre

Prestazioni. Ly=∑ipi[⌈−log⁡2pi⌉+1]≥∑ipi[−log⁡2pi+1]=H+1L_y=\sum_ip_i\left[\lceil-\log_2p_i\rceil+1\right]\ge\sum_ip_i\left[-\log_2p_i+1\right]=H+1 e Ly<H+2L_y<H+2: il codice è subottimo di almeno 11 bit per parola rispetto al limite di Shannon. Ha però un vantaggio: poiché il codice dipende solo dall'intervallo [0,1)[0,1) e dalle probabilità, si presta a un meccanismo adattativo. Nella codifica aritmetica il codificatore e il decodificatore tengono entrambi una stima delle probabilità P(ai)P(a_i) e la aggiornano a ogni simbolo; l'intervallo di partenza viene suddiviso con le probabilità correnti, così non serve conoscere in anticipo la statistica della sorgente né trasmettere un dizionario.

Confronto sull'esempio 0,51; 0,27; 0,13; 0,090{,}51;\ 0{,}27;\ 0{,}13;\ 0{,}09

Codice Lunghezze LyL_y [bit] η=HLy\eta=\frac H{L_y}
Huffman (ottimo) 1,2,3,31,2,3,3 1,711{,}71 0,9950{,}995
Shannon 1,2,3,41,2,3,4 1,801{,}80 0,9450{,}945
Elias 2,3,4,52,3,4,5 2,802{,}80 0,6070{,}607

con H=1,70H=1{,}70 bit: i limiti di Shannon sono 1,70≤Ly<2,701{,}70\le L_y<2{,}70 (Ly=2,80L_y=2{,}80 per Elias supera H+1H+1 ma non H+2H+2). Il codice ottimo è il migliore, Shannon è a meno di 0,10{,}1 bit, Elias spreca 11 bit.

Dalla sorgente al modulatore: periodo di simbolo

Un esercizio tipico concatena i blocchi. La sorgente emette un simbolo ogni Ts=1T_s=1 ms con le probabilità sopra.

  1. Codificatore di sorgente (Huffman, Ly=1,71L_y=1{,}71 bit per simbolo): escono LyTs=1,71\frac{L_y}{T_s}=1{,}71 kbit/s, quindi un bit ogni Tb=11710=0,585T_b=\frac1{1710}=0{,}585 ms.
  2. Codificatore di canale con rate Rc=34R_c=\frac34 (per esempio k=30k=30, n=40n=40): ogni 33 bit di informazione ne escono 44, quindi il bit-rate sul canale è 17103/4=2280\frac{1710}{3/4}=2280 bit/s e il tempo di bit dopo il codice è Tc=34Tb=0,4386T_c=\frac34T_b=0{,}4386 ms.
  3. Modulatore 16-QAM (log⁡216=4\log_216=4 bit per simbolo): T=4Tc=1,754T=4T_c=1{,}754 ms (570 simboli/s).

(Con arrotondamenti intermedi sui tempi di bit si trova 1,741{,}74 ms; il valore senza arrotondamenti è 1,7541{,}754 ms.) In formula, per ogni simbolo della sorgente escono LyL_y bit dal codificatore di sorgente, LyRc\frac{L_y}{R_c} bit dal codificatore di canale e LyRclog⁡2M\frac{L_y}{R_c\log_2M} simboli dal modulatore (Modulazione digitale - trasmettitore, bit map e canale AWGNIl trasmettitore digitale ha due blocchi: la bit map raggruppa $\log_2M$ bit in un simbolo $a_m\in{1,\dots,M}$ (periodo $T=T_b\log_2M$) e il modulatore associa a ogni simbolo una forma d'onda $s_{a_m}(t)$, così $s_{Tx}(t)=\sum_ms_{a_m}(t-mT)$; l'insieme delle $M$ forme d'onda è la segnalazione. Il canale ideale lascia il segnale com'è, il canale AWGN lo scala di $A$ e somma il rumore bianco gaussiano $w(t)$, il canale multipath somma echi ritardati: i suoi due effetti sono la deformazione delle forme d'onda ($s'm$) e l'interferenza intersimbolica. Il ricevitore ha un demodulatore digitale che decide $\hat a_m$ e una bit demap.Modulazione digitale - trasmettitore, bit map e canale AWGN →; per il rate del codice Controllo d'errore - ARQ, FEC e codici a blocco sul canale binario simmetricoPer proteggere i bit dagli errori si può chiedere la ritrasmissione (ARQ, serve il canale di ritorno), aggiungere ridondanza per correggere (FEC) o unire le due cose (HARQ). Un codice a blocco $(n,k)$ trasforma $k$ bit in una parola di $n>k$ bit scelta tra $2^k$ parole su $2^n$ sequenze; modulatore, canale e demodulatore equivalgono a un canale binario simmetrico senza memoria con probabilità d'errore sul bit $P{bit}$. Per $P_{bit}<\frac12$ il decodificatore ML sceglie la parola a minima distanza di Hamming; con distanza minima $d_{min}$ si correggono sempre $t=\lfloor\frac{d_{min}-1}{2}\rfloor$ errori e se ne rivelano sempre $d_{min}-1$. Il tasso è $R=\frac kn$ e la probabilità d'errore di parola è limitata da $P(\text{più di }t\text{ errori})$. L'ARQ ha efficienza $S_{SW}$, $S_{GBN}$, $S_{SR}$ in funzione di $t_P$, $t_A$, $\tau_P$ e $p$.Controllo d'errore - ARQ, FEC e codici a blocco sul canale binario simmetrico →), quindi T=Ts Rclog⁡2MLy=1 ms⋅0,75⋅41,71=1,754 ms.T=\frac{T_s\,R_c\log_2M}{L_y}=\frac{1\ \text{ms}\cdot0{,}75\cdot4}{1{,}71}=1{,}754\ \text{ms}.

Errori comuni

  • Costruire Huffman unendo i nodi più probabili, o non riordinare dopo ogni unione.
  • Scambiare le etichette 0/10/1 in modo incoerente: va bene qualunque scelta, ma una per ramo, e bisogna leggere dalla radice alla foglia.
  • Dimenticare che LyL_y dipende dalle probabilità dei simboli, non dal numero di rami: due codici con le stesse lunghezze ordinate hanno la stessa LyL_y.
  • Dire che il codice di Shannon è ottimo: solo con probabilità potenze di 12\frac12.
  • Prendere per Elias li=⌈−log⁡2pi⌉l_i=\lceil-\log_2p_i\rceil senza il +1+1 (è la lunghezza di Shannon).
  • Troncare il punto medio mim_i in modo sbagliato nella conversione in binario (moltiplicare per 22 e prendere la parte intera a ogni passo).
  • Nell'esercizio di catena, invertire il rapporto Tc=RcTbT_c=R_cT_b: il codice di canale aggiunge bit, quindi i bit sul canale sono più frequenti (Tc<TbT_c<T_b).

Domande d'esame

  1. Si costruisca il codice di Huffman per p=(0,51; 0,27; 0,13; 0,09)p=(0{,}51;\ 0{,}27;\ 0{,}13;\ 0{,}09) e se ne calcoli la lunghezza media. Unioni 0,220{,}22, 0,490{,}49, radice; parole 0,10,110,1110,10,110,111; Ly=1,71L_y=1{,}71 bit.
  2. Per la stessa sorgente si calcolino le lunghezze medie dei codici di Shannon e di Elias e i limiti di Shannon. Shannon 1,2,3,4⇒1,801,2,3,4\Rightarrow1{,}80 bit; Elias +1+1 bit ⇒2,80\Rightarrow2{,}80 bit; limiti H=1,70≤Ly<2,70H=1{,}70\le L_y<2{,}70.
  3. Si dimostri che in un codice a prefisso ottimo le parole meno probabili non sono più corte. Scambio delle parole: ΔL=[p(x1)−p(x2)][l(y2)−l(y1)]<0\Delta L=[p(x_1)-p(x_2)][l(y_2)-l(y_1)]<0 se p(x1)<p(x2)p(x_1)<p(x_2) e l(y1)<l(y2)l(y_1)<l(y_2): assurdo con l'ottimalità.

Esercizi svolti

Versione ripasso

Shannon(-Fano) (Codici di Shannon-Fano e di HuffmanIn un codice ottimo le parole più probabili non sono più lunghe di quelle meno probabili e le due parole più lunghe differiscono solo per l'ultimo simbolo. Shannon-Fano costruisce l'albero dall'alto dividendo ripetutamente i simboli in due gruppi di probabilità quasi uguali; Huffman lo costruisce dal basso unendo ogni volta i due simboli meno probabili ed è sempre ottimo tra i codici a prefisso. La lunghezza media $L_y$ è la somma delle probabilità dei nodi uniti, l'efficienza è $\eta=\frac{H}{L_y}$.Codici di Shannon-Fano e di Huffman →, Codifica di sorgenteLa codifica di sorgente senza perdita assegna ai simboli (o a parole di $N$ simboli) parole di codice di lunghezza variabile, corte per i simboli probabili, con una mappa invertibile. Un codice a prefisso è sempre decodificabile; Kraft-McMillan: se il codice è decodificabile $\sum M^{-l_i}\le1$ e viceversa esiste un codice a prefisso con quelle lunghezze. Shannon: $L\ge\frac{H}{\log_2M}$ e esiste un codice con $L<\frac{H}{\log_2M}+1$ (lunghezze $\lceil\log_M\frac1p\rceil$). Shannon-Fano divide dall'alto, Huffman unisce dal basso i due meno probabili ed è ottimo; raggruppare simboli e la codifica aritmetica si avvicinano al limite.Codifica di sorgente →)

  • li=⌈−log⁡Mypi⌉\boxed{l_i=\lceil-\log_{M_y}p_i\rceil}; binario: informazione arrotondata per eccesso, li=⌈i(a‾i)⌉l_i=\lceil i(\underline a_i)\rceil. Soddisfa Kraft, H≤Ly<H+1H\le L_y<H+1.
  • Parole dalle lunghezze: ordinate crescenti, prime lil_i cifre di ci=∑j<i2−ljc_i=\sum_{j<i}2^{-l_j}, o scelta di nodi sull'albero.
  • Ottimo solo se pi=2−kip_i=2^{-k_i}: (12,14,18,18)\left(\frac12,\frac14,\frac18,\frac18\right) dà 0,10,110,1110,10,110,111, Ly=1,75=HL_y=1{,}75=H.
  • (0,51;0,27;0,13;0,09)(0{,}51;0{,}27;0{,}13;0{,}09): informazioni 0,971;1,889;2,943;3,4740{,}971;1{,}889;2{,}943;3{,}474, l=1,2,3,4l=1,2,3,4, Kraft 1516\frac{15}{16}, parole 0,10,110,11100,10,110,1110, Ly=1,80L_y=1{,}80; H=1,70H=1{,}70, η=0,945\eta=0{,}945.

Codici ottimi

  • Ottimo: LyL_y minima tra i prefissi.
  • Teorema 1: p(x1)<p(x2)⇒l(y1)≥l(y2)p(x_1)<p(x_2)\Rightarrow l(y_1)\ge l(y_2). Se no, scambiando le parole ΔL=[p(x1)−p(x2)][l(y2)−l(y1)]<0\Delta L=[p(x_1)-p(x_2)][l(y_2)-l(y_1)]<0: assurdo.
  • Teorema 2: almeno due parole di lunghezza massima che differiscono solo nell'ultimo simbolo. Se il fratello di una parola più lunga non fosse parola, la si accorcerebbe e LyL_y scenderebbe.

Huffman (binario)

  • (1) ordina decrescente; (2) unisci i due meno probabili in un nodo con la somma (rami 00 e 11); (3) ripeti; (4) leggi dalla radice alle foglie.
  • Il codice non è unico (etichette, pareggi), LyL_y sì. Controllo: Ly=L_y= somma delle probabilità dei nodi interni (radice compresa).
  • (0,4;0,3;0,2;0,1)(0{,}4;0{,}3;0{,}2;0{,}1): nodi 0,3,0,6,10{,}3,0{,}6,1; 0,10,110,1110,10,110,111; Ly=1,9L_y=1{,}9; H=1,846H=1{,}846, η=0,972\eta=0{,}972 (lunghezza fissa 0,9230{,}923).
  • (0,12;0,22;0,17;0,11;0,38)(0{,}12;0{,}22;0{,}17;0{,}11;0{,}38): 0,230{,}23 (con 0,12+0,110{,}12+0{,}11), 0,390{,}39, 0,610{,}61 (con 0,38+0,230{,}38+0{,}23), 11; a5=00a_5=00, a2=10a_2=10, a3=11a_3=11, a1=011a_1=011, a4=010a_4=010; Ly=2,23L_y=2{,}23; H=2,163H=2{,}163; Shannon darebbe 2,852{,}85.
  • (0,51;0,27;0,13;0,09)(0{,}51;0{,}27;0{,}13;0{,}09): nodi 0,22,0,49,10{,}22,0{,}49,1; 0,10,110,1110,10,110,111; Ly=1,71L_y=1{,}71.
  • Ottimalità: i due teoremi riducono il problema a uno con un simbolo in meno e probabilità pa+pbp_a+p_b. Per MyM_y simboli si uniscono MyM_y nodi (con simboli fittizi a probabilità 00).

Elias e codifica aritmetica

  • [0,1)[0,1) in NN intervalli di ampiezza pip_i (ordine fissato); mim_i punto medio; parola = prime li=⌈−log⁡2pi⌉+1\boxed{l_i=\lceil-\log_2p_i\rceil+1} cifre binarie di mim_i. A prefisso perché il troncamento dista meno di 2−li≤pi22^{-l_i}\le\frac{p_i}2 e resta nell'intervallo di aia_i.
  • Conversione: raddoppiare e prendere la parte intera; 0,012=140{,}01_2=\frac14, 0,1012=0,6250{,}101_2=0{,}625.
  • Esempio: m=0,255;0,645;0,845;0,955m=0{,}255;0{,}645;0{,}845;0{,}955 con l=2,3,4,5l=2,3,4,5 danno 01,101,1101,1111001,101,1101,11110; Ly=1,02+0,81+0,52+0,45=2,80L_y=1{,}02+0{,}81+0{,}52+0{,}45=2{,}80.
  • H+1≤Ly<H+2H+1\le L_y<H+2: subottimo. Si adatta (codifica aritmetica adattativa: codificatore e decodificatore aggiornano P(ai)P(a_i)).

Come si svolge un esercizio

  • Verificare che le probabilità sommino a 11 (altrimenti ricavare quella mancante).
  • Huffman: elenco dei nodi a ogni passo, parole, LyL_y con pesi, controllo con i nodi interni, confronto con HH (H≤Ly<H+1H\le L_y<H+1) ed efficienza η=HLy\eta=\frac H{L_y}.
  • Shannon: tabella −log⁡2p-\log_2p, ⌈⋅⌉\lceil\cdot\rceil, controllo di Kraft, LyL_y.
  • Elias: tabella intervallo, punto medio, lil_i, cifre binarie; Ly=LShannon+1L_y=L_{\text{Shannon}}+1.
  • Se un esercizio chiede "è un codice di Shannon?": confrontare le lunghezze con ⌈−log⁡2p⌉\lceil-\log_2p\rceil simbolo per simbolo.

Confronto su (0,51;0,27;0,13;0,09)(0{,}51;0{,}27;0{,}13;0{,}09), H=1,70H=1{,}70, limiti [1,70; 2,70)[1{,}70;\ 2{,}70):

  • Huffman 1,711{,}71 (η=0,995\eta=0{,}995); Shannon 1,801{,}80 (0,9450{,}945); Elias 2,802{,}80 (0,6070{,}607, oltre H+1H+1 ma sotto H+2H+2).

Catena sorgente →\to modulatore

  • Ts=1T_s=1 ms, Huffman Ly=1,71L_y=1{,}71: LyTs=1,71\frac{L_y}{T_s}=1{,}71 kbit/s, Tb=0,585T_b=0{,}585 ms.
  • Rate 34\frac34: Tc=34Tb=0,4386T_c=\frac34T_b=0{,}4386 ms (rate 22802280 bit/s); 16-QAM (4 bit per simbolo): T=TsRclog⁡2MLy=1⋅0,75⋅41,71=1,754\boxed{T=\frac{T_sR_c\log_2M}{L_y}}=\frac{1\cdot0{,}75\cdot4}{1{,}71}=1{,}754 ms (con arrotondamenti 1,741{,}74).

Errori tipici

  • Huffman unendo i nodi più probabili, o senza riordinare.
  • Etichette 0/10/1 incoerenti: una per ramo, lettura dalla radice.
  • LyL_y senza pesi, o contata come numero di rami.
  • Shannon ritenuto ottimo (solo con probabilità diadiche).
  • Elias senza il +1+1 o con conversione binaria sbagliata.
  • Tc=RcTbT_c=R_cT_b: il codice aggiunge bit, quindi Tc<TbT_c<T_b.

Domande tipiche

  • Huffman per (0,51;0,27;0,13;0,09)(0{,}51;0{,}27;0{,}13;0{,}09): 0,10,110,1110,10,110,111, Ly=1,71L_y=1{,}71.
  • Shannon (1,801{,}80) ed Elias (2,802{,}80), con limiti 1,70≤Ly<2,701{,}70\le L_y<2{,}70.
  • Teorema 1: meno probabile non è più corto.

Esercizi svolti. Esercizio - sensori di temperatura, codice di Huffman, porta seriale e informazione mutua (esercizi del corso, cap. 5, es. 56); Esercizio - Huffman, codice di Shannon, funzione deterministica di una sorgente e informazione mutua di un canale (secondo compitino del 9 gennaio 2026, es. 196); Esercizio - codice di Elias, Huffman sulla coppia di sorgenti e informazione mutua (compito del 22 gennaio 2019, es. 92); Esercizio - canale binario non simmetrico, informazione mutua, Huffman ed Elias sulle coppie e canale a cancellazione (compito del 10 febbraio 2021, es. 123).

Esercizi su questo argomento

Teoria collegata