07.03.2014 Views

Kompresja Kodowanie arytmetyczne

Kompresja Kodowanie arytmetyczne

Kompresja Kodowanie arytmetyczne

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Kompresja</strong><br />

<strong>Kodowanie</strong> <strong>arytmetyczne</strong><br />

Dariusz Sobczuk


<strong>Kodowanie</strong> <strong>arytmetyczne</strong><br />

(lata 1960-te)<br />

Pierwsze prace w tym kierunku sięgają<br />

początków lat 60-tych XX wieku<br />

Pierwszy algorytm Eliasa nie został<br />

opublikowany (opisywany jest tylko w później<br />

wydanych książkach)<br />

Niezależne odkrycie kodowania<br />

<strong>arytmetyczne</strong>go latach 1976–1980 przez<br />

różnych autorów<br />

Aktualnie patent posiada IBM<br />

kompresja danych 2


<strong>Kodowanie</strong> <strong>arytmetyczne</strong> -<br />

Pomysł<br />

W metodach entropijnych chodzi o zaokrąglanie<br />

rozkładu prawdopodobieństw symboli Ps,<br />

powodowane koniecznością zapisania poszczególnych<br />

słów kodowych na całkowitej liczbie bitów<br />

Najbardziej dokładne przybliżenie rozkładu Ps można<br />

uzyskać poprzez przypisanie jednego słowa<br />

kodowego całej sekwencji danych źródłowych<br />

Dokładność wyznaczania wartości<br />

prawdopodobieństwa wystąpienia całego ciągu jest<br />

ograniczona sposobem ustalenia jego wartości dla<br />

poszczególnych symboli<br />

kompresja danych 3


<strong>Kodowanie</strong> <strong>arytmetyczne</strong> –<br />

Pomysł cd<br />

Chcemy wyznaczyć P(s we ) i zapisać je za pomocą<br />

bitowego ciągu kodowego<br />

Jednak dotychczasowy zapis As={a 1 ,...,a n } i<br />

Ps={p 1 ,...,p n } tak, że Ps: a i → P(a i ) nie jest<br />

przydatny, gdyż prawdopodobieństwa wystąpienia<br />

dwóch symboli mogą być jednakowe<br />

Zamiast prawdopodobieństw można użyć<br />

dystrybuantę dyskretnego układu zmiennej losowej<br />

FP<br />

S<br />

⎧<br />

i<br />

= ⎨∑<br />

p<br />

⎩ j=<br />

1<br />

j<br />

⎫<br />

: i = 1,..., n⎬<br />

= {p1,<br />

p1<br />

+ p2,...,<br />

p1<br />

+ ... + pn}<br />

⎭<br />

kompresja danych 4


<strong>Kodowanie</strong> <strong>arytmetyczne</strong> –<br />

Pomysł cd<br />

Opis za pomocą dystrybuanty pozwala na<br />

jednoznaczne odwzorowanie symboli alfabetu As w<br />

rozłączne podprzedziały w postaci<br />

π s : a i ∈As → [F(a i-1 ), F(a i )) ⊂ [0,1)<br />

Zakładając F(a 0 ) = 0 i F(a n ) =1 można dla dowolnego<br />

przedziału zapisać<br />

π [d,g) : a i ∈As→ [d+F(a i-1 )·(g-d), d+F(a i )·(g-d)) ⊂ [d,g)<br />

Opierając się na powyższych założeniach można<br />

podziały robić rekurencyjnie<br />

kompresja danych 5


<strong>Kodowanie</strong> <strong>arytmetyczne</strong> -<br />

<strong>Kodowanie</strong><br />

Pierwszy symbol pojawiający się w<br />

kodowanym ciągu s 1 = a k , a k ∈As powoduje<br />

zawężenie przedziału kodu do π (1) = π s (a k ) =<br />

[F(a k-1 ), F(a k ) ⊂ [0,1).<br />

Drugi symbol ciągu wejściowego powoduje<br />

zawężenie przedziału π (1) w proporcjach,<br />

które wynikają z linii prawdopodobieństwa do<br />

π (2) itd.<br />

Mamy więc zasadę zwężania kodu π (i) ⊂π (i-1)<br />

kompresja danych 6


<strong>Kodowanie</strong> <strong>arytmetyczne</strong> –<br />

<strong>Kodowanie</strong> cd<br />

Kod arytmetyczny K=A 0 : As → [0,1]) z jedną linią<br />

prawdopodobieństwa Πs = {[F(a i-1 ), F(a i )), i=1,...n}<br />

na podstawie kodu wejściowego s i =a k modyfikuje<br />

aktualny przedział w następujący sposób:<br />

A 0 (π s (a k ), π (i-1) ) = π (i)<br />

gdzie π (i) =[D (i) ,G (i) ) oraz:<br />

D (i) = D (i-1) + R (i-1) F(a k-1 ),<br />

G (i) = D (i-1) + R (i-1) F(a k ), dla i=1,2,...<br />

Długość przedziału kodowego:<br />

R (i-1) = |π (i-1) | = G (i-1) -D (i-1)<br />

kompresja danych 7


<strong>Kodowanie</strong> <strong>arytmetyczne</strong> -<br />

Dekodowanie<br />

Ponieważ π (t) ⊂π (1) , to pozwala określić do jakiego<br />

przedziału Πs trafia L t , co pozwala zdekodować<br />

pierwszy symbol s 1 = a k ⇔ L t ∈ [F(a k-1 ), F(a k ))<br />

Dalej przeskalowujemy liczby zgodnie ze wzorem:<br />

L i-1 = (L i - F(a k-1 ))/(F(a k ) - F(a k-1 )) i rzutując na linie<br />

prawdpodobieństw otrzymujemy symbol<br />

s i = a k ⇔ L t ∈ [F(a k-1 ), F(a k ))<br />

Dodatkowo jest potrzebna liczba ciągu wejściowego,<br />

bo inaczej kodowanie się zapętli. Po osiągnięciu tej<br />

liczby dekodowanie kończy się<br />

kompresja danych 8


<strong>Kodowanie</strong> <strong>arytmetyczne</strong> -<br />

Przykład<br />

Kodujemy słowo „ARYTMETYKA”<br />

a 1 =„A”; P(a 1 )=0.2; π s (a 1 )=[0, 0.2)<br />

a 2 =„E”; P(a 2 )=0.1; π s (a 2 )=[0.2, 0.3)<br />

a 3 =„K”; P(a 3 )=0.1; π s (a 3 )=[0.3, 0.4)<br />

a 4 =„M”; P(a 4 )=0.1; π s (a 4 )=[0.4, 0.5)<br />

a 5 =„R”; P(a 5 )=0.1; π s (a 5 )=[0.5, 0.6)<br />

a 6 =„T”; P(a 6 )=0.2; π s (a 6 )=[0.6, 0.8)<br />

a 7 =„Y”; P(a 7 )=0.2; π s (a 7 )=[0.8, 1.0)<br />

kompresja danych 9


Kod. <strong>arytmetyczne</strong> – Przykład cd<br />

i s i = a k D (i) G (i) R (i)<br />

0 INI 0 1 1<br />

1 „A” 0.0 0.2 0.2<br />

2 „R” 0.1 0.12 0.02<br />

3 „Y” 0.116 0.12 0.004<br />

4 „T” 0.1184 0.1192 0.0008<br />

5 „M” 0.11872 0.1188 0.00008<br />

6 „E” 0.118736 0.118744 0.000008<br />

7 „T” 0.1187408 0.1187424 0.0000016<br />

8 „Y” 0.11874208 0.1187424 0.00000032<br />

9 „K” 0.118742176 0.118742208 0.000000032<br />

10 „A” 0.118742176 0.1187421824 0.0000000064<br />

kompresja danych 10


Kod. Arytmetyczne - Przykład cd.<br />

i Liczba kodowa L i s i = a k F(a k-1 ) F(a k ) ΔF(a k )<br />

1 0.118742176 „A” 0.0 0.2 0.2<br />

2 0.59371088 „R” 0.5 0.6 0.1<br />

3 0.9371088 „Y” 0.8 1.0 0.2<br />

4 0.685544 „T” 0.6 0.8 0.2<br />

5 0.42772 „M” 0.4 0.5 0.1<br />

6 0.2772 „E” 0.2 0.3 0.1<br />

7 0.72 „T” 0.6 0.8 0.2<br />

8 0.86 „Y” 0.8 1.0 0.2<br />

9 0.3 „K” 0.3 0.4 0.1<br />

10 0 „A” 0.0 0.2 0.2<br />

... 0 „A” 0.0 0.2 0.2<br />

kompresja danych 11


Kod. Arytmetyczne - Przykład cd.<br />

i Liczba kodowa L i s i = a k F(a k-1 ) F(a k ) ΔF(a k )<br />

1 0.11874218 „A” 0.0 0.2 0.2<br />

2 0.5937109 „R” 0.5 0.6 0.1<br />

3 0.937109 „Y” 0.8 1.0 0.2<br />

4 0.685546 „T” 0.6 0.8 0.2<br />

5 0.427725 „M” 0.4 0.5 0.1<br />

6 0.27725 „E” 0.2 0.3 0.1<br />

7 0.725 „T” 0.6 0.8 0.2<br />

8 0.8625 „Y” 0.8 1.0 0.2<br />

9 0.3125 „K” 0.3 0.4 0.1<br />

10 0.125 „A” 0.0 0.2 0.2<br />

... 0.625 „T” 0.6 0.8 0.2<br />

kompresja danych 12


Częstość występowania symboli<br />

w badanej sekwencji tekstowej<br />

Jakżeż ja się uspokoję –<br />

Pełne strachu oczy moje,<br />

Pełne grozy myśli moje,<br />

Pełne trwogi serce moje,<br />

Pełne drżenia piersi moje –<br />

Jakżeż ja się uspokoję...<br />

Symbol L. wyst. Symbol L. wyst.<br />

a 6 p 7<br />

c 3 r 6<br />

d 1 s 7<br />

e 18 ś 1<br />

ę 4 t 2<br />

g 2 u 3<br />

h 1 w 1<br />

i 7 y 3<br />

j 10 z 2<br />

k 4 ż 5<br />

l 1 , 3<br />

ł 4 . 3<br />

m 5 – 2<br />

n 5 20<br />

o 11 6<br />

kompresja danych 13


<strong>Kodowanie</strong> <strong>arytmetyczne</strong><br />

przykładowa sekwencja<br />

0 0,0392 0,2288 0,2745 0,3399 0,3660 0,9608 1,0000<br />

a i j k<br />

<br />

0,2745 0,2784 0,2788 0,3373 0,3399<br />

a c <br />

0,274510,27461 0,27521 0,27545 0,27546 0,27697 0,27707<br />

a j k <br />

kompresja danych 14


<strong>Kodowanie</strong> <strong>arytmetyczne</strong> – cechy<br />

W teorii wymagane są operacje na liczbach<br />

o bardzo dużej precyzji (rzędu milionów cyfr)<br />

Dzięki takiemu podejściu możliwe jest<br />

uzyskanie kodu o średniej długości<br />

odpowiadającej entropii (kod całej<br />

wiadomości będzie dłuższy o nie więcej niż 2<br />

bity od kodu wynikającego z entropii)<br />

Operacje na liczbach o takiej precyzji są<br />

bardzo czasochłonne<br />

kompresja danych 15


<strong>Kodowanie</strong> <strong>arytmetyczne</strong> –<br />

podejście praktyczne<br />

Przedziały stają się bardzo małe, a co za tym idzie<br />

pierwsze cyfry obu końców są identyczne<br />

Wykorzystując to implementuje się kodowanie<br />

<strong>arytmetyczne</strong> na liczbach o niewielkiej liczbie cyfr<br />

znaczących (typowo na liczbach 32-bitowych)<br />

Znacząco większa prędkość działania takiej<br />

implementacji<br />

Nieznaczne pogorszenie współczynnika kompresji<br />

kompresja danych 16


Koder binarny<br />

Koder binarny jest szczególnym przypadkiem<br />

realizacji kodu <strong>arytmetyczne</strong>go dla<br />

dwuelementowego alfabetu As={0,1}<br />

Binarne kodowanie adaptacyjne jest<br />

najbardziej efektywną, entropijną metodą<br />

kodowania przy kompresji obrazów (JBIG,<br />

JBIG2, MPEG-4, JPEG, JPEG200)<br />

Większość realizacji kodowania<br />

<strong>arytmetyczne</strong>go dotyczy alfabetu binarnego<br />

kompresja danych 17


Algorytm kodowania binarnego<br />

Przy alfabecie As={a 1 ,a 2 } podział linii<br />

prawdopodobieństw Πs zależy od jednej wartości<br />

F(a 1 )=P(a 1 )=p 1 . Mamy wówczas dwa podprzedziały<br />

[0, p 1 ) oraz [p 1 ,1).<br />

Aktualna postać przedziału kodowego π (i) =[D (i) ,G (i) ) o<br />

długości R (i) = |π (i) | = G (i) -D (i) zależy od wartości<br />

liczby R 1<br />

(i-1)<br />

= R (i-1) p 1 .<br />

kompresja danych 18


Algorytm kodowania binarnego cd<br />

Algorytm kodowania:<br />

Jeśli kodujemy s i = a 1 to π (i) =[D (i-1) , D (i-1) + R 1<br />

(i-1)<br />

)<br />

Jeśli kodujemy s i = a 2 to π (i) =[D (i-1) ) +R 1<br />

(i-1)<br />

, G (i-1) )<br />

W pierwszym przypadku modyfikowana jest<br />

tylko górna granica.<br />

W drugim przypadku modyfikowana jest tylko<br />

dolna granica.<br />

kompresja danych 19


Algorytm kodowania binarnego cd<br />

Algorytm dekodowania:<br />

Jeśli L - D (i-1) < R 1<br />

(i-1)<br />

, to dekodujemy s i = a 1 oraz<br />

π (i) =[D (i-1) , D (i-1) + R 1<br />

(i-1)<br />

)<br />

Jeśli L - D (i-1) ≥ R 1<br />

(i-1)<br />

, to dekodujemy s i = a 2 oraz<br />

π (i) =[D (i-1) ) +R 1<br />

(i-1)<br />

, G (i-1) )<br />

Wartość przedziału kodowego w praktyce<br />

można ustalić za pomocą zmiennych DÓŁ i<br />

GÓRA<br />

kompresja danych 20


<strong>Kodowanie</strong> Huffmana<br />

a kodowanie <strong>arytmetyczne</strong><br />

<strong>Kodowanie</strong> Huffmana:<br />

kod optymalny w klasie<br />

kodów o długościach<br />

będącymi liczbami<br />

całkowitymi<br />

stosunkowo łatwy<br />

do obliczania<br />

współczynnik kompresji<br />

zwykle niewiele gorszy<br />

od teoretycznego<br />

optimum<br />

brak ograniczeń<br />

patentowych<br />

<strong>Kodowanie</strong> <strong>arytmetyczne</strong>:<br />

kod optymalny<br />

stosunkowo trudny<br />

do obliczania<br />

niewysoka wydajność<br />

wynikająca z konieczności<br />

wykonywania operacji<br />

arytmetycznych<br />

bardzo dobry współczynnik<br />

kompresji (zbieżny<br />

do entropii)<br />

ograniczenia patentowe<br />

kompresja danych 21


Paradygmat modelowanie–<br />

kodowanie<br />

Modelowanie<br />

uaktualnienie<br />

modelu<br />

Modelowanie<br />

uaktualnienie<br />

modelu<br />

sekwencja<br />

wejściowa<br />

<strong>Kodowanie</strong><br />

dane<br />

skompresowane<br />

Dekodowanie<br />

sekwencja<br />

wyjściowa<br />

kompresja danych 22


<strong>Kodowanie</strong> adaptacyjne<br />

Kod budowany na podstawie częstości<br />

wystąpień symboli w dotychczas<br />

zakodowanym fragmencie<br />

Zalety:<br />

brak konieczności przekazywania do dekodera<br />

informacji o prawd. występowania symboli<br />

dobry współczynnik kompresji<br />

Wady:<br />

niska prędkość działania (konieczność modyfikacji<br />

kodu po zakodowaniu każdego symbolu)<br />

kompresja danych 23


Adaptacyjne kodowanie<br />

Huffmana<br />

Model początkowy zakłada, że<br />

prawdopodobieństwo wystąpienia każdego<br />

symbolu alfabetu jest jednakowe<br />

Kod Huffmana konstruowany jest dla takiego<br />

modelu<br />

Po zakodowaniu każdego symbolu kod<br />

Huffmana jest przebudowywany, aby<br />

symbole, które w przeszłości występowały<br />

częściej otrzymały krótsze kody<br />

kompresja danych 24


Adaptacyjne kodowanie<br />

Huffmana – cechy<br />

Zalety:<br />

brak konieczności<br />

przesyłania<br />

do dekodera<br />

informacji<br />

o modelu<br />

dobry współczynnik<br />

kompresji<br />

Wady:<br />

wolne uaktualnianie<br />

drzewa Huffmana<br />

po zakodowaniu<br />

każdego symbolu<br />

kompresja danych 25


Adaptacyjne kodowanie<br />

<strong>arytmetyczne</strong><br />

Model początkowy zakłada jednakowe<br />

prawdopodobieństwo występowania każdego<br />

symbolu alfabetu<br />

Przedział [0, 1) dzielony jest na podprzedziały<br />

równej długości<br />

Po zakodowaniu każdego symbolu<br />

modyfikowane jest prawdopodobieństwo jego<br />

występowania, aby zwiększyć względną<br />

długość podprzedziału mu odpowiadającego<br />

kompresja danych 26


Adaptacyjne kodowanie<br />

<strong>arytmetyczne</strong> – cechy<br />

Zalety:<br />

brak konieczności<br />

przesyłania<br />

do dekodera<br />

informacji<br />

o modelu<br />

dobry współczynnik<br />

kompresji<br />

Wady:<br />

konieczność<br />

przechowywania<br />

statystyk występowania<br />

symboli w specjalnych<br />

strukturach danych<br />

umożliwiających szybki<br />

dostęp i aktualizację<br />

wolniejsze niż kodowanie<br />

statyczne<br />

kompresja danych 27


Czym jest tak naprawdę<br />

kodowanie?<br />

Algorytmy kodowania służą do przydzielenia<br />

symbolom kodów w taki sposób aby średnia<br />

długość kodu w kodowanej sekwencji była jak<br />

najmniejsza<br />

Algorytmy te bazują na rozkładzie<br />

prawdopodobieństwa występowania symboli,<br />

który jest dostarczany przez algorytm<br />

modelowania<br />

kompresja danych 28


Plan kolejnego wykładu<br />

Algorytmy kompresji bezstratnej ogólnego<br />

przeznaczenia:<br />

metody Ziva–Lempela (LZ)<br />

metody predykcji przez częściowe dopasowanie<br />

(PPM)<br />

metody oparta na transformacie Burrowsa–<br />

Wheelera (BWT)<br />

Porównanie wydajności algorytmów<br />

kompresja danych 29

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!