Sunteți pe pagina 1din 11

Universitatea Tehnică “Gheorghe Asachi” din Iaşi

Facultatea de Electronică, Telecomunicaţii şi Tehnologia Informaţiei


Tehnici de Compresie a Semnalelor Multimedia

Lucrarea de laborator nr. 2

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ă.

2.1 Clasificarea algoritmilor de compresie fără pierderi


Algoritmii de compresie de date fără pierderi pot fi încadrați în una din următoarele
categorii:

1) Algoritmi statici, care se bazează pe o statistică bine cunoscută a sursei sau un


model al acesteia, și dau rezultate bune în cazul în care statistica reală a sursei este
asemănătoare cu cea presupusă. În caz contrar, rezultatul poate fi o extensie în loc de
o compresie. Algoritmul Huffman static se înscrie în această categorie.

2) Algoritmi semi-adaptivi sau în două treceri, care apelează în prealabil la par-


curgerea întregii secvențe furnizate de sursă pentru a determina statistica (frecvența)
mesajelor. Acești algoritmi oferă rezultate bune pentru orice tip de sursă, dar nu pot
fi folosiți într-o transmisiune în timp real.

3) Algoritmi adaptivi, care necesită o singură parcurgere a secvenței și nu necesită


cunoașterea prealabilă a statisticii mesajelor, fiind astfel potriviți pentru orice tip de
sursă. Algoritmul Huffman adaptiv ce va fi prezentat în această lucrare se înscrie
în această categorie. Tehnicile adaptive au ca idee estimarea statisticii sursei și con-
struirea unui ”dicționar de codare” al mesajelor sursei în paralel cu codarea pentru
compresie a secvenței furnizate de sursă. Acest dicționar se va construi identic la
recepție, pe baza informației recepționate.

1
Tehnici de Compresie a Semnalelor Multimedia 2. Codarea Huffman

2.2 Codarea Huffman statică binară


Algoritmul de codare Huffman (apărut în 1952) furnizează o codare optimală pentru o
sursă cu mesaje independente și cu o statistică cunoscută, în sensul că nici un alt algoritm nu
asigură o lungime medie a cuvintelor de cod mai mică. Sunt situații în care și alți algoritmi
pot conduce la o lungime medie egală cu cea dată de algoritmul Huffman, dar niciodată mai
mică.
Algoritmul constă în următorii pași:

1) Ordonarea celor N mesaje ale sursei în ordine descrescătoare a probabilităților.

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 ).

3) Eliminarea celor două mesaje și includerea mesajului reunit r1 în mulțimea celorlalte


mesaje, în ordinea descrescătoare a probabilităților.

4) Repetarea algoritmului de restrângere până când ultimul șir ordonat conține doar două
mesaje.

5) Cuvintele de cod corespunzătoare fiecărui mesaj se obțin în felul următor:

• î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.2.1 Codarea Huffman statică de dispersie minimă și maximă


În cadrul algoritmului Huffman static prezentat mai sus, se poate întâmpla ca probabili-
tatea unui mesaj reunit să fie egală cu probabilitatea unui alt mesaj (reunit sau nu). În acest
caz, ordonarea în ordinea descrescătoare a probabilităților nu mai este unică, mesajele cu
aceeași probabilitate putând fi aranjate în orice ordine. Indiferent de cum se alege ordonarea
în acest caz, codurile rezultate vor avea aceeași lungime medie a cuvintelor de cod. Cu toate
acestea, dispersia lungimilor cuvintelor de cod poate varia.
Se poate demonstra că în cazul în care mesajul reunit se ordonează întotdeauna înaintea
tuturor mesajelor existente cu aceeași probabilitate, dispersia lungimilor cuvintelor de cod
va avea o valoare minimă. Similar, dacă mesajul reunit se plasează întotdeauna după toate
celelalte mesaje existente de aceeași probabilitate, dispersia lungimilor cuvintelor de cod va
avea o valoare maximă.
În cazul în care nu se întâmplă ca probabilitatea vreunui mesaj reunit să fie egală cu
a altui mesaj, nu există nici o libertate în aranjarea descrescătoare a probabilităților, și

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

b). Să se determine eficiența codării și factorul de compresie.

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

s5 0.10 0110 0.15 011

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

2.3 Codarea Huffman adaptivă binară


În descrierea codării Huffman adaptive se vor folosi următoarele notații și noțiuni, cu
referire la graful unui cod Huffman:

• nodurile terminale din graful arborescent se vor numi frunze, corespunzând mesajelor
sursei;

• cuvântul de cod pentru un mesaj se obține parcurgând arborele de la rădăcină la frunza


corespunzătoare mesajului. Prin convenție, ’0’ se va aloca unei ramuri din stânga și
’1’ unei ramuri din dreapta;

• 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;

• un bloc reprezintă totalitatea nodurilor care au aceeași pondere;

• dacă sursa ce urmează a fi codată furnizează n mesaje, în graf există 2n + 1 noduri


interne și externe, numerotate în continuare y1 , . . . , y2n+1 . Nodurile y2j−1 și y2j sunt fii
ai aceluiași nod părinte, iar numărul de ordine al părintelui este mai mare decât y2j−1
și y2j ;

• dacă pj este ponderea nodului cu numărul yj , trebuie să existe relația p1 ≤ p2 ≤ · · · ≤


p2n+1 . Cu alte cuvinte, secvența ponderilor trebuie să fie în ordine crescătoare.

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.3.1 Algoritmul de codare


Algoritmul de compresie pentru codarea Huffman adaptivă presupune parcurgerea urmă-
torilor pași:

1) Se inițializează arborele de codare cu un nod rădăcină.

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.

4) Se citește următorul mesaj din secvență:

• 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.3.2 Algoritmul de decodare


Algoritmul de decompresie pentru codarea Huffman constă în parcurgerea următorilor
pași, prin care se reface pas cu pas arborele de la algoritmul de compresie:

1) Se inițializează arborele de codare cu un nod rădăcină.

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

2.3.3 Actualizarea arborelui: varianta FGK


În lucrarea de față, actualizarea arborelui se face prin metoda propusă de Faller, Gallager

și Knuth. Varianta FGK urmărește minimizarea lungimii în biți a mesajului codat, j pj lj ,
unde pj reprezintă ponderea frunzei asociată mesajului sj (numărul de apariții ale mesajului
sj ), iar lj lungimea codului asociat frunzei respective. Dacă reactualizarea arborelui se face
după procedeul de mai jos, atunci această minimizare este asigurată.
Se presupune că suntem la pasul algoritmului Huffman dinamic în care s-a citit mesajul
numărul i din secvență, ti . Nodurile din arborele Huffman construi până în acest moment
sunt numerotate descrescător începând cu (2n+1), unde n este numărul de mesaje ale sursei,
numărul maxim (2n + 1) fiind atribuit nodului rădăcină. Fiecare nod este caracterizat de
o pondere. Pentru nodurile frunză asociate unui mesaj, ponderea reprezintă numărul de
apariții până în acest moment, în timp ce ponderea nodurilor interne este suma ponderilor
celor două nodurilor descendente. Nodul gol este singurul nod din arbore care are ponderea
zero.
Schema logică a procesului de reactualizare a arborelui este prezentată în Fig. 1 și constă
din următorii pași.

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.

2) Se incrementează ponderea nodului asociat mesajului ti . Apoi se trece la nodul părinte.


Se verifică dacă numărul acestuia este maxim în cadrul blocului său (bloc = totalitatea
nodurilor care au aceeași pondere). Dacă nu, acesta se interschimbă cu nodul cu cel
mai mare număr de ordine din bloc. Se incrementează ponderea nodului părinte, apoi
se trece la nodul părinte al acestuia, și procedura se repetă până se ajunge la nodul
rădăcină.

Observația 1. Conform pasului 2, ponderea oricărui nod părinte nu se incrementează


decât după ce s-a verificat că nodul respectiv are numărul maxim în bloc, în caz contrar
efectuându-se în prealabil interschimbarea cu nodul cu numărul maxim din bloc, pentru a
asigura această condiție.
Observația 2. Interschimbarea a două noduri include ponderile lor și întregii sub-arbori
descendenți din aceștia, cu toate ponderile și numerele de ordine ale tuturor nodurilor deri-
vate. Numerele de ordine ale celor două noduri nu se interschimbă, altfel condiția de a avea
numărul maxim în bloc nu poate fi îndeplinită.

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

Este acesta Nu Mergi la


nod radacina? nodul parinte

Da

Stop

Figura 1: Procedura FGK de actualizare a arborelui


7
Tehnici de Compresie a Semnalelor Multimedia 2. Codarea Huffman

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?

Exercițiul 9 Codare fișiere


Efectuați compresia unui fișier text (.txt), a unui fișier imagine (.bmp), a unui fișier audio
(.wav) și a unui fișier executabil (.exe) furnizate în pachetul Matlab aferent lucrării. Care
este raportul de compresie în fiecare caz? Comentați.

4 Întrebări finale
1. Este benefică codarea Huffman a unei surse cu mesaje echiprobabile?

2. De ce se obțin dispersii diferite în funcție de poziționarea elementelor cu aceeași pro-


babilitate (plasarea pe pozițiile cele mai de sus sau cele mai de jos din listă)?

3. Cum credeți că va fi dispersia sursei codate în cazul când poziționarea elementelor cu


aceeași probabilitate se face fără o regulă sistematică (de ex. se alternează poziția cea
mai de sus și cea mai de jos)?

4. Comentați evoluția codului corespunzător caracterului a în secvența din Exemplul 2.


Cum evoluează lungimea sa?

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

Figura 2: Exemplul 2 - Actualizarea arborelui

10
Tehnici de Compresie a Semnalelor Multimedia 2. Codarea Huffman

Figura 3: Exemplul 2 - Actualizarea arborelui (continuare)

11

S-ar putea să vă placă și