Kompresja Kodowanie arytmetyczne
Kompresja Kodowanie arytmetyczne
Kompresja Kodowanie arytmetyczne
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