Sunteți pe pagina 1din 9

Obiectivul lucrării

Stocarea și transmisia digitală a datelor necesită conversia informației transmise de sursă în


biți. Creșterea e 7cienței transmisiunii impune codarea sursei primare, operație ce conduce la
maximizarea transinformației. Lucrarea are ca scop introducerea noțiunilor legate de codarea
surselor discrete si prezentarea algoritmilor folosiți uzual pentru implementarea codării:
Shannon Fano si Huffman.

Aspecte teoretice
Scopul principal al codării de surs este să permită trecerea de la alfabetul sursei la alfabetul
canalului. Cazurile în care efectul perturbațiilor asupra transmisiei datelor este nesemni cativ
(transmisii la distanțe mici, putere de emisie mare, etc) impun codarea surselor discrete de
informație astfel încât să facă posibilă transmisia pe canal într-un timp cât mai scurt.

În plus, datele furnizate de o sursă discretă sunt adesea redundante. Conectarea directă a
unei asemenea surse la canalul de comunicație conduce la utilizarea neeconomică a
acestuia. Distribuția de probabilitate a simbolurilor emise nu poate asigura entropia maximă
a sursei și, ca urmare, canalul nu poate utilizat la capacitatea sa, chiar dacă nu este afectat
de perturbații, ceea ce conduce la o e ciența redusă a transmisiunii în ansamblu.

Pentru a asigura prin canal transinformația la valoarea sa maximă, este necesar ca sursa
primară să
7e transformată, prin operația de codare, într-o sursă secundară , speci7 catde setul de
probabilități care maximizeaz transinformația (entropia sursei secundare cât mai apropiat de
cea maximă). Se introduce astfel un codor ce va realiza adaptarea statistică a sursei la
canalul de comunicație. Acesta implementează o codare compactă, care generează cuvinte
de cod într-o reprezentare cu un numar de biți cât mai mic, optim în raport cu un criteriu de
compactare adecvat. Acest criteriu va lua în considerare maximizarea entropiei și
posibilitatea realizării unei decodări sigure și facile la recepție.

Fie sursa primară descrisă de alfabetul [𝑆] ce conține 𝑁 simboluri a căror distribuție de
probabilitati este [𝑃𝑆 ] :
[𝑆] = [𝑠1 , 𝑠2 , . . . . . 𝑠𝑁 ]
[𝑃𝑆 ] = [𝑝(𝑠1 ), 𝑝(𝑠2 ), . . . . . 𝑝(𝑠𝑁 )]
Sursa secundară este descrisă de alfabetul [𝑋] ce include 𝐷 simboluri și distribuția de
probabilități [𝑃𝑋 ] :
[𝑋] = [𝑥1 , 𝑥2 , . . . . . 𝑥𝐷 ]
[𝑃𝑋 ] = [𝑝(𝑥1 ), 𝑝(𝑥2 ), . . . . . 𝑝(𝑥𝐷 )]
Se alocă 7ecărui simbol 𝑠𝑖 din alfabetul sursei primare, prin codare compactă, un cuvânt de
cod 𝑐𝑖 , de lungime 𝑙𝑖 , format din literele 𝑥𝑘 , 𝑘 = 1, . . . 𝐷 . Codul astel obținut este:
[𝐶] = [𝑐1 , 𝑐2 , . . . . . 𝑐𝑁 ] .
𝑠𝑖 ∈ 𝑆    ⟹    𝑐𝑖 ∈ 𝐶
Prin codare se urmărește e7ciența transmisiei informației. În cazul canalelor fără zgomot
mărirea e7cienței presupune minimizarea unei anumite funcții de cost, cea mai simplă
funcție 7ind cea care asociază costului 𝑡𝑖 durata cuvântului. Considerând faptul ca prețul
exploatării unui sistem de transmisiune poate 7 estimat ca 7ind aproximativ liniar crescător
cu timpul, costul mediu pe mesaj devine:
𝑁 𝑛
⎯⎯⎯⎯
∑ ∑
𝐶= 𝑡𝑖 ⋅ 𝑝(𝑐𝑖 ) = 𝑡𝑖 ⋅ 𝑝(𝑠𝑖 )
𝑖=1 𝑖=1

Dacă toate literele 𝑥𝑖 din alfabetul [𝑋] al codului au aceeași durata 𝜏 care se poate
considera egală cu unitatea (𝜏 = 1) atunci:
𝑡𝑖 = 𝑙𝑖 ⋅ 𝜏
adică durata unui cuvânt este egală cu numărul de litere care formează acel cuvant 𝑐𝑖 , costul
⎯⎯
mediu 7ind astfel asociat cu lungimea medie 𝑙 a unui cuvant de cod.
𝑛
⎯⎯⎯⎯ ⎯⎯

𝐶= 𝑙𝑖 ⋅ 𝑝(𝑠𝑖 ) = 𝑙
𝑖=1

Creșterea e7cienței se poate obține printr-o atribuire convenabilă a cuvintelor de cod 7ecărui
mesaj al sursei primare, luându-se în considerare distribuția de probabilități a sursei.

Limita inferioară a lungimii medii a unui cuvănt de cod

Fie o sursă 𝑆 , caracterizată de alfabetul [𝑆] = [𝑠1 , 𝑠2 . . . . . 𝑠𝑁 ] cu distribuția de


probabilități [𝑃𝑆 ] = [𝑝(𝑠1 ), 𝑝(𝑠2 ), . . . . . 𝑝(𝑠𝑁 )] și un cod [𝐶] = [𝑐1 , 𝑐2 . . . . . 𝑐𝑁 ] , ale
cărui cuvinte apar cu aceleași probabilități ca mesajele sursei 𝑝(𝑐𝑖 ) = 𝑝(𝑠𝑖 ) . Lungimile
cuvintelor de cod sunt: [𝐿] = [𝑙1 , 𝑙2 . . . . . 𝑙𝑁 ] unde 𝑙𝑖 este numărul de litere din alfabetul
codului [𝑋] = [𝑥1 , 𝑥2 . . . . . 𝑥𝐷 ] care compun cuvântul 𝑐𝑖 .

Entropia sursei este:


𝑁


𝐻(𝑆) = 𝐻(𝐶) = − 𝑝(𝑠𝑖 ) log 𝑝(𝑠𝑖 )
𝑖=1
unde 𝐻(𝐶) este entropia cuvintelor codului. Entropia alfabetului codului este:
𝐷
𝐻(𝑋) = − ∑ 𝑝(𝑥𝑖 ) log 𝑝(𝑥𝑖 )
𝑖=1
⎯⎯
⎯⎯
Informația medie pe un cuvânt de cod este dată de produsul dintre numărul mediu de litere 𝑙
și informația medie pe literă 𝐻(𝑋) :
⎯⎯
𝐻(𝑆) = 𝑙 ⋅ 𝐻(𝑋)
Valoarea maximă a entropiei 𝐻(𝑋) se obține atunci când probabilitățile 𝑝(𝑥𝑖 ) ale literelor
codului sunt egale, respectiv 𝐻𝑚𝑎𝑥 (𝑋) = log 𝐷 .
Relația devine:
⎯⎯ ⎯⎯
𝐻(𝑆) = 𝑙 ⋅ 𝐻(𝑋) ≤ 𝑙 ⋅ log 𝐷
Altfel spus:
⎯⎯ 𝐻(𝑆) ⎯⎯
𝑙≥ = 𝑙 𝑚𝑖𝑛
log 𝐷
relație care arată că lungimea medie a unui cuvânt de cod are o margine inferioară egală cu
entropia sursei împărțită la valoarea maximă a entropiei alfabetului codului sau că:
𝐻(𝑆)
⎯⎯ ≤ log 𝐷
𝑙
informația medie pe o literă din alfabetul codului nu poate 7 mai mare decat valoarea
maximă a entropiei alfabetului codului.

Capacitatea, e5ciența și redundanța codului

1. Capacitatea codului. Capacitatea unui canal fără perturbații este atinsă când sursa
secundară este o sursă de entropie maximă:
𝐶 = 𝑠𝑢𝑝[𝐻(𝑋) − 𝐻(𝑋/𝑌 )] = max 𝐻(𝑋) = log 𝐷
𝑝(𝑥)
unde 𝐷 reprezinta alfabetul de intrare al canalului și, în același timp, alfabetul codului.
Deoarce 𝐻(𝑋/𝑌 ) = 0 se de7nește capacitatea codului ca valoarea maximă a
entropiei sursei secundare:
𝐶𝐶 = max 𝐻(𝑋) = log 𝐷
𝑝(𝑥)

2. E5ciența codului. este raportul dintre entropia sursei secundare 𝐻(𝑋) și valoarea sa
⎯⎯
maximă 𝐻𝑚𝑎𝑥 (𝑋) sau raportul dintre lungimea medie minimă 𝑙 𝑚𝑖𝑛 și lungimea medie
⎯⎯
𝑙 a cuvintelor de cod:
⎯⎯
𝐻(𝑆)
𝐻(𝑋) 𝐻(𝑋) 𝑙 𝑚𝑖𝑛
𝜂𝐶 = ⎯⎯ = = = ⎯⎯
𝑙 ⋅ log 𝐷 𝐻𝑚𝑎𝑥 (𝑋) log 𝐷 𝑙
3. Redundanța codului este mărimea complementară e7cienței:
log 𝐷 − 𝐻(𝑋)
𝜌𝐶 = 1 − 𝜂𝐶 =
log 𝐷

⎯⎯ ⎯⎯
= 𝑚𝑖𝑛 ; 𝜂 = 1; 𝜌 = 0
⎯⎯ ⎯⎯
Codurile pentru care 𝑙 = 𝑙 𝑚𝑖𝑛 ; 𝜂 = 1; 𝜌 = 0 sunt coduri absolut optimale. Dacă pentru un
cod oarecare este îndeplinită aceasta relație nu rezultă ca el este absolut optimal, însă, cu
alfabetul și cu lungimile date se poate forma un cod absolut optimal.
⎯⎯ ⎯⎯
Codurile pentru care 𝑙 > 𝑙 𝑚𝑖𝑛 ; 𝜂 < 1; 𝜌 > 0 sunt coduri optimal.
Considerând surse discrete cu debit controlabil și fără memorie, pentru codare compactă se
folosesc algoritmii Shannon-Fano (Shannon 1948, Fano 1949) si Huffman (1952).

Inegalitatea McMillan

Condiția necesară de existență a unui cod fără pre7x - instantaneu, de alfabet de dimensiune
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯
𝐷 , cu lungimea cuvintelor de cod 𝑙𝑖 ,  𝑖 = 1, 𝑁 este dată de inegalitatea Kraft McMillan:
𝑁
−𝑙𝑖
∑ 𝐷 ≤1
𝑖=1
Pentru codurile absolut optimale inegalitatea devine egalitate.

Codarea pe grupe de simboluri

Conform teoremei I a lui Shannon codarea extensiilor unei surse discrete de informație
conduce la obținerea unor lungimi medii ale cuvintelor de cod cu atât mai mici cu cât ordinul
extensiei este mai mare. Aplicațiile practice nu permit însă codarea extensiei de ordinul 𝑚 a
sursei cand 𝑚 → ∞ din motive ce țin de complexitatea codorului asa încât, în general se
realizează codări pe mesajele individuale ale sursei - simbol cu simbol folosindu-se algoritmi
ce conduc la coduri instantanee de e7ciență cât mai mare.

Desfășurarea lucrării

PROBLEMA
Determinati dictionarul binar (D=2) al codului Huffman pentru un text la alegerea voastra.
Folosind setul de probabilitati rezultat din cod, realizati codarea, pe hartie si comparati
rezultatele.
Codarea Huffman. Dacă sursa se codeaza simbol cu simbol problema care apare este
identi7carea unei metode de codare care să genereze un cod optimal pentru orice distribuție
de probabilități a sursei primare, altfel spus să nu existe o alta procedură de codare care să
conducă la o e7ciență mai mare. În acest caz cuvintele de cod obținute vor avea cea mai
mică lungime medie în raport cu lungimile medii ce se pot obține prin alte metode.

Înainte de expunerea metodei două proprietăți generale ale codurilor optimale trebuie
menționate:

1. Cel mai scurt cuvînt de cod să 7e atribuit simbolului cu probabilitatea cea mai mare. În
acest scop se ordonează simbolurile în ordinea descrescatoare a probabilitaților.
Ordonarea asigură existența unei lungimi medii minime!
2. Ultimele două cuvinte de cod au aceeași lungime.

Codarea Huffman cu 𝐷 simboluri presupune parcurgerea următorilor pași:

1. Cele N simboluri ale sursei se aranjează în ordinea descrescătoare a probabilitatilor;


2. Se formează mulțimi de mesaje care să poată 7 divizate în două submultimi de
probabilitati cât mai apropiate. Se notează sursa primară rezultată cu 𝑅0 ;
3. Se grupează ultimele 𝐷 simboluri de cele mai mici probabilitati, într-un simbol arti7cial
𝑟1 cu probabilitatea 𝑝(𝑟1 ) egală cu suma probabilitatilor simbolurilor grupate; se obtine
sursa restransa de ordin 1, 𝑅1 .
4. Se atribuie câte una din literele alfabetului codului celor 𝐷 simboluri grupate;
5. Se repetă pașii precedenți până când se ajunge la o sursa restrânsă 𝑅𝑁−𝐷 care
furnizează doar 𝐷 simboluri;
]. Cuvântul de cod complet, corespunzător unui simbol al sursei primare, este constituit
din secvența literelor codului obținută prin parcurgerea surselor restranse în sensul
opus restrângerii, până la găsirea simbolului original; aceasta echivalează cu
parcurgerea unui arbore de la un nod 7nal la rădacină.

1 1 1 1
EXEMPLU.Fie o sursa 𝑆 ce emite patru simboluri cu probabilitățile [ 2 , 4 , 8 , 8 ] . Identi7cați
un cod Huffman binar pentru sursa dată.

Observatie. Un cod optimal de alfabet 𝐷 trebuie să îndeplinească relația:


𝑁−𝐷
∈
𝐷−1
unde 𝑁 este num'arul de simboluri al sursei primare. Codarea ternară, 𝐷 = 3 , a unei surse
ce emite 𝑁 = 6 simboluri presupune adaugarea celui de-al 7 -lea simbol, de probabilitate
𝑝(𝑠7 ) = 0 pentru realizarea codării.
6: -62/6-13=0,333
×:,
-1-0166

:, =1/6-0,166

¿Bedaria Hitwa
neberara :
0,33

AX 0,166
1o/XA 1)0,332
MOM 06641>1
1
0,34
0,166
141N 0,166-

from math import log2 
import sys

string = 'examen'

# Creating tree nodes
class NodeTree(object):

    def __init__(self, left=None, right=None):
        self.left = left
        self.right = right

    def children(self):
        return (self.left, self.right)

    def nodes(self):
        return (self.left, self.right)

    def __str__(self):
        return '%s_%s' % (self.left, self.right)

# Main function implementing huffman coding
def huffman_code_tree(node, left=True, binString=''):
    if type(node) is str:
        return {node: binString}
    (l, r) = node.children()
    d = dict()
    d.update(huffman_code_tree(l, True, binString + '0'))
    d.update(huffman_code_tree(r, False, binString + '1'))
    return d

# Calculating frequency
freq = {}
for c in string:
    if c in freq:
        freq[c] += 1
    else:
        freq[c] = 1

freq = sorted(freq.items(), key=lambda x: x[1], reverse=True)

nodes = freq

while len(nodes) > 1:
    (key1, c1) = nodes[-1]
    (key2, c2) = nodes[-2]
    nodes = nodes[:-2]
    node = NodeTree(key1, key2)
    nodes.append((node, c1 + c2))

    nodes = sorted(nodes, key=lambda x: x[1], reverse=True)

huffmanCode = huffman_code_tree(nodes[0][0])

print(' Char | Huffman code ')
print('----------------------')
for (char, frequency) in freq:
    print(' %-4r |%12s' % (char, huffmanCode[char]))

Char | Huffman code


----------------------
'e' | 0
'x' | 101
'a' | 100
'm' | 111
'n' | 110
print('Frecventele de aparitie ale literelor:')
print(freq)
print('Lungimea intregului sir, numarul de caractere:')
length = len(string) 
print(length)

#lungimile cuvintelor de cod
l=[];
#frecventele=[];
for  (char,frequency) in freq:
    l.append(len((huffmanCode[char])))
    #frecventele.append(frequency)
print('Lungimile cuvintelor de cod:')
print(l)
print('Probabilitatile literelor:')
probs = [float("{:.2f}".format(frequency[1]/length)) for frequency in freq]
print(probs)

#lungimea medie
l_med = sum([a*b for a, b in zip(l, probs)])
print('Lungimea medie a codului:')
print(round(l_med,2))
# determinarea lungimii minime medii H(S)/log2(D)
entropia = -sum([p * log2(p) for p in probs])
print("Entropia sursei - lungimea minima:", round(entropia,2))
eficienta=round(entropia/l_med,2)
print("Eficienta codului:", eficienta)
    

Frecventele de aparitie ale literelor:


[('i', 2), ('n', 1), ('f', 1), ('o', 1), ('r', 1), ('m', 1), ('a', 1), ('t', 1
Lungimea intregului sir, numarul de caractere:
10
Lungimile cuvintelor de cod:
[2, 3, 3, 3, 3, 4, 4, 4, 4]
Probabilitatile literelor:
[0.2, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]
Lungimea medie a codului:
3.2
Entropia sursei - lungimea minima: 3.12
Eficienta codului: 0.98
Exercitii propuse
Fie o sursă 𝑆 ce emite mesajele [𝑆] = [1, 2, 3, 4, 5] . Se considera doua distributii 𝑃𝑆 si
𝑄𝑆 ale variabilei aleatoare ce descrie sursa prezentata in tabel. Ultimele doua coloane ale
tabelului con'tin coduri binare asociate sursei date.

Scrieti in Python secventa de cod necesara* asa incat sa:

1. Calculati 𝐻(𝑃𝑆 ) si 𝐻(𝑄𝑆 );


2. Veri7cati ca lungimea minima medie a codului 𝐶1 sub distributia 𝑃𝑆 este egala cu
entropia 𝐻(𝑃𝑆 ). Este 𝐶1 absolut optimal pentru 𝑃𝑆 ? Este 𝐶2 un cod absolut optimal
pentru 𝑄𝑆 ?
3. Se presupune ca se utilizeaza codul 𝐶2 cand distributia este 𝑃𝑆 . Care este lungimea
medie a cuvantului de cod? Cu cat este mai mare aceasta fata de entropia 𝐻(𝑃𝑆 )?
4. Care este pierderea daca este folosit codul 𝐶1 cand distributia este 𝑄𝑆 ?

creati un sir de caractere care sa genereze probabilitatile P si Q pentru codul anterior.

Colab paid products - Cancel contracts here

! 0s completed at 16:01

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