Capitolo 9: Teoria dell’informazione e codifica di sorgente Su Capitolo 9: Teoria dell’informazione e codifica di sorgente Sezione 9.2: Sorgente discreta con memoria 

9.1 Codifica di sorgente discreta

Iniziamo l’analisi considerando una sorgente di informazione che produce sequenze x(n) composte da simboli xk appartenenti ad un alfabeto di cardinalità L (ossia con k = {1, 2, ⋯, L}), e che si presentano con probabilità pk = Pr(xk) non dipendente da n, ovvero la sorgente è stazionaria.
Sorgente senza memoria
Con questo termine si intende che i simboli vengono emessi in modo statisticamente indipendente (§ 6.1.5), ovvero indicando con xh, xk una coppia di simboli consecutivi (ossia x(n) = xh, x(n + 1) = xk), la probabilità del secondo non dipende dall’identità del primo, ossia p(xk ⁄ xh) = p(xk) = pk.
Misura dell’informazione
La conoscenza di ognuno dei simboli emessi xk apporta una quantità di informazione (espressa in bit) definita come[452]  [452]  Per calcolare il logaritmo in base 2, sussiste la relazione log2α = log10α log102 ≃ 3.322 ⋅ log10α. O più in generale, log2α = logβα logβ2
(10.216)
Ik = I(xk) = log2 1pk = − log2 pk      bit
che rappresenta il livello di dubbio a riguardo del verificarsi
figure f17.1.png
dell’evento xk prima che questo si verifichi, ovvero di quanto possiamo ritenerci sorpresi nel venire a conoscenza dell’evento xk, di cui riteniamo di conoscere la probabilità pk. Osserviamo infatti che la (10.216) attribuisce un valore di informazione tanto più elevato quanto minore è la probabilità di emissione del simbolo.
La scelta di esprimere la relazione tra probabilità e informazione mediante il logaritmo in base 2 consente di verificare le seguenti osservazioni:
Prob. pk Inf.  − log2pk Commento
1 0 L’evento certo non fornisce informazione
0 L’evento impossibile dà informazione infinita
12 1 Conoscere quale tra due eventi equiprobabili si sia verificato apporta un’informazione pari ad una cifra binaria (0 ⁄ 1) o bit = binary digit
12n n Es. probabilità 14 →  due bit, 18 →  tre bit ...
Notiamo inoltre che, essendo la sorgente senza memoria, due simboli emessi consecutivamente sono statisticamente indipendenti ovvero p(xhxk) = p(xh)p(xk) e dunque
I(xh, xk) = − log2phpk = − log2ph − log2pk = I(xh) + I(xk)

9.1.1 Entropia

Come in termodinamica al concetto di entropia si associa il grado di disordine in un sistema, così per una sorgente informativa l’entropia misura il livello medio di casualità dei simboli emessi. Definiamo infatti entropia (indicata con H) di una sorgente discreta S il valore atteso (§ 6.2.2) della quantità di informazione apportata dalla conoscenza dei simboli (scelti tra L possibili) da essa generati
(10.217) Hs = E{Ik} = Lk = 1pk Ik = Lk = 1pk log2 1pk    bit/simbolo
che, pesando in probabilità la quantià di informazione associata ai diversi simboli, rappresenta il tasso medio di informazione per simbolo espresso dalle sequenze osservabili. Come dimostriamo sotto, da tale definizione ne consegue che
Questi predicati possono essere riassunti dall’espressione
(10.218) 0 ≤ Hs ≤ log2L
Dimostrazione  Osserviamo innanzitutto che Hs ≥ 0 in quanto la (10.217) comprende tutti termini positivi o nulli, essendo log2α ≥ 0 per α = 1pk ≥ 1. Mostriamo ora che Hs − log2L ≤ 0: riscriviamo innanzitutto il primo membro della diseguaglianza come
(10.219)
Hs − log2L  = k pklog21 pk − log2Lk pk =  k pklog21 pk − log2L = k pklog21 Lpk
dato che kpk = 1, ove le sommatorie su k si intendono da 1 ad L . Esprimiamo poi questo risultato parziale nei termini di logaritmi naturali, tenendo conto che log2 α = ln αln 2, ovvero
(10.220) k pklog2 1Lpk = 1ln 2 k pkln 1Lpk
A questo punto utilizziamo
figure f17.1a.png
la relazione ln α ≤ α − 1 mostrata in figura, con l’uguaglianza valida solo se α = 1. Ponendo quindi α = 1 Lpk e sostituendo la (10.220) nella (10.219) si ottiene
Hs − log2L  =  1 ln 2 k pkln 1 Lpk  ≤  1 ln 2 k pk1 Lpk − 1 =   =  1 ln 2 k 1 L − k pk = 1 ln 2 (1 − 1) = 0
con il segno di uguale solo se 1Lpk = 1 ovvero pk = 1L.

9.1.1.1 Entropia di sorgente binaria

Nel caso particolare di una sorgente binaria, ovvero che emette uno tra due simboli {x0, x1} con probabilità rispettivamente p0 = p, p1 = q = 1 − p, la formula dell’entropia (10.217) fornisce l’espressione
(10.221)
Hb(p) = − plog2p − (1 − p)log2(1 − p)    bit/simbolo
il cui grafico è mostrato al lato sinistro di figura 9.2, in funzione di p.
figure f5.75.png
figure f5.76.png
Figure 9.2 Entropia di sorgente binaria e ridondanza associata
I due simboli {x0, x1} possono essere rappresentati dalle 2 cifre binarie {0, 1}, che in questo caso chiamiamo binit, per non confonderli con la misura dell’informazione (il bit). Osserviamo quindi che se p ≠ 0.5 si ottiene Hb(p) < 1, ossia la sorgente emette informazione con un tasso inferiore a un bit/simbolo, mentre a prima vista non potremmo usare meno di un binit per rappresentare ogni simbolo binario.

9.1.1.2 Ridondanza

Esprime la differenza D tra l’entropia di una sorgente Hs (10.217) ad L simboli ed il numero di binit[453]  [453] La notazione α indica l’intero superiore ad α: ad esempio con L = 10 occorrono M = log210 = 3.322 = 4 binit/simbolo, come se fosse stato L = 16. M = log2L necessario a rappresentarli, divisa per quest’ultimo, ovvero
(10.222) D = M − Hs M = 1 − Hs M ≤ 1
mostrata sempre in fig. 9.2 per il caso L = 2 al variare di p[454]  [454] Si noti la differenza: la ridondanza della codifica di sorgente indica la frazione di binit/simbolo che eccedono il valore dell’entropia, mentre la ridondanza della codifica di canale (pag. 1) indica il rapporto tra binit di protezione e quelli effettivamente emessi dalla sorgente..
Esempio Consideriamo un sorgente binaria con p0 = 0.8 (e p1 = 0.2). L’applicazione della (10.221) fornisce un valore Hb(0.8) = 0.8 log2 10.8 + 0.2 log2 10.2 = 0.72 bit/simbolo, minore del valore di 1 bit/simbolo che si sarebbe ottenuto nel caso di equiprobabilità. La relativa ridondanza D è pari a 1 − 0.721 = 0.28, ovvero il 28 %.

9.1.1.3 Entropia di sorgente L-aria

L’applicazione della (10.218) al caso di una sorgente che emette simboli non equiprobabili ed appartenenti ad un alfabeto di cardinalità L, determina per la stessa un valore di entropia HL < log2L bit/simbolo.
Esempio Nel caso di una sorgente quaternaria con p0 = 0.5, p1 = 0.25, p2 = 0.125, p3 = 0.125, l’applicazione della (10.217) fornisce H4 = 1.75 bit/simbolo, inferiore ai 2 bit/simbolo di una sorgente con quattro simboli equiprobabili. La relativa ridondanza è ora pari a 1 − 1.752 = 0.125 ovvero il 12.5 %.

9.1.2 Intensità informativa e codifica binaria

Svolgiamo ora alcune considerazioni relative alla possibilità di ridurre la ridondanza mediante una operazione di codifica (di sorgente). Consideriamo una sorgente discreta senza memoria con alfabeto ad L simboli, caratterizzata da una entropia di Hs bit/simbolo, e che emette i valori xk a frequenza fs simboli/secondo: il flusso informativo risultante consegue quindi una intensità o velocità di informazione pari a
(10.223) R = fsHs      bit/secondo
Volendo trasmettere tale informazione attraverso un canale binario (vedi § 17.1.1), l’elemento indicato in figura come codificatore binario fa corrispondere ad ogni simbolo xk un numero variabile di Nk binit[455]  [455] Mettere in corrispondenza i diversi simboli di sorgente con una loro codifica binaria è detta codifica per blocchi, discussa al § 9.1.4, dove si mostra anche la possibilità di produrre ogni parola di uscita in corrispondenza non di un unico simbolo di sorgente alla volta, ma come equivalente di più simboli. Raggruppando ad esempio M simboli binari si ottiene una nuova sorgente equivalente con L’ = 2M simboli., scelti in modo da utilizzare meno binit per i simboli più probabili (e più binit per quelli rari) come descritto nel seguito, producendo una velocità di trasmissione binaria di fb binitsec. Dal punto di vista del canale il messaggio è prodotto da una nuova sorgente equivalente, i cui simboli binari hanno probabilità p e 1 − p, e dunque caratterizzata da una entropia Hb(p)bitbinit ≤ 1. Dato che l’intensità informativa in ingresso fsHs ed in uscita fbHb(p) dal codificatore deve essere la stessa[456]  [456] Essendo biunivoca la corrispondenza tra il simbolo xk ed il gruppo di Nk binit, non vi è perdita o aggiunta di informazione. e che Hb(p) ≤ 1, la velocità binaria fb della sorgente binaria equivalente rispecchia il vincolo
(10.224)
fb   ≥   fbHb(p)   =   fsHs   =   R
Il rapporto N = fb fs ≥ Hs rappresenta il numero medio di binit emessi per ciascun simbolo della sorgente, e può essere valutato a partire dalle probabilità pk dei simboli xk e dal numero Nk di binit necessario a rappresentarlo, come valore atteso N = E{Nk} = kpkNk.

9.1.2.1 Teorema della codifica di sorgente

Noto anche come primo teorema di Shannon[457]  [457] Vedi ad es. http://it.wikipedia.org/wiki/Primo_teorema_di_Shannon, afferma che esiste un modo di scegliere gli Nk binit associati a ciascun simbolo xk tale che[458]  [458] In effetti la (10.225) sussiste qualora il codificatore non operi indipendentemente su ogni simbolo di sorgente, ma più in generale possa emettere i binit in corrispondenza di sequenze di xk via via più lunghe. Torneremo su questo aspetto al § 9.1.4, dove il teorema sarà dimostrato.
(10.225) Hs   ≤   N   ≤   Hs + ϵ
con ϵ piccolo a piacere, e che si annulla in corrispondenza della codifica ottima, per la quale risulta N = Hs. Ma non dice come fare, cosa di cui ci occupiamo ai §§ seguenti.

9.1.2.2 Codebook e codeword

Le operazioni svolte dal codificatore binario sono descritte nei termini della emissione di una parola di codice detta anche codeword, prelevata da un dizionario (o codebook) che descrive la collezione di tutte le possibili codeword.

9.1.2.3 Efficienza del codice

E’ la misura η di quanti bit di informazione sono trasportati da ogni binit di codifica[459]  [459] Ad esempio, un valore η = 0.33 indica che ogni binit trasporta solo 13 di bit di informazione., ed è definita come il rapporto tra l’entropia di sorgente Hs bitsimbolo ed il numero medio N di binitsimbolo emessi: in base alla (10.223) ed alla considerazione che fb = fsN si ottiene
(10.226)
η = Hs N = Hs fbfs = fsHs fb = R fb = Hb(p) ≤ 1     [bitbinit]
e pertanto η è anche pari al rapporto tra gli R bitsecondo di informazione della sorgente e la velocità di trasmissione fb binitsecondo prodotta dal codificatore.
Osservazione All’aumentare dell’efficienza, si assiste ad una contemporanea riduzione della ridondanza, potendo scrivere [460]  [460] Sebbene la (10.222) esprima la ridondanza come D = 1 − Hs M, dopo la codifica i simboli di sorgente sono rappresentati (in media) da N binit anziché M, dunque otteniamo η + D = Hs N + 1 − Hs N = 1. η + D = 1.
Sappiamo già che qualora i binit emessi a velocità fb assumano i valori 0 o 1 in modo equiprobabile, allora per la sorgente equivalente risulta Hb12 = 1, ovvero dalla (10.224) fb = R e dalla (10.226) N = Hs. Dunque il problema di individuare un codice ottimo diviene quello di trovare un insieme di codeword tali da rendere equiprobabili i valori dei binit, con il vincolo di mantenere il codice decifrabile, ovvero tale da rispettare la regola del prefisso. Ma andiamo con ordine.

9.1.3 Codifica con lunghezza di parola variabile

Mostriamo mediante un esempio
Simbolo Prob. Codeword Nk
x1 .5 0 1
x2 .25 10 2
x3 .125 110 3
x4 .125 111 3
come scegliendo codeword più lunghe per rappresentare i simboli meno probabili, e più corte per i simboli più frequenti, si può subito ottenere una migliore efficienza del codice. Consideriamo infatti la sorgente del secondo esempio a pag. 1, con alfabeto di cardinalità L = 4, ai cui simboli competono le probabilità riportate alla seconda colonna della tabella. In questo caso l’entropia vale
Hs  =  k pklog2 1pk =   =  1 2 log22 +  1 4 log24 +  2 8 log28 =  1 2  +  1 2  +  2 8 ⋅ 3 = 1.75    bit ⁄simbolo
Se il codificatore di sorgente adotta le codeword mostrate nella terza colonna, a cui corrispondono le lunghezze di Nk binit riportate nella quarta colonna, il numero medio di binit/simbolo prodotti dalla codifica binaria risulta pari a
(10.227)
N = E{Nk} = k Nkpk = 1 ⋅ 1 2 + 2 ⋅  1 4 + 3 ⋅  2 8 = 1.75    binit ⁄simbolo
Con queste codeword otteniamo dunque Hs = N, ovvero una efficienza η = 1! Intraprendiamo allora un ragionamento che ci porterà a concludere come questo sia un risultato per nulla scontato, e che dipende sia dalla particolare scelta fatta per le codeword, sia dal particolare tipo delle pk dell’esempio, tutte potenze negative di due (essendo 0.5 = 2−1, 0.25 = 2−2, 0.125 = 2−3).

9.1.3.1 Regola del prefisso

Affinché un insieme di codeword di lunghezza variabile possa assere adottato come codebook di sorgente, queste devono poter essere riconosciute come distinte presso il ricevitore, e ciò è possibile a patto che nessuna sia uguale all’inizio di una codeword più lunga. Si può mostrare che la condizione necessaria e sufficiente per avere un codice non ambiguo è che il numero di binit Nk con cui sono espresse le codeword soddisfi la disuguaglianza di Kraft[461]  [461] Vedi ad es. https://en.wikipedia.org/wiki/Kraft-McMillan_inequality, espressa come
(10.228) K = Lk = 12 − Nk ≤ 1
Esempio  Nella tabella sono riportati quattro possibili codici
Simb. pk A B C D
x1 .5 00 0 0 0
x2 .25 01 1 01 10
x3 .125 10 10 011 110
x4 .125 11 11 0111 111
N 2.0 1.25 1.875 1.75
K 1.0 1.5 0.9375 1.0
(A,B,C,D) per la sorgente quaternaria già discussa, assieme al corrispettivo valore di N e K. Il codice A corrisponde ad un codificatore particolarmente banale con Nk = N per tutti i k, dunque la (10.228) diviene K = L 2 − N ≤ 1 ed è soddisfatta a patto che N ≥ log2L: nel nostro caso, essendo L = 4 ed N = 2, si ottiene log2 L = 2 = N e quindi K = 1, dunque il codice è decifrabile (anche perché a lunghezza fissa), ma non particolarmente valido, in quanto l’efficienza espressa dalla (10.226) risulta pari a η = Hs N = 1.752 = 0, 875 < 1. Ma quando Hs < log2L come nel nostro caso, si può realizzare una efficienza migliore ricorrendo ad un codice a lunghezza variabile. Le codeword del codice B producono un valore K = 1.5 > 1, e dunque rappresentano un codice ambiguo[462]  [462] Ad esempio, la sequenza 10110010 potrebbe essere interpretata come x3x4x1x1x3 oppure x2x1x4x1x1x2x1 od anche x3x2x2x1x1x3: difatti, violano la regola del prefisso. Il codice C invece non è ambiguo[463]  [463] Nonostante il codice C non soddisfi la regola del prefisso, non è ambiguo in quanto lo zero indica comunque l’inizio di una nuova codeword. , essendo K < 1, ma presenta una efficienza Hs N = 0, 93 < 1 e dunque è anch’esso sub-ottimale. Infine, il codice D è quello analizzato al precedente paragrafo, ed effettivamente risulta una scelta ottima, dato che oltre a soddisfare la (10.228), consegue una efficienza Hs N = 1.

9.1.3.2 Codice ottimo

Indichiamo con questo termine un codice che oltre a soddisfare la regola del prefisso[464]  [464] Soddisfare la (10.228) con il segno di uguale è una condizione solamente necessaria, ma non sufficiente, per ottenere di un codice ottimo. consegue anche una efficienza (10.226) unitaria, ovvero Hs N=1. Perché ciò avvenga il valore pk delle probabilità di simbolo deve essere una potenza negativa di due, ovvero pk = 2 − Nk con Nk intero: in tal caso la (10.228) si scrive K = Lk = 1 2 − Nk = Lk = 1 pk = 1 e la diseguaglianza di Kraft è verificata con il segno di uguale, dunque è possibile individuare un codice non ambiguo.
Osserviamo inoltre che scegliendo la lunghezza delle codeword proprio pari a Nk = log2 1pk, l’espressione (10.227) che ne calcola la lunghezza media N = k pkNk coincide con quella (10.217) che fornisce Hs = k pklog2 1pk, ovvero ogni simbolo è codificato con una codeword lunga tanti binit quanti sono i bit di informazione che trasporta, determinando una efficienza η unitaria. Per individuare un codice che si avvicini a questa proprietà si può utilizzare la tecnica di Huffman presentata appresso, mentre per modificare le pk si ricorre alla codifica per blocchi di simboli esposta al § 9.1.4.

9.1.3.3 Codice di Huffman

E’ basato su di un algoritmo capace di individuare un codice a lunghezza variabile che soddisfa la regola del prefisso, adotta codeword più lunghe per i simboli meno probabili, e tenta di rendere equiprobabili le cifre binarie che compongono le codeword. L’algoritmo definisce[465]  [465] Vedi http://en.wikipedia.org/wiki/Huffman_coding un albero binario i cui rami sono etichettati con 1 e 0, che può essere realizzato attuando i seguenti passi:
Si può dimostrare che il codice di Huffman generato in questo modo è il migliore possibile nel caso in cui la statistica dei simboli di sorgente sia nota a priori, nel senso che produce un codebook con il minor numero possibile di binit/simbolo medi N, e le cui codeword allo stesso tempo soddisfano la regola del prefisso e la disuguaglianza di Kraft. La codifica di Huffman è ampiamente utilizzata nel contesto di altri metodi di compressione (metodo deflate di pkzip, § 9.2.3) e di codec multimediali (jpeg e mp3, cap. 10), in virtù della sua semplicità, velocità, ed assenza di brevetti.
Ovviamente ci deve essere un accordo a priori tra sorgente e destinatario a riguardo della corrispondenza tra parole di codice e simboli (o blocchi di simboli) della sorgente. Nel caso in cui ciò non sia vero, oppure nel caso in cui la statistica dei simboli della sorgente sia stimata a partire dal materiale da codificare, occorre inviare all’inizio della comunicazione anche la tabella di corrispondenza, eventualmente in forma a sua volta codificata.
Esempio  Una sorgente con L = 8 simboli è caratterizzata dalle probabilità di simbolo riportate alla figura seguente, a partire dalle quali si realizza un codice di Huffman mediante la costruzione grafica riportata, in cui le probabilità sono scritte in rosso, sotto i rami ed accanto ai simboli, mentre i binit sopra i rami, in blu.
Simb. pk CW
a1 0.05 0000
a2 0.1 0001
a3 0.1 100
a4 0.12 101
a5 0.13 001
a6 0.15 010
a7 0.15 011
a8 0.2 11
   
figure f17.2d.png
Dopo aver ordinato i simboli in base alle probabilità, si individuano i due nodi con probabilità più bassa come a1 e a2, che assommano prob. 0.15 e sono etichettati come nodo ➀; dunque la coppia ora meno probabile è a3 con a4, che cumula prob. 0.22 e si etichetta ➁. Quindi, le due prob. minori divengono quelle del nodo ➀ e del simbolo a5, che assommano a 0.28 generando il nodo ➂; il passo successivo è quello di accoppiare a6 con a7 generando il nodo ➃ a cui compete la prob. di 0.3. Gli ultimi tre passi vedono accoppiare ➁ con a8 producendo ➄ con prob. 0.42, quindi ➂ con ➃ generando ➅ con probabilità 0.58, ed infine ➄ con ➅ producendo il nodo radice a cui compete una prob. unitaria. Si può ora procedere, partendo dalla radice a destra, ad assegnare un binit pari a 0 o 1 ad ogni coppia di rami rispettivamente in alto ed in basso, ripetendo l’assegnazione seguendo le diramazioni verso sinistra, sopra le quali sono mostrate le codeword che si formano, di cui l’inizio in comune replica la configurazione assegnata al padre. Le codeword complete che compaiono sui rami più a sinistra sono quindi riportate alla terza colonna della tabella. Come è possibile verificare, il codice rispetta la regola del prefisso, in quanto nessuna delle codeword è uguale all’inizio di altre.
Osservazioni Se calcoliamo Hs, N e η per la sorgente ed il codice individuato, si ottiene Hs = 2.916, non molto meno del massimo log2L = 3 bit a simbolo, corrispondente a probabilità pk tutte uguali e pari a 18 = 0.125. Il codice consegue una lunghezza media di codeword pari a N = 2.95, e come osserviamo usa 3 binit per i 5 simboli con probabilità intermedia, il 15% delle volte usa 4 binit, ed il 20% due. Il codice consegue pertanto una efficienza η = HsN = 0.988, ovvero la sorgente codificata presenta una ridondanza D solamente del 1,2%.

9.1.3.4 Codifica dinamica (di Huffman)

L’esecuzione dell’algoritmo di Huffman richiede la preventiva stima della probabilità pk dei simboli, ottenuta a partire dal messaggio da codificare; inoltre, prima di trasmettere il messaggio codificato occorre inviare anche il codebook prodotto dall’algoritmo, per permettere al decodificatore di funzionare.
La variante adattiva dell’algoritmo di generazione del codice prevede invece di utilizzare valori pk stimati durante l’analisi del messaggio, con quelle k costruire l’albero, e con l’albero corrente codificare i simboli man mano che vengono presi in considerazione. Durante l’analisi e la codifica del messaggio le k si modificano, con esse l’albero, ed il codice. Lo stesso algoritmo adattivo è implementato anche al ricevitore, che sviluppa dal suo lato il medesimo albero, evitando così di dover trasmettere il codebook, e permettendo di adottare la tecnica anche per messaggi prodotti in tempo reale. Inoltre, nel caso in cui il messaggio non sia propriamente stazionario e le pk non si mantengano costanti nel tempo, l’adattività consente al codice di seguire tale variazioni e di conseguire in tal caso prestazioni anche migliori della tecnica statica[466]  [466] Per approfondimenti si veda
https://www2.cs.duke.edu/csed/curious/compression/adaptivehuff.html, mentre per una descrizione dell’algoritmo di Vitter http://en.wikipedia.org/wiki/Adaptive_Huffman_coding
.

9.1.4 Codifica per blocchi

Riprendiamo la discussione iniziata a pag. 1 relativa al codice binario ottimo per una sorgente L − aria senza memoria con simboli xk a probabilità pk, notando che se la lunghezza Nk della codeword associata ad xk viene scelta in modo tale che
(10.229) log2 1pk   ≤   Nk   ≤   log2 1pk + 1
si può mostrare che la disuguaglianza di Kraft (10.228) è soddisfatta[467]  [467]  Infatti se calcoliamo K = Lk = 12 − Nk per Nk pari ai due valori indicati in (10.229) otteniamo nel primo caso
Lk = 12 − log21 pk = Lk = 12log2pk = Lk = 1pk = 1
mentre nel secondo
Lk = 12 − (log21pk + 1) = Lk = 12log2pk ⋅ 2− 1 = 0.5Lk = 1pk = 0.5
Pertanto in entrambi i casi la disuguaglianza di Kraft K ≤ 1 è soddisfatta, e per valori intermedi si ottengono valori intermedi.
, e dunque è possibile realizzare un codice non ambiguo con tali codeword. Moltiplicando ora i membri di (10.229) per pk e sommando su k si ottiene
(10.230) Hs   ≤   N   ≤   Hs + 1
da cui si deduce che è possibile ottenere un’efficienza η = Hs N → 1 solo se Hs≫1, oppure se Nk ≃ log2 1pk (vedi nota 467).
Ma esiste anche un’altra possibilità: quella di raggruppare i simboli xk in blocchi
figure f17.2e.png
di n elementi, e considerare l’intero blocco come un unico simbolo di una nuova sorgente equivalente con alfabeto a Ln valori[468]  [468] Pari al numero di disposizioni con ripetizione di n oggetti estratti dagli elementi di un insieme di cardinalità L. Ad esempio, raggruppando due (n = 2) cifre decimali (L = 10), si ottiene un numero da 0 a 99, ovvero un simbolo ad L2 = 100 valori. , come rappresentato in figura. Essendo la sorgente senza memoria i suoi simboli sono indipendenti, e quindi si dimostra[469]  [469] Indicando con y la v.a. discreta in uscita dalla sorgente a blocchi, essa risulta di tipo multivariato (§ 6.2.6), le cui le v.a. marginali sono i simboli x emessi dalla sorgente originale. L’indipendenza statistica di questi ultimi consente di scrivere Pr{y} = Pr{x1}Pr{x2}Pr{xn} in cui i valori xi sono quelli dei simboli originali che compongono y. L’entropia Hbloccos della sorgente a blocchi è definita come valore atteso dell’informazione I(y) = − log2Pr(y), e in base alla proprietà del logaritmo di un prodotto possiamo scrivere log2Pr(y) = log2Pr(x1) + log2Pr(x2) + ⋯ + log2Pr(xn), ottenendo cioè che I(y) è pari alla somma dell’informazione legata ad ogni valore x che partecipa a comporre y. Pertanto si ottiene
Hbloccos  = E{I(y)} = E{ − log2Pr(x1) − log2Pr(x2) − ⋯ − log2Pr(xn)} =   = nj = 1E{ − log2Pr(x)} = nHs
ovvero l’entropia della sorgente equivalente è esattamente pari alla somma di quella dei simboli che rappresenta.
che l’entropia della nuova sorgente è n volte quella originale, ossia Hbloccos = nHs. Il risultato (10.230) quindi ora si scrive come nHs ≤ nN ≤ nHs + 1 in cui nN è il numero medio di binit per blocco, e dividendo per n, otteniamo infine
(10.231) Hs   ≤   N   ≤   Hs + 1n
che rappresenta una forma di dimostrazione del teorema (10.225) con ϵ = 1 n, e che permette di ottenere N → Hs se n → ∞, avvicinandosi alle condizioni di codifica ottima per qualsiasi distribuzione delle pk.
Esercizio Per applicare questo metodo ad un caso pratico, consideriamo una sorgente binaria senza memoria che emette simboli xk con probabilità pk mostrata in tabella. Per ogni coppia di simboli il blocco serie/parallelo
Simbolo Prob. Codeword
x1 0.8 1
x2 0.2 0
x1x1 → y1 0.64 0
x1x2 → y2 0.16 10
x2x1 → y3 0.16 110
x2x2 → y4 0.04 111
della fig. precedente emette un simbolo quaternario yh a cui (in virtù dell’indipendenza statistica tra i simboli xk) compete la probabilità ottenuta moltiplicando le probabilità della coppia xixj associata. Codifichiamo quindi i simboli yh con il codice a lunghezza variabile introdotto al § 9.1.3 , e ricalcoliamo il numero medio di binit/simbolo N, che risulta pari a
N = 1 ⋅ 0.64 + 2 ⋅ 0.16 + 3 ⋅ 0.16 + 3 ⋅ 0.04 = 1.58     binit
ogni 2 simboli, ossia pari ad una media di 0.79 binit/simbolo binario, mentre in assenza di codifica a blocchi non avremmo potuto utilizzare meno di 1 binit/simbolo binario. Al crescere della dimensione di blocco n si può verificare come N si avvicini sempre più al valore dell’entropia della sorgente binaria Hb = 0.72 calcolato a pag. 1, ovvero dimostrare l’eq. (10.231).

9.1.4.1 Compromesso velocità-ritardo

Come indicato dalla (10.231), realizzando blocchi via via più lunghi è possibile ridurre la velocità media di codifica Nfs (in binit/sec) rendendo N sempre più vicino all’entropia, ovvero
min [N] = Hs + ε
in cui ε → 0 se la lunghezza n del blocco tende ad infinito. D’altra parte, all’aumentare della dimensione del blocco aumenta di egual misura il ritardo che intercorre tra l’emissione di un simbolo e la sua codifica, e di questo va tenuto conto, nel caso sussistano dei vincoli temporali particolarmente stringenti sulla consegna del messaggio.
Riassumendo
Qualora una sorgente discreta ad L simboli esibisca un valore di entropia inferiore a log2L, la velocità binaria Nfs in uscita dal codificatore di sorgente può essere ridotta e resa prossima all’intensità informativa R (eq. (10.223)) adottando una codifica a blocchi di lunghezza via via crescente, e utilizzando per i nuovi simboli compositi un opportuno codice di Huffman.
Esercizio Sperimentare la costruzione di un codice di Huffman basato sul raggruppamento di tre simboli della sorgente binaria dell’esercizio precedente, e verificare se il numero medio di binit/simbolo binario N riesce ad avvicinarsi ancora di più al valore dell’entropia della sorgente binaria pari a 0.72 bit/binit.
 Capitolo 9: Teoria dell’informazione e codifica di sorgente Su Capitolo 9: Teoria dell’informazione e codifica di sorgente Sezione 9.2: Sorgente discreta con memoria