Przekazywanie informacji multimedialnych
2. Kompresja i porządkowanie danych
2.8. Kod Golomba
Kod Golomba należy do szerszej rodziny kodów przedziałowych, które znalazły zastosowanie w standardach multimedialnych, m.in. w JPEG-LS i H.264. Wyróżnikiem kodów przedziałowych jest potencjalnie nieograniczony alfabet źródła informacji dzielony na przedziały. Słowa kodowe symboli konstruowane są jako konkatenacja (zlepienie) przedrostka wskazującego na przedział z wyróżnikiem konkretnego elementu danego przedziału. W przypadku kodu Golomba jest to zlepienie odpowiedniego słowa kodu unarnego ze słowem kodu dwójkowego prawie stałej długości.
Kod dwójkowy prawie stałej długości
Aby uzyskać oszczędniejszą reprezentację kodu dwójkowego (niż za pomocą kodu z p. 1.2.4) przy licbitów kodu binarnego prawie stałej długości, pozostałym zaś -- bitów, zachowując jednoznaczną dekodowalność kodu.
Dokładniej, w kodzie dwójkowym prawie stałej długości (dla n-elementowego alfabetu pierwszym r symbolom (o indeksie ) przypisywane są słowa bitowe postaci , a pozostałym - słowa o długości bitów postaci , gdzie.
Oczywiście, dla źródeł o alfabecie zawierającym symboli, otrzymujemy , podczas gdy . Oznacza to, że kod dwójkowy prawie stałej długości przyjmuje postać kodu stałej długości.
Przykład 2.2 Kod dwójkowy prawie stałej długości
Ustalmy postać słów kodu dla symboli dwóch alfabetów o odpowiednio oraz , sprawdzając jednoznaczną dekodowalność takiego kodu.
W pierwszym przypadku mamy: oraz długość krótszego słowa. Wtedy pierwszy symbol alfabetu otrzyma jednobitowe słowo kodowe , dwa pozostałe zaś słowa dwubitowe, odpowiednio i . jest kodem przedrostkowym, jest więc jednoznacznie dekodowalny. Analogicznie, dla otrzymujemy : oraz . Trzy krótsze, dwubitowe słowa kodowe to , i , a pozostałe: i . jest także kodem przedrostkowym.
W kodzie słowa kodowe tworzone są jedynie na podstawie pozycji (indeksu) danego symbolu w alfabecie, bez analizy rozkładu wag poszczególnych symboli. Długość tych słów jest minimalnie zróżnicowana, a więc ich efektywne wykorzystanie w algorytmach kodowania jest możliwe szczególnie w przypadku źródeł o stosunkowo równomiernym (tj. zrównoważonym) rozkładzie prawdopodobieństw symboli. Pokazuje to następujący przykład.
Przyklad 2.3 Efektywność kodu dwójkowego
Wyznaczmy słowa kodu Huffmana dla źródła opisanego zbiorem prawdopodobieństw: .
Stosując algorytm 2.1 można skonstruować drzewo Huffmana jak na rys. 2.5. Postać tego drzewa jest \emph{znormalizowana}, tj. liście są uszeregowane w porządku od lewej do prawej według niemalejącej głębokości (każde drzewo Huffmana można znormalizować zamieniając odpowiednio miejscami węzły tego samego poziomu, jeśli relacja maksymalnej głębokości liści ich poddrzew nie jest zgodna z porządkiem uszeregowania -- mechanizm wykorzystywany w algorytmach adaptacyjnych).
Odczytane z drzewa słowa kodowe kolejnych symboli są następujące: , , , i . Są one identyczne ze słowami kodu pod warunkiem uporządkowania symboli alfabetu zgodnie z nierosnącym ich prawdopodobieństwem. Oznacza to, że w tym przypadku kod dwójkowy prawie stałej długości jest równoważny znormalizowanemu kodowi Huffmana, optymalnemu w kategorii kodów symboli.
Rys. 2.5 Znormalizowane drzewo Huffmana konstruowane dla zrównoważonego rozkładu prawdopodobieństwa symboli alfabetu z przykładu 2.3, z typowym etykietowaniem gałęzi; drzewo to daje słowa kodowe jak w kodzie dwójkowym prawie stałej długości.
Okazuje się, że rozkład prawdopodobieństw symboli źródła z przykładu 2.3 jest zrównoważony, tj. suma dwóch najmniejszych prawdopodobieństw rozkładu jest większa od prawdopodobieństwa największego. Dla takich źródeł, po uporządkowaniu symboli alfabetu zgodnie z nierosnącym ich prawdopodobieństwem, kod dwójkowy prawie stałej długości jest optymalnym kodem symboli.
Kod unarny
Kod unarny wykorzystuje prostą regułę tworzenia kolejnych słów kodowych symboli alfabetu o potencjalnie nieograniczonej długości. Każde ze słów ustalane jest niezależnie, jedynie na podstawie wskazania pozycji symbolu (lub całego przedziału symboli) w hipotetycznym alfabecie.
Według przedrostkowego kodu unarnego, kolejnym symbolom alfabetu przypisywane są słowa postaci: 1, 01, 001, 0001, lub w logice odwróconej: 0, 10, 110, 1110, . Definicja kodu unarnego dla dowolnej, całkowitej , będącej elementem alfabetu liczb lub indeksem symbolu alfabetu niesprecyzowanej postaci, jest następująca: lub .
Za pomocą można szybko określić słowa dowolnie rozszerzanego alfabetu. Kod ten można wykorzystać do efektywnej kompresji strumienia danych z liczbami naturalnymi (z zerem), przy założeniu: jest nie mniej prawdopodobna niż . Długość kolejnych słów kodowych różni się o jeden: . Ponieważ w kodzie efektywnym długość słowa powinna być równa (proporcjonalna do) informacji własnej danego symbolu , to kod unarny jest najbardziej efektywny w przypadku, gdy wartości prawdopodobieństw symboli maleją z potęgą dwójki.
Wyobraźmy sobie, że kodowany strumień danych pochodzi ze źródła informacji o alfabecie , czyli , zaś rozkład prawdopodobieństw symboli alfabetu wynosi , czyli p. Słowa kodu unarnego przypisane kolejnym symbolom tego źródła mają długości odpowiednio, , , czyli . Obliczając średnią bitową takiego kodu mamy:
|
czyli rozkład długości słów dokładnie odpowiada rozkładowi entropii źródła informacji.
Kod unarny jest więc w tym przypadku kodem optymalnym.
Zależność na jest szczególnym przypadkiem rozkładu geometrycznego dla . Kod unarny jest optymalny dla wszystkich rozkładów geometrycznych z , tj. pozwala uzyskać w tym przypadku rozkład długości słów jak w kodzie Huffmana. Ponieważ przy przyrost informacji własnej kolejnych symboli jest większy od 1 bit/symbol, to zróżnicowane o jeden bit słowa są również optymalne. Warunkiem koniecznym jest jednak uporządkowanie symboli alfabetu według nierosnących prawdopodobieństw ich występowania.
Jednak dla rozkładów geometrycznych z informacja własna kolejnych symboli alfabetu narasta wolniej niż 1 bit/symbol, czyli wolniej od wydłużanego o 1 bit słowa kolejnych symboli. Znaczy to, że kod unarny przestaje być wówczas rozwiązaniem optymalnym. Średni przyrost długości słowa kodowego na symbol mniejszy od 1 bita można uzyskać za pomocą kodu Golomba, łączącego kod unarny (z szybszym przyrostem długości słowa o nieograniczonej precyzji) z kodem dwójkowym prawie stałej długości (o znacznie wolniejszym przyroście długości słowa o ograniczonej precyzji). Okazuje się, że dla rozkładów geometrycznych z kod Golomba z odpowiednio dobranym parametrem (rzędem) jest optymalnym kodem symboli.
Konstrukcja kodu Golomba
Rząd kodu Golomba określa stały rozmiar przedziału przy podziale potencjalnie nieskończonego alfabetu według zasady:
(2.1) |
Słowo kodowe kodu Golomba symbolu składa się z wskaźnika tego przedziału , zapisanego w kodzie unarnym, oraz względnego miejsca symbolu w przedziale , . Mamy więc lub alternatywnie .
Efektywność kodu Golomba warunkowana jest uporządkowaniem realnego alfabetu kodowanych symboli, tak że oraz właściwym doborem wartość . Ustalenie tego parametru związane jest bezpośrednio z wartością , charakteryzującą rozkład geometryczny (zobacz rys. 2.6), możliwie wiernie aproksymujący rozkład prawdopodobieństw uporządkowanego alfabetu źródła. Szybsze opadanie funkcji rozkładu (mniejsze ) wymaga krótszych przedziałów, wolniejsze - dłuższych.
Rys. 2.6 Rozkład geometryczny (jednostronny) dla wartości : 0,5, 0,7, 0,9.
Wyznaczanie poszczególnych słow kodu Golomba jest proste obliczeniowo. Postać drzew binarnych kodu różnego rzędu ukazuje ich zasadnicze właściwości. Widać to w przykładzie 2.4.
Przyklad 2.4 Kod Golomba
Wyznaczmy słowo kodowe Golomba rzędu m=3 dla i=14. Ustalając wartość uzyskujemy przedrostek , zaś przy musimy wyznaczyć słowo kodu dwójkowego Obliczmy więc , czyli , stąd . Poprzez konkatenację otrzymujemy .
Zestawienie słów kodu Golomba dla kolejnych liczb całkowitych nieujemnych przedstawiono w tab. 2.3. Z kolei binarne drzewa pierwszych słów kodów i zamieszczono na rys.2.7. W pierwszym drzewie (dla ) od ścieżki prawych synów odchodzą tylko liście (jako lewi synowie kolejnych węzłów wewnętrznych).
Rys. 2.7 Wybrane drzewa Golomba dla kodów rzędu: a) m=1, b) m=2, c) m=3, d) m=4.
W kolejnych węzłach wewnętrznych ścieżki prawych synów podpięte są poddrzewa, początkowo składające się z pojedynczych liści (dla m=1), aż do pełnych poddrzew przy m=4. Przy rosnącym m daje to efekt stopniowego równoważenia drzewa, czyli lepszego dopasowanie do rozkładów geometrycznych o mniejszych nachyleniach (większym ).
Tab. 2.3 Przykładowe słowa kodu Golomba różnych rzędów dla kolejnych liczb całkowitych ; przy m=1 występują tylko słowa kodu unarnego; | oznacza miejsce sklejenia słowów kodu unarnego oraz dwójkowego prawie stałej długości.
Kod wykładniczy
Przykładem kodu przedziałowego o zmiennym rozmiarze przedziału jest wykładniczy kod Golomba (exp_Golomb), zastosowany w koderze CAVLC (Context based Adaptive Variable Length Coding) standardu H.264.
Słowa kodowe kodu exp_Golomb konstruowane są według reguły:
(2.2) |
gdzie $. Przykładowe słowa kodu zebrano w tabeli 2.4.
Tab. 2.4 Pierwsze, kolejne słowa wykładniczego kodu przedziałowego.
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | ... | |
1 | 010 | 011 | 00100 | 00101 | 00110 | 00111 | 00010000 | 0001001 | ... |
Charakterystyczną cechą tej wersji kodu Golomba jest wykładniczo rosnąca długość przedziału, równa .