Kompresja Kodowanie arytmetyczne Dariusz Sobczuk
Kodowanie arytmetyczne (lata 1960-te) Pierwsze prace w tym kierunku sięgają początków lat 60-tych XX wieku Pierwszy algorytm Eliasa nie został opublikowany (opisywany jest tylko w później wydanych książkach) Niezależne odkrycie kodowania arytmetycznego latach 1976 1980 przez różnych autorów Aktualnie patent posiada IBM kompresja danych 2
Kodowanie arytmetyczne - Pomysł W metodach entropijnych chodzi o zaokrąglanie rozkładu prawdopodobieństw symboli Ps, powodowane koniecznością zapisania poszczególnych słów kodowych na całkowitej liczbie bitów Najbardziej dokładne przybliżenie rozkładu Ps można uzyskać poprzez przypisanie jednego słowa kodowego całej sekwencji danych źródłowych Dokładność wyznaczania wartości prawdopodobieństwa wystąpienia całego ciągu jest ograniczona sposobem ustalenia jego wartości dla poszczególnych symboli kompresja danych 3
Kodowanie arytmetyczne Pomysł cd Chcemy wyznaczyć P(s we ) i zapisać je za pomocą bitowego ciągu kodowego Jednak dotychczasowy zapis As={a 1,...,a n } i Ps={p 1,...,p n } tak, że Ps: a i P(a i ) nie jest przydatny, gdyż prawdopodobieństwa wystąpienia dwóch symboli mogą być jednakowe Zamiast prawdopodobieństw można użyć dystrybuantę dyskretnego układu zmiennej losowej FP S i = p j= 1 j : i = 1,..., n = {p1, p1 + p2,..., p1 +... + pn} kompresja danych 4
Kodowanie arytmetyczne Pomysł cd Opis za pomocą dystrybuanty pozwala na jednoznaczne odwzorowanie symboli alfabetu As w rozłączne podprzedziały w postaci π s : a i As [F(a i-1 ), F(a i )) [0,1) Zakładając F(a 0 ) = 0 i F(a n ) =1 można dla dowolnego przedziału zapisać π [d,g) : a i As [d+f(a i-1 ) (g-d), d+f(a i ) (g-d)) [d,g) Opierając się na powyższych założeniach można podziały robić rekurencyjnie kompresja danych 5
Kodowanie arytmetyczne - Kodowanie Pierwszy symbol pojawiający się w kodowanym ciągu s 1 = a k, a k As powoduje zawężenie przedziału kodu do π (1) = π s (a k ) = [F(a k-1 ), F(a k ) [0,1). Drugi symbol ciągu wejściowego powoduje zawężenie przedziału π (1) w proporcjach, które wynikają z linii prawdopodobieństwa do π (2) itd. Mamy więc zasadę zwężania kodu π (i) π (i-1) kompresja danych 6
Kodowanie arytmetyczne Kodowanie cd Kod arytmetyczny K=A 0 : As [0,1]) z jedną linią prawdopodobieństwa Πs = {[F(a i-1 ), F(a i )), i=1,...n} na podstawie kodu wejściowego s i =a k modyfikuje aktualny przedział w następujący sposób: A 0 (π s (a k ), π (i-1) ) = π (i) gdzie π (i) =[D (i),g (i) ) oraz: D (i) = D (i-1) + R (i-1) F(a k-1 ), G (i) = D (i-1) + R (i-1) F(a k ), dla i=1,2,... Długość przedziału kodowego: R (i-1) = π (i-1) = G (i-1) -D (i-1) kompresja danych 7
Kodowanie arytmetyczne - Dekodowanie Ponieważ π (t) π (1), to pozwala określić do jakiego przedziału Πs trafia L t, co pozwala zdekodować pierwszy symbol s 1 = a k L t [F(a k-1 ), F(a k )) Dalej przeskalowujemy liczby zgodnie ze wzorem: L i-1 = (L i - F(a k-1 ))/(F(a k ) - F(a k-1 )) i rzutując na linie prawdpodobieństw otrzymujemy symbol s i = a k L t [F(a k-1 ), F(a k )) Dodatkowo jest potrzebna liczba ciągu wejściowego, bo inaczej kodowanie się zapętli. Po osiągnięciu tej liczby dekodowanie kończy się kompresja danych 8
Kodowanie arytmetyczne - Przykład Kodujemy słowo ARYTMETYKA a 1 = A ; P(a 1 )=0.2; π s (a 1 )=[0, 0.2) a 2 = E ; P(a 2 )=0.1; π s (a 2 )=[0.2, 0.3) a 3 = K ; P(a 3 )=0.1; π s (a 3 )=[0.3, 0.4) a 4 = M ; P(a 4 )=0.1; π s (a 4 )=[0.4, 0.5) a 5 = R ; P(a 5 )=0.1; π s (a 5 )=[0.5, 0.6) a 6 = T ; P(a 6 )=0.2; π s (a 6 )=[0.6, 0.8) a 7 = Y ; P(a 7 )=0.2; π s (a 7 )=[0.8, 1.0) kompresja danych 9
Kod. arytmetyczne Przykład cd i s i = a k D (i) G (i) R (i) 0 INI 0 1 1 1 A 0.0 0.2 0.2 2 R 0.1 0.12 0.02 3 Y 0.116 0.12 0.004 4 T 0.1184 0.1192 0.0008 5 M 0.11872 0.1188 0.00008 6 E 0.118736 0.118744 0.000008 7 T 0.1187408 0.1187424 0.0000016 8 Y 0.11874208 0.1187424 0.00000032 9 K 0.118742176 0.118742208 0.000000032 10 A 0.118742176 0.1187421824 0.0000000064 kompresja danych 10
Kod. Arytmetyczne - Przykład cd. i Liczba kodowa L i s i = a k F(a k-1 ) F(a k ) ΔF(a k ) 1 0.118742176 A 0.0 0.2 0.2 2 0.59371088 R 0.5 0.6 0.1 3 0.9371088 Y 0.8 1.0 0.2 4 0.685544 T 0.6 0.8 0.2 5 0.42772 M 0.4 0.5 0.1 6 0.2772 E 0.2 0.3 0.1 7 0.72 T 0.6 0.8 0.2 8 0.86 Y 0.8 1.0 0.2 9 0.3 K 0.3 0.4 0.1 10 0 A 0.0 0.2 0.2... 0 A 0.0 0.2 0.2 kompresja danych 11
Kod. Arytmetyczne - Przykład cd. i Liczba kodowa L i s i = a k F(a k-1 ) F(a k ) ΔF(a k ) 1 0.11874218 A 0.0 0.2 0.2 2 0.5937109 R 0.5 0.6 0.1 3 0.937109 Y 0.8 1.0 0.2 4 0.685546 T 0.6 0.8 0.2 5 0.427725 M 0.4 0.5 0.1 6 0.27725 E 0.2 0.3 0.1 7 0.725 T 0.6 0.8 0.2 8 0.8625 Y 0.8 1.0 0.2 9 0.3125 K 0.3 0.4 0.1 10 0.125 A 0.0 0.2 0.2... 0.625 T 0.6 0.8 0.2 kompresja danych 12
Częstość występowania symboli w badanej sekwencji tekstowej Jakżeż ja się uspokoję Pełne strachu oczy moje, Pełne grozy myśli moje, Pełne trwogi serce moje, Pełne drżenia piersi moje Jakżeż ja się uspokoję... Symbol L. wyst. Symbol L. wyst. a 6 p 7 c 3 r 6 d 1 s 7 e 18 ś 1 ę 4 t 2 g 2 u 3 h 1 w 1 i 7 y 3 j 10 z 2 k 4 ż 5 l 1, 3 ł 4. 3 m 5 2 n 5 <spacja> 20 o 11 <nw> 6 kompresja danych 13
Kodowanie arytmetyczne przykładowa sekwencja 0 0,0392 0,2288 0,2745 0,3399 0,3660 0,9608 1,0000 a i j k <nw> 0,2745 0,2784 0,2788 0,3373 0,3399 a c <nw> 0,274510,27461 0,27521 0,27545 0,27546 0,27697 0,27707 a j k <nw> kompresja danych 14
Kodowanie arytmetyczne cechy W teorii wymagane są operacje na liczbach o bardzo dużej precyzji (rzędu milionów cyfr) Dzięki takiemu podejściu możliwe jest uzyskanie kodu o średniej długości odpowiadającej entropii (kod całej wiadomości będzie dłuższy o nie więcej niż 2 bity od kodu wynikającego z entropii) Operacje na liczbach o takiej precyzji są bardzo czasochłonne kompresja danych 15
Kodowanie arytmetyczne podejście praktyczne Przedziały stają się bardzo małe, a co za tym idzie pierwsze cyfry obu końców są identyczne Wykorzystując to implementuje się kodowanie arytmetyczne na liczbach o niewielkiej liczbie cyfr znaczących (typowo na liczbach 32-bitowych) Znacząco większa prędkość działania takiej implementacji Nieznaczne pogorszenie współczynnika kompresji kompresja danych 16
Koder binarny Koder binarny jest szczególnym przypadkiem realizacji kodu arytmetycznego dla dwuelementowego alfabetu As={0,1} Binarne kodowanie adaptacyjne jest najbardziej efektywną, entropijną metodą kodowania przy kompresji obrazów (JBIG, JBIG2, MPEG-4, JPEG, JPEG200) Większość realizacji kodowania arytmetycznego dotyczy alfabetu binarnego kompresja danych 17
Algorytm kodowania binarnego Przy alfabecie As={a 1,a 2 } podział linii prawdopodobieństw Πs zależy od jednej wartości F(a 1 )=P(a 1 )=p 1. Mamy wówczas dwa podprzedziały [0, p 1 ) oraz [p 1,1). Aktualna postać przedziału kodowego π (i) =[D (i),g (i) ) o długości R (i) = π (i) = G (i) -D (i) zależy od wartości liczby R 1 (i-1) = R (i-1) p 1. kompresja danych 18
Algorytm kodowania binarnego cd Algorytm kodowania: Jeśli kodujemy s i = a 1 to π (i) =[D (i-1), D (i-1) + R 1 (i-1) ) Jeśli kodujemy s i = a 2 to π (i) =[D (i-1) ) +R 1 (i-1), G (i-1) ) W pierwszym przypadku modyfikowana jest tylko górna granica. W drugim przypadku modyfikowana jest tylko dolna granica. kompresja danych 19
Algorytm kodowania binarnego cd Algorytm dekodowania: Jeśli L - D (i-1) < R 1 (i-1), to dekodujemy s i = a 1 oraz π (i) =[D (i-1), D (i-1) + R 1 (i-1) ) Jeśli L - D (i-1) R 1 (i-1), to dekodujemy s i = a 2 oraz π (i) =[D (i-1) ) +R 1 (i-1), G (i-1) ) Wartość przedziału kodowego w praktyce można ustalić za pomocą zmiennych DÓŁ i GÓRA kompresja danych 20
Kodowanie Huffmana a kodowanie arytmetyczne Kodowanie Huffmana: kod optymalny w klasie kodów o długościach będącymi liczbami całkowitymi stosunkowo łatwy do obliczania współczynnik kompresji zwykle niewiele gorszy od teoretycznego optimum brak ograniczeń patentowych Kodowanie arytmetyczne: kod optymalny stosunkowo trudny do obliczania niewysoka wydajność wynikająca z konieczności wykonywania operacji arytmetycznych bardzo dobry współczynnik kompresji (zbieżny do entropii) ograniczenia patentowe kompresja danych 21
Paradygmat modelowanie kodowanie Modelowanie uaktualnienie modelu Modelowanie uaktualnienie modelu sekwencja wejściowa Kodowanie dane skompresowane Dekodowanie sekwencja wyjściowa kompresja danych 22
Kodowanie adaptacyjne Kod budowany na podstawie częstości wystąpień symboli w dotychczas zakodowanym fragmencie Zalety: brak konieczności przekazywania do dekodera informacji o prawd. występowania symboli dobry współczynnik kompresji Wady: niska prędkość działania (konieczność modyfikacji kodu po zakodowaniu każdego symbolu) kompresja danych 23
Adaptacyjne kodowanie Huffmana Model początkowy zakłada, że prawdopodobieństwo wystąpienia każdego symbolu alfabetu jest jednakowe Kod Huffmana konstruowany jest dla takiego modelu Po zakodowaniu każdego symbolu kod Huffmana jest przebudowywany, aby symbole, które w przeszłości występowały częściej otrzymały krótsze kody kompresja danych 24
Adaptacyjne kodowanie Huffmana cechy Zalety: brak konieczności przesyłania do dekodera informacji o modelu dobry współczynnik kompresji Wady: wolne uaktualnianie drzewa Huffmana po zakodowaniu każdego symbolu kompresja danych 25
Adaptacyjne kodowanie arytmetyczne Model początkowy zakłada jednakowe prawdopodobieństwo występowania każdego symbolu alfabetu Przedział [0, 1) dzielony jest na podprzedziały równej długości Po zakodowaniu każdego symbolu modyfikowane jest prawdopodobieństwo jego występowania, aby zwiększyć względną długość podprzedziału mu odpowiadającego kompresja danych 26
Adaptacyjne kodowanie arytmetyczne cechy Zalety: brak konieczności przesyłania do dekodera informacji o modelu dobry współczynnik kompresji Wady: konieczność przechowywania statystyk występowania symboli w specjalnych strukturach danych umożliwiających szybki dostęp i aktualizację wolniejsze niż kodowanie statyczne kompresja danych 27
Czym jest tak naprawdę kodowanie? Algorytmy kodowania służą do przydzielenia symbolom kodów w taki sposób aby średnia długość kodu w kodowanej sekwencji była jak najmniejsza Algorytmy te bazują na rozkładzie prawdopodobieństwa występowania symboli, który jest dostarczany przez algorytm modelowania kompresja danych 28
Plan kolejnego wykładu Algorytmy kompresji bezstratnej ogólnego przeznaczenia: metody Ziva Lempela (LZ) metody predykcji przez częściowe dopasowanie (PPM) metody oparta na transformacie Burrowsa Wheelera (BWT) Porównanie wydajności algorytmów kompresja danych 29