150 likes | 346 Views
Komprimace dat a kryptologie. Aritmetické kódování. Myšlenka: Jak zakódovat vstupní data do jediného čísla? Data se zakódují do zlomku n , 0 ≤ n < 1, n ∊R Bezztrátová komprese. Princip.
E N D
Komprimace dat a kryptologie Aritmetické kódování
Myšlenka: Jak zakódovat vstupní data do jediného čísla? Data se zakódují do zlomku n, 0 ≤ n < 1, n∊R Bezztrátová komprese Princip
Podle pravděpodobnosti výskytu znaku je každému znaku přiřazena poměrná část intervalu <0,1). To je interval rozdělení znaků. Princip Kódování
Potom postupně upřesňujeme počáteční interval <0,1), dokud není vyprázdněn vstup. Číslo n leží ve vypočítaném intervalu. • Zavedeme symboliku: • Horní hodnota intervalu … high • Spodní hodnota intervalu … low • Rozpětí intervalu … range Princip kódování
Výpočet nových hranic intervalu pro jednotlivé znaky: high = low+ range*horní hodnota intervalu znaku low = low+ range* spodní hodnotaintervalu znaku Výpočet probíhá pro všechny symboly na vstupu. Princip kódování
Číslo, které kóduje vstupní řetězec může být libovolné číslo z výsledného intervalu. Obvykle se bere to, které má nejkratší binární zápis. Princip kódování
Chceme zakódovat řetězec „ace“. Máme např. abecedu se znaky a,b,c,d,e. Provedeme rozdělení pravděpodobnosti výskytu znaků do intervalu znaků <0,1). Příklad kódování
Výpočet nových hranic intervalu pro každý znak. Výsledný interval: <0.195,0.210) Jako výslednou hodnotu vybereme např. n=0.20 Příklad kódování
Při dekódování není potřeba předávat výsledný interval, stačí jen zvolené číslo n. Musíme mít ale k dispozici pravděpodobnosti výskytu znaků abecedy. Číslo n postupně upravujeme a při každém kroku k němu najdeme příslušný znak podle intervalu, ve kterém právě leží n. Nová hodnota n se vypočítá podle vztahu: n = (n – low) / range low, high … hodnoty intervalu, do kterého patří n Opakujeme tak dlouho, dokud není celý řetězec dekódován. Princip dekódování
n = 0.20 Stanovíme jednotlivé znaky: Výsledný řetězec: „ace“ Příklad dekódování
Problém: nekonečně dlouhý řetězec povede na interval s nekonečně velkou přesností. • Je potřeba nekonečně mnoho bitů pro uložení. • Řešení: • V proměnných low a high se ukádá jen několik posledních desetinných míst, zbytek je zapsán na výstupu. • V době kdy se rovnají MSB (nejvýznamnější bity) horní i dolní hranice intervalu, vypíšeme hotnotu na výstup a posuneme vlevo obě proměnné o jeden bit. Aspekty implementace
Pokud se MSB nerovnají, může nastat další další problém – podtečení. V situaci, kdy jsou hranice intervalu velmi blízko a stále nemají stejný MSB, mění se dále už jen ostatní bity, nikoli MSB – nedojde k posunu bitů vlevo a přesnost se ztratí. Podtečení nastává v případě, že dva MSB v low a se liší od jejich protějšků v high. Podtečení
Řešení: • Posun bitů vlevo od druhého bitu. • Např.: • low = 0111010111001101high= 1011001001001100 podtečení posun: low = 0110101110011010high= 1110010010011001 podtečení
begin spočti četnosti zdrojových jednotek output(četnosti) interval I := nový interval 0..1 rozděl I podle četnosti jednotek readSymbol(X) while (X!=EOF) do begin if (MSB(low) == MSB(high)) then begin output(MSB) případné zahozené číslice na výstup shiftlefthighi low end else begin if (nebezpečí podtečení) then begin shiftlefthighi lowod druhé pozice end end spočti nové low a high readSymbol(X) end output(zbytek) end Pseudokód
Srovnatelné s Huffmanovým kódováním Komprese trvá déle, ale má lepší kompresní poměr. JPEG JBIG2 Použití