Documente Academic
Documente Profesional
Documente Cultură
Codarea Huffman
1 Obiectivul lucrării
Lucrarea își propune familiarizarea cu unii dintre algoritmii de codare entropică cei mai
utilizați, algoritmul Huffman static și cel adaptiv în varianta FGK, precum și prezentarea
unei implementări pe calculator care ilustrează modul de compresie.
2 Noțiuni teoretice
Algoritmii de codare entropică se folosesc pentru codarea mesajelor unei surse de in-
formație complete, discrete și fără memorie, a cărei statistică este cunoscută sau poate fi
aproximată.
1
Tehnici de Compresie a Semnalelor Multimedia 2. Codarea Huffman
2) Formarea din ultimele două mesaje a unui mesaj restrâns r1 = sN −1 ∪ sN având pro-
babilitatea p(r1 ) = p(sN −1 ) + p(sN ).
4) Repetarea algoritmului de restrângere până când ultimul șir ordonat conține doar două
mesaje.
• în cadrul ultimului șir ordonat cu doar două mesaje, unui mesaj i se alocă simbolul
’0’, iar celuilalt simbolul ’1’;
• se trece la șirul ordonat anterior, transferând mesajelor simbolurile deja alocate la
pasul precedent. Pentru cele două mesaje reunite într-un mesaj comun, se adaugă
’0’ sau ’1’ în continuarea simbolurilor mesajului reunit. Operația continuă până
când se ajunge la primul șir ordonat format din mesajele inițiale ale sursei.
Succesiunile de simboluri care corespund mesajelor inițiale ale sursei reprezintă cuvintele
de cod ale acestora.
2
Tehnici de Compresie a Semnalelor Multimedia 2. Codarea Huffman
va exista o singură valoare a dispersiei lungimilor cuvintelor de cod pentru codul Huffman
obținut.
Exemplul 1
a). Să se codeze prin algoritmul Huffman static binar sursa caracterizată de următoarea
distribuție: ( )
s1 s2 s3 s4 s5 s6
S:
0.3 0.25 0.15 0.15 0.10 0.05
Soluție
a). Codarea Huffman statică a sursei este redată în tabelul următor:
si P(si ) ci
0.60 0
0.40 0.40 1
00
s1 0.30 0.30 0.30 0.30 00
0.30 0.30 01
10
s2 0.25 0.25 0.25 10
11
s3 0.15 0.15 0.15 11
010
s4 0.15 0.15 010
s6 0.05 0111
Cuvintele de cod corespunzătoare celor 6 mesaje ale sursei sunt scrise în coloana ci
din tabelul de mai sus.
∑6
b). Lungimea medie a cuvintelor de cod: l = p(si ) · li = 2.45 <biți/mesaj>.
i=1
∑6
Entropia sursei informaționale S: H(S) = − p(si ) · log2 (p(si )) = 2.39 <biți/mesaj>.
i=1
H(S) 2.35
Eficiența codării: η = = = 0.98 = 98%
l 2.45
lu 3
Factorul de compresie: FC = = = 1.22, unde lu reprezintă numărul de biți
l 2.45
necesari reprezentării mesajelor necomprimate, lu = ⌈log2 (N )⌉, unde N este numărul
de mesaje al sursei S, iar funcția ⌈x⌉ reprezintă cel mai mic întreg mai mare sau egal
cu x (partea întreagă superioară).
3
Tehnici de Compresie a Semnalelor Multimedia 2. Codarea Huffman
• nodurile terminale din graful arborescent se vor numi frunze, corespunzând mesajelor
sursei;
• nodurile de la extremitățile ramurilor care pleacă dintr-un nod reprezintă fiii sau copiii
nodului respectiv, numit nod părinte;
• fiecare nod are atașat un număr intitulat pondere. Ponderea unui nod frunză este
numărul de apariții ale mesajului corespunzător frunzei respective până la acel moment.
Ponderea unui nod intern este suma ponderilor fiilor nodului respectiv;
Ultimele două caracteristici se numesc de fraternitate și orice arbore care are această
proprietate este un arbore Huffman.
Ideea principală în codarea Huffman adaptivă este aceea că arborele (graful) codului
este actualizat după fiecare mesaj codat, plecându-se inițial de la un singur nod rădăcină.
Astfel, pentru codarea mesajului cu numărul i din secvență se folosește un arbore de codare
construit pe baza celor i − 1 mesaje precedente din mesaj. După transmiterea mesajului
i, arborele de codare se actualizează, și noul arbore este folosit pentru codarea mesajului
următor i + 1. Există mai multe implementări ale algoritmului Huffman adaptiv, care diferă
între ele prin modul de actualizare a arborelui. În această lucrare se va prezenta metoda de
actualizare propusă de Faller, Gallager și Knuth (FGK).
2) Se transmite primul mesaj în clar (de ex. codul ASCII al unei litere).
4
Tehnici de Compresie a Semnalelor Multimedia 2. Codarea Huffman
3) Se construiesc încă două noduri (frunze) care pornesc din nodul rădăcină, unul la
stânga, care nu conține nici un simbol și căruia i se atașează ponderea nulă (frunză
goală) și unul la dreapta care conține simbolul apărut, ponderea acestuia devenind
egală cu 1.
• dacă mesajul este deja în arbore se transmite codul său din arbore. Codul mesa-
jului se formează citind simbolurile de ’0’ respectiv ’1’ atașate ramurilor, pornind
de la nodul rădăcină până la nodul în care se află mesajul. Apoi se trece direct
la pasul 5;
• dacă mesajul nu este în arbore se transmite codul nodului terminal care nu conține
nici un simbol (frunză goală) urmat de codul în clar (de ex. ASCII) al mesajului.
Codul nodului fără nici o literă se formează ca și în cazul nodului care conține o
literă.
5) Se actualizează arborele (vezi procedura din subsecțiunea 2.3.3). Dacă secvența s-a
terminat, atunci codarea este terminată. În caz contrar se reia procedeul începând cu
pasul 4.
2) Se decodează primul mesaj transmis în clar (de ex. codul ASCII al literei).
3) Se construiesc încă două noduri care pornesc din nodul rădăcină, unul la stânga, care
nu conține nici un mesaj și căruia i se atașează ponderea nulă, și unul la dreapta, care
conține mesajul recepționat, ponderea acestuia devenind egală cu 1.
4) Se citește codul recepționat, bit cu bit. Se parcurge arborele pornind din nodul rădă-
cină, biții de ’0’ și ’1’ recepționați indicând ramurile care se aleg la parcurgere, până
când se ajunge la un nod frunză:
• dacă nodul frunză respectiv este nodul care nu conține nici un mesaj, se citește
următorul mesaj în clar, apoi se trece la pasul 5;
• dacă nodul frunză respectiv este atașat unui mesaj, atunci acesta este mesajul
decodat din codul recepționat.
5) Se reactualizează arborele (vezi procedura mai jos). Dacă secvența recepționată s-a
terminat, atunci decodarea este terminată, iar în caz contrar se reia procedeul începând
cu pasul 4.
5
Tehnici de Compresie a Semnalelor Multimedia 2. Codarea Huffman
1) Dacă mesajul curent ti este deja în arbore, se trece la pasul 2. Dacă mesajul curent ti
nu există încă în arbore, atunci se creează două noduri derivate din nodul gol, care se
notează cu numerele de ordine imediat inferioare celor existente. Nodului din dreapta
i se asociază noul mesaj ti , în timp ce nodul din stânga rămâne nod gol.
Exemplul 2
Să se codeze prin algoritmul Huffman adaptiv binar mesajul abcdaaba. Să se determine
factorul de compresie obținut.
6
Tehnici de Compresie a Semnalelor Multimedia 2. Codarea Huffman
Start
Nodul gol
da nastere Da Prima aparitie
unui nou nod a mesajului?
gol si unui
nod extern
Nu
Incrementeaza
ponderea
Mergi la
nodului
nodul extern
extern si a
al mesajului
vechiului
nod gol
Schimba
Mergi la Numarul nodul cu cel
Nu
vechiul nodului este care are cel
nod gol maxim in bloc? mai mare
numar in bloc
Da
Incrementeaza
ponderea
nodului
Da
Stop
Soluție
Evoluția arborelui de codare Huffman este prezentată în Fig. 2 și Fig. 3. Secvența binară
obținută în final este:
a0b00c100d1011100
Considerând că literele transmise în clar a,b, c, d necesită 5 biți fiecare (sunt 26 de litere
în total, log2 (⌈26⌉) = 5), atunci numărul total de biți din secvența comprimată este 33, în
timp ce secvența necomprimată ar necesita 5 ∗ 8 = 40 biți. Prin urmare:
40
Factorul de compresie: FC = .
33
3 Desfășurarea lucrării
Se vor folosi următoarele funcții Matlab atașate lucrării, care implementează metode de
codare Huffman semi-adaptivă: huffdict() pentru crearea unui cod Huffman, huffcod()
pentru codarea unui fișier folosind un cod creat în prealabil, huffdecod() pentru decodarea
unui fișier codat. De asemenea, se va folosi și executabilul Simulare_codare_Huffman.exe.
Exercițiul 1
Fie sursa informațională S caracterizată de distribuția:
( )
s1 s2 s3 s4 s5 s6 s7 s8
S:
0.22 0.11 0.03 0.04 0.11 0.04 0.23 0.22
Să se realizeze o codare binară Huffman statică de dispersie minimă și maximă. Pentru
fiecare caz:
• desenați graful codului;
• calculați lungimea medie a cuvintelor de cod;
• calculați dispersia lungimilor cuvintelor de cod;
• calculați eficiența codării și factorul de compresie.
Exercițiul 2
Pentru secvența “bcdeaaddee” desenați evoluția arborelui de codare dinamică Huffman
FGK și determinați secvența binară codată. Calculați raportul de compresie obținut.
Exercițiul 3
Decodați următoarea secvență codată Huffman dinamic FGK “a10r00d10010011010”.
Exercițiul 4
Folosind programul de codare Huffman atașat, efectuați o compresie a fișierului “tex-
tro.txt”. Care este rata de compresie obținută? Ce rată de compresie se obține efectuând o
compresie uzuală .zip? Cum credeți că se explică diferența?
8
Tehnici de Compresie a Semnalelor Multimedia 2. Codarea Huffman
Exercițiul 5
Compresați același fișier “textro.txt” dar selectând opțiunea utilizării simbolurilor de câte
două caractere. Care este noua rată de compresie?
Exercițiul 6
Efectuați compresia Huffman a fisierului în limba română “textro.txt” și apoi a fișierului
în limba engleză “texten.txt”. Care sunt ratele de compresie obținute? Dar dacă utilizați
codul obținut din fișierul în limba română pentru codarea textului în engleză, și viceversa?
Explicați diferența dintre ratele de compresie. Cum vor fi diferențele dacă simbolurile sunt
formate din două caractere?
Exercițiul 7
Introduceți o eroare în fișierul comprimat și apoi rulați programul de decompresie. Ce se
obține la decodare? Ce soluții ați putea imagina pentru a limita propagarea erorilor?
Exercițiul 8
Efectuați compresia Huffman a unui fișier deja comprimat. Cum este câștigul obținut?
4 Întrebări finale
1. Este benefică codarea Huffman a unei surse cu mesaje echiprobabile?
5. Pentru Exemplul 2, cum credeți că va evolua codul pentru litera d dacă aceasta urmează
să apară de 6 ori în continuarea secvenței date?
9
Tehnici de Compresie a Semnalelor Multimedia 2. Codarea Huffman
10
Tehnici de Compresie a Semnalelor Multimedia 2. Codarea Huffman
11