Documente Academic
Documente Profesional
Documente Cultură
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.
∑
𝐻(𝑆) = 𝐻(𝐶) = − 𝑝(𝑠𝑖 ) 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.
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.
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.
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ă.
:, =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]))
#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)
! 0s completed at 16:01