Przekazywanie informacji multimedialnych
1. Matematyczna modelowanie informacji
1.12. Podstawowe zasady kodowania
Algorytmy kodowania wykorzystujące opisane wyżej modele źródeł informacji pozwalają tworzyć wyjściową reprezentację kodową, która jest sekwencją bitową o skończonej długości, utworzoną z bitowych słów kodowych charakterystycznych dla danej metody. Realizację algorytmu kodowania, np. w określonym języku programowania lub sprzętową, nazwiemy koderem. Analogicznie realizację algorytmu dekodowania -- dekoderem. Algorytm kodowania realizuje kod, czyli wspomnianą regułę (zasadę, funkcję, przekształcenie) przyporządkowującą ciągowi symboli wejściowych (opisanych modelem źródła informacji o zdefiniowanym alfabecie ) bitową sekwencję kodową (wyjściową).
Kodowanie binarne jest metodą wykorzystania określonego kodu do kompresji sekwencji danych wejściowych źródła informacji . Kod ten bazuje na określonym modelu źródła informacji, który steruje procesem kodowania binarnego. Podstawowy algorytm kodowania składa się więc z dwóch zasadniczych elementów: modelowania oraz binarnego kodowania.
Kody jednoznacznie dekodowalne
W metodach kompresji, w przeciwieństwie np. do technik szyfrowania, istnieje warunek konieczny, aby reprezentacja kodowa (tj. bitowa sekwencja wyjściowa powstała w wyniku realizacji reguły kodu na strumieniu wejściowym) była jednoznacznie dekodowalna. Oznacza to, iż na podstawie wyjściowej sekwencji bitowej kodera realizującego ustalony kod opisany funkcją kodowania można jednoznacznie odtworzyć oryginalny zbiór symboli wejściowych.
Kodowanie jest więc przekształceniem różnowartościowym 'jeden w jeden', czyli bijekcją. Jeśli dla ciągów symboli wejściowych oraz o wartościach z alfabetu } przyporządkowano bitową sekwencję kodową ( - zbiór wszystkich sekwencji bitowych generowanych przez ):
(1.10) |
Oznaczmy przez zbiór wszystkich niepustych i skończonych sekwencji symboli alfabetu o symbolach. Wtedy ogólna postać funkcji kodowania z binarnym alfabetem sekwencji wyjściowych .
Przykładem kodu jednoznacznie dekodowalnego jest prosty kod dwójkowy stałej długości (zobacz punkt ) z czteroelementowym alfabetem . Każdemu z symboli alfabetu przypisano słowo kodowe w postaci binarnego zapisu liczby naturalnej od 0 do 3, będącej indeksem (wskazującej pozycję) danego symbolu w na bitach. Zbiór słów kodowych jest więc następujący: }, a kod jest odwzorowaniem różnowartościowym (co wynika z unikatowej postaci binarnej reprezentacji indeksu kolejnych symboli ).
Kodowanie według polega na przypisaniu kolejnym symbolom sekwencji wejściowej odpowiednich binarnych słów kodowych , takich że i , dołączając je do wyjściowej sekwencji bitów (konkatenacja bitów słów kodowych symboli źródła według porządku ich występowania na wejściu kodera). Praca dekodera tego kodu polega na odtwarzaniu symboli z według czytanych kolejno 2 bitowych indeksów, co pozwala jednoznacznie zdekodować sekwencję kodową i wiernie zrekonstruować postać źródłowej sekwencji .
Kodowanie według jest przykładem tzw. kodowania przyrostowego: , gdzie , a ( nazwiemy alfabetem kodu ). Ogólniej kodowanie przyrostowe polega na kolejnym dołączaniu sekwencji bitowych, przypisywanych czytanym sekwencjom symboli wejściowych według określonej reguły (tj. kodu), tworząc jedną sekwencję kodową. Kod może przypisywać sekwencje kodowe pojedynczym symbolom (jak wyżej) lub całym wieloelementowym grupom (blokom) symboli.
Dany jest alfabet oraz zbiór wszystkich niepustych sekwencji nad tym alfabetem . Trywialnym przykładem kodowania, które po rozszerzeniu nie jest jednoznacznie dekodowalne, jest funkcja , która dowolnemu symbolowi z przypisuje to samo słowo kodowe . Dekoder odczytując nie jest w stanie podjąć jednoznacznej decyzji: .
Innym przykładem kodu niejednoznacznie dekodowalnego przy dwuelementowym alfabecie źródła jest: i , kiedy to sekwencję można zdekodować jako ciąg symboli lub też jako pojedynczy symbol . Przy większym alfabecie źródła, np. określmy jako: , , i . Dekodowanie sekwencji bitowych lub nie jest jednoznaczne, gdyż lub też , a w przypadku mamy .
Koder przyporządkuje czterem symbolom alfabetu źródła informacji następujące słowa kodowe: . Rozpatrzmy krótką sekwencję kodową = 00} utworzoną ze słów kodowych alfabetu , która może być interpretowana jako połączenie słów 0 i 0} () lub też 001 (czyli ). Kod realizowany przez ten koder również nie jest kodem jednoznacznie dekodowalnym, a można to stwierdzić na podstawie analizy alfabetu postaci (zbioru) słów kodowych danego kodu. Dla koderów wykorzystujących inne zbiory binarnych słów kodowych można w analogiczny sposób stwierdzić, że:
- kod jest jednoznacznie dekodowalny,
- kod jest jednoznacznie dekodowalny,
- kod nie jest jednoznacznie dekodowalny,
- kod jest jednoznacznie dekodowalny,
- kod nie jest jednoznacznie dekodowalny.
Aby kod był jednoznacznie dekodowalny musi mieć różnych słów kodowych (w przypadku warunek ten nie jest spełniony). Jeśli w danym kodzie jedno ze słów kodowych jest konkatenacją innych słów, wówczas kod nie jest jednoznacznie dekodowalny (zobacz przypadki kodów i ). Uogólniając tę zasadę, jeśli połączenie kilku słów kodowych daje taki sam efekt, jak połączenie innych słów z alfabetu kodu, wówczas także mamy do czynienia z brakiem jednoznaczności dekodowania. Tak jest w przypadku kodu , gdzie połączenie słów , jak również w przypadku kodu , ponieważ .
Kody przedrostkowe
W przypadku kodów o liczniejszych alfabetach źródeł informacji trudno jest nieraz zweryfikować kod pod względem jednoznaczności dekodowania. Można jednak zauważyć, że we wszystkich przypadkach przedstawionych powyżej kodów, które nie są jednoznacznie dekodowalne, jedno ze słów kodowych jest przedrostkiem innego. Słowo jest przedrostkiem słowa , jeśli , gdzie . Dla kodów oraz żadne ze słów nie jest przedrostkiem innego. Są to więc kody przedrostkowe, tj. dla dowolnej pary różnych symboli zachodzi relacja (gdzie oznacza relację początku w sekwencji bitowej). Relacja ta przenosi się na sekwencje symboli źródła . Skoro żaden element z nie jest przedrostkiem innego słowa tego zbioru, to sekwencja kodowa dowolnego ciągu symboli z także nie może być przedrostkiem sekwencji słów kodowych innego ciągu symboli alfabetu źródła. Efektem wystąpienia choćby jednego różnego symbolu w sekwencji wejściowej jest pojawienie się słowa, który nie jest przedrostkiem innego, co powoduje utratę cechy przedrostkowości sekwencji: , ponieważ . Ta właściwość pozwala jednoznacznie zdekodować sekwencję kodową ciagu symboli wejściowych.
Kody przedrostkowe (prefix codes) w literaturze angielskojęzycznej nazywane są także prefix condition codes}, prefix-free codes lub też comma-free code. Wydaje się, że nazwa kody bezprzedrostkowe lepiej oddaje istotę zagadnienia.
Ze względu na możliwość dekodowania od razu kolejnych słów kodowych (od lewej do prawej, co daje prostą budowę kodera), kody przedrostkowe znane są także jako instantaneous codes, czyli kody z natychmiastowym dekodowaniem, bez konieczności odczytywania dalszych bitów w celu poprawnej interpretacji sekwencji bitów. Prosty algorytm dekodera kodu przedrostkowego który polega na odczytywaniu kolejnych słów kodowych i dekodowaniu odpowiadających im symboli źródła, jest następujący:
Algorytm 1.3 Dekodowanie sekwencji kodu przedrostkowego
- Wyzeruj zmienną przechowującą wejściową sekwencję bitów;
- Czytaj do tyle bitów, ile wynosi minimalna długość słowa kodowego w a wobec braku danych wejściowych zakończ;
- Porównanie ze słowami kodu : dla sprawdź, jeśli (gdzie ), to emituj na wyjście symbol i kontynuuj krok 1;
- Czytaj bit z wejścia i dopisz go do , a wobec braku danych wejściowych zakończ;
- Przejdź do kroku 3.
Kody przedrostkowe mogą być reprezentowane za pomocą struktury binarnych drzew kodowych (są kodami drzew binarnych), gdzie etykietowane gałęzie ustalają kolejne bity słów symboli alfabetu źródła, przypisanych liściom tego drzewa. Przejście od liścia do korzenia ze spisaniem dwójkowych etykiet kolejnych gałęzi daje słowo kodowe danego symbolu (w odwrotnej kolejności, tj. od najmłodszego bitu do nastarszego). Przy dekodowaniu symbolu, odczytywane kolejno bity słowa kodowego (od najstarszego do najmłodszego) prowadzą od korzenia do odpowiedniego liścia. Wykorzystanie struktury drzewa umożliwia wygodną realizację kodera i dekodera danego kodu przedrostkowego.
Przedrostkowość kodu jest warunkiem wystarczającym jego jednoznacznej dekodowalności. Nie jest jednak warunkiem koniecznym, co pokazuje przykład kodu . Kody jednoznacznie dekodowalne, nie będące kodami przedrostkowymi, są jednak trudniejsze w dekodowaniu (komplikuje się nieco budowa dekodera, a interpretacja sekwencji bitów odbywa się z opóźnieniem). Po odczytaniu słowa kodowego wymagają niekiedy odczytania kilku dodatkowych bitów, aby dokonać poprawnej jego interpretacji. Weźmy sekwencję kodową utworzoną według kodu postaci: . Zdekodowanie pierwszego symbolu trójelementowego alfabetu wymaga odczytania dwóch pierwszych bitów (drugi bit sekwencji kodowej równy 0 wskazuje, że pierwsze 0 to a nie pierwszy bit słowa ). Aby poprawnie zdekodować bit drugi i trzeci sekwencji (jako ) koniecznym jest odczytanie wszystkich pozostałych bitów (tj. czwartego, piątego i szóstego). Bowiem po odczytaniu piątego bitu jeszcze nie wiadomo, czy 0111 (bity od 2 do 5 sekwencji ) to złączone słowa , czy też konkatenacja słów z pierwszym bitem kolejnego słowa . Dopiero po odczytaniu ostatniego 0 (szóstego bitu z ) wszystko się wyjaśnia (gdyby nie był to ostatni bit sekwencji kodowej, nie byłoby wiadomo czy należy dekodować czy też jest to pierwszy bit ).
Kody drzew binarnych
Wykorzystanie struktury drzewa w projektowaniu kodu przedrostkowego pozwala w wygodny sposób realizować założenia dotyczące konstrukcji kodu efektywnego w kompresji danych o określonej charakterystyce. Utworzenie drzewa binarnego dla definiowanego kodu przedrostkowego ułatwia analizę kodu, pozwala wykazać ewentualną jego nadmiarowość, umożliwia prostą jego modyfikację poprzez zmianę sposobu etykietowania drzewa (wpływającego na postać poszczególnych słów) lub dodanie liści (rozszerzenie alfabetu kodu o nowe słowa).
Właściwości kodu drzewa binarnego są określane na etapie konstruowania struktury drzewa dla założonej liczby liści, przy ustalaniu jego głębokości, poziomu zrównoważenia w skali całego drzewa lub wybranych poddrzew, sposobu rozmieszczenia symboli w liściach oraz zasad etykietowania. Głębokość umieszczenia poszczególnych liści decyduje o długości słów kodowych. Poziom zrównoważenia drzewa wpływa na zróżnicowanie długości słów symboli.
Formowanie słów kodowych poszczególnych liści odbywa się poprzez spisywanie etykiet gałęzi przejścia od korzenia do liścia, nigdy w kierunku odwrotnym (wynika to z naturalnego kierunku przejścia od rodzica do dzieci, pozwala rozróżnić potomstwo, choć nieco komplikuje budowę kodera wymuszając konieczność odwrócenia bitów). Idąc od korzenia na kolejnych poziomach formowany jest, w zależności od drogi, przedrostek słów kodowych. Przykładowo, przy ustalaniu słowa liścia z symbolem w drzewie na rys. 1.4a, w węźle wewnętrznym pierwszego poziomu określony jest przedrostek 0, a następnie idąc do prawego syna-liścia otrzymujemy słowo W zależności od wybranego sposobu etykietowania gałęzi, binarne drzewo kodowe (tj. służące do realizacji danego kodu) o określonej strukturze wyznacza wiele kodów o takiej samej długości słów. Słowa te w sposób jednoznaczny opisują drogę przejścia od korzenia do symboli alfabetu przypisanych poszczególnym liściom.
Rys. .4 Etykietowanie drzew binanych: a) drzewo o dwóch wierzchołkach wewnętrznych i trzech liściach z symbolami z zaznaczoną relacją rodzic-dzieci oraz ustalonymi słowami kodowymi ; b) trzy inne sposoby etykietowania tego samego drzewa.
Przy etykietowaniu drzewa binarnego gałęzie łączące wierzchołek rodzica z dziećmi muszą mieć różne etykiety. Dwa możliwe sposoby etykietowania gałęzi każdego elementarnego poddrzewa (rodzic-dwójka dzieci) to 0 dla połączenia z lewym synem i 1 - z prawym lub odwrotnie (zobacz rys. 1.4a). Skoro istnieją dwie możliwości ustalania przedrostka dzieci każdego wierzchołka wewnętrznego (rodzica), to przy wierzchołkach wewnętrznych w drzewie mamy różnych sposobów utworzenia słów kodowych. Przykład różnych sposobów etykietowania drzewa o przedstawiono na rys. 1.4.
W związku z tym, w przypadku budowy drzewa określonego kodu przedrostkowego możliwych jest różnych postaci drzewa binarnego, w zależności od przyjętego sposobu etykietowania. Długość słów poszczególnych symboli alfabetu tego kodu jest określona, czyli odpowiednie liście muszą zawsze znajdować się na tej samej głębokości, chociaż kształt struktury drzewa może być różny.
Długość słowa symbolu danego liścia drzewa jest równa głębokości (numerowi poziomu, licząc od zerowego poziomu korzenia), na jakiej znajduje się liść. Dla drzew z rysunku 1.4 liście i znajdują się na 2 poziomie (na głębokości równej 2), więc mają słowa dwubitowe, zaś liściowi z pierwszego poziomu przypisano słowo jednobitowe. Zmiana sposobu etykietowania nie wpływa na długość poszczególnych słów.
Efektywna postać kodu drzewa binarnego Podstawowy warunek zapewniający efektywność kodu sprowadza się do konstrukcji drzewa, które nie ma zdegenerowanych elementarnych poddrzew, tj. rodzica tylko z jednym dzieckiem. Stąd każdy wierzchołek takiego drzewa, zwanego drzewem lokalnie pełnym, z wyjątkiem korzenia, ma brata. Puste miejsce w zdegenerowanym poddrzewie jest niewykorzystane - brakuje gałęzi z etykietą, dla której zarezerwowano miejsce w drzewie. Zawsze wtedy można zlikwidować wierzchołek rodzica takiego poddrzewa przesuwając na jego miejsce jedyne dziecko (wraz z poddrzewem) i skracając w ten sposób o jeden długość związanego z dzieckiem przedrostka słów liści z jego poddrzewa.
Drzewo lokalnie pełne o zadanej liczbie liści można zbudować, zaczynając np. od struktury z jednym wierzchołkiem, korzeniem, dodając nowe liście zgodnie z poniższą regułą.
Reguła rozbudowy drzewa lokalnie pełnego: wybrany węzeł aktualnej postaci drzewa przenosimy wraz z poddrzewem o jeden poziom niżej, zaś na jego miejsce wstawiamy nowy węzeł wewnętrzny, którego drugim dzieckiem jest nowo dołączany liść.
Drzewo o liściach ma jeden węzeł wewnętrzny, tj. korzeń. Dodanie nowego liścia według tej reguły powoduje, że uzyskujemy drzewo z liśćmi przy dwóch wierzchołkach wewnętrznych. W każdym kolejnym kroku rozbudowy drzewa dochodzi jeden liść i jeden wierzchołek wewnętrzny, a więc liczba wierzchołków wewnętrznych drzewa lokalnie pełnego jest zawsze równa: . Wszystkich wierzchołków drzewa jest . Przykłady drzew przedstawiono na rys.1.5.
Rys. 1.5 Przykłady drzew: a) lokalnie pełnych; b) nie będących lokalnie pełnymi.
Aby uzyskać postać drzewa, które utraci cechę lokalnej pełności można zmodyfikować opisaną wyżej metodę konstrukcji drzewa lokalnie pełnego w sposób następujący. Wybrany liść przesuwamy poziom niżej, zaś w jego poprzednim miejscu tworzymy wierzchołek wewnętrzny (bez dołączania nowego liścia). W ten sposób powstaje zdegenerowane elementarne poddrzewo, rośnie o jeden liczba węzłów wewnętrznych przy niezmiennej liczbie liści równej . W drzewach nie będących lokalnie pełnymi o liściach liczba węzłów wewnętrznych jest więc równa lub większa, a liczba wszystkich wierzchołków .
W mniejszym drzewie na rysunku 1.5a liczba wierzchołków . Wersja tego drzewa po utracie cechy lokalnej pełności z rys. 1.5b ma odpowiednio (dwa wierzchołki wewnętrzne plus dwa liście), czyli . Nastąpiło wydłużenie długości słowa kodowego symbolu o jeden bit. Analogicznie większe drzewo z rys. 1.5a ma jego modyfikacja na rys. 1.5b odpowiednio oraz wydłużone słowa symboli i o jeden bit.
Każdy wewnętrzny wierzchołek drzewa lokalnie pełnego o lokalizacji jednoznacznie określonej jego przedrostkiem ma zawsze dwóch synów: lewego i prawego o przedrostkach i . Przedrostki te muszą pojawić się jako przedrostki słów wszystkich liści występujących w poddrzewie wierzchołka . Stąd w kodzie takiego drzewa każdy przedrostek właściwy (mający przedłużenie w słowie) dowolnego słowa kodowego ma przedłużenia i będące przedrostkami tego słowa oraz innego . Kod drzewa lokalnie pełnego nazywany jest kodem przedrostkowym pełnym.
W większym drzewie z rys. 1.5a widać, że dowolny przedrostek związany z wierzchołkiem wewnętrznym ma przedłużenia z dołączonym bitem 0 oraz 1 w przedrostkach dzieci tego wierzchołka, a ostatecznie w słowach liści należących do jego poddrzewa. Z kolei słowa i mniejszego drzewa z rys. 1.5b świadczą o tym, że nie jest on przedrostkowo pełny: przedrostek właściwy słowa nie ma przedłużenia a jedynie przedłużenie w słowie symbolu .
Kody symboli i kody strumieniowe
Kod dwójkowy stałej długości, jak również inne wzmiankowane wyżej przykłady kodów pozwalające lub nie na jednoznaczne dekodowanie tworzonych sekwencji, należą do klasy tzw. kodów symboli (symbol codes). W kodach symboli sekwencja wyjściowa powstaje poprzez przypisanie kolejnym symbolom pojawiającym się na wejściu odpowiednich słów kodowych w schemacie ,,jeden symbol - jedno słowo''. Aby uzyskać efekt kompresji potrzebne jest zróżnicowanie długości poszczególnych słów (w przeciwieństwie do kodu , który ustala zwykle oryginalną reprezentację kodowanych danych). Bardziej praktyczne są więc kody o zmiennej długości bitowej słów kodowych (variable-length symbol codes).
Inną, potencjalnie bardziej efektywną grupę metod kodowania stanowią kody strumieniowe (stream codes). W kodach strumieniowych pojedyncze słowo kodowe przypisywane jest ciągowi symboli wejściowych. Może to być ciąg symboli o stałej lub zmiennej długości (np. w koderach słownikowych), a w skrajnym przypadku wszystkim symbolom strumienia wejściowego odpowiada jedno słowo kodowe, będące jednoznacznie dekodowalną reprezentacją danych źródłowych. Takie słowo tworzone jest w koderze arytmetycznym, stanowiącym automat skończony, który w każdym takcie (a więc po wczytaniu kolejnego symbolu wejściowego) wyprowadza (nieraz pustą) sekwencję bitów w zależności od czytanego symbolu i aktualnego stanu automatu.
Jednoznaczna dekodowalność kodów strumieniowych wynika z różnowartościowości przekształcenia sekwencji symboli wejściowych w słowo kodowe (sekwencję kodową). Decydujący wpływ ma tutaj metoda tworzenia słów kodowych, przystosowana do znacznie większego alfabetu możliwych postaci danych wejściowych, zwykle adaptacyjna i bardziej złożona niż w przypadku kodów symboli.
W charakterystyce kodów symboli o zmiennej długości istotną rolę odgrywa także nierówność Krafta-MacMillana. Dotyczy ona kodów jednoznacznie dekodowalnych zawierających słów kodowych o długościach , dla których zachodzi następująca zależność:
(1.11) |
Odwrotnie, mając dany zbiór dodatnich liczb całkowitych spełniających (1.11) istnieje jednoznacznie dekodowalny kod symboli o długościach kolejnych słów kodowych równych .
Nierówność (1.11) jest prawdziwa dla kodów drzew binarnych, co można wykazać na podstawie właściwości struktury drzewa. Dowolną postać drzewa binarnego daje się uzyskać poprzez rozbudowę drzewa najprostszej postaci. Kolejne liście dołączane są w wolnych miejscach istniejącej struktury węzłów lub też poprzez dodanie nowego węzła wewnętrznego.
Najprostsza (i najbardziej efektywna) postać drzewa z jednym liściem to korzeń z podpiętym bezpośrednio liściem. Mamy wtedy jedno słowo kodowe o długości czyli spełniona jest nierówność (1.11). Wstawienie na wolne miejsce (jako drugie dziecko korzenia) drugiego liścia daje dwa słowa kodowe o długościach i wobec czego zachodzi równość .
Uzyskaliśmy w ten sposób drzewo lokalnie pełne. Dodanie nowego liścia z zachowaniem lokalnej pełności drzewa może się odbywać według reguły rozbudowy drzewa lokalnie pełnego stosowanej do dowolnego liścia. Powoduje to następującą zmianę w alfabecie słów kodowych: słowo o długości zastępowane jest dwoma słowami postaci i o długości . Odpowiedni składnik sumy z wyrażenia (1.11) się nie zmienia, gdyż . Według tej zasady można uzyskać dowolne drzewo lokalnie pełne. Pozwala to stwierdzić, że dla drzew lokalnie pełnych, czyli dla kodu przedrostkowego pełnego zawsze zachodzi równość: .
Rozbudowa drzewa bez zachowania cechy lokalnej pełności powoduje zmniejszenie efektywności kodu poprzez wydłużenie słów kodowych. Utratę tej cechy powoduje modyfikacja drzewa polegająca na przesunięciu o jeden poziom w dół wierzchołka wraz z całym poddrzewem i ustanowieniu w zwolnionym miejscu nowego węzła wewnętrznego. Operacja ta powoduje wydłużenie długości słów kodowych wszystkich liści tego poddrzewa. Mamy więc gdzie to długości słów po modyfikacji. Dla kodu przedrostkowego bez cechy pełności mamy więc zawsze zależność: .
Spełnienie nierówności (1.11) jest warunkiem koniecznym jednoznacznej dekodowalności kodu, nie jest jednak warunkiem wystarczającym (dostatecznym). Potwierdzeniem jest np. kod symboli określony słowami (niewielka modyfikacja kodu ) spełniający(1.11). Przykładowe kody i nie spełniają nierówności (1.11), co dowodzi, że nie są jednoznacznie dekodowalne. Zaś w przypadku kodów i zależność ta nie wystarcza do wykazania braku niejednoznacznej dekodowalności.
Nierówność (1.11) można odnieść do pojęcia informacji własnej związanej z wystąpieniem (z prawdopodobieństwem ) pojedynczego symbolu kodowanego słowem o długości zapisując gdzie j est nadmiarową|niedomiarową (w stosunku do wartości informacji własnej) długością słowa (wynikającą np. z ograniczenia długości słowa do całkowitej liczby bitów). W wyniku prostych przekształceń , co pozwala zapisać (1.11) jako . Jeśli założymy stałą wartość dla wszystkich słów, wtedy . W przypadku, gdy kod dobiera krótsze od informacji własnej słowa kodowe dla wybranych symboli alfabetu, to dla innych symboli słowa muszą być wydłużone (średnio) tak samo lub bardziej.
Twierdzenia o kodowaniu źródeł
Przy konstruowaniu technik odwracalnej kompresji interesującym jest pytanie o granicę możliwej do uzyskania efektywności kompresji. Intuicyjnie wiadomo, że nie można stworzyć nowej reprezentacji danych o dowolnie małej długości przy zachowaniu pełnej informacji dostarczonej ze źródła. Okazuje się, że entropia łączna wyznaczona według równań (1.4) dla kodowanego zbioru danych stanowi graniczną (minimalną) wartość średniej bitowej reprezentacji kodowej - jest bowiem miarą ilości informacji pochodzącej ze źródła. Mówią o tym twierdzenia Shannona o kodowaniu źródeł, w tym szczególnie istotne twierdzenie o bezstratnym kodowaniu źródła (tj. z kanałem bezszumnym, z doskonałą rekonstrukcją sekwencji symboli źródła - bez ograniczenia liczby bitów) (noiseless source coding theorem), zwane też pierwszym twierdzeniem Shannona. Według tego twierdzenia, aby zakodować dany proces (sekwencję symboli generowanych przez źródło) o entropii do postaci sekwencji symboli binarnych, na podstawie której możliwe będzie dokładne zdekodowanie (rekonstrukcja) procesu źródłowego, potrzeba co najmniej symboli binarnych (bitów). Możliwa jest przy tym realizacja schematu kodowania, który pozwoli uzyskać bitową reprezentację informacji z takiego źródła o długości bardzo bliskiej wartości .
Bardziej praktyczna odmiana twierdzenia o bezstratnym kodowaniu źródła dotyczy granicznej efektywności kodowania, osiąganej poprzez kodowanie dużych bloków symboli alfabetu źródła (tj. -tego rozszerzenia źródła, przy zmianie struktury informacji pojedynczej) za pomocą binarnych słów kodowych. Zamiast przypisywania słów kodowych pojedynczym symbolom alfabetu, jak w koderach symboli, koncepcja skuteczniejszego kodera prowadzi w kierunku realizacji kodu strumieniowego, uwzględniając przy tym w możliwie wydajny sposób zależności pomiędzy poszczególnymi symbolami kodowanej sekwencji.
Niech będzie ergodycznym źródłem z alfabetem o wygenerowanych elementach i entropii . Ponadto, niech bloki po (\)N\leq t\)) symboli alfabetu źródła kodowane będą jednocześnie za pomocą binarnych słów kodowych dających kod jednoznacznie dekodowalny. Wówczas dla dowolnego możliwa jest, poprzez dobór odpowiednio dużej wartości taka konstrukcja kodu, że średnia liczba bitów reprezentacji kodowej przypadająca na symbol tego źródła spełnia równanie:
(1.12) |
Okazuje się, że zawarta w tym twierdzeniu sugestia o zwiększaniu efektywności kompresji poprzez konstruowanie coraz większych rozszerzeń źródła (rosnące ) jest cenną wskazówką, ukazującą kierunek optymalizacji koderów odwracalnych. W dosłownej realizacji tej sugestii występuje jednak problem skutecznego określenia prawdopodobieństw łącznego wystąpienia symboli źródła na podstawie kodowanego strumienia danych.
Z twierdzenia o bezstratnym kodowaniu źródła jasno wynika, że każde źródło danych może być bezstratnie kodowane przy użyciu kodu jednoznacznie dekodowalnego, którego średnia liczba bitów na symbol źródła jest dowolnie bliska, ale nie mniejsza niż entropia źródła (określona na podstawie prawdopodobieństw występowania poszczególnych symboli i grup symboli źródła) wyrażona w bitach. Jest to naturalne ograniczenie wszystkich metod bezstratnej kompresji odnoszące się do założonych modeli źródeł informacji. Oczywiście użyty model źródła winien jak najlepiej charakteryzować (przybliżać) zbiór danych rzeczywistych. Należy więc podkreślić względność wyznaczanych wartości granicznych wobec przyjętego modelu źródła informacji. Przykładowo, przy konstruowaniu kodera na podstawie modelu źródła bez pamięci, graniczną wartością efektywności tego kodera będzie wartość entropii .
Uzyskanie większej skuteczności kompresji metod bezstratnych jest możliwe poprzez doskonalenie modelu źródła informacji przybliżającego coraz wierniej kompresowany zbiór danych (oryginalnych, współczynników falkowych itp.), nawet kosztem rosnącej złożoności modelu. Potrzeba coraz dokładniej modelować wpływ kontekstu, zarówno za pomocą rozbudowanych, dynamicznych (adaptacyjnych) modeli predykcyjnych, jak też coraz szybciej i pełniej określanych probabilistycznych modeli Markowa nawet wyższych rzędów. Modelowanie musi być skojarzone z efektywnymi rozwiązaniami kodów binarnych (powstających na podstawie tych modeli), pozwalających osiągnąć minimalną długość bitowej sekwencji nowej reprezentacji danych.