KÓDOVÁNÍ A KOMPRESE DAT URČENO PRO VZDĚLÁVÁNÍ V AKREDITOVANÝCH STUDIJNÍCH PROGRAMECH
RADIM FARANA
ČÍSLO OPERAČNÍHO PROGRAMU: CZ.1.07 NÁZEV OPERAČNÍHO PROGRAMU: VZDĚLÁVÁNÍ PRO KONKURENCESCHOPNOST OPATŘENÍ: 7.2 ČÍSLO OBLASTI PODPORY: 7.2.2
INOVACE VÝUKY INFORMATICKÝCH PŘEDMĚTŮ VE STUDIJNÍCH PROGRAMECH OSTRAVSKÉ UNIVERZITY REGISTRAČNÍ ČÍSLO PROJEKTU: CZ.1.07/2.2.00/28.0245
OSTRAVA 2014
Tento projekt je spolufinancován Evropským sociálním fondem a státním rozpočtem České republiky Recenzent: doc. RNDr. František Koliba, CSc.
Název: Autor: Vydání: Počet stran:
Kódování a komprese dat Radim Farana první, 2014 153
Jazyková korektura nebyla provedena, za jazykovou stránku odpovídá autor.
© Radim Farana © Ostravská univerzita v Ostravě
OBSAH 1
VSTUP DO PROBLEMATIKY ..........................................................5
2
TEORIE INFORMACE .......................................................................7 2.1 2.2 2.3 2.4
3
INFORMATIKA ......................................................................................8 JEDNOTKA INFORMACE ........................................................................9 ZÁKLADNÍ POJMY Z TEORIE INFORMACE ............................................11 PŘENOS INFORMACE ..........................................................................13 KÓDOVÁNÍ ........................................................................................17
3.1 ZÁKLADNÍ POJMY Z TEORIE KÓDŮ......................................................18 3.1.1 Huffmanova konstrukce nejkratšího kódu .................................21 3.1.2 Shannon-Fanova konstrukce nejkratšího kódu .........................22 3.2 BEZPEČNOSTNÍ KÓDY ........................................................................23 3.2.1 Objevování chyb........................................................................23 3.2.2 Opravování chyb .......................................................................24 4
LINEÁRNÍ KÓDY..............................................................................33 4.1 4.2
5
CYKLICKÉ KÓDY ............................................................................43 5.1 5.2
6
REALIZACE CYKLICKÝCH KÓDŮ .........................................................50 POUŽITÍ CYKLICKÝCH KÓDŮ ..............................................................52 KONTROLNÍ ČÍSLICE.....................................................................55
6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 7
DEKÓDOVÁNÍ LINEÁRNÍCH KÓDŮ ......................................................38 HAMMINGOVY KÓDY .........................................................................40
RODNÉ ČÍSLO .....................................................................................56 IDENTIFIKACE PUBLIKACÍ ..................................................................56 ČÁROVÝ KÓD .....................................................................................57 IDENTIFIKAČNÍ ČÍSLO .........................................................................58 ČÍSLO ÚČTU .......................................................................................58 IDENTIFIKAČNÍ ČÍSLO AUTOMOBILU ...................................................60 ČÁROVÉ KÓDY ...................................................................................61 KÓDY KONSTANTNÍ ZMĚNY ...............................................................63 KÓDY PRO UKLÁDÁNÍ DAT .........................................................67
7.1 JEDNODUCHÉ DATOVÉ TYPY ..............................................................68 7.1.1 Logická informace.....................................................................69 7.1.2 Celá čísla...................................................................................69 7.1.2.1 Přímý kód ..............................................................................70 7.1.2.2 Doplňkový kód......................................................................70 7.1.2.3 Inverzní kód...........................................................................71 7.1.2.4 Operace s celými čísly...........................................................72 7.1.3 Reálná čísla ...............................................................................72 7.1.3.1 Přímý kód ..............................................................................73 7.1.3.2 Doplňkový kód......................................................................74 7.1.3.3 Inverzní kód...........................................................................74 7.1.3.4 Operace s reálnými čísly .......................................................74 7.1.4 Textová informace .....................................................................79 7.1.5 Ukazatel.....................................................................................80
Kódování a komprese dat 7.2 SLOŽENÉ DATOVÉ TYPY .................................................................... 80 7.2.1 Pole ........................................................................................... 80 7.2.2 Struktura ................................................................................... 81 7.2.3 Množina .................................................................................... 81 7.2.3.1 Operace s množinami ........................................................... 82 7.2.4 Objekt........................................................................................ 82 7.2.5 Soubor....................................................................................... 83 8
BEZEZTRÁTOVÁ KOMPRESE DAT............................................ 85 8.1 METODA OPAKOVÁNÍ ZNAKŮ ............................................................ 86 8.2 VÝKONNÉ SYSTÉMY KOMPRESE ........................................................ 87 8.2.1 Algoritmus Lempel-Ziv 1977 .................................................... 89 8.2.2 Algoritmus Lempel-Ziv-Welch 1984......................................... 91 8.2.3 Huffmanův kód.......................................................................... 96 8.2.4 Aritmetická komprese ............................................................... 97
9
KOMPRESE OBRAZU ................................................................... 101 9.1 9.2 9.3 9.4
10 10.1 10.2
MODELY BAREV .............................................................................. 102 FORMÁT JPEG ................................................................................ 104 JPEG 2000...................................................................................... 112 FRAKTÁLNÍ KOMPRESE .................................................................... 119 KOMPRESE VIDEA A ZVUKU .................................................... 131 KOMPRESE VIDEA – MPEG............................................................. 132 KOMPRESE ZVUKU .......................................................................... 135
11
ŘEŠENÍ ÚKOLŮ.............................................................................. 141
12
REJSTŘÍK ........................................................................................ 143
13
VYSVĚTLIVKY K POUŽÍVANÝM SYMBOLŮM..................... 149
14
LITERATURA.................................................................................. 151
4
Kódování a komprese dat
1
Vstup do problematiky
Cíl: Tento učební text přibližuje studentům základní informace z oblasti kódování a šifrování dat. Učební text přibližuje matematické základy a algoritmy pro tvorbu kódů minimální délky, kontrolních a samoopravných kódů několika tříd. V druhé části jsou představeny základní kompresní algoritmy jak pro bezeztrátovou kompresi, tak pro kompresi obrazu, videa a zvuku. Studenti získají přehled a orientaci v základních pojmech z oblasti kódování a komprese dat. Po jejím prostudování byste měli být schopni:
Definovat cíl učebního textu. Znát obsah učebního textu.
Klíčová slova této kapitoly: Data, kód, kódování, komprese, algoritmus. Doba potřebná ke studiu: 0,15 hodiny
Průvodce studiem Tento učební text představuje základní znalosti z oblasti kódování a komprese dat a pomáhá tak studentům pochopit principy používané v řadě aplikací, komunikačních a informačních systémech. Učební text je sestaven podle standardů používaných pro elektronické učební texty včetně obvyklých grafických symbolů, polotučnou kurzívou jsou psány hlavní pojmy, které je třeba znát, zatímco pouze tučné písmo slouží ke grafickému zvýraznění části textu. V uvozovkách jsou uváděny základní definice. Seminární práce V průběhu studia modulu studenti vypracovávají seminární práci na zvolené téma z oblasti kódování a komprese dat. Práci zpracovávají formou prezentace s komentářem pro přednášejícího (buď jako komentáře jednotlivých stránek nebo jako samostatný text). Ke zpracování musí použít nejméně tři nezávislé hodnověrné zdroje informace a na závěr prezentace zhodnotit kvalitu a nezávislost použitých zdrojů.
5
Kódování a komprese dat
6
Kódování a komprese dat
2
Teorie informace
Cíl: Cílem celé kapitoly je představit základní pojmy z oblasti teorie informace, nutné pro pochopení následujícího textu. Po jejím prostudování byste měli být schopni:
Vymezit obsah vědních oborů kybernetika a informatika. Definovat základní pojmy z teorie informace. Definovat jednotku informace. Určit informační obsah zprávy.
Klíčová slova této kapitoly: Informatika, kybernetika, informace, teorie informace, jednotka informace, zdroj zpráv, informační entropie, zpráva, sdělení, přenosový řetězec, kódové slovo, kód, minimální délka kódového slova, střední délka kódového slova, redundance. Doba potřebná ke studiu: 5 hodin
Průvodce studiem Tato kapitola vymezuje vědní obor informatika a definuje základní pojmy z oblasti teorie informace. Pro další pochopení textu je potřeba správně chápat definici jednotky informace a ostatní základní pojmy. Vyhraďte si na studium této kapitoly pět hodin a věnujte pozornost všem příkladům, nepodlehněte dojmu, že vše je samozřejmé a dávno známé.
7
Kódování a komprese dat
2.1 informatika
kybernetika
Informatika
Prvním problémem je samo o sobě vymezení obsahu předmětu informatika. Mnozí autoři se ve vymezení jejího oboru značně různí. Často se setkáváme s názorem „Informatika je věda o sběru, přenosu a zpracování informace.“ Takto je však často definována také kybernetika. Odtud pramení názor, že informatika je jen nový název pro kybernetiku. Abychom obě vědní disciplíny oddělili, přikloňme se spíše k definici [55]: „Informatika je věda o zpracování informace, zejména za pomoci automatizovaných prostředků.“
myšlení
informace zpráva
Připomeňme si na tomto místě také pojem myšlení, abychom zdůraznili jeho odlišnost od předmětu informatiky. Myšlení (jako specifická vlastnost druhu Homo sapiens) je specifickým, vysoce organizovaným příkladem zpracování informace, ale zpracování informace je neoddělitelným rysem každého živého organismu, včetně jednobuněčného. Klíčovým pojmem, od kterého je odvozen název informatiky, je pojem informace. K jejímu vysvětlení použijeme další, obdobně těžce vyjádřitelný pojem, zpráva. Zprávu chápeme jako relaci mezi zdrojem a odběratelem, při které dochází k přenosu informace. Jejím hlavním atributem, nejpodstatnějším rysem, je právě skutečnost, že obsahuje nějakou informaci. Informaci můžeme definovat různě, např.: „Informací nazýváme abstraktní veličinu, která může být přechovávána v určitých objektech, předávána určitými objekty, zpracovávána v určitých objektech a použita k řízení určitých objektů. Jako objekt přitom chápeme živé organismy, technická zařízení nebo soustavy těchto prvků.“ Přitom platí: 1. Stejná zpráva může přinášet různou informaci různým odběratelům. Ať jsou to třeba hlášení stavu vody na českých tocích, synoptické mapy povětrnostní situace, a zejména tajné zprávy, kódy a šifry. Např. zpráva „Nebe nad Španělskem je čisté.“ byla běžně vysílána ve španělském rozhlase. Většina obyvatel ji přešla bez povšimnutí. Byla však dohodnutým heslem pro vystoupení frankistů proti republikánské vládě a zahájila těžké boje. Závěr: množství informace ve zprávě je závislé na příjemci. 2. Stejná zpráva může přinést stejnému příjemci různou informaci. Dejme tomu, že za války vedené Alfácií proti Betácii a Gamácii, mohli zajatci v Betácii odeslat cestou Červeného kříže jednu ze tří předtištěných pohlednic (což bylo všeobecně známo): I. Cítím se dobře, nic mi nechybí. II. Jsem zcela zdráv. III. Nebojte se o mne, nic nepotřebuji. Zajatci v Gamácii mohli odeslat jedině pohlednici: I. Cítím se dobře, nic mi nechybí. Jedna alfácká matka měla dva syny. Oba padli do zajetí. Jeden v Betácii, druhý v Gamácii. Oba poslali domů stejnou pohlednici. Zpráva z Betácie přesto obsahovala více informace, neboť tento syn měl na výběr více různých zpráv. Závěr: množství informace ve zprávě je závislé na zdroji. 8
Kódování a komprese dat
Teorie informace je věda, která studuje množství informace ve zprávách, způsoby jejich kódování a přenášení. Vznikla v období II. světové války, zejména s rozvojem šifrování. Základním principem určování informačního obsahu zpráv je zjištění, že zpráva obsahuje tím více informace, čím menší je pravděpodobnost jejího výskytu. Vycházíme přitom z axiomatické teorie pravděpodobnosti, která je definována např. ve [23]: Každému jevu A E (množina všech přípustných jevů, jistý jev) je přiřazeno jako pravděpodobnost číslo P(A), přičemž platí následující axiomy: a) pravděpodobnost je nezáporná, tj. P(A) 0; (1)
teorie informace pravděpodobnost
*
b) pravděpodobnost sjednocení konečně mnoha nebo spočetně mnoha vzájemně neslučitelných jevů A1 E, A2 E, ... je rovna součtu pravděpodobností těchto jevů, tj. P(A1 A2 ...) = P(A1) + P(A2) + ...; (2) c) pravděpodobnost jistého jevu E je rovna 1, tj. P(E) = 1.
2.2
(3)
Jednotka informace
Máme-li měřit množství informace ve zprávě, potřebujeme k tomu jednotku. Jednotka informace byla ustanovena následovně:
jednotka informace
„Jednotka informace je takové množství informace, které získáme potvrzením, že nastala jedna ze dvou stejně pravděpodobných možností.“ Jednotku informace označujeme často jako [bit], fyzikálně je bezrozměrná (stejně jako pravděpodobnost). Brzy se stalo nepohodlným pracovat s tak malou jednotkou a začala se používat jednotka [Byte] (čti bajt), která obsahuje osm bitů. A další pojmy, jako slovo (word), poloslovo apod. vyjádřené v počtu Byte. Těmito pojmy se zatím zabývat nebudeme. Vznikly pro potřeby výpočetní techniky, vlastní teorie informace je nepotřebuje. Specifickou otázkou jsou jména pro násobné jednotky. Vžilo se označení odvozené od jednotek používajících desítkovou číselnou soustavu. Např. kilobit by tedy měl obsahovat 1000 bitů. Ale používají se přitom násobky odvozené od mocnin dvou. Proto 1 kilobit = 1024 bitů. Aby byly tyto problémy odstraněny ustanovila IEC (International Electrotechnical Commission – mezinárodní standardizační organizace) v prosinci 1998 nová jména jednotek a předpon pro binární násobky používané ve zpracování dat a při přenosech dat:
*
Množina se nazývá spočetnou, jestliže lze její prvky vzájemně jednoznačně přiřadit prvkům množiny přirozených čísel {1, 2, 3, ....}. Tato definice vychází z axiomu, že množina přirozených čísel je sice nekonečná, ale spočetná. Můžeme dokázat spočetnost množiny celých čísel i množiny racionálních čísel. Množina iracionálních čísel je již nespočetná, proto je nespočetná také množina reálných čísel.
9
bit Byte
Kódování a komprese dat
Faktor 210 220 230 240 250 260
Přepona Zkratka kibi Ki mebi Mi gibi Gi tebi Ti pebi Pi exbi Ei
Původ kilobinary (210)1 megabinary (210)2 gigabinary (210)3 terabinary (210)4 petabinary (210)5 exabinary (210)6
Odvozeno kilo (103)1 kilo (103)2 kilo (103)3 kilo (103)4 kilo (103)5 kilo (103)6
Uvedené předpony nejsou součást jednotek systému SI. Jak je patrné z tabulky, vznikly nové jednotky odvozením z předpon používaných v SI systému jednotek. Druhá část předpony byla nahrazena slabikou bi (ze slova binary). V současné době ale prakticky nejsou používány. binary digit shannon nat hartley
zdroj informace
Označení bit má současně význam binary digit, a tak působí často nedorozumění, proto dnes používáme pro jednotku informace označení závislé na způsobu jejího určení podle vztahu (6), pro binární logaritmy je proto jednotkou shannon, [Sh]. Volba přirozených logaritmů ln se základem e dává jednotku nat, [nat]. Volba dekadických logaritmů lg dává jednotku hartley, [Hart] (viz norma IEC/ISO 80000, Díl 13). Příklad 2.1: Rozeberme zdroj informace vydávající celkem 7 zpráv {a, b, c, d, e, f, g}. Z hlediska pravděpodobnosti výskytu jednotlivých zpráv je můžeme rozdělit do dvou skupin o stejné pravděpodobnosti výskytu: I. {a, e}, II. {b, c, d, f, g}. Předpokládejme dále, že pravděpodobnosti {a} a {e} jsou stejné. Ve skupině II je stejně pravděpodobné, že zpráva patří do jedné z podskupin {b, d, g} nebo {c, f}, a dále podle obr. 1. Může se jednat např. o soubor hlášení s ustáleným textem. Zdroj zpráv :
{a, b, c, d, e, f, g}
{a, e} {a} 1 P(a) = 2
1 2
P(a, e) =
{e} 1 P(e) = 2
1 2
{b, c, d, f, g} {b, d, g} P(b, d, g) =
1 2 {b} 1 P(b) = 2
1 2
1 2
{d} 1 1 P(d) = 2 2
{d, g}
1 2
1 2
P(b, c, d, f, g) =
{c, f} P(c, f) =
{c} 1 1 P(c) = 2 2
{f}
1 2
P(f) =
{g} 1 2
1 2
P(g) =
1 2
1 2
1 2
1 2
Obr. 1. Pravděpodobnosti výskytů jednotlivých zpráv zdroje
10
1 2 1 2
1 2
1 2
1 2
1 2
Kódování a komprese dat Pravděpodobnost, že zpráva patří do skupiny I nebo II je stejná, tedy platí: P(a, e) = P(b, c, d, f, g) =
1 , 2
(4a)
jestliže je zpráva ze skupiny I, pak je to {a} nebo {e} se stejnou pravděpodobností, takže: 2
1 1 1 P(a) + P(e) = , a současně P(a) = P(e), tedy P(a) = P(e) = = . (4b) 2 4 2 Podobně platí: 3
1 1 P(b) = P(c) = P(f) = = . 8 2
(4c)
4
1 1 P(d) = P(g) = = . 16 2
(4d)
Každé rozhodnutí, že zpráva patří do jedné ze dvou stejně pravděpodobných skupin, přináší informaci 1 bit. Zpráva {a} tedy obsahuje 2 bity informace, neboť bylo nutno učinit dvě rozhodnutí. Obecně pro náš příklad platí, že pravděpodobnost výskytu zprávy x je rovna: k
1 P(x) = , 2 kde je
2.3
k
(5) – počet rozhodnutí při cestě rozhodovacím stromem k dané zprávě, ale také počet bitů informace, kterou zpráva nese, neboli její informační obsah.
Základní pojmy z teorie informace
Informační obsah zprávy x je roven: 1 log 2 P( x) k(x) = log 2 P( x)
Sh .
informační obsah
(6)
Odtud vyplývá, že pokud zkoumaný zdroj může dávat jen jednu zprávu, její pravděpodobnost je nutně rovna pravděpodobnosti jistého jevu, P(E) = 1, a informační obsah této zprávy je: 1 1 log 2 0 Sh . (7) k = log 2 1 P(E) Přenášet takovou zprávu nemá smysl. Jestliže zdroj zpráv může dávat n různých zpráv xi s pravděpodobností P(xi), i = 1, 2, ..., n, pak střední (vážené) množství informace ve zprávách z tohoto zdroje bude: n 1 Sh/symbol. H = P( xi ) log 2 (8) i 1 P ( xi )
Nazývá se informační entropie tohoto zdroje.
11
informační entropie
Kódování a komprese dat
Informační entropie zdroje z obr. 1 je rovna: 1 1 1 1 1 1 1 H = 2 2 3 3 3 4 4 2,625 16 4 4 8 8 8 16
kódování
kód
minimální délka kódového slova
Sh/symbol. (9)
Zprávy z rozebíraného zdroje doposud označujeme {a, b, ..., g}. Ve skutečnosti mohou být reprezentovány nápisy libovolné délky. Protože známe jejich pravděpodobnosti výskytu, můžeme dohodnout způsob jejich kódování. Přirozený způsob kódování vyplývá přímo z obr. 1. Budeme postupovat od vrcholu a popisovat cestu až ke zprávě, P – doprava, L – doleva, tedy: a: LL, e: LP, b: PLL, c: PPL, f: PPP, d: PLPL, g: PLPP. Tento zápis je velmi vhodný. Je možno jej interpretovat např. pomocí teček a čárek Morseovy abecedy apod. Obvykle však používáme znaky 0 a 1 binární abecedy, která je vhodnější pro interpretaci ve výpočetní technice. (Setkáme se také s označením L (Low – nízký signál) a H (High – vysoký signál), zejména u logických integrovaných obvodů). Provedeme-li pak transformaci L 0, P 1, dostaneme kód: a: 00, e: 01, b: 100, c: 110, f: 111, d: 1010, g: 1011. Je zřejmé, že minimální délka kódového slova N*(xi), vyjadřujícího kód zprávy o pravděpodobnosti P(xi) je rovna: N*(xi) = – log2 P(xi) = k(xi) [Sh],
(10)
a je tedy rovna informačnímu obsahu zprávy. V praxi však nebudou pravděpodobnosti výskytu zpráv vždy rovny celočíselným mocninám jedné poloviny. Zato kódová slova musí mít celistvý počet znaků. Ne vždy tedy budou délky kódových slov rovny minimálním délkám. Pak pro kódová slova délky N(xi), i = 1, 2, ..., n ze vztahu: n
L=
střední délka kódového slova
P ( xi ) N ( xi ), i 1
(11)
L nazýváme střední (váženou) délkou kódového slova. A ze vztahu: redundance
R = L – H, R nazýváme redundancí (nadbytečností) daného způsobu kódování.
12
(12)
Kódování a komprese dat Poznámka k zamyšlení: Redundandnost kódu však má podstatný význam. V české abecedě je celkem 41 znaků, včetně přejatých znaků jako q, x apod.: a á b c č d ď e é ě f g h i í j k l m n ň o ó p q r ř s š t ť u ú ů v w x y ý z ž. Spisovná čeština obsahuje v nejrozsáhlejších slovnících (o devíti svazcích) asi 250 000 slov. Pokud by pravděpodobnost jejich výskytu byla konstantní, pak minimální délka slov bude:
1 3,34697 [znak], 250000
N*(xi) = – log41 P(xi) = – log41
(13)
takže všechna slova jsme schopni vyjádřit nejvýše čtyřmi znaky a ještě nám zbudou nevyužité kombinace znaků. Nebo opačně, chceme-li každé slovo vyjádřit právě pěti znaky, pak: N*(xi) = 5 = – logz P(xi) z 12,0112,
(14)
a k vyjádření všech slov nám postačí množina 12 různých znaků. Takové úvahy jsou zajisté scestné. Těžko si představíme použití slov jako „čšžýá“, „ggggg“ apod. Vysoká redundandnost jazyka má však pro naši schopnost dorozumění velký význam. Pomáhá nám překlenout rozdíly ve výslovnosti lidí (různá nářečí, polykání koncovek apod.) včetně různých vad výslovnosti (šišlání, ráčkování apod.). Např. Arabové využívají velké redundandnosti samohlásek v psaném textu tak, že je vůbec nezapisují. Aniž by přitom text ztratil na srozumitelnosti. Obdobný význam má redundandnost kódu u technických systémů pro odstranění vlivu šumu v přenosovém kanále, přeslechů apod.
2.4
Přenos informace
Abychom mohli s informací pracovat, je třeba ji vyjádřit (reprezentovat) nějakým vhodným způsobem. K tomu využíváme různé kódy k vyjádření informace. Každý takový kód obsahuje množinu prvků (kódových slov), které reprezentují (zastupují) konkrétní elementární zprávy. Typickým příkladem je kódování jednotlivých znaků textu (např. dálnopisný kód CCITT, kód ASCII apod.). V tomto kódu se s informací přímo pracuje, proto ho obvykle označujeme jako abecedu (abecedu zdroje zpráv). Pojem kódování je totiž spojován spíše s přenosem informace. Této oblasti je věnována kapitola 2. Celou problematiku přenosu informace naznačuje obr. 2. Úplný přenosový řetězec tvoří zdroj informace – kódovací člen – vysílač – přenosový kanál – přijímač – dekódovací člen – příjemce informace. V dolní části jsou pak naznačeny hlavní nežádoucí vlivy, které na přenos informace působí. zdroj informace
kódovací člen
vysílač
zkreslení
přenosový kanál
přijímač
útlum
dekódovací člen
příjemce informace
šumy
Obr. 2. Přenosový řetězec
13
kód
abeceda
přenosový řetězec
Kódování a komprese dat
přenosový kanál spojitý přenosový kanál diskrétní přenosový kanál kvantování bezšumový kanál šumový kanál odhalení chyby odstranění chyby
bezpaměťový kanál paměťový kanál
Podle způsobu práce, technické realizace a působení nepříznivých vlivů dělíme přenosové kanály na: 1. Spojité (v úrovni signálu) neboli analogové. Přenosovým kanálem je přenášen signál, který může nabývat libovolných hodnot. Může přitom jít o signály spojité i diskrétní (z hlediska času). Těmito kanály se dále zabývat nebudeme. 2. Diskrétní (v úrovni signálu) neboli kvantované. Přenosovým kanálem je přenášen signál, který nabývá hodnoty z množiny hodnot signálu. Takové signály vznikají kvantováním (diskretizací v úrovni) ze spojitých signálů. Z hlediska času může být signál spojitý nebo diskrétní. Protože je možno všechny typy kanálů redukovat na diskrétní kanály s diskrétním časem, budeme se dále zabývat jen touto třídou přenosových kanálů. Tyto kanály se obvykle nazývají číslicové. Z hlediska teorie informace rozdělujeme přenosové kanály podle pravděpodobnosti, že přijmeme skutečně vyslanou zprávu. Ideálním případem je bezšumový kanál, přenášející informaci s naprostou jistotou, tedy pravděpodobností P(xi) = 1. Běžné kanály tuto vlastnost nemají a vždy existuje nenulová pravděpodobnost, že se vyslaný znak změní ve kterýkoliv z možných znaků přijatých. Takové kanály označujeme jako šumové. Šumové kanály jsou v praxi častější a vyžadují speciální postupy zabezpečení přenosu informace sloužící k odhalení chyby či dokonce k odstranění zjištěné chyby. Z hlediska statistických závislostí chyb rozdělujeme šumové kanály na: 1. bezpaměťové, kdy výskyt chyby v jednom znaku nijak neovlivňuje výskyt chyby v následujících znacích. Výskyt chyby je zcela náhodný a může být vyjádřen jednoduše pravděpodobností výskytu chyby, hovoříme tedy o chybách náhodných. 2. paměťové, kdy výskyt jedné chyby ovlivňuje chyby další. V takových kanálech mají chyby tendenci ke shlukování. Výskyt shlukových chyb je pro jejich rozpoznání a odstranění obvykle náročnější než výskyt několika náhodných chyb. Nejčastěji budeme pracovat s bezpaměťovými kanály, u nichž bude pravděpodobnost změny jednoho kódového slova v jiné stejná pro všechna kódová slova. Takové kanály se nazývají symetrické. Rozložení pravděpodobnosti přenosu binárních signálů (z abecedy Z2 = {0, 1}) je ukázáno na obr. 3.
P(0,1) = P(0) - P(0,0) P(0)
0
P(1)
1
P(0,0)
1 P(1,1)
P(0) + P(1) = 1
P(1,0) = P(1)-P(1,1)
Obr. 3. Symetrický binární kanál
14
0
Kódování a komprese dat
U symetrického bezpaměťového šumového přenosového kanálu podle obr. 3 platí rovnost P(1,0) = P(0,1). Nejčastěji budeme pracovat s kanály, u nichž předpokládáme také rovnost P(0) = P(1) = 0,5, tedy statisticky stejně pravděpodobný přenos obou znaků zdrojové abecedy. Pro popis vlastností kanálu nám pak postačí znalost pravděpodobnosti změny znaku P(1,0) nebo P(0,1), kterou označujeme také jednoduše jako pravděpodobnost výskytu chyby. Druhou významnou vlastností přenosového kanálu je počet znaků, které je možno jím přenést za jednotku času, tedy rychlost přenosu informace. Její vyjádření přímo v počtu znaků zdrojové abecedy za sekundu je však nepraktické. Raději pracujeme s jejich informačním obsahem vyjádřeným v bitech. Např. při přenosu číslic desítkové soustavy a při předpokladu konstantní pravděpodobnosti jejich výskytu je informační obsah jedné číslice roven:
1 k ( xi ) log 2 P xi log 2 3,32bitů . 10
1
imin
kde je
[ Bd ] , imin
telegrafní rychlost Baud
– minimální odstup dvou proudových změn při přenosu informace.
v p vm log 2 m [bit.s–1], vp vm m
modulační rychlost
(16a)
Z praktického pohledu je u binárních (dvoustavových) signálů imin rovno délce přenosu jednoho bitu a jednotky Baud a bit.s–1, mají shodný význam. To je zřejmě důvodem, proč se v poslední době používá téměř výhradně jednotka bit.s–1. Rozdíly nastávají až při použití vícestavových číslicových signálů. U nich je celá skupina bitů vyjádřena jedním stavem signálu a hodnoty modulační rychlosti a rychlosti přenosu jsou různé, vztah mezi nimi je
kde je
rychlost přenosu informace
(15)
Kanál, který přenese 100 desítkových číslic za sekundu, přenese tedy množství informace rovné 332 bitů za jednu sekundu a rychlost přenosu je rovna 332 bit.s–1. Neboli rychlost přenosu informace (vp) je rovna množství informace přenesenému informačním kanálem za jednotku času. V literatuře je možno se setkat s jinou definicí rychlosti přenosu informace, nazývanou modulační rychlost (vm) nebo také telegrafní rychlost, která je definována normou CCITT s jednotkou [Baud] (čti bód) označenou Bd, pojmenovanou podle tvůrce telegrafní abecedy, francouzského technika J. Baudota:
vm
pravděpodobnost výskytu chyby
(16b)
– rychlost přenosu, – modulační rychlost, – počet stavů vícestavového signálu.
15
bit.s-1
Kódování a komprese dat
Kontrolní otázky: 1. Jak je definován vědecký obor informatika? 2. Jak je definován pojem informace? 3. Jak je definována jednotka informace? 4. Jak určíme informační obsah zprávy? Úkoly k textu: 1. Zdroj informace generuje 8 různých zpráv s četnostmi (10, 12, 25, 5, 10, 13, 15, 10). Jaká je informační entropie tohoto zdroje? 2. Přenosový kanál přenese 650 zpráv z tohoto zdroje za sekundu. Jaká je jeho přenosová rychlost? Korespondenční úkol 1: 1. Vytvořte příklad zdroje zpráv s alespoň deseti různými zprávami, určete četnosti výskytu zpráv a spočítejte informační entropii tohoto zdroje. Shrnutí obsahu kapitoly V této kapitole jsme se seznámili se základními pojmy z oblasti teorie informace. Především je to sama definice pojmu informace, dále zpráva a její informační obsah. A samozřejmě definice potřebné jednotky informace. Dále jsme se seznámili s prvky přenosového řetězce, s vlastnostmi přenosových kanálů a rychlostí přenosu informace. Víme, že zprávu musíme pro přenos upravit do podoby sdělení a použít vhodný kód. Podrobně se kódováním bude zabývat následující kapitola.
Zpráva x A B C D E F G H CH I J K L M N
Příklad řešení: Četnost Pravděpodobnost P (x ) 10 0,040 20 0,080 5 0,020 85 0,340 14 0,056 5 0,020 6 0,024 8 0,032 4 0,016 5 0,020 6 0,024 18 0,072 18 0,072 8 0,032 38 0,152 250
Informační obsah k (x ) 4,644 3,644 5,644 1,556 4,158 5,644 5,381 4,966 5,966 5,644 5,381 3,796 3,796 4,966 2,718 H=
Informační entropie zdroje zpráv je
3,209
16
P (x )k (x ) 0,186 0,292 0,113 0,529 0,233 0,113 0,129 0,159 0,095 0,113 0,129 0,273 0,273 0,159 0,413 3,209 [Sh]
Kódování a komprese dat
3
Kódování
Cíl:
Cílem celé kapitoly je představit základní pojmy z oblasti teorie kódování, nutné pro pochopení základních principů tvorby kódů. Následuje vysvětlení konstrukce kódů minimální délky, používaných také pro kompresi dat. Dále jsou představeny principy nutné pro odhalení nebo opravu chyby při přenosu dat. Po jejím prostudování byste měli být schopni:
Definovat základní pojmy z oblasti kódování. Klasifikovat typy kódů a rozhodnout o jejich vhodném využití. Definovat a vysvětlit principy odhalování a opravy chyb při přenosu dat.
Klíčová slova této kapitoly:
Teorie kódování, prosté kódování, systematický kód, prefixový kód, blokový kód, Kraftova nerovnost, Mc Millanova věta, kód minimální délky, perfektní kód, Huffmanův kód, Shannon-Fanův kód, násobnost chyby, kontrolní kód, samoopravný kód, Hammingova vzdálenost, informační poměr. Doba potřebná ke studiu: 2 hodiny
Průvodce studiem Studium této kapitoly je nutné k pochopení základních pojmů z teorie kódování. Následně jsou představeny základní algoritmy konstrukce nejkratších kódů. Ty se používají všude tam, kde se snažíme minimalizovat délku kódových slov, zrychlit přenos informace apod. Kapitola končí základními principy odhalení a opravy chyb u blokových kódů. Na studium této části si vyhraďte dvě hodiny. Zkuste si samostatně vyřešit příklady použití popsaných algoritmů tvorby minimálních kódů, abyste je byli schopni aplikovat a využít.
17
Kódování a komprese dat
3.1
Základní pojmy z teorie kódů
teorie kódování
Teorie kódování se zabývá konstrukcemi kódů, zaměřenými na různé cíle (odstraňování chyb, zrychlení přenosu apod.) a studiem vlastností kódů.
zdrojový znak zdrojová abeceda
Při přenosu nahrazujeme často znaky, kterými jsou zprávy zapsány (zdrojové znaky ze zdrojové abecedy), binárními symboly 0 a 1. Pokud je slov zdrojové abecedy více než dva, musíme používat slova vytvořená z binárních symbolů (kódové znaky z kódové abecedy), tedy posloupnost b1 b2 ... bk , kde bi B pro i = 1, 2, ..., k a B 0, 1 . Hovoříme pak o kódovém slově délky k. Množina všech kódových slov K(a), kde a jsou zdrojové znaky se nazývá jednoduše kód. Význam mají jen prostá kódování, kdy různým zdrojovým znakům odpovídají různá kódová slova. Každé kódování zdrojových znaků K: AB můžeme rozšířit na kódování zdrojových zpráv, tedy posloupnosti slov v abecedě A, K*(a1 a2 ... an) = K(a1)K(a2) ... K(an). Zprávu a1 a2 ... an kódujeme znak po znaku. Tím vznikne zobrazení K*: A*B*.
kódový znak kódová abeceda prosté kódování
jednoznačné dekódování prosté zobrazení
Podstatné je, abychom byli současně schopni ze zakódované zprávy získat zprávu zdrojovou. Kódování K*: A*B* je jednoznačně dekódovatelné, jestliže ze znalosti zakódované zprávy K*(a1 a2 ... an) můžeme vždy jednoznačně určit zdrojovou zprávu a1 a2 ... an, tedy jestliže je kódování zpráv K*: A*B* prostým zobrazením (pro x y platí f(x) f(y)). Příklad 3.1: Máme za úkol kódovat informaci o stavu oblačnosti jasno polojasno zataženo déšť Přitom víme, že nejčastěji je „jasno“, méně často „polojasno“ a nejméně často zbývající. Zvolme na ukázku dva příklady: I
jasno polojasno zataženo déšť
II
0 01 011 111
jasno polojasno zataženo déšť
0 01 011 101
V obou případech se jedná o prostá kódování, zprávu „jasno, jasno, polojasno, déšť“ zakódujeme: I 0001111
18
II 0001101
Kódování a komprese dat
Pokusme se nyní dekódovat zprávu 01101101: I II Zkusme dekódovat zprávu Byť to na první pohled není zřejmé, zprávu lze dekódovat. rovněž „odzadu“. Dekódování však Postupujeme „odzadu“. Jakmile nebude jednoznačné. Můžeme narazíme na znak 0 nebo vyčerpáme získat zprávu: „zataženo, zataženo, polojasno“, maximální délku slova jedná se o ale také začátek dalšího slova. Zpráva tedy „polojasno, déšť, déšť“. zní: Toto kódování zpráv tedy není „zataženo, zataženo, polojasno“. zobrazením a je Toto kódování zpráv je prostým prostým zobrazením a můžeme ho použít. Při nepoužitelné! vyhodnocování zpráv ale musíme vždy přijmout celou zprávu až do konce. Výhodnější by bylo použít kódování, které bude dekódovatelné „od začátku“. Můžeme použít dva přístupy: a) Blokové kódování (délky n) je takové prosté kódování, při kterém mají všechna slova stejnou délku (a to n). Každé blokové kódování je jednoznačně dekódovatelné. Pokud známe zprávu K*(a1 a2 ... an), pak prvních n znaků tvoří kód zdrojového znaku a1 atd. b) Prefixové kódování je takové kódování, které je prosté a žádné kódové slovo není prefixem (začátkem) jiného kódového slova. Prefixové kódování je jednoznačně dekódovatelné. Ve zprávě najdeme nejmenší počet znaků, které tvoří kódové slovo, tyto znaky umažeme a pokračujeme. Je zřejmé, že každé blokové kódování je současně prefixové. Použití prefixového kódování, které není blokové, nám zato umožňuje vytvořit kódy s malou redundancí, při jejich použití dosáhneme nejvyšší možné rychlosti přenosu zpráv. Umožňuje totiž zohlednit pravděpodobnost výskytu zprávy, tedy často se vyskytujícím zprávám přidělit krátká kódová slova. Pro modelový příklad můžeme sestavit např. následující prefixové kódování: jasno 0 polojasno 10 zataženo 110 déšť 111
blokové kódování prefixové kódování
Otázkou je, zda jsme schopni pro zadané požadavky sestavit prefixový kód. K rozhodnutí nám pomohou následující dvě věty: Prefixový kód sestrojený nad n-prvkovou kódovou abecedou s délkami kódových slov d1 , d 2 , , d r existuje právě tehdy, když platí Kraftova nerovnost, tj. n d1 n d 2 n d r 1 .
(17) .
19
Kraftova nerovnost
Kódování a komprese dat
Mc Millanova věta
Mc Millanova věta: Každé jednoznačně dekódovatelné kódování splňuje Kraftovu nerovnost.
Z těchto dvou vět vyplývá, že každé jednoznačně dekódovatelné kódování je prefixové, ale pokud není, existuje jiné kódování nad stejnou kódovou abecedou s danými délkami kódových slov, které již prefixové bude. Příklad 3.2: Máme za úkol sestavit binární prefixový kód číslic 0, 1, ..., 9 s délkami kódových slov d 0 d1 2, d 2 d 7 3, d 8 d 9 4 .
Kraftova nerovnost je rovna 2
1 1 1 11 6 2 1 , tudíž prefixový kód 16 8 4 8
s těmito délkami slov neexistuje. Zvolíme-li d 0 d1 2, d 2 d 7 d 8 d 9 4 , potom Kraftova nerovnost 1 1 je 2 8 1 a tedy takový prefixový kód existuje. Může vypadat 4 16 například takto Číslice Kódové slovo 0 00 1 01 2 1000 3 1001 4 1010 5 1011 6 1100 7 1101 8 1110 9 1111
optimální kód nejkratší kód
Naší snahou je však sestavit prefixový kód co nejkratší délky (optimální kód). Takové kódy se nazývají nejkratší kódy. Pro jejich konstrukci vycházíme ze znalosti pravděpodobnosti výskytu zdrojových znaků p1, p2, ..., pn při délkách kódových slov N1, N2, ..., Nn je pak střední délka kódového slova: n
L pi N i .
(18)
i 1
Na dlouhou zprávu o m zdrojových znacích, pak potřebujeme přibližně m.L znaků kódových (binárních).
20
Kódování a komprese dat Příklad 3.3: Máme za úkol vytvořit kód pro vysílání zpráv složených ze znaků:
zdrojové znaky pravděpodobnost výskytu kódová slova
+ 0,4
– 0,2
* 0,2
/ 0,2
0
10
110 111
Střední délka slova je
L 1 0,4 2 0,2 3 0,2 3 0,2 .
Stejnou střední délku bude mít i kódování: zdrojové znaky kódová slova
+ 00
– 01
* 10
/ 11 nejkratší kód
Lepší kódování se nám najít nepodaří. Našli jsme tedy nejkratší kód. 3.1.1
Huffmanova konstrukce nejkratšího kódu
Nejkratší kód zkonstruoval v r. 1952 O. Huffman (čti hafmen), podle něj je často označován jako Huffmanův kód. Zdrojové znaky uspořádáme podle nerostoucí posloupnosti pravděpodobnosti jejich výskytu. Pokud jsou jen dva, přiřadíme jim po řadě znaky 0 a 1. V případě tří znaků pracujeme redukovanou abecedou a1 a a2,3 s pravděpodobnostmi výskytu p1 a p2,3 = p2 + p3. Nejkratší kód redukované abecedy je a2,3 a1 0 1 Rozdělením slova a2,3 zpět na a2 a a3 dostaneme výsledný kód a2 a3 a1 0 10 11 Obdobně postupujeme i při více zdrojových znacích. Příklad 3.4: Sestrojme nejkratší kód pro zdrojovou abecedu:
A 0,4
B 0,3
C 0,1
D 0,1
E 0,1
Postup redukcí bude následující: znak
pravděp.
1. redukce
2. redukce
3. redukce
A
0,4
0,4
0,4
0,6
B
0,3
0,3
0,3
0,4
C D
0,1 0,1
0,2 0,1
0,3
E
0,1
21
Huffmanův kód
Kódování a komprese dat
Zpětným postupem dostáváme tyto nejkratší kódy: 0,6 ... 0 0,4 ... 1
0,4 ... 1 0,3 ... 00 0,3 ... 01
0,4 ... 1 0,3 ... 00 0,2 ... 010 0,1 ... 011
0,4 ... 1 0,3 ... 00 0,1 ... 011 0,1 ...0100 0,1 ... 0101
Výsledný kód je následující: A 1 B 00 C 011 D 0100 E 0101 Jeho střední délka slova je:
L 0,4 2 0,3 3 4 4 0,1 2,1 bitů .
Pozorný čtenář si jistě uvědomil, že Huffmanova konstrukce není jednoznačná. Závisí na tom, kam zařazujeme redukované znaky, pokud má více znaků stejnou pravděpodobnost výskytu. Algoritmus na tvorbu Huffmanova kódu je možno účinně realizovat při využití binárních stromů. Podrobný popis algoritmu je k dispozici v literatuře, např. [5, 26].
ShannonFanův kód
3.1.2
Shannon-Fanova konstrukce nejkratšího kódu
Odlišnou konstrukci vytvořili Claude Shannon a Robert Mario Fano. Kódová slova seřadíme podle pořadí jejich pravděpodobností. Následně je rozdělíme do dvou skupin, které se budou co nejméně lišit celkovou pravděpodobností. V každé skupině pokračuje dělení na skupiny až vzniknou jednoprvkové skupiny. Následně každé dvojici skupin přidělíme znaky 0 a 1 a sestavíme jednotlivá kódová slova. Příklad 3.5: Sestrojme pomocí Shannon-Fanovy konstrukce nejkratší kód pro zdrojovou abecedu
A 0,4
B 0,3
C 0,1
D 0,1
E 0,1
Kódová slova již jsou seřazena podle pravděpodobnosti výskytu. Postup dělení skupiny bude následující
22
Kódování a komprese dat
Zpráva
A
B
C
D
E
P(i)
0,4
0,3
0,1
0,1
0,1
0
1 0
1 0
1 0
kódové slovo
0
10
110
1110
1 1111
Pozorný čtenář si zajisté uvědomil, že Shannon-Fanova konstrukce není zcela jednoznačná. Závisí na tom, jak seřadíme znaky se stejnou pravděpodobností výskytu a v jakém pořadí budeme skupinám přidělovat znaky 0 a 1.
3.2
Bezpečnostní kódy
Jiným problémem je řešení přenosu informace, při kterém může docházet k chybám. Tady naopak redundanci uměle zvyšujeme, abychom mohli chyby objevovat a nejlépe také odstraňovat. 3.2.1
bezpečnostní kód objevování chyb
Objevování chyb
Pro objevování chyb je nutné, aby slova z množiny Tn byla rozdělena na kódová slova (K) a nekódová slova (Tn – K). Předpokládáme, že vysíláme kódová slova a přijímáme slova z množiny Tn. Pokud přijmeme nekódové slovo, pak jsme objevili chybu. Pokud je přijaté slovo kódové, pak buď nedošlo k chybě nebo jsme ji neobjevili. Kód objevuje t-násobné chyby (chyby nejvýše v t znacích), jestliže při vyslání kódového slova a vzniku t-násobné chyby bude vždy přijato slovo nekódové. K tomu definujeme Hammingovu vzdálenost. Dvě slova mají Hammingovu vzdálenost rovnou počtu znaků, ve kterých se liší. Nejběžnější kódy pro objevování jednonásobných chyb jsou kódy kontroly parity. K binárnímu slovu přidáme znak tak, aby výsledné slovo mělo sudý počet jedniček (sudou paritu) nebo lichý (lichou paritu). Kód sudé parity je obvykle nazýván kódem celkové kontroly parity. Jak bude ukázáno dále, kód liché parity má některé nepříjemné vlastnosti. Výsledný kód skutečně objevuje všechny jednoduché chyby (vícenásobné objevovat nemusí).
23
kódové slovo nekódové slovo
Hammingova vzdálenost sudá parita lichá parita kód celkové kontroly parity
Kódování a komprese dat
(n, k)-kód
Např. ke tříznakovému kódu přidáme jeden bit paritní, výsledný kód bude mít čtyři znaky. Z toho tři znaky nesou informaci, jeden je nadbytečný, redundandní a slouží k zabezpečení. Hovoříme o kódu (4, 3) nebo obecně (n, k)-kódu, kde je: n – počet znaků, k – počet informačních znaků. Princip objevování chyb vysvětluje následující obr. 4.
jiné kódové slovo
kódové slovo změna jediného bitu
d=1
d=1
0101
0111
1111
0001 nekódové slovo Obr. 4. Princip objevování chyb minimální vzdálenost
opravování chyb
U kódu celkové parity mají všechna kódová slova Hammingovu vzdálenost alespoň 2, říkáme, že kód má minimální vzdálenost d = 2. Kód objevuje t-násobné chyby pro všechna t < d. 3.2.2
Opravování chyb
Abychom mohli opravit t-násobnou chybu, musí platit t < d/2, jak vysvětluje následující obr. 5.
d=1 kódové slovo
d=1 chyba
jiné kódové slovo
d=3 Obr. 5. Princip opravování chyb
24
d=2
Kódování a komprese dat
Např. kód s minimální vzdáleností d = 3 je schopen opravit jednoduché chyby (a objevit dvojnásobné, ty by však byly opraveny nesprávně). Příklad 3.6: jaké vlastnosti má kód „dva z pěti“, tedy binární kód obsahující všechna slova délky 5 znaků, z nichž jsou vždy dva znaky rovny 1?
Všechna kódová slova jsou: kód “dva z pěti“
11000 10100 10010 10001 01001 00101 00011 00110 01100 01010 Minimální vzdálenost kódu je d 2 , protože Hammingova vzdálenost kódových slov je rovna 2 nebo 4. Potom tento kód objeví jednoduchou chybu a neopraví žádnou chybu. Uvažujme například přijaté slovo 01011. Toto slovo není kódové a chybu objevíme, nevíme však, zda původním slovem bylo 01010, 00011 nebo 01001. Pokud budeme uvažovat dvojnásobné chyby, vyšleme například slovo 11000 a přijmeme 00110, dvojnásobnou chybu pak neobjevíme. Pro velmi nekvalitní kanály je vhodný opakovací kód. Každý znak vyšleme např. pětkrát, jedná se tedy o kód (5,1). Minimální vzdálenost kódu je d = 5. Kód objevuje 4-násobné chyby a opravuje 2-násobné chyby (Při výskytu 3-násobné či 4-násobné chyby provede kód samozřejmě opravu, ovšem na nesprávné kódové slovo). Dekódování nekódového slova se provádí „hlasováním“ – větší počet stejných znaků je uznán, např.:
opakovací kód
šumový kanál 1
11111
01011
1
zdroj. slovo
kódové slovo
přijaté slovo
zdroj. slovo
kódování
dekódování
Velmi důležitý je kód dvourozměrné kontroly parity, běžně používaný v počítačích. Informační znaky zapíšeme do matice typu (p, q). Každému řádku přidáme jeden symbol kontroly parity řádku, podobně každému sloupci kontrolu parity sloupce. Paritě sloupce parit řádků pak znak „kontrola kontrol“, volený tak, aby i parita výsledné matice byla sudá. Např. pro p = 7 a q = 3
25
kód dvourozměrné kontroly parity
Kódování a komprese dat
máme 7.3 = 21 informačních znaků a 8.4 = 32 všech znaků, takže jde o kód délky 32. Nazývá se ASCII (32, 21)-kód. Příklad kódového slova: 101 000 001 010 111
0 0 1 1 1
kontrola parity řádků
111 1 000 0 110 0
kontrola kontrol kontrola parity sloupce Tento kód opravuje jednoduché chyby. Taková chyba způsobí změnu parity v jednom řádku a jednom sloupci. Znak v jejich průsečíku můžeme opravit. Redundance kódu je ovšem poměrně vysoká. Při tvorbě kódů se snažíme najít kód, který má co nejkratší délku (nejmenší redundanci) a přitom opravuje co nejvíce chyb. V další kapitole proto přejdeme k lépe matematicky propracovaným kódům.
informační poměr
Pro hodnocení kódů se někdy používá informační poměr, pro (n, k)-kód: k R . (19) n Pro opakovací (5, 1)-kód vychází R
1 0,2 , pro ASCII (32, 21)-kód je n
21 0,65625 . ACSII (32, 21)-kód je tedy výhodnější než opakovací (5, 32 1)-kód. Než však tento závěr vyhlásíme, uvědomme si, prosím, že opakovací kód opraví dvojnásobnou chybu, zatímco ASCII kód pouze chybu jednoduchou.
R
26
Kódování a komprese dat Kontrolní otázky: 5. Co znamená pojem nejkratší kód?. 6. Popište Huffmanovu konstrukci nejkratšího kódu. 7. Popište Shannon-Fanovu konstrukci nejkratšího kódu. 8. Jaký je princip rozpoznání chyby při přenosu kódového slova? 9. Jaký je princip opravy chyby při přenosu kódového slova? Úkoly k textu: 3. Pomocí Kraftovy nerovnosti rozhodněte, zda jsou kódy následující kódy jednoznačně dekódovatelné. Rozhodněte, zda jsou prefixové. Pokud jsou jednoznačně dekódovatelné, ale ne prefixové, zkonstruujte prefixové kódy se stejnými délkami kódových slov.
zpráva A B C D E F
K1 0 10 11 101 100 111
K2 0 02 1 12 20 21
K3 0 1 210 211 212 222
K4 2 01 02 202 201 222
4. Zdroj informace generuje 8 různých zpráv, ve sledované době byly zaznamenány jejich počty výskytů (10, 12, 25, 5, 10, 13, 15, 10). Sestavte kód minimální délky, určete jeho střední délku a redundanci daného způsobu kódování. 5. Jaké vlastnosti má kód celkové kontroly parity (sudá parita)? Korespondenční úkol 2: 2. Vytvořte příklad zdroje zpráv s alespoň dvaceti různými zprávami, sestavte minimální kódy jak pomocí Huffmanovy, tak Shannon-Fanovy konstrukce, spočítejte informační entropii, střední délku kódového slova pro oba vytvořené kódy a porovnejte jejich redundanci. Shrnutí obsahu kapitoly V této kapitole jsme se seznámili se základními pojmy z teorie kódů. Známe základní podmínky dekódovatelnosti vytvořeného kódu. Umíme určit minimální délku kódového slova i střední délku kódového slova pro daný způsob kódování a určit jeho redundanci. Umíme použít Huffmanovu konstrukci nebo Shannon-fanovu konstrukci pro sestavení kódu minimální délky, což se nám bude hodit pro komprese dat. Chápeme základní principy důležité pro rozpoznání nebo dokonce opravu chyby vzniklé při přenosu kódového slova.
27
/ 0,2
/ 0,2
/ 0,2
/ 0,2
/ 0,2
/ 0,2
/ 0,2
/ 0,2
/ 0,2
Znak x P (x )
1. redukce
28
2. redukce
3. redukce
4. redukce
5. redukce
6. redukce
7. redukce
8. redukce
D,E 0,1
D,E 0,1
F,G 0,09
( 0,08
( 0,08
( 0,08
( 0,08
( 0,08
( 0,08
B,C 0,1
F,G 0,09
( 0,08
) 0,08
) 0,08
) 0,08
) 0,08
) 0,08
) 0,08
F,G 0,09
( 0,08
) 0,08
H,I 0,07
N,O,P 0,06
N,O,P 0,06
N,O,P 0,06
. 0,05
. 0,05
( 0,08
) 0,08
H,I 0,07
N,O,P 0,06
L,M 0,06
L,M 0,06
. 0,05
A 0,05
A 0,05
) 0,08
H,I 0,07
N,O,P 0,06
L,M 0,06
J,K 0,06
. 0,05
A 0,05
B 0,05
B 0,05
H,I 0,07
N,O,P 0,06
L,M 0,06
J,K 0,06
. 0,05
A 0,05
B 0,05
C 0,05
C 0,05
N,O,P 0,06
L,M 0,06
J,K 0,06
. 0,05
A 0,05
B 0,05
C 0,05
D 0,05
D 0,05
L,M 0,06
J,K 0,06
. 0,05
A 0,05
B 0,05
C 0,05
D 0,05
E 0,05
E 0,05
J,K 0,06
. 0,05
A 0,05
B 0,05
C 0,05
D 0,05
E 0,05
F 0,05
F 0,05
. 0,05
A 0,05
B 0,05
C 0,05
D 0,05
E 0,05
F 0,05
G 0,04
G 0,04
A 0,05
B 0,05
C 0,05
D 0,05
E 0,05
F 0,05
G 0,04
H 0,04
H 0,04
C 0,05
D 0,05
E 0,05
F 0,05
G 0,04
H 0,04
I 0,03
I 0,03
E 0,05
F 0,05
G 0,04
H 0,04
I 0,03
J 0,03
J 0,03
G 0,04
H 0,04
I 0,03
J 0,03
K 0,03
K 0,03
I 0,03
J 0,03
K 0,03
L 0,03
L 0,03
K 0,03
L 0,03
M 0,03
M 0,03
Kódování a komprese dat
Příklad řešení: Huffmanova konstrukce. Postupné redukce:
Kódování a komprese dat 9. redukce
/ 0,2
D,E 0,1
B,C 0,1
.,A 0,1
F,G 0,09
( 0,08
) 0,08
H,I 0,07
N,O,P 0,06
L,M 0,06
10. redukce
/ 0,2
J,K,L,M 0,12
D,E 0,1
B,C 0,1
.,A 0,1
F,G 0,09
( 0,08
) 0,08
H,I 0,07
N,O,P 0,06
11. redukce
/ 0,2
H,I,N,O,P 0,13
J,K,L,M 0,12
D,E 0,1
B,C 0,1
.,A 0,1
F,G 0,09
( 0,08
) 0,08
12. redukce
/ 0,2
(,) 0,16
H,I,N,O,P 0,13
J,K,L,M 0,12
D,E 0,1
B,C 0,1
.,A 0,1
F,G 0,09
13. redukce
/ 0,2
.,A,F,G 0,19
(,) 0,16
H,I,N,O,P 0,13
J,K,L,M 0,12
D,E 0,1
B,C 0,1
14. redukce
/ 0,2
B,C,D,E 0,2
.,A,F,G 0,19
(,) 0,16
H,I,N,O,P 0,13
J,K,L,M 0,12
H,I,N,O,P, J,K,L,M 0,25
/ 0,2
B,C,D,E 0,2
.,A,F,G 0,19
(,) 0,16
H,I,N,O,P, J,K,L,M 0,25
/ 0,2
B,C,D,E 0,2
15. redukce
16. redukce .,A,F,G,(,) 0,35
17. redukce ,/,B,C,D,E .,A,F,G,(,) 0,4 0,35
H,I,N,O,P, J,K,L,M 0,25
.,A,F,G,(,), H,I,N,O,P, 18. redukce J,K,L,M ,/,B,C,D,E 0,6 0,4
29
J,K 0,06
Kódování a komprese dat
0,6 0,4
0 1
0,4 0,35 0,25
1 00 01
0,35 0,25 0,2 0,2
00 01 10 11
0,25 0,2 0,2 0,19 0,16
01 10 11 000 001
0,2 0,2 0,19 0,16 0,13 0,12
10 11 000 001 010 011
0,2 0,19 0,16 0,13 0,12 0,1 0,1
10 000 001 010 011 110 111
0,2 0,16 0,13 0,12 0,1 0,1 0,1 0,09
10 001 010 011 110 111 0000 0001
0,2 0,13 0,12 0,1 0,1 0,1 0,09 0,08 0,08
10 010 011 110 111 0000 0001 0010 0011
0,2 0,12 0,1 0,1 0,1 0,09 0,08 0,08 0,07 0,06
10 011 110 111 0000 0001 0010 0011 0100 0101
Zpětná expanze a přiřazení znaků kódu:
30
znak x
P (x )
N (x )
/ ( ) . A B C D E F G H I J K L M N O P
0,2 0,08 0,08 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,04 0,04 0,03 0,03 0,03 0,03 0,03 0,03 0,02 0,01
10 0010 0011 00000 00001 1110 1111 1100 1101 00010 00011 01000 01001 01110 01111 01100 01101 01010 010110 010111
Střední délka: L = 4,07
bitů
Informační entropie: H = 4,0196
[Sh]
Redundance R = L ‐ H R = 0,0504
[Sh]
( 0,08
001 ( 0,08
001 ( 0,08
001 ( 0,08
001 ( 0,08
000 / 0,2
000 / 0,2
000 / 0,2
000 / 0,2
Znak x P (x )
Znak x P (x )
Znak x P (x )
Znak x P (x )
00
/ 0,2
Znak x P (x )
( 0,08
/ 0,2
Znak x P (x )
( 0,08
/ 0,2
Znak x P (x )
0100 ) 0,08
0100 ) 0,08
0100 ) 0,08
) 0,08
) 0,08
) 0,08
) 0,08
010
0
0101 . 0,05
0101 . 0,05
0101 . 0,05
. 0,05
. 0,05
. 0,05
. 0,05
01
0110 A 0,05
0110 A 0,05
0110 A 0,05
A 0,05
A 0,05
A 0,05
A 0,05
011
0111 B 0,05
0111 B 0,05
0111 B 0,05
B 0,05
B 0,05
B 0,05
B 0,05
1000 C 0,05
1000 C 0,05
1000 C 0,05
C 0,05
C 0,05
C 0,05
C 0,05
100
1001 D 0,05
1001 D 0,05
1001 D 0,05
D 0,05
D 0,05
D 0,05
D 0,05
1010 E 0,05
1010 E 0,05
1010 E 0,05
E 0,05
10 E 0,05
E 0,05
E 0,05
10110 F 0,05
10110 F 0,05
F 0,05
101 F 0,05
F 0,05
F 0,05
F 0,05
1011
10111 G 0,04
10111 G 0,04
G 0,04
G 0,04
G 0,04
G 0,04
G 0,04
11000 H 0,04
11000 H 0,04
H 0,04
H 0,04
H 0,04
H 0,04
H 0,04
1100
11001 I 0,03
11001 I 0,03
I 0,03
I 0,03
I 0,03
I 0,03
I 0,03
110
1
11010 J 0,03
11010 J 0,03
J 0,03
J 0,03
J 0,03
J 0,03
J 0,03
1101
11011 K 0,03
11011 K 0,03
K 0,03
K 0,03
K 0,03
K 0,03
K 0,03
11100 L 0,03
11100 L 0,03
L 0,03
L 0,03
11 L 0,03
L 0,03
L 0,03
11
Kódování a komprese dat
Shannon-Fanova konstrukce:
31
Kódování a komprese dat
Výsledný kód a jeho vlastnosti: znak x
P (x )
N (x )
/ ( ) . A B C D E F G H I J K L M N O P
0,2 0,08 0,08 0,05 0,05 0,05 0,05 0,05 0,05 0,05 0,04 0,04 0,03 0,03 0,03 0,03 0,03 0,03 0,02 0,01
000 001 0100 0101 0110 0111 1000 1001 1010 10110 10111 11000 11001 11010 11011 11100 11101 11110 111110 111111
Střední délka: L = 4,09
bitů
Informační entropie: H = 4,0196
[Sh]
Redundance R = L ‐ H R = 0,0704
[Sh]
Závěr: Kód sestavený pomocí Shannon-Fanovy konstrukce má vyšší redundanci než kód sestavený Huffmanovou konstrukcí.
32
Kódování a komprese dat
4
Lineární kódy
Cíl:
Cílem celé kapitoly je představit významnou třídu kódů – kódy lineární, někdy označované také za kódy maticové. Pochopení jejich principů je důležité pro zvládnutí následujících kapitol. Všechny další třídy kódů budou patřit ke kódům lineárním. Po jejím prostudování byste měli být schopni:
Definovat principy lineárních kódů. Rozpoznat zda je kód lineární. Sestavit lineární kód.
Klíčová slova této kapitoly:
Lineární kód, maticový kód, báze kódu, generující matice, kontrolní matice, systematický kód, syndrom slova, standardní dekódování, duální kód, samoduální kód, Hammingův kód, perfektní kód. Doba potřebná ke studiu: 3 hodiny
Průvodce studiem Studium této kapitoly je nutné k pochopení principů konstrukce kódů. Jsou představeny principy tvorby lineárních kódů, představeny systematické kódy, které se snadno dekódují. Kapitola končí třídou Hammingových kódů. je to významná třída kódů pro opravu jednoduchých chyb, které jsou perfektní, což znamená, že při požadovaných vlastnostech mají nejmenší možnou redundanci. Na studium této části si vyhraďte tři hodiny. Zkuste si samostatně vyřešit příklady tvorby lineárních kódů a jejich použití.
33
Kódování a komprese dat
lineární kódy
maticové kódy
báze kódu
Nejdůležitější třídou kódů pro nás budou lineární kódy. To jsou kódy, u nichž je součet dvou kódových slov vždy opět kódovým slovem. Pro možnost manipulace s kódovými slovy je přitom vyjadřujeme jako řádkové vektory. Při definici těchto kódů se často používají matice, proto se také někdy označují jako maticové kódy. Lineární kód tvoří lineární podprostor prostoru Z n2 (n-rozměrný prostor binárních proměnných). Tento podprostor můžeme popsat jeho bází. Např. kód celkové kontroly parity je (n, n – 1)-kód. Může mít bázi: b1 = 1000 ... 001 b2 = 0100 ... 001 …
bn–1 = 0000 ... 011
generující matice kódu
Každý prvek báze je přitom sám kódovým slovem. Do báze se snažíme zařadit kódová slova s co nejmenším počtem jedniček, vzájemně lineárně nezávislá. Tato báze b1, b2, ... bk, (n, k)-kódu obsahuje kódová slova – vektory, které zapsány pod sebe tvoří generující matici kódu s n sloupci a k řádky.
b1 b 2 . G . . . b k
(20)
Neboli matice G typu (k, n) je generující maticí lineárního kódu, jestliže platí: každý její řádek je kódovým slovem, každé kódové slovo je lineární kombinací řádků, řádky jsou lineárně nezávislé, to znamená, že hodnost matice G je k. Např. kód celkové kontroly parity (sudá parita) (4, 3)-kód má generující matici: 1 0 0 1 (21) G 0 1 0 1 . 0 0 1 1
systematický kód
Pro další práci budou důležité zejména systematické kódy. To jsou kódy, u nichž můžeme najít generující matici, která má v levé části jednotkovou matici. G E| B . (22) Kód celkové kontroly parity je tedy systematický. Generující matici můžeme využít při kódování zpráv, neboť platí: v z G , kde je z v G
– slovo zdrojové abecedy, – slovo kódové abecedy, – generující matice lineárního kódu.
Například slovo zdrojové abecedy [100] zakódujeme: 34
(23)
Kódování a komprese dat
1 0 0 1 v 1 0 0 0 1 0 1 1 0 0 1, což je správné. 0 0 1 1 Větším problémem je dekódovatelnost zpráv, především kontrola, zda při přenosu nedošlo k chybě. U systematických kódů můžeme s výhodou použít kontrolní matici. Kontrolní matice lineárního kódu K je taková matice H z prvků abecedy T, pro kterou platí, slovo v v1v2 ...vn je kódové, když splňuje podmínku:
v1 0 v 2 0 . . H , H v T 0T . . . . . vn 0
kontrolní matice kódu
(24)
Přitom platí věta: Lineární kód s generující maticí G E | B má kontrolní matici:
H B T | E' .
(25)
Např. pro kód celkové kontroly parity (sudá parita) je H 1 1 1 1 . Kontrolní matici lze s úspěchem použít pro objevování chyb. Pro každé slovo v v1v2 ...vn definujeme slovo s s1s2 ...sm předpisem: #
v1 s1 v s 2 2 . . H , . . . . vn sm
H v T sT .
(26)
Slovo s se nazývá syndrom slova. Je-li syndrom nenulový, pak došlo k chybě při přenosu. Syndromy lze využít k odhalování chyb poměrně rychlým algoritmem. Existuje dokonalejší, ale pomalejší postup – tzv. standardní dekódování, popsané v další kapitole.
syndrom slova
Ne všechny kódy jsou systematické. Naštěstí platí, že každý lineární kód je ekvivalentní systematickému lineárnímu kódu, který nalezneme tak, že provedeme vhodnou permutaci sloupců v jeho generující matici.
ekvivalentní systematický lineární kód
#
Pozor ! Kód liché parity není lineární, např. součet dvou kódových slov 1101+1110 = 0011, což není kódové slovo. Nemá smysl snažit se sestavit jeho generující matici, natož matici kontrolní.
35
standardní dekódování
Kódování a komprese dat
koktavý kód
Příklad 4.1: Máme definován (6, 3)-kód, u kterého je každý informační znak vyslán dvakrát. Takový kód se také nazývá koktavý kód délky 6. Tento kód je lineární a je reprezentován generující maticí G , kterou snadno sestavíme tak, že informačními znaky (sloupec 1, 3, 5) necháme probíhat jednotkové vektory a poté doplníme kontrolní znaky (sloupec 2, 4, a 6).
1 b12 G 0 b22 0 b32
0 b14 1 b24 0 b34
0 b16 1 1 0 0 0 0 0 b26 0 0 1 1 0 0 . (27) 1 b36 0 0 0 0 1 1
Koktavý kód není systematický. Vidíme však, že kdybychom v kódových slovech změnili pořadí symbolů tak, aby systematický byl, vytvořili bychom generující matici podobně, měla by pouze přeházené sloupce. 1 0 0 14 15 16 (28) G ' 0 1 0 24 25 26 . 0 0 1 34 35 36 Vidíme, že první tři sloupce tvoří v matici systematického kódu jednotkovou submatici řádu 3. Označíme tedy druhou submatici jako B: 14 15 16 B 24 25 26 . (29) 34 35 36
Nyní vytvoříme kontrolní matici H B T | E' , kde B T je transponovaná záporná matice k matici B a E’ je jednotková matice vhodného řádu (podle počtu řádků matice B T ). 14 24 34 1 0 0 (30) B T | E' 15 25 35 0 1 0 . 16 26 36 0 0 1
Pomocí kódování informačních znaků dostáváme z generující matice G’ popis kódových slov kódu K’: u1 , u 2 , u 3 u1 u 2 u 3 u1 14 u 2 24 u 3 34 u1 15 u 2 25 u 3 35 u1 16 u 2 26 u 3 36
(31)
Nyní vynásobme nyní matici B T | E' transponovaným kódovým slovem u ' T
36
Kódování a komprese dat u1 14 u 2 24 u 3 34 u1 14 u 2 24 u 3 34 B T | E' u ' T u1 15 u 2 25 u 3 35 u1 15 u 2 25 u 3 35 u1 16 u 2 26 u 3 36 u1 16 u 2 26 u 3 36
0 0 0
(32)
Z toho vyplývá, že matice B T | E' je kontrolní maticí kódu K’, kterou jsme jednoduchým postupem zkonstruovali ze znalosti generující matice G’. Vidíme, že platí: každý lineární kód je ekvivalentní systematickému lineárnímu kódu, který získáme tak, že provedeme vhodnou permutaci sloupců v jeho generující matici.
ekvivalentní systematický lineární kód
Vrátíme-li se zpět ke koktavému kódu, můžeme provést permutaci sloupců (1, 5, 3, 4, 2, 6) a dostaneme matici G’, ve které můžeme dále vyměnit druhý a třetí řádek# a dostáváme generující matici ve tvaru G E | B systematického lineárního (6, 3)-kódu K’, který je ekvivalentní lineárnímu koktavému kódu délky 6. 1 0 0 0 1 0 1 0 0 0 1 0 G 0 0 1 1 0 0 ~ 0 1 0 0 0 1 . (33) 0 1 0 0 0 1 0 0 1 1 0 0 Odtud snadno získáme kontrolní matici K’, 0 1 1 0 0 0 0 0 0 1 0 1 H ' 1 0 0 1 0 0 0 1 0
ekvivalentního systematického kódu 0 1 1 0 0 0 0 0 1 0 1 0 0 0 1
(34)
a pokud provedeme zpětnou permutaci sloupců, získáme kontrolní matici původního koktavého kódu délky 6. 0 0 1 1 0 0 H 1 1 0 0 0 0 0 0 0 0 1 1
(35)
Na základě toho, že lineární kód je lineárním prostorem, můžeme definovat dualitu lineárních kódů. Nechť K je lineární (n, k)-kód, potom duální kód K takový, že platí u ' K v' K : u 'v' 0 , kde je operace skalárního násobení vektorů.
#
Řádky v generující matici tvoří bázová kódová slova a na jejich pořadí nezáleží
37
duální kód
Kódování a komprese dat
Platí, že duální kód K lineárního (n, k)-kódu K je lineární(n, n – k)-kód a platí, že jejich generující a kontrolní matice jsou zaměněny, tedy G H' a H G' . samoduální kódy
Existuje také speciální skupina kódů, pro které platí, že K = K . Nazývají se samoduální kódy. V jejich případě platí G H .
4.1 třídy kódu K
Dekódování lineárních kódů
Nechť K je lineární (n, k)-kód. Potom kód K tvoří podgrupu aditivní grupy Zn a odtud můžeme vytvořit faktorovou grupu Zn / K, která tvoří grupu tříd kódu K tak, že pro každé e Z n existuje třída w jejímž je reprezentantem
ew w K w v; v K
(36)
Z algebry víme, že jednotlivé třídy jsou buď disjunktní nebo jsou si rovny. Budeme tedy pracovat se systémem různých tříd, přičemž jako reprezentanty zvolíme vždy slovo dané třídy s nejmenší Hammingovou váhou. Reprezentanty budeme označovat znakem e
Z n / K e ; e w Z n e w min w i . vi w
(37)
Dekódování pak probíhá podle předpisu w w e w , kde e w je reprezentant třídy slova w.
(38)
Můžeme použít buď tabulku pro standardní dekódování nebo využít syndromy.
standardní dekódování standardní dekódovací tabulka
V prvním případě sestavíme standardní dekódovací tabulku, kde budou vypsány všechny třídy a jejich slova. V prvním sloupci bude vždy reprezentant třídy a řádky budou vzestupně uspořádány podle Hammingovy váhy jednotlivých reprezentantů. V prvním řádku bude tedy vždy třída s nulovým reprezentantem, která tvoří kód. na pozici i-tý řádek a j-tý sloupec bude takové slovo dané třídy, jehož rozdíl od kódového slova v j-tém sloupci je roven reprezentantu třídy.
38
Kódování a komprese dat Příklad 4.2: Ukažme si dekódování na koktavém kódu délky 6. Všech slov délky 6 nad dvouprvkovou abecedou Z2 je 2 6 64, kód má 8 slov, potom standardní dekódovací tabulka bude mít 8 sloupců a 8 řádků – tříd#. ei K 000000 100000 001000 000010 101000 100010 000101 100110
110000 010000 111000 110010 011000 010010 110101 010110
001100 101100 000100 001110 100100 101110 001001 101010
000011 100011 001011 000001 101011 100001 000110 100101
110011 010011 111011 110001 011011 010001 110110 010101
111100 011100 110100 111110 010100 011110 111001 011010
001111 101111 000111 001101 100111 101101 001010 101001
111111 011111 110111 111101 010111 011101 111010 011001
Dekódujeme potom snadno, najdeme dané slovo v tabulce a odečteme od něj reprezentanta. Měli bychom dostat slovo, které je kódovým slovem daného sloupce. Například 111000 111000 001000 110000 Koktavý kód má minimální vzdálenost 2, potom objeví jednoduchou chybu, ale nemusí ji opravit správně.
Opravdu, stačí, když za reprezentanta třetího řádku místo 001000 zvolíme slovo této třídy stejné váhy 000100, potom třetí řádek by byl nahrazen tímto 000100 110100 001000 000111 110111 111000 001011 111011 a potom
111000 111000 000100 111100 .
Druhým způsobem je dekódování pomocí syndromů. Celou standardní tabulku budeme redukovat na sloupec reprezentantů a jejich syndromů a využijeme vlastnost, že všechna slova dané třídy mají shodný syndrom.
#
ei
s eTi
000000 100000 001000 000010 101000 100010 000101 100110
000 010 100 001 110 011 101 111
Při vytváření tabulky můžeme postupovat tak, že začnete nulovým reprezentantem a vypíšete kódová slova, poté pokračujete reprezentanty váhy 1, tedy 100...0, 010...0, až 000...1, potom váhy 2 atd., dokud nevygenerujeme celou tabulku. Přitom pokaždé, když se v řádku objeví slovo, které již bylo dříve uvedeno, tvoříme třídu shodnou s nějakou dříve uvedenou. Daný řádek smažeme a postupujeme dále.
39
dekódování pomocí syndromů
Kódování a komprese dat Dekódujeme tak, že přijmeme slovo w, určíme jeho syndrom s w , ten najdeme v tabulce a od slova w odečteme reprezentanta, který má shodný syndrom. Například přijmeme slovo 111000 , potom jeho syndrom je 0 0 1 1 0 0 T T T (39) H 111000 1 1 0 0 0 0 111000 100 o T 0 0 0 0 1 1 a odtud je
4.2 Hammingův kód perfektní kód
111000 111000 00100 110000 .
Hammingovy kódy
Hammingovy kódy jsou speciální skupinou lineárních kódů. Opravují jednoduché chyby, neobyčejně snadno se dekódují a jsou perfektní (mají nejmenší možnou redundanci).
Hammingův binární kód s m kontrolními znaky (m = 2, 3, 4, ...) má délku 2m – 1, takže vzniká (3, 1)-kód, (7, 4)-kód, (15, 11)-kód, atd. Binární kód se nazývá Hammingův, jestliže má kontrolní matici, jejíž sloupce jsou všechna nenulová slova dané délky a žádné z nich se neopakuje. Na uspořádání sloupců nezáleží. Můžeme použít např. binární rozvoj čísel 1, 2, ..., 2m – 1 . Pro m = 2 dostaneme matici
0 1 1 H . 1 0 1
(40)
Matice H je kontrolní maticí opakovacího kódu délky 3. Ten skutečně opravuje jednoduché chyby. Pro m = 3 dostaneme (7, 4)-kód s kontrolní maticí:
0 0 0 1 1 1 1 H 0 1 1 0 0 1 1 . 1 0 1 0 1 0 1
(41)
Abychom našli jeho generující matici, přemístíme sloupce do tvaru H B T | E' . Např. vyměníme první a poslední, druhý a předposlední, čtvrtý a pátý sloupec. Dostaneme:
40
Kódování a komprese dat
1 1 0 1 1 0 0 H ' 1 1 1 0 0 1 0 . 1 0 1 1 0 0 1
(42)
Generující matice tohoto kódu bude G E | B
1 0 G' 0 0
0 0 0 1 1 1 1 0 0 1 1 0 . 0 1 0 0 1 1 0 0 1 1 0 1
(43)
Generující matici původního kódu získáme zpětným přehozením sloupců:
1 0 G 1 1
1 0 1 0 0 1 1 0 1 0 1 0 . 1 1 0 0 0 0 0 0 1 1 0 0
(44)
Z hlediska kódování je výhodnější G', neboť jde o systematický Hammingův kód. Z hlediska dekódování je výhodnější tvar G, či spíše H. Dekódování Hammingova kódu využívá syndromu s. Jestliže sloupce matice H jsou uspořádány tak, že tvoří binární rozvoje čísel 1, 2, ..., 2m – 1, přijmeme vektor v = v1 v2 ...vn, určíme jeho syndrom s, kde:
sT Hv T .
(45)
Slovo s je binárním zápisem čísla i a my změníme i-tý znak přijatého slova. Hammingův kód má minimální vzdálenost d = 3, opravuje tedy jednoduché chyby. Rozšířený Hammingův kód (doplněný o paritní bit) pak má vzdálenost d = 4, takže odhaluje trojnásobné chyby. Kontrolní otázky: 10. Jaké vlastnosti má lineární kód?. 11. Jak se sestavuje generující matice lineárního kódu? 12. Jaké vlastnosti má systematický kód? 13. Jaký je vztah mezi generující a kontrolní maticí systematického kódu? Úkoly k textu: 6. Lineární kód obsahuje kódová slova (0000, 0011, 0101, 0110, 1001, 1010, 1100, 1111), sestavte jeho generující a kontrolní matici. 7. Pro binární kód celkové kontroly parity délky 4 sestavte standardní dekódovací tabulku a tabulku pro dekódovaní pomocí syndromů. Dekódujte slova 1011, 1110, 1111. Shrnutí obsahu kapitoly V této kapitole jsme se seznámili s nejdůležitější třídou kódů – lineárními kódy. Umíme sestavit generující matici lineárního kódu, určit kontrolní matici a použít ji pro odhalení chyby při přenosu. Umíme sestavit generující a kontrolní matici Hammingova kódu pro opravu jednoduchých chyb.
41
rozšířený Hammingův kód
Kódování a komprese dat
42
Kódování a komprese dat
5
Cyklické kódy
Cíl: Cílem celé kapitoly je představit významnou třídu lineárních kódů – kódy cyklickými, nazývaných také jako kódy polynomické, protože pro jejich definici s výhodou využíváme polynomy. jejich významnou výhodou je schopnost odhalovat kromě náhodných chyb také chyby shlukové. Po jejím prostudování byste měli být schopni:
Pracovat s polynomy, zejména násobit je a dělit. Definovat základní principy cyklických kódů, generující a kontrolní polynom. Sestavit cyklický kód. Zkontrolovat správnost přeneseného slova zabezpečeného cyklickým kódem. Realizovat cyklický kód také v hardwarové podobě.
Klíčová slova této kapitoly: Cyklický kód, polynomický kód, okruh polynomů, báze kódu, generující polynom, generující matice, kontrolní polynom, kontrolní matice, systematický kód, systematické kódování, shlukové chyby, paměťový kanál, CRC. Doba potřebná ke studiu: 5 hodin
Průvodce studiem Studium této kapitoly je nutné k pochopení principů konstrukce cyklických kódů, které jsou významnou podmnožinou lineárních kódů. Použití booleovských funkcí a booleovských polynomů je využitelné i při optimalizaci logických obvodů a systémů logického řízení. Na studium této části si vyhraďte pět hodin. Zkuste si samostatně vyřešit také všechny příklady tvorby cyklických kódů a jejich použití.
43
Kódování a komprese dat cyklický kód polynomický kód
Cyklické kódy jsou rozsáhlou třídou zabezpečovacích kódů. Podle způsobu manipulace s kódovým slovem se také označují jako polynomické kódy. Kódová slova totiž můžeme chápat jako zkrácený zápis polynomu stupně n:
a0 a1 z a2 z 2 ...an 1 z n 1
a0 a1a2 a3 ...an1 .
(46)
Lineární kód se pak nazývá cyklický, jestliže s každým kódovým slovem a0 a1a2 a3 ...an1 obsahuje také slovo an 1a0 a1...an 2 , které vzniklo cyklickým posunem jednotlivých bitů. Při práci s polynomy přitom odpovídá cyklický posun násobení proměnnou z. Přesun koeficientu u nejvyšší mocniny na začátek kódového slova vyřešíme zavedením:
z n 1, z n 1 z , z n 2 z 2 ,... .
(47)
K definici cyklických kódů jsou zapotřebí znalosti z algebry polynomů a faktorových okruhů. Jejich objasnění přesahuje rámec této publikace, blíže je možno se s nimi seznámit např. v [1]. Pro nás bude nejvýznamnější operací násobení a dělení polynomů. Dělení polynomu a(z) polynomem b(z) chápeme jako určení podílu q(z) a zbytku r(z). Přitom platí:
a z q z b z r z kde je
okruh polynomů
deg
a
deg r z deg b z
(48)
– stupeň polynomu – nejvyšší číslo k = deg a(z), takové, že ak 0 ; stupeň nulového polynomu přitom předpokládáme roven –1.
Pro definici cyklických kódů je významný pojem okruh polynomů modulo q(z): T / q( z ) , (49) kde je
T q(z)
– těleso vzniklé z abecedy T, u binárních kódů pracujeme s tělesem Z2 = {0, 1}, – polynom proměnné z nad tělesem T, koeficienty polynomu jsou prvky tělesa T.
Základní operace v okruhu polynomů modulo q(z) jsou pak sčítání, které se neliší od běžného sčítání polynomů: a(z) + b(z). Násobení je však definováno jako zbytek po dělení polynomu a(z).b(z) polynomem q(z) a(z) b(z). Pokud zvolíme q(z) = zn – 1 vznikne okruh polynomů, ve kterém platí zn = 1, což je požadavek pro cyklický kód (47). Polynomy patřící do tohoto okruhu pak definují jednotlivá kódová slova. Ukažme si základní operace s polynomy v okruhu polynomů modulo q(z) na příkladu okruhu Z2 / (z2 – 1). Jeho prvky jsou polynomy stupně 1: 0, 1, z, z + 1.
44
Kódování a komprese dat
Pro sčítání platí tabulka: + 0 0 0 1 1 z z z+1 z+1 Násobení
je
1 1 0 z+1 z
určeno
jako
z z z+1 0 1
zbytek
po
z+1 z+1 z 1 0
dělení
z2 1,
např.:
z z z z 1 1 2
2
Pro násobení platí tabulka: 0 0 0 1 0 0 z z+1 0
1 0 1 z z+1
z 0 z 1 z+1
z+1 0 z+1 z+1 0
Všimněte si zejména násobení polynomem z, které odpovídá cyklickému posunu. Cyklický kód můžeme kromě generující matice (jako každý jiný lineární kód) definovat pomocí generujícího polynomu g(z). Generující polynom cyklického (n, k)-kódu je polynom stupně n – k v tomto kódu, který je dělitelem polynomu (zn – 1). Generující matice cyklického kódu vznikne cyklickým posunem koeficientů generujícího polynomu:
k-1 g0 0 . G . . 0
g1
g2
...
g0
g1
... g n k 1
0
...
0
g nk
g0
0 g nk
g1
0 0 ... 0 . ... ... g n k 0 ...
(50)
k -1
45
generující polynom generující matice
Kódování a komprese dat
Její řádky tvoří polynomy
g( z ) z g( z) . . . z k 1 g ( z ) báze kódu
Z definice generující matice víme, že tyto polynomy tvoří bázi kódu. Pro generující polynom g(z) (n, k)-kódu K tedy platí: 1. Stupeň polynomu g(z) je n – k, 2. Kód K sestává ze všech násobků polynomu g(z) v prostoru T n , tedy: K {q z g z q ( z ) T n } , 3. Polynom g(z), z.g(z), ..., zk–1.g(z) tvoří bázi kódu K, 4. Polynom g(z) dělí polynom zn – 1 beze zbytku.
kontrolní polynom
U cyklických kódů můžeme kontrolní matici nahradit kontrolním polynomem: h ( z ) ( z n 1) : g( z ) (51)
kontrolní matice
Kontrolní matici cyklického (n, k)-kódu získáme cyklickými posuvy koeficientů kontrolního polynomu čteného od nejvyšší mocniny:
n–k+1
0 0 . H . . hk
0 0
. .
. .
. .
hk 1
.
.
.
0 0 0 hk
hk hk 1
hk 1 .
. .
. .
. h1 h1 h0
h1
h0
.
.
.
h0 0 .(52) 0
Kontrolní matice má n – k řádků. Protože hk 0 , jsou řádky lineárně nezávislé. Pro každý polynom v(z), pro který platí: (53) v( z ) h ( z ) 0 , splňuje kontrolní matice podmínku H v T 0T .
46
(54)
Kódování a komprese dat Příklad 6.1: Kód celkové kontroly parity (sudá parita) délky 4 bity, tedy (4, 3)kód je lineární kód, který je také cyklickým kódem. Skládá se z těchto polynomů: 0, 1 z , 1 z 2 , 1 z 3 , z z 2 , z z 3 , z 2 z 3 , 1 z z 2 z 3 Nenulový kódový polynom nejnižšího stupně je polynom 1 + z, ostatní kódové polynomy jsou všechny násobky polynomu 1 + z v okruhu Z2/(z4 – 1). Přitom platí: z 4 1 z 3 z 2 z 1z 1 . (55)
Jeho generující matici podle vztahu (50) určíme jako: 1 1 0 0 G 0 1 1 0 . 0 0 1 1
(56)
Jeho kontrolní polynom vyplývá ze vztahů (51) a (55) (je třeba si uvědomit, že v binární aritmetice platí –z = z): (57) h( z) z 3 z 2 z 1 . Z něj určíme kontrolní matici H 1 1 1 1 ,
(58)
což odpovídá našim dosavadním poznatkům o tomto kódu. Příklad 6.2: (4, 2)-kód s generující maticí: 1 1 1 1 G 0 1 0 1
(59)
má kódová slova 0000, 1111, 0101, 1010. Je to tedy cyklický kód. Polynom stupně n – k = 4 – 2 = 2 je 1010, tedy 1 + z2. Ten však dává jinou generující matici: 1 0 1 0 G (60) . 0 1 0 1 Kontrolní polynom je h ( z ) 1 z 2 , neboť platí: ( z 4 1) ( z 2 1)( z 2 1) .
(61)
Kontrolní matice tohoto kódu je pak: 0 1 0 1 H . 1 0 1 0
(62)
Generující matice G´ (60) odpovídá generující matici systematického kódu, můžeme ji tedy zapsat jako G E B a kontrolní matice je H BT E' .
Takto získáme opět jinou kontrolní matici: 1 0 1 0 H . 0 1 0 1
(63)
47
Kódování a komprese dat Příklad 6.3: Z dříve uvedených poznatků vyplývá, že každý cyklický kód rozkládá polynom zn – 1 na součin g(z).h(z). To platí i naopak. Popišme nyní všechny binární cyklické kódy délky 5. Platí: z 5 1 ( z 1)( z 4 z 3 z 2 z 1) , (64)
odtud dostáváme dva kódy (netriviální kódy): 1. kód celkové kontroly parity g( z ) z 1 , h ( z ) z 4 z 3 z 2 z 1 , 2. opakovací kód g( z ) z 4 z 3 z 2 z 1 , h ( z ) z 1 . Příklad 6.4: Hammingův (7, 4)-kód není cyklický. Např. cyklickým posunem slova 1101001 (první řádek generující matice) dostaneme nekódové slovo 1110100 (jeho syndrom je 101). Protože sloupce kontrolní matice Hammingova kódu můžeme psát v libovolném pořadí, uspořádáme je tak, aby vznikl cyklický kód. 0 0 0 1 1 1 1 (65) H 0 1 1 0 0 1 1 . 1 0 1 0 1 0 1
Sloupce tvoří všechna slova délky 3 kromě 000. Místo slov budeme psát polynomy stupně nejvýše 2 v pomocné proměnné x (její označení je voleno z důvodu odlišení od proměnné z). Chceme najít pořadí, v jakém zapsat všechny nenulové polynomy a + bx + cx2 jako sloupce c b a matice H tak, aby vznikl cyklický kód. K tomu použijeme okruh Z 2 / q ( x) , kde je q(x) polynom třetího stupně, takže prvky okruhu jsou právě naše polynomy. Jako vhodná volba se ukazuje: q( x) x 3 x 1 , neboť platí x 3 x 1 0 , takže mocninami xi vyjádříme naše polynomy: x0 1 x1 x
(66)
x2 x2 x3 x 1 x4 x2 x x5 x 2 x 1 x6 x2 1
Kontrolní matici H nyní uspořádáme podle těchto mocnin: 0 0 1 0 1 1 1 2 3 4 5 6 H1 x x x x x x 0 1 0 1 1 1 0 . 1 0 0 1 0 1 1
48
(67)
Kódování a komprese dat
Kód s touto kontrolní maticí sestává ze všech polynomů
v( z ) v0 v1 z ... v6 z 6 ,
(68)
pro které platí: v 0 v 1 . H 1 x . . v6
x2
v 0 v 1 . . . . x 6 v0 v1 x v 2 x 2 ... v6 x 6 0 , (69a) . . v6
neboli v( x) 0 v okruhu Z 2 /( x 3 x 1) ,
(69b)
a tento kód je cyklický, přitom má kontrolní matice jako sloupce všechna nenulová slova délky 3, takže je to Hammingův (7, 4)-kód. Generující polynom je stupně 7 – 4 = 3 a je to jediný takový polynom g( z ) z 3 z 1 . (70) Generující matice je tedy: 1 1 0 1 0 0 1 1 0 1 G 0 0 1 1 0 0 0 0 1 1
0 0 1 0
0 0 . 0 1
Kontrolní polynom h(z) určíme ze vztahu (51): h ( z ) ( z 7 1) : ( z 3 z 1) z 4 z 2 z 1 . Ten určuje kontrolní matici: 0 0 1 0 1 1 1 H 0 1 0 1 1 1 0 , 1 0 1 1 1 0 0
(71)
(72)
(73)
ta vznikne z kontrolní matice (67) přičtením prvního řádku k poslednímu.
49
Kódování a komprese dat
5.1 systematický kód systematické kódování
Realizace cyklických kódů
Dosud nebyla řešena otázka realizace cyklických kódů. Jak bylo uvedeno, cyklický kód je kódem lineárním, jako takový je ekvivalentní se systematickým kódem. U systematického kódu můžeme oddělit informační bity od kontrolních bitů. Tím se velmi usnadňuje dekódování. Pro cyklické kódy existuje velmi jednoduché systematické kódování. Každé kódové slovo čteme pozpátku (neboli polynomy zapisujeme od nejvyšší mocniny, tedy opačně než jsme je zapisovali dosud). Z informačních bitů u0 u1 ... uk–1 vytvoříme polynom: u ( z ) u 0 z n 1 u1 z n2 ... u k 1 z nk . (74) Tento polynom dělíme generujícím polynomem g(z): u ( z ) q( z )g( z ) r ( z ) , kde je deg r ( z ) n k .
(75)
Odečtením zbytku vznikne kódové slovo: q ( z )g ( z ) u ( z ) r ( z ) ,
(76)
které je nutně slovem cyklického kódu. Protože v binární aritmetice platí 1 1 0 , polynom u(z) obsahuje jen koeficienty u mocniny n – k nebo vyšší, zatímco zbytek koeficienty nižší, pak při označení (77) r ( z ) rk z nk 1 rk 1 z n k 2 ... rn1 z rn , vyšleme kódové slovo: u 0 u1 ...u k 1rk rk 1 ...rn .
(78)
Výhodou uvedeného postupu je skutečnost, že u binárních kódů, kde platí r(z) + r(z) = 0 vysíláme kódové slovo u(z) + r(z), které je bezezbytku dělitelné generujícím polynomem. Kontrolu správnosti přeneseného kódového slova tedy zjistíme jeho dělením generujícím polynomem. Např. v rozebíraném Hammingově (7, 4)-kódu zakódujeme informační bity 1010 (u0u1u2u3) tak, že polynom u(z) = z6 + z4 dělíme generujícím polynomem g(z) = z3 + z + 1 a získáme zbytek r(z) = z + 1. Výsledné kódové slovo je u(z) – r(z) = z6 + z4 + z + 1. Při zápisu od nejvyšší mocniny tedy vyšleme 1010011. Při kontrole přijatého kódového slova již postupujeme jako dříve. Přijaté kódové slovo je v(z) = z6 + z4 + z + 1. Dělením kontrolním polynomem h(z) = z4 + z2 + z + 1 zjistíme, že kódové slovo je dělitelné beze zbytku a tedy správné. Totéž zjistíme dělením generujícím polynomem. Obdobně pro informační bity 1001 získáme kódové slovo 1001110. Vlastní operace dělení generujícím polynomem je snadno realizovatelná pomocí dvou binárních sčítaček a tří posuvných registrů (pro Hammingův (7, 4)-kód):
u6 ... u2 u1 u0
+
r0
+
r1
r2
q 6... q 2q 1q 0
Obr. 6. Hardwarová realizace dělení generujícím polynomem g(z) = z3 + z + 1
50
Kódování a komprese dat
Do obvodu vstupují koeficienty polynomu u(z) = u0z6 + u1z5 + ... + u6 a vystupují koeficienty podílu q(z) = q0z6 + q1z5 + ... + q6. Po vystoupení posledního koeficientu zůstávají v registrech koeficienty zbytku r(z) = r2z2 + r1z + r0. Např. při dělení u(z) = z6 + z4 (kódování informačních bitů 1010) bude obsah registrů postupně nabývat hodnot:
vstup u0 u1 u2 u3 u4 u5 u6
1 0 1 0 0 0 0
r0 1 0 1 1 0 0 1
r1 0 1 0 0 1 0 1
r2 0 0 1 0 0 1 0
výstup 0 0 0 1 0 0 1
q0 q1 q2 q3 q4 q5 q6
Získali jsme tedy q(z) = z3 + 1 a r(z) = z + 1. V souladu se systematickým kódováním bude kódové slovo 1010011. Obdobně získáme pro dělení u(z) = z6 + z3 (kódování informačních bitů 1001) q(z) = z3 + z a r(z) = z2 + z, tedy příslušné kódové slovo bude 1001110. Správnost činnosti můžeme snadno ověřit, pokud si uvědomíme, že posun registrů vpravo představuje násobení jejich obsahu proměnnou z. Zpětná vazba pak realizuje modulování generujícím polynomem. Pokud původní obsah registrů byl r2 z 2 r1 z r0 , (79) pak posunem o jednu pozici doprava získáme polynom r1 z 2 (r2 r0 ) z r2 .
(80)
Protože platí r2 z 3 r2 z 3 0 , můžeme tento vztah rozšířit a upravit do tvaru (81) z (r2 z 2 r1 z r0 ) r2 ( z 3 z 1) z r ( z ) mod g ( z ) . Jestliže tedy registry na počátku vynulujeme a koeficienty polynomu u(z) budou vstupovat počínaje koeficientem u nejvyšší mocniny, pak po vstoupení posledního koeficientu bude v registrech uloženo n 1 n 2 nk (u 0 z u1 z ... u k z 0...0) mod g( z ) , tedy skutečně zbytek po dělení generujícím polynomem. Pro vlastní realizaci kódování bude vhodné použitý obvod mírně upravit. Protože podíl q(z) je pro nás nepodstatný, zajímá nás pouze zbytek r(z), takže pokud přesuneme vstup informačních bitů na konec obvodu, získáme zbytek r(z) ihned po průchodu informačních bitů obvodem. Tím „ušetříme“ průchod posledních tří bitů (obecně n – k bitů), které jsou vždy nulové, jak vyplývá z (74).
51
Kódování a komprese dat Upravený obvod pak vypadá následovně:
r0
r1
+
r2
+ u 0 u1 ...
u6 Obr. 7. Hardwarová realizace určení zbytku po dělení generujícím polynomem g(z) Zbytek přitom je r ( z ) r2 z 2 r1 z r0 . Při kódování informačních bitů 1010 bude obsah registrů postupně nabývat hodnot:
vstup
r0
r1
r2
start 1 0 1 0
0 1 0 0 1
0 1 1 0 1
0 0 1 1 0
Takže po průchodu pouze informačních bitů je v registrech hodnota zbytku r(z), který připojíme za informační bity a získáme kódové slovo 1010011. Při vysílání kódového slova budeme vysílat bity od nejvyšší mocniny z (od začátku slova), takže kontrola může probíhat souběžně s přijímáním znaků. Po přijetí informačních bitů a jejich vydělení g(z) známe zbytek, který srovnáme s přijatým zbytkem. Nebo necháme celé kódové slovo vydělit g(z), zbytek musí být 0.
5.2 shlukové chyby paměťový kanál CRC
Použití cyklických kódů
Používání cyklických kódů se v poslední době velmi rozšířilo. Důvodem je především schopnost cyklických kódů odhalovat shlukové chyby. Zkoumáním informačních kanálů se totiž zjistilo, že se většinou chovají jako paměťové kanály a chyby mají tendenci vyskytovat se blízko sebe. Nejznámější jsou bezesporu kódy CRC (Cyclic Redundancy Code) používané pro zjištění neporušenosti dat. Z každého bloku dat (obvykle násobky 256 Byte) je vypočten zbytek po dělení generujícím polynomem a uložen za tato data. Následující tabulka uvádí nejznámější kódy CRC [36]:
52
Kódování a komprese dat
počet kontrolních bitů
označení
generující polynom
8
LRCC–8
12
CRC–12
16
LCRC–16
16
CRC–16
16
CRC–16 reverzní SDLC
z16 z14 z 1
SDLC reverzní CRC–32
z16 z11 z 4 1
16 16 32
použití
kontrolní Byte je součet datových Byte modulo 2 12 11 3 2 z z z z z 1 používá se pro šestibitové znaky 16 kontrolní součet z 1 dvojic Byte (Word) modulo 2 16 15 2 binární z z z 1 synchronní protokol
z8 1
linkový protokol IBM, standard CCITT
z16 z12 z 5 1
z 32 z 26 z 23 z 22 z16 z12 z11 z10
Ethernet, HDLC, ZMODEM
z8 z 7 z5 z 4 z2 z 1 Blíže si všimněme kódu CRC–16. Opět je možno ho realizovat pomocí binárních sčítaček a posuvných registrů. Využijeme dosavadních znalostí a necháme informační bity vstupovat na konec obvodu. Po vstupu posledního informačního bitu máme v registrech zbytek po jeho dělení generujícím polynomem.
r0
r1
+
r2
...
r 14
+
r 15
+ u0 u1 ...
Obr. 8. Hardwarová realizace určení zbytku po dělení generujícím polynomem g(z) Po průchodu informačních bitů u0u1 ... uk je v registrech uložen zbytek r15r14 ... r0. Výsledné kódové slovo je pak tvořeno jejich spojením u0u1 ... ukr15r14 ... r0. Např. slovo 10100001 dává zbytek 1000001111000101. Celé kódové slovo je pak 101000011000001111000101, což odpovídá zásadám systematického kódování informačních bitů, jak bylo popsáno.
53
Kódování a komprese dat Obrovskou výhodou CRC kódů je možnost jejich snadné softwarové realizace při zpracování celých Byte najednou (u CRC–16). Abychom si uvědomili možnosti softwarové realizace, vyjděme z následující úvahy [35]. Předpokládejme, že již máme zpracovánu část zabezpečovaného bloku dat d(z) a odpovídající stav registru r(z) = CRC(d(z)). Další přicházející Byte je db( z ) db7 z 7 ... db1 z db0 . Rozšířeným datům d ( z ) z 8 d( z ) db( z ) odpovídá r ( z ) z 16 d ( z ) mod g ( z ) , což je po dosazení za d ( z ) z 8 z 16 d( z ) z 16 db( z ) mod g( z ) .
CRC
(82)
Přitom z16d ( z ) mod g ( z ) je již vypočtené r(z), takže nový stav registrů je roven výrazu: r ( z ) z 8 r ( z ) z 16 db( z ) mod g( z ) . (83)
Pokud vyjádříme jednotlivé bity registru r(z) – je šestnáctibitový a slova db(z) – je osmibitové a označíme x7 db7 r15 , x6 db6 r14 ,..., x0 db0 r8 , pak rovnici (83) upravíme do tvaru: r ( z ) z 16 db7 z 7 ... db0 z 0 z 8 r7 z 7 ... r0 z 0 z 16 r15 z 7 ... r8 z 0 mod g( z )
z 8 r7 z 7 ... r0 z 0 z 16 x7 z 7 ... x0 z 0 mod g( z ) z 8 (r7 z 7 ... r0 z 0 ) CRC(x ( z )). CRC rozšířených dat je tedy tvořeno dvěma složkami, přičemž druhá vznikne operací XOR dat db (8 bitů) a pravé poloviny slova r(z), tedy předchozího CRC. Výpočet pak probíhá tak, že si předem zpracujeme CRC všech 256 možných hodnot polynomu x(z) (8 bitů). Registr CRC vynulujeme a každý nový Byte db „přixorujeme“ k pravé polovině starého CRC, tím vypočteme x(z), vyhledáme v tabulce CRC(x(z)) a „přixorujeme“ ho ke staré hodnotě CRC posunuté o 8 bitů doprava. Tím získáme nové CRC. Podrobný popis softwarové realizace se nachází v [35, 36, 59].
Kontrolní otázky: 14. Jak jsou definovány cyklické kódy?. 15. Jak určíme generující a kontrolní polynom kódu? 16. Jak z generujícího polynomu určíme generující matici kódu? 17. Jak z kontrolního polynomu určíme kontrolní matici kódu? 18. Jak realizujeme systematické kódování cyklického kódu? 19. Informační slovo (1001) je třeba zabezpečit pomocí cyklického (7, 4)-kódu s generujícím polynomem g(z) = z3 + z + 1. Ukažte postup systematického kódování. Shrnutí obsahu kapitoly V této kapitole jsme se seznámili s významnou třídou lineárních kódů – cyklickými kódy. K jejich definici s výhodou používáme polynomy a operace s nimi, zejména dělení polynomů. Umíme sestavit generující a kontrolní polynom kódu, zakódovat i dekódovat informační slovo kódu. Známe také významnou skupinu CRC kódů, používaných pro odhalení shlukových chyb při zabezpečení dat. Seznámili jsme se také s hardwarovou realizací cyklických kódů. 54
Kódování a komprese dat
6
Kontrolní číslice
Cíl: Cílem celé kapitoly je představit typické metody realizace a zabezpečení unikátních identifikátorů. Většinou jsou označovány jako kontrolní číslice a patří mezi kontrolní kódy. Často jsou součástí identifikačních systémů, jako jsou čárové kódy, jejichž příklady jsou také uvedeny v této kapitole. na závěr je ukázána konstrukce kódu konstantní změny, který má specifické využití v informatických aplikacích.
Po jejím prostudování byste měli být schopni:
Specifikovat používané metody realizace kontrolních číslic. Vytvořit unikátní identifikátor pro potřebnou aplikaci. Popsat princip realizace čárového kódu. Sestavit kód konstantní změny požadované délky.
Klíčová slova této kapitoly: Kontrolní číslice, rodné číslo, ISBN, ISSN, ISMN, čárový kód, EAN 13, IČ, číslo účtu, IBAN, VIN, UPC, QR-kód, kód konstantní změny, Grayův kód, Karnaughova mapa.
Doba potřebná ke studiu: 4 hodiny
Průvodce studiem Studium této kapitoly je nutné k pochopení principů konstrukce kontrolních číslic pro zabezpečení unikátních identifikátorů proti chybám. ty se využívají k identifikaci různých objektů, zejména pokud jsou tyto identifikátory použity v rámci výrobních a technologických procesů k identifikaci výrobků, zboží. Na studium této části si vyhraďte čtyři hodiny. Zkuste si samostatně vyřešit také všechny příklady tvorby kontrolních číslic a zamyslete se nad jejich použitím.
55
Kódování a komprese dat kontrolní číslice
Úkolem kontrolních číslic je zabezpečit odhalení chybně zadaného údaje, který obvykle jednoznačně identifikuje určitý objekt, výrobek, knihu, osobu apod. Používá se několik algoritmů jejich vytváření, které si kladou obdobné požadavky jako cyklické kódy, tedy při malé redundanci odhalovat shlukové chyby co největšího rozsahu [49, 50]. Využívají se přitom zejména znalosti z oblasti dělitelnosti čísel, viz např. [8].
6.1 rodné číslo
Rodné číslo
Typickým představitelem je identifikátor osob známý jako rodné číslo. Postup při přidělování rodných čísel narozeným dětem vychází z ustanovení vyhlášky FSÚ č. 55/1976 Sb. Rodná čísla přiděluje Český statistický úřad prostřednictvím matrik, příslušných podle místa narození dítěte. Prvních šest míst rodného čísla je tvořeno na principu: první dvojčíslí = poslední dvojčíslí kalendářního roku narození, druhé dvojčíslí = kalendářní číslo měsíce, u žen zvýšené o 50, třetí dvojčíslí = pořadové číslo dne v měsíci. Koncovky rodného čísla jsou dvojího typu: Trojmístné koncovky rodných čísel osob narozených do roku 1953 včetně. Spolu se základními šesti místy vytvářejí devítimístné rodné číslo. Nejsou zabezpečeny kontrolní číslicí. Čtyřmístné koncovky rodných čísel osob narozených v roce 1954 a později. Rodná čísla těchto osob jsou desetimístná. Čtyřmístná koncovka je konstruována tak, aby celé desetimístné rodné číslo bylo beze zbytku dělitelné jedenácti. Jestliže rozložíme číslo c = 11a + b, pak číslo včetně zabezpečení je: 10c + (c mod 11). (84) Přitom platí: 10c + (c mod 11) = 10(11a + b) + b = 110a + 11b = 11(10a + b). (85) Z čehož je zřejmé, že číslo včetně zabezpečení je vždy beze zbytku dělitelné 11. Pozorný čtenář si jistě uvědomil, že je zde problém. Pokud je zbytek po dělení čísla roven 10, pak bychom po zabezpečení dostali stejný výsledek jako pro následující číslo, jehož zbytek po dělení 11 je 0. Řešení tohoto problému je pouze jediné – nepoužívat čísla, jejichž zbytek po dělení 11 je 10.
6.2 ISBN ISSN ISMN
Identifikace publikací
Pro celosvětovou identifikaci vydaných publikací se používá číslo ISBN (International Standard Book Number) pro knihy, ISSN (International Standard Serial Number) pro časopisy a ISMN (International Standard Music Numbering) pro hudebniny. I přes jejich rozdílnou délku (ISBN má celkem deset znaků, ISSN celkem osm znaků) je jejich zabezpečení řešeno stejným způsobem [46]. Konstrukcí samotného čísla se zabývat nebudeme, zájemci získají potřebné údaje např. z [29]. Kontrolní číslice vzniká následujícím postupem. 1. Jednotlivé číslice vynásobíme vahami v sestupném pořadí od n po 1, kde n je počet číslic výsledného čísla včetně zabezpečení. 2. Sečteme dílčí součiny. 3. Určíme zbytek po dělení součtu součinů 11. 4. Od 11 odečteme získaný zbytek. 56
Kódování a komprese dat 5.
Získané kontrolní číslo připojíme na konec čísla. Pokud je kontrolní číslo rovno desíti, použijeme znak X.
Příklad zabezpečení čísla ISBN: Původní číslo Váhy Dílčí součiny Součet součinů Zbytek po dělení Kontrolní číslo
8 10 80
0 9 0
7 8 56
2 7 14
2 6 12
6 5 30
2 4 8
9 3 27
3 2 6 233 2 9
Výsledné číslo, včetně oddělovačů, je 80-722-629-3 (oddělovače dělí identifikátory země původu, vydavatele, publikace a kontrolní znak). Příklad zabezpečení čísla ISSN Původní číslo Váhy Dílčí součiny Součet součinů Zbytek po dělení Kontrolní číslo
4 8 32
2 7 14
1 6 6
0 5 0
1 4 4
1 3 3
6 2 12 71 5 6
Výsledné číslo, včetně oddělovačů, je 4210-1166.
6.3
Čárový kód
Čárové kódy se používají k jednoznačné identifikaci výrobků, nástrojů apod. Bylo vytvořeno několik systémů čárových kódů, následující popis zabezpečení se týká kódu EAN-13, který tvoří třináct číslic včetně kontrolní (obdobně funguje zabezpečení u kódu EAN-8). Zabezpečení odstraňuje nepříjemnou vlastnost zbytku po dělení 11, tedy rozsah hodnot 0 10. Postup výpočtu kontrolní číslice je následující [19]: 1. Číslice na lichých pozicích sečteme. 2. Přičteme součet číslic na sudých pozicích zvětšený třikrát. 3. Určíme zbytek po dělení součtu desíti. 4. Kontrolní číslici tvoří rozdíl desíti a zbytku po dělení.
Příklad zabezpečení čísla EAN-13 Původní číslo Váhy Dílčí součiny Součet součinů Zbytek po dělení Kontrolní číslo
8 1 8
5 3 15
9 1 9
3 3 9
8 1 8
3 3 9
7 1 7
8 3 24
6 1 6
4 3 12
1 1 1
3 3 9 117 7 3
Výsledné číslo je 8 593837 864133.
57
čárový kód EAN 13
Kódování a komprese dat
6.4 identifikační číslo
Identifikační číslo
Identifikační číslo – IČ (dříve IČO), je přidělováno podnikatelským subjektům pro jejich jednoznačnou identifikaci: právnickým osobám zapsaným v obchodním rejstříku – rejstříkový soud, fyzickým osobám provozujícím živnost – živnostenský úřad, ostatním ekonomickým subjektům – Český statistický úřad. Pro výpočet kontrolní číslice se využívá zbytku po dělení desíti a jednotlivé číslice se násobí sestupnými vahami. Postup výpočtu kontrolní číslice je následující: 1. Číslice (bez kontrolní) vynásobíme sestupnými vahami 8, 7, 6, 5, 4, 3, 2. 2. Dílčí součiny sečteme. 3. Určíme zbytek po dělení součtu jedenácti. 4. Kontrolní číslici tvoří rozdíl jedenácti a zbytku po dělení. Příklad zabezpečení identifikačního čísla Původní číslo Váhy Dílčí součiny Součet součinů Zbytek po dělení Kontrolní číslo
6 8 48
0 7 0
7 6 42
8 5 40
3 4 12
1 3 3
7 2 14 159 5 6
Výsledné identifikační číslo je 60783176.
6.5 číslo účtu
Číslo účtu
Číslo účtu je v obchodním styku používáno velmi často. K zabezpečení se využívá řetězec úplných zbytků modulo 11. Tento řetězec se po deseti prvních opakuje, což odpovídá dělení čísla účtu na předčíslí délky 6 znaků a bázi délky 10 znaků včetně zabezpečení. Postup výpočtu kontrolní číslice je následující: 1. Sestupnými vahami 15, 14, … umocníme číslo dvě a určíme zbytek po dělení jedenácti. 2. Získanými zbytky vynásobíme postupně jednotlivé číslice čísla účtu. 3. Dílčí součiny sečteme. 4. Určíme zbytek po dělení součtu jedenácti. 5. Kontrolní číslici tvoří rozdíl jedenácti a zbytku po dělení.
Příklad zabezpečení čísla účtu Váhy váha mod 11 2 Číslo účtu Dílčí součiny Součet součinů Zbytek po dělení Kontrolní číslo
15 10 0 0
14 5 0 0
13 8 0 0
12 4 0 0
11 2 0 0
Výsledné číslo účtu je 2701251768.
58
10 1 0 0
9 6 2 12
8 3 7 21
7 7 0 0
6 9 1 9
5 10 2 20
4 5 5 25
3 8 1 8
2 4 7 28
1 2 6 12 135 3 8
Kódování a komprese dat V rámci evropské unie se pro jednotný systém identifikace bankovních účtů používá kód IBAN (International Bank Account Numer), založený na mezinárodním standardu ISO 13616. Vydala ho ECBS (European Committee for Banking Standards). Dnem vstupu ČR do Evropské unie (1. 5. 2004) se součástí českého právního řádu stane „Nařízení Evropského parlamentu a Rady ES č. 2560/2001 ze dne 19. 12. 2001 o platbách v eurech“. Podle tohoto nařízení musí všechny banky uvádět čísla účtů ve formátu IBAN. Důvodem jeho zavedení je podpora automatizovaného zpracování přeshraničních plateb a eliminace chyb z důvodu nesprávně zadaného čísla účtu. Kód IBAN obsahuje následující informace: Pozice hodnota význam 1-2 CZ ISO kód země, dva alfanumerické znaky 3-4 23 kontrolní číslice, délky dvou cifer 5-8 0300 kód banky, délky čtyř cifer 9-14 000000 první část čísla účtu (předčíslí) délky šest cifer 15-24 0127089559 druhá (základní) část čísla účtu, délky deset cifer Celkově tvoří IBAN dvacet čtyři alfanumerické znaky, které se v elektronické komunikaci uvádí bez mezer, v písemné se dělí do skupin po čtyřech znacích: CZ23 0300 0000 0001 2708 9559 V tuzemském platebním styku přitom zůstává nadále původní použití čísel účtů: 000000-0127089559/0300 Postup výpočtu kontrolních číslic definuje dokument [18]: 1. číslo IBAN zapíšeme ve formátu pro elektronický platební styk (bez mezer), místo kontrolních číslice zapíšeme 00, 2. první čtyři znaky (včetně kontrolních číslic) přesuneme na konec čísla, 3. písmena převedeme na čísla podle konverzní tabulky: A 10 G 16 M 22 S 28 Y 34 B 11 H 17 N 23 T 29 Z 35 C 12 I 18 O 24 U 30 D 13 J 19 P 25 V 31 E 14 K 20 Q 26 W 32 F 15 L 21 R 27 X 33 4. Pro výpočet kontrolních číslic použijeme metodu MOD 97-10 (ISO 7064). Její použití závisí na použitém formátu uložení čísel, formát Integer (32 bitů) je schopen přesně uložit 9 cifer, formát Long (64 bity) je schopen přesně uložit 18 cifer. Celková délka IBAN je delší, takže podle použitého formátu vezmeme prvních 9 (18) cifer a vypočteme zbytek po dělení 97 z první části, zbytek doplníme dalšími 6 nebo 7 ciframi (16 nebo 18) podle toho zda je zbytek jedno nebo dvouciferný a opět počítáme zbytek po dělení 97, postup opakujeme tak dlouho, až zpracujeme všechny cifry, konečný zbytek odečteme od 98 (určíme doplněk do 98), což je hledané kontrolní číslo, pokud vyjde jednociferné, doplníme ho o úvodní nulu na dvouciferné.
59
IBAN
Kódování a komprese dat Příklad: Hledáme IBAN pro účet číslo 127089559/0300. Celé číslo účtu je 0000000127089559/0300 (správnost čísla je možno ověřit dříve uvedeným postupem). Kód IBAN tedy bude: CZxx 0300 0000 0001 2708 9559. Výpočet kontrolních číslic s použitím 32 bitového formátu uložení čísel: Přesun prvních znaků na konec: 03000000000127089559CZ00 Náhrada písmen za čísla: 03000000000127089559123500 Devět číslic: 030000000 mod 97 = 34 Druhá skupina: 340012708 mod 97 = 63 Třetí skupina: 639559123 mod 97 = 02 Poslední skupina: 2500 mod 97 = 75 Doplněk do 98 98 – 75 = 23 Celé číslo IBAN bude: CZ23 0300 0000 0001 2708 9559 Pokud budeme výpočet kontrolních číslic aplikovat na celé číslo IBAN včetně zabezpečení, musí vyjít zbytek jedna. Kontrola čísla IBAN s použitím 32 bitového formátu uložení čísel: Přesun prvních znaků na konec: 03000000000127089559CZ23 Náhrada písmen za čísla: 03000000000127089559123523 Devět číslic: 030000000 mod 97 = 34 Druhá skupina: 340012708 mod 97 = 63 Třetí skupina: 639559123 mod 97 = 02 Poslední skupina: 2523 mod 97 = 01 Zbytek vyšel 1, IBAN je správný.
VIN
6.6
Identifikační číslo automobilu
Identifikační číslo automobilu, známé pod zkratkou VIN (Vehicle Identification Number) bylo u nás zavedeno v roce 1985 a používá se pro identifikaci vozidel jezdících rychlostí větší než 25 km/h. Je popsán normou ISO 3779 z února 1977. Jedná se o sedmnáctimístný kód, složený z písmen a číslic. Celkově udává přehled o technických parametrech automobilu. VIN začíná třípísmenným kódem automobilky, která vozidlo vyrobila. Následující znaky již charakterizují výrobek – modelovou řadu, typ, druh motoru a jeho objem, provedení karoserie či používané palivo. Na konci se uvádí modelový rok a výrobní číslo (dříve číslo podvozku). Na osmém místě se nachází kontrolní číslice C. Postup výpočtu identifikačního čísla automobilu: 1. Písmena jsou zaměněna za čísla podle tabulky: A 1
B 2
2.
D 4
E 5
F 6
G 7
H 8
J 1
K 2
L 3
M 4
N 5
P 7
R 9
S 2
T 3
U 4
V W 5 6
X 7
Y 8
Z 9
Čísla na jednotlivých pozicích vynásobíme vahami podle tabulky: 1 8
60
C 3
2 7
3 6
4 5
5 4
6 3
7 2
8 10
C -
10 11 12 13 14 15 16 17 9 8 7 6 5 4 3 2
Kódování a komprese dat 3. 4. 5.
Dílčí součiny sečteme Určíme zbytek po dělení součtu jedenácti. Kontrolní číslici tvoří zbytek po dělení jedenácti, pokud je roven desíti, použije se znak X.
Příklad zabezpečení identifikačního čísla automobilu: VIN Číselná podoba Váhy Dílčí součiny Součet součinů Zbytek po dělení
T 3 8 24
M 4 7 28
B 2 6 12
B 2 5 10
G 7 4 28
4 4 3 12
1 U 1 4 2 10 2 40
-
Y 8 9 72
2 2 8 16
3 3 7 21
4 4 6 24
1 4 1 4 5 4 5 16
9 9 3 27
1 1 2 2 339 9
Úplné identifikační číslo automobilu je TMBBG41U9Y2341491
6.7
Čárové kódy
Technologie čárových kódů se již před více než dvaceti lety prudce rozvinula a stala se nedílnou součástí identifikace zboží, materiálů apod. Používá se několik typů kódů, jejichž základní principy – posloupnost čárek a mezer definované šířky a optické snímání jsou společné. Základní principy si ukážeme na příkladu kódu EAN (European Article Numbering), který je shodný se starším kódem UPC (Universal Product Code), zavedeným v USA a Kanadě. V základní verzi je kód třináctimístný a může být doplněn další skupinou až pěti znaků (EAN 13+5). Podrobnosti je možno získat např. v [6, 19]. Základní rozměry čárového kódu jsou uvedeny na obr. 9 R
X
X
R
*gHH0G0|WXWSWs
H
Start
kód L
Stop
Obr. 9. Základní rozměry čárového kódu kde je: X – šířka modulu, nejužší element kódu, pro EAN je doporučeno 11 velikostí, základní velikost modulu je 0,330 mm R – světlé pásmo, minimálně 2,5 mm, obvykle desetinásobek modulu H – výška kódu, doporučení se liší podle způsobu čtení, pro EAN 70-80 % délky L – délka kódu Kód je tvořen posloupností třinácti číslic následujícího významu: P1 – P3 – prefix státu, pro ČR a SR 859 O1 – O4 – číslo organizace V1 – V5 – číslo výrobku v rámci organizace K – kontrolní číslice, jejíž určení bylo popsáno dříve.
61
EAN UPC
Kódování a komprese dat Vlastní realizace kódu má poněkud jinou strukturu: Start (101) P2 – kódován sadou znaků Levá A P3, O1-O4 – kódované kombinací znaků sad Levá A a Levá B, tato kombinace současně kóduje znak P1 Dělicí znak (01010) V1-V5 – kódované znaky sady Pravá. K – Kontrolní číslice kódovaná znakem sady Pravá Stop (101) Z popisu je zřejmé, že se používají celkem tři sady znaků a kód pro první znak prefixu. Správnost každého znaku samostatně je navíc zajištěna kontrolou parity: Znak Levá A Levá B Pravá Kód pro P1 lichá parita sudá parita sudá parita 0 0001101 0100111 1110010 AAAAA 1 0011001 0110011 1100110 ABABB 2 0010011 0011011 1101100 ABBAB 3 0111101 0100001 1000010 ABBBA 4 0100011 0011101 1011100 BAABB 5 0110001 0111001 1001110 BBAAB 6 0101111 0000101 1010000 BBBAA 7 0111011 0010001 1000100 BABAB 8 0110111 0001001 1001000 BABBA 9 0001011 0010111 1110100 BBABA
Příklady kódu:
*gGA2A0|PWQPPu *gHH0G0|WXWSWs
Kód EAN-13 umožňuje zakódovat také čísla knih (ISBN) a časopisů (ISSN): 978 – ISBN bez kontrolního znaku (9 znaků) – Kontrolní znak EAN 977 – ISSN bez kontrolního znaku (7 znaků) – 00 – Kontrolní znak EAN V poslední době se stále více využívá rozšíření kódu EAN 13+5, umožňující přidat skupinu až pěti dalších znaků. Tato skupina začíná znakem start, následuje první znak, dělicí znak, druhý znak, dělicí znak, …, pátý znak. Na pravé straně se stop znak neuvádí. Pro kódování znaků se využívají skupiny Levá A a Levá B, v závislosti na vypočítané referenční hodnotě: 1. Čísla na lichých pozicích se sečtou a výsledek vynásobí třemi. 2. Čísla na sudých pozicích se sečtou a vynásobí devíti. 3. Celkový součet se vydělí desíti, zbytek po dělení určuje referenční hodnotu.
62
Kódování a komprese dat Referenční hodnota 0 1 2 3 4 5 6 7 8 9
Použití znaků BBAAA BABAA BAABA BAAAB ABBAA AABBA AAABB ABABA ABAAB AABAB
Pro využití čárových kódů v prostředí různých programů jsou dnes k dispozici řady ActiveX komponent, vhodných zejména pro databázové aplikace, a fontů. Ukázky v této kapitole byly vytvořeny pomocí fontu firmy Chaos Microsystems, Inc., viz [2]. V současnosti se systémy čárových kódů rozšiřují do oblasti 2D kódů, které jsou schopny zaznamenat mnohem větší množství dat, ale pro jejich čtení je potřeba také příslušně upravené technické zařízení. Několik ukázek 2D kódů obsahuje obr. 10.
QR-kód kód PDF417
kód Data Matrix
kód Odeone
QR-kód
Obr. 10. Příklady 2D kódů
6.8
kód konstantní změny
Kódy konstantní změny
Pro speciální použití byly vytvořeny kódy konstantní změny. Jejich základní myšlenkou je, že dvě následující kódová slova se liší vždy o stejný počet bitů. Nejčastěji o jeden bit a pak hovoříme o třídě Grayových kódů**. Používají se v absolutních snímačích natočení, viz následující obr. 11, ale také pro kódování jedinců u genetických algoritmů. Důvodem je, že při mutaci je změnou kteréhokoliv bitu vždy vygenerován jedinec blízké hodnoty.
**
Z pohledu teorie grafů se jedná o Hamiltonovskou kružnici na n-dimenzionální kostce.
63
Grayův kóv
Kódování a komprese dat
Obr. 11. Absolutní snímač natočení využívající Grayův kód Příklad převodu čtyřbitového binárního čísla na Grayův kód ukazuje následující tabulka: dekadické číslo 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Karnaughova mapa
binární číslo 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111 a3 a 2 a 1 a 0
binární podoba
a3 a2 a1 a0
Gray Code
binární vyjádření
g3 g2 g1 g0
0000 0001 0011 0010 0110 0111 0101 0100 1100 1101 1111 1110 1010 1011 1001 1000 g3 g2 g1 g0
Pro určení převodních vztahů můžeme využít Karnaughovu mapu, např. pro bit g0 platí:
a3a2
a1a0
00 01 11 10
00 0 0 0 0
01 1 1 1 1
11 0 0 0 0
10 1 1 1 1
Odtud získáme vztah pro g0 a obdobně i pro ostatní bity: g0 = a1a0 OR a1a0 = a1 XOR a0 g1 = a2 XOR a1 g2 = a3 XOR a2 g3 = a3
64
(86)
Kódování a komprese dat Pro opačný převod je výhodné použít postupný převod: a 3 = g3 a2 = a3 XOR g2
(87)
a1 = a2 XOR g1 a0 = a1 XOR g0
Kontrolní otázky: 20. Jaké vlastnosti má lineární kód? 21. Jak se sestavuje generující matice lineárního kódu? 22. Jaké vlastnosti má systematický kód? 23. Jaký je vztah mezi generující a kontrolní maticí systematického kódu? Úkoly k textu: 8. Osoba ženského pohlaví, narozená 14. 4. 2014 má pořadové číslo v matrice narození 014. Určete její rodné číslo včetně zabezpečení. Shrnutí obsahu kapitoly V této kapitole jsme se seznámili s různými principy tvorby kontrolních číslic pro zabezpečení unikátních identifikátorů. Umíme použít různým způsobem vygenerované kontrolní číslice pro zabezpečení identifikačních údajů proti chybám. Známe kódy konstantní změny a víme k čemu se nám mohou hodit. . Korespondenční úkol 3: 3. Vytvořte příklady zabezpečení informace kontrolní číslicí s využitím zabezpečení: – Modulo 11 – Metody sestupných vah se zabezpečení modulo 10 – Metody střídavých vah a zabezpečení modulo 10. – Modulo 97. A ukažte, jak zabezpečení odhalí chybu vzniklou pří čtení zabezpečeného čísla.
65
Kódování a komprese dat
66
Kódování a komprese dat
7
Kódy pro ukládání dat
Cíl: Cílem celé kapitoly je představit typické kódy používané pro ukládání dat v počítači. V této kapitole budou představeny obvyklé typy strukturovaných dat, pro jejichž optimální uložení v počítači byly vytvořeny vhodné kódy. Současně s představením používaných kódů bude upozorněno na související problémy jako je omezená přesnost uložení čísel v počítači a s ní související zaokrouhlovací chyby. Po jejím prostudování budeme schopni správně vybrat potřebný kód a budeme si vědomi s ním souvisejících problémů, takže budeme schopni je buď eliminovat nebo vzít v úvahu při jejich používání.
Po jejím prostudování byste měli být schopni:
Popsat kódy pro ukládání dat z různých domén. Znát a popsat problémy, které s různými datovými typy souvisí a vzít je v úvahu při práci s nimi.
Klíčová slova této kapitoly: Informace, kódování, optimální kód, data, datový typ, jednoduchý datový typ, složený datový typ, kardinalita, proměnná, deklarace proměnné, definice proměnné, NULL, logická informace, celé číslo, číselný kód, přímý kód, znaménkový bit, doplňkový kód, inverzní kód, přetečení rozsahu, operace s celými čísly, reálné číslo, rotace bitů, racionální číslo, iracionální číslo, pevná řádová čárka, proměnná řádová čárka, normování, přesnost, mantisa, exponent, operace s reálnými čísly, platná cifra, počítačové epsilon, skrytý bit, zaokrouhlovací chyba, Kahanův trik, rovnost čísel, znak, text, ASCII-2, řetězec, pole znaků, ukazatel, dynamická datová struktura, pole, vektor, matice, mapovací funkce, řídká matice, struktura, množina, objekt, veřejné rozhraní, soubor, typový soubor, textový soubor, XML, formát souboru.
Doba potřebná ke studiu: 6 hodin
Průvodce studiem Studium této kapitoly je nutné k pochopení principů konstrukce kódů pro ukládání dat v závislosti na jejich doméně. Některé kódy mají omezení, kterých je potřeba si být při práci s nimi vědom. Jinak můžeme snadno vytvořit programovou realizaci správného algoritmu řešení problému, která může být nesprávná. Na studium této části si vyhraďte šest hodin. Vyřešte samostatně všechny příklady včetně korespondenčního úkolu, abyste si osvojili znalosti o používaných datových kódech a problémy, se kterými se můžeme setkat.
67
Kódování a komprese dat informace kódování optimální kód
data
datový typ jednoduchý datový typ složený datový typ
Pro práci s informací v počítači je potřeba tuto informaci nějakým vhodným způsobem interpretovat. K tomu využíváme kódování informace. Musíme tedy vytvořit vhodný kód, neboli přiřazení kódových slov jednotlivým zprávám. Možných zpráv je nepřeberné množství, o pravděpodobnosti jejich výskytu nic nevíme, takže vytvořit optimální kód nebude možné. Přesto nechceme zbytečně plýtvat prostorem pro uložení informace. Vytvořit vhodný kód pro uložení jakékoliv informace zřejmě nebude jednoduché. V praxi se osvědčilo vytvořit speciální kódy pro jednotlivé typy informace, které se často vyskytují. Je zřejmé, že kód pro uložení čísel bude vypadat jinak, než kód pro uložení textů. Postupným vývojem se ustálilo několik základních kódů, které jsou vhodné pro ukládání informace v počítačích. Takto uloženou informaci obvykle označujeme jako data. Pojem data můžeme definovat jako informaci, která má určitou vypovídací schopnost, je určitým způsobem uspořádána, seřazena apod. Způsob jejího uložení pak obvykle nazýváme datový typ. Rozlišujeme jednoduché datové typy (primitivní) pro ukládání informace stejného typu (čísla, text apod.). Z nich pak vytváříme složené datové typy pro ukládání rozsáhlejší informace. Způsob uložení souhrnné informace o určitém objektu obvykle označujeme jako datovou strukturu. Pokud se tato struktura během zpracování nemění, to znamená, že je vytvořena při spuštění programu a zaujímá stále stejný prostor pro uložení, nazýváme ji statická datová struktura. Pokud se tato struktura během zpracování mění (přibývá jejích prvků a pod.), nazýváme ji dynamická datová struktura. V následujících kapitolách budou rozebrány některé významné postupy zpracování informace v počítači.
7.1 kardinalita
proměnná deklarace proměnné
definice proměnné NULL
Jednoduché datové typy
V této kapitole rozebereme typicky používané jednoduché datové typy (primitivní, základní). Základní vlastností datového typu je počet hodnot, kterých může nabývat typ T. Nazývá se kardinalita typu T. Jak uvidíme dále, kardinalita všech datových typů je vždy konečné velikosti, k dispozici máme konec konců paměť omezené velikosti. Co z této skutečnosti plyne, bude podrobně vysvětleno při ukládání reálných čísel. Datové typy přiřazujeme jednotlivým proměnným, se kterými pracujeme v programu. Při práci s proměnnými mohou nastat dva zvláštní případy: 1. Proměnná nebyla vytvořena (deklarována). Tato skutečnost má při manipulaci s proměnnou obvykle za následek havárii programu. Řada programovacích jazyků přitom vůbec neumožňuje vytvořit program, který používá proměnnou, která nebyla vytvořena (FORTRAN, PASCAL, C, C++, ...). 2. Proměnná byla vytvořena, ale nemá přiřazenu žádnou hodnotu, nebyla definována její hodnota. Různé programovací jazyky se v této situaci chovají různě. Některé umožňují implicitní inicializaci proměnných hodnotou 0 nebo speciální hodnotou NULL (Access BASIC). Jiné tuto inicializaci neprovádějí pouze u jistých paměťových tříd proměnných (C, C++).
68
Kódování a komprese dat Pokud jazyk nepodporuje implicitní inicializaci, pak má proměnná nějakou náhodnou hodnotu, obvykle určenou tím, co obsahovala paměť v době vytvoření proměnné. Obecně se doporučuje při vytvoření proměnné ihned definovat její obsah (provést inicializaci proměnné). Pokud jazyk používá speciální hodnotou NULL, pak je dobré si uvědomit následující skutečnost. Při operaci, do níž vstoupí alespoň jeden z argumentů hodnoty NULL, bude výsledkem operace rovněž hodnota NULL. Dále se již těmito problémy zabývat nebudeme a přejdeme přímo k jednotlivým datovým typům. Pro vytvoření proměnné požadovaného datového typu budeme, tam kde to bude potřebné, používat následující syntaxi: seznam proměnných : datový typ 7.1.1
Logická informace
Logická informace nabývá dvou hodnot Pravda/Nepravda, True/False, Yes/No, 0/-1, 1/0. Obvykle jsou definovány následující základní Booleovské operátory. Jejich definice je uvedena v následné tabulce: - unární not - ¬, negace, - binární and - ^, logický součin, konjunkce, or - v, logický součet, disjunkce.
p
q
p or q
p and q
not p
true true false false
true false true false
true true true false
true false false false
false false true true
logická informace
Pro porovnání hodnot proměnných slouží binární operátory jejichž výsledkem je rovněž logická informace (označení odpovídá jazykům jako BASIC, PASCAL, aj.): = - rovnost, shoda obsahu, (jazyk C používá = =), < - je menší, > - je větší, >= - je větší nebo rovno (), <= - je menší nebo rovno (), <> - není rovno (), (jazyk C používá ! =).
7.1.2
Celá čísla
Pro ukládání celých čísel se používá několik datových typů, které se liší velikostí zabírané paměti a tím i kardinalitou. Tabulka 1 uvádí vybrané datové typy. V tabulce 1 jsou uvedeny rozsahy jednotlivých datových typů pro různé typy operačních systémů. U šestnáctibitových OS (DOS, Windows) jsou kardinality menší než u třicetidvoubitových OS (Windows NT, Windows 95).
69
celé číslo
Kódování a komprese dat Čísla ukládáme v binární podobě. Vyjadřujeme je přitom v pozičním tvaru pomocí základu číselné soustavy polynomem, který ukládáme po jednotlivých bitech. 39 3 101 9 100 1 25 0 2 4 0 2 3 1 2 2 1 21 1 2 0
0
0
1
0
0
1
1
1
27 26 25 24 23 22 21 20 Tab. 1. Vybrané celočíselné datové typy
jazyk C, C++ char unsigned char short unsigned short int unsigned int long unsigned long
číselný kód
jazyk PASCAL ----Byte ShortInt ----Integer Word LongInt -----
v šestnáctibitovém OS
ve třicetidvoubitovém OS
-128 127 0 255 -128 127 0 255 -32 768 32 767 0 65 535 -2147483648 2147483647 0 4 294 967 295
-128 127 0 255 -32 768 32 767 0 65 535 -2147483648 2147483647 0 4 294 967 295 -2147483648 2147483647 0 4 294 967 295
Uložení kladného čísla nebo nuly je tedy velmi jednoduché. Potíže nastávají až při ukládání záporných čísel. Používají se tři způsoby kódování celých čísel (číselné kódy), které se liší právě ukládáním záporných čísel. 7.1.2.1 Přímý kód
přímý kód znaménkový bit
Přímý kód ukládá absolutní hodnotu čísla spolu se znaménkovým bitem, který určuje zda se jedná o číslo kladné, či záporné. 39
- 39
Při použití tohoto kódu musíme rozlišovat sčítání dvou kladných čísel, jednoho kladného a jednoho záporného atd. Znaménkový bit se operace neúčastní, pouze rozhoduje o druhu použité operace. 7.1.2.2 Doplňkový kód
doplňkový kód
Záporné číslo v doplňkovém kódu ukládáme zvětšené o 2n, kde n je počet bitů datového typu. Např. pro uložení čísla na 8 bitů: 39
- 39
70
Kódování a komprese dat Při sčítání dvou čísel sčítáme čísla včetně znaménkových bitů. Pokud dojde k přenosu na nejvyšším místě, ignoruje se. Např. sečtení čísel 39 a -39 v doplňkovém kódu: znaménko 0 0 1 0 0 1 1 1 39= 1 1 0 1 1 0 0 1 -39= 1 0 0 0 0 0 0 0 0 přenos
Jiným problémem je přetečení rozsahu zobrazitelných čísel (přeplnění). Ukažme si ho na součtu čísel 127 a 1 uložených v doplňkovém kódu v 1 Byte :
přetečení rozsahu
znaménko 0 1 1 1 1 1 1 1 127= 0 0 0 0 0 0 0 1 1= 0 1 0 0 0 0 0 0 0 přenos
Jak vidíme sečtením dvou kladných čísel jsme získali číslo záporné. Pokud chceme při sčítání čísel kontrolovat, zda nedošlo k přetečení rozsahu, můžeme využít zdvojení znaménkového bitu. Ukažme si to na dříve uvedených příkladech: znaménko
znaménko
39=
0 0 0 1 0 0 1 1 1
127=
0 0 1 1 1 1 1 1 1
-39=
1 1 1 0 1 1 0 0 1
1=
0 0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 stejná hodnota znaménka nestejná hodnota znaménka přenos přenos ukazuje na správný výsledek ukazuje na přetečení rozsahu
Jednoduchost aritmetických operací s čísly v doplňkovém kódu je vyvážena složitějším převodem záporných čísel. Provádí se tak, že u kladného čísla zaměníme hodnotu všech bitů a k poslednímu přičteme 1. Tento kód je dnes standardně využíván (např. v jazyku PASCAL, C). 7.1.2.3 Inverzní kód
U inverzního kódu je záporné číslo vyjádřeno jako inverze (změna hodnot všech bitů) kladného čísla stejné absolutní hodnoty. Záporné číslo pro uložení zvětšíme o 2n - 1. Opět pracujeme se všemi bity čísla. 39
- 39
71
inverzní kód
Kódování a komprese dat Jak vidíme, záporné číslo v inverzním kódu je vždy o 1 větší než v doplňkovém kódu. Tuto skutečnost musíme uvažovat při aritmetických operacích. Poznámka k zamyšlení: Pozorný čtenář si jistě uvědomil, že v inverzním kódu existují dva způsoby uložení hodnoty 0: 0 0 0 0 0 0 0 0 = 1 1 1 1 1 1 1 1
operace s celými čísly
reálné číslo
rotace bitů
7.1.2.4 Operace s celými čísly
S celými čísly je možno provádět všechny běžné operace + - sčítání, - odečítání, * - násobení, / - dělení, jeho výsledek závisí na programovacím jazyku. V jazyku C, C++ bude výsledkem opět celé číslo, v jiných jazycích je však výsledkem reálné číslo, div - celočíselné dělení, např. 22 div 5 = 4, mod - zbytek po celočíselném dělení, např. 22 mod 5 = 2. Některé programovací jazyky umožňují provádět operace s bity celých čísel, jako jsou logické operace s jednotlivými bity, nebo rotace bitů: - doleva (nahoru) - posunutí bitů na vyšší pozici, nejvyšší bit se ztrácí, nebo přesouvá na nejnižší pozici, - doprava (dolů) - posunutí bitů na nižší pozici, nejnižší bit se ztrácí, nebo přesouvá na nejvyšší pozici. 7.1.3
racionální číslo iracionální číslo
Reálná čísla
Množina reálných čísel je sjednocením množin: - racionálních čísel - ty je možno vyjádřit jako podíl dvou přirozených čísel a znaménkem. Tuto vlastnost využívaly některé speciální číselné kódy. - iracionálních čísel - ty není možno vyjádřit jako podíl dvou přirozených čísel, patří sem např. , e. Při ukládání reálných čísel si musíme uvědomit, že máme k dispozici jen omezený paměťový prostor, proto zejména iracionální čísla není možno uložit celá. Při ukládání reálných čísel existují dva přístupy. - kódy s pevnou řádovou čárkou, kdy pozice řádové čárky je stále stejná. Nevýhodou je omezení rozsahu uložitelných čísel, výhodou vyšší rychlost operace s čísly.
pevná řádová čárka
72
Kódování a komprese dat zn. 22 21 20 2-1 2-2 2-3 2-4 2,625 poloha řádové čárky
2,6
Tyto kódy se dnes prakticky neužívají. - kódy s proměnnou řádovou čárkou, kdy provádíme normování čísla do podoby: m 2e , (88) kde je
m e
- mantisa, obvykle je | m | < 1, - exponent, který je celým číslem. zn. 2 +2
2,625 = 0,65625 . 2
0
-1
2
1
-2
2
0
mantisa
-3
1
2
-4
0
zn. 2 0
1
1
2
proměnná řádová čárka normování
0
0
= 2,5
exponent
Z ukázky je zřejmé, že o přesnosti uloženého čísla rozhoduje mantisa (obvykle je kódována v přímém kódu), o rozsahu čísla rozhoduje exponent (obvykle je kódován tak, že je nutno od uložené hodnoty nutno odečíst 2n-1, abychom získali jeho skutečnou hodnotu, přitom n je počet bitů pro uložení exponentu). Exponent je celé číslo, o jejich kódování již byla řeč. Číselné kódy pro ukládání desetinného čísla jsou velmi podobné a mají také obdobné vlastnosti.
přesnost
7.1.3.1 Přímý kód
přímý kód
Přímý kód můžeme definovat vztahem: x0 x x př x 1, 1 x x 0
(89)
Pokud čtenáře udivuje vztah pro vyjádření záporného čísla, pak je potřeba si uvědomit, že platí: 1-x = 1+ | x | pro | x | < 1 (90) Z ukázky je zřejmé, že bit před desetinnou čárkou má význam znaménka.
Příklad: 0,65625pø 0,10101 0,65625pø 110101 , Nula má v přímém kódu dvě vyjádření 1,0000 a 0,0000.
73
mantisa exponent
Kódování a komprese dat 7.1.3.2 Doplňkový kód
doplňkový kód
Doplňkový kód můžeme definovat vztahem: x0 x x dop 1 x 1, 2 x x 0
(91)
Kladná čísla se zobrazují přímo, záporná jako doplněk do čísla 2 (základu použité soustavy). Nula má přitom jediné vyjádření, neboť platí: 1dop 1,0000 0,65625dop 0,10101 0,65625dop 1,01011
7.1.3.3 Inverzní kód
inverzní kód
Inverzní kód můžeme definovat vztahem:
x x př n 2 2 x kde je
n
x0 x 0
x 1,
(92)
- řád poslední zobrazené dvojkové cifry (počet bitů pro uložení čísla bez znaménka).
Příklad uložení čísel v doplňkovém kódu: 0,65625inv 0,10101
0,65625inv 1,01010 7.1.3.4 Operace s reálnými čísly
operace s reálnými čísly
platná cifra přesnost počítačové epsilon
S reálnými čísly je možno provádět základní operace, jako + - sčítání - odečítání * - násobení / - dělení. Při jejich provádění si musíme uvědomit skutečnost, že reálná čísla lze uložit jen na omezený počet platných cifer. Jejich počet je určen počtem bitů pro uložení mantisy. Přesnost ukládání čísel vyjadřujeme pojmem počítačové epsilon (). Je to nejmenší číslo zobrazitelné v daném číselném kódu, pro které platí:
1,0 + >1,0.
(93)
Pokud neznáme přesně použitý číselný kód, můžeme určit *, splňující podmínku, že je to největší zobrazitelné číslo, pro které platí:
74
Kódování a komprese dat
1,0 + * = 1,0.
(94)
Pomocí jednoduchého postupu s použitím proměnných e a e1 rozebíraného číselného kódu zjistíme * následujícím algoritmem: e = 1 e1 = 1+e while e1 > 1 e = 0.5 *e e1 = 1 + e end while tiskni e Z dosavadních znalostí snadno určíme, že = 2*.
Příklad: V programovacím jazyku PASCAL zaujímá reálné číslo (datový typ real) 6 Byte. Testem zjistíme, že * 9,0949470177 *1013 2 40 ,
1,8189894035 *1012 2 39 . Aby bylo možno uložit číslo 1 + , tedy konkrétně číslo 20 + 2-39, potřebujeme k tomu 40 bitů, jeden bit zabere znaménko, na exponent tedy zbývá 7 bitů. Z toho usuzujeme, že exponent tedy nabývá rozsahu -64 63, neboli číslo 264 by již nemělo být možno uložit (to je přibližně 1,8.1019). Můžeme si však ověřit, že uložíme i větší čísla. Kde je v našich propočtech chyba? Odpověď je jednoduchá – nikde. Celý problém je spojen s využitím následující úvahy. Díky normování mantisy je první uložený bit vždy roven jedné. Takže tento bit vůbec neukládáme (říkáme mu skrytý bit). Mantisa pak zabírá 39 bitů + znaménko, na exponent zbývá 8 bitů. Nesmíme přitom opomenout uložení čísla 0. To je uloženo pomocí samých nul, tedy včetně exponentu. U ostatních čísel je exponent uložen zvětšen o 128 (27).
-2 -3 zn.2 2 ...
-40
7
skrytý bit
1 0
... 2 2 ... 2 2 mantisa v přímém kódu
exponent + 128
Konkrétně tedy např.: 0,1 = 01001100 11001100 11001100 11001100 11001101 01111011 0,5 = 00000000 00000000 00000000 00000000 00000000 10000000 1,0 = 00000000 00000000 00000000 00000000 00000000 10000001 1,5 = 01000000 00000000 00000000 00000000 00000000 10000001 Z ukázky je zřejmé, že zatímco třeba číslo 0,5 je uloženo přesně, číslo 0,1 nikoliv, tedy již při jeho ukládání vzniká zaokrouhlovací chyba, která se pak jeho opakovaným přičítáním akumuluje. Proto není divu, že následující algoritmus neskončí pro hodnotu 10 000, ale bude vesele pokračovat dále:
75
zaokrouhlovací chyba
Kódování a komprese dat x = 0 repeat provedení potřebné činnosti x = x + 0,1 until x = 10 000
Pokud necháme do proměnné x 100 000 krát přičíst 0,1 zjistíme, že bude mít hodnotu pouze 9999,9999784. Nejlepšího výsledku dosáhneme následující úpravou algoritmu: x = -0,1 repeat x = x + 0,1 provedení potřebné činnosti until x >= 10 000
Jistě nás nepřekvapí, že činnost uvnitř smyčky proběhla celkem 100 002 krát. Po skončení algoritmu má proměnná x hodnotu 10 000,099978. Pokud se nám to nelíbí, můžeme využít jako počítadlo pro opakování proměnnou celočíselného typu: for i = 0 to 100 000 step 1 x = i*0,1 provedení potřebné činnosti end for
Kahanův trik
Pokud se proměnná x nezvětšuje vždy o stejnou hodnotu, pak nelze využít popsaný postup. V záloze však máme jiný postup. Nazývá se Kahanův trik (vymyslel ho již v roce 1965 W. Kahan). Vychází ze zjištění, že při výpočtech na počítači neplatí základní matematické zákony (distributivní a asociativní zákon), pak se může stát že: (a + b) + c a + (b + c) Např. při výpočtech s čísly na 7 platných cifer získáme: A = 0,1234567 B = 2381,325 A+B= 2381,448 Přitom se ztratila informace 0,0004567, neboť při sčítání musely být exponenty obou čísel stejné. Vhodným postupem jsme schopni tuto ztracenou informaci získat. Pro B > A platí: B = 2381,325 -(A+B) = - 2381,448 B -(A+B) = - 0,123 A = 0,1234567 (B-(A+B))+A = 0,0004567 Upozorněme ještě, že pro rozebíraný případ, kdy B > A, nám vyjde (A-(A+B))+B = 0. Pořadí operandů tedy není zvoleno náhodně.
76
Kódování a komprese dat
Uplatněním Kahanova triku získáme algoritmus: x = 0 c for i=1 y = t = c = x = end for
= 0 to 100000 step 1 0,1 + c x + y (x - t) + y t
Výsledkem bude hodnota x = 10000,000000. Přesněji to již vskutku nejde. Pokud využijeme informaci o ukládání reálných čísel, pak se budeme snažit přičítat hodnoty, které jsou uloženy přesně, např. místo 0,1 použijeme 0,109375 = 2-4 + 2-5 + 2-6. Pokud je potřeba tuto hodnotu měnit, pak nejlépe násobením, či dělením dvěma. Způsobí totiž změnu exponentu o 1, mantisa a tedy ani přesnost uložení čísla se nezmění. Nesmíme ale zapomenout na další zdroj nepřesnosti. Tím je odříznutí desetinných míst při zarovnání sčítanců na stejnou velikost exponentu. Tento problém se vyskytuje zejména při součtu řad čísel. Obdobným problémem je testování rovnosti dvou reálných čísel, zejména pokud jejich hodnoty byly vypočteny. Je zřejmé že přímé srovnání jejich hodnot použít nelze. První, co začátečník obvykle udělá je určení, zda jsou si testovaná čísla "hodně blízká", např. určením, zda absolutní hodnota rozdílu čísel je velmi malé číslo, např. : x = -0,1 repeat x = x + 0,1 if ABS(x - 1000) < 10-26 hlášení shody end if until x >= 10 000
Shoda hodnot však nebude hlášena. Z přesnosti ukládaných čísel (na asi 11 platných cifer) plyne, že shoda bude hlášena až při nastavení "malého čísla" na hodnotu asi 0,0000011. Jenže jeho hodnota závisí na hodnotě testované, nelze tedy najít všeobecně platnou srovnávací hodnotu. Řešení problému je přitom nasnadě. Řešitel může s úspěchem použít právě krok řešení, např. úpravou testu : if ABS(x - 1000) < krok řešení/2 hlášení shody end if Pokud se však krok řešení mění, může vzniknout jiný problém, a to případ, kdy se krok řešení zmenší natolik, že jeho přičtení k aktuální hodnotě proměnné x její hodnotu nezmění. Další problém spojený s reálnými čísly je nestejnosměrnost pokrytí číselné osy zobrazitelnými čísly. Zkusme si tuto skutečnost dokumentovat na datovém
77
rovnost čísel
Kódování a komprese dat
typu, kde mantisa v přímém kódu a se skrytým bitem zaujímá 5 bitů a exponent 3 bity. Je možno zobrazit tato čísla: Tab.2. Zobrazitelná čísla pro mantisu 4bity (+ skrytý bit) a exponent 3 bity Exponent (nahoře bitové vyjádření, dole číselné vyjádření) 001 010 011 100 101 110
000 Mantisa 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
-4
-3
-2
-1
0 0.033203 0.035156 0.037109 0.039063 0.041016 0.042988 0.044922 0.046875 0.048828 0.050781 0.052734 0.054688 0.056641 0.058594 0.060547
0.0625 0.066406 0.070313 0.074219 0.078125 0.082031 0.085975 0.089844 0.09375 0.097656 0.101563 0.105469 0.109375 0.113281 0.117188 0.121094
0.125 0.132813 0.140625 0.148438 0.15625 0.164063 0.17195 0.179688 0.1875 0.195313 0.203125 0.210938 0.21875 0.226563 0.234375 0.242188
0.25 0.265625 0.28125 0.296875 0.3125 0.328125 0.3439 0.359375 0.375 0.390625 0.40625 0.421875 0.4375 0.453125 0.46875 0.484375
0
1
0.5 0.53125 0.5625 0.59375 0.625 0.65625 0.6878 0.71875 0.75 0.78125 0.8125 0.84375 0.875 0.90625 0.9375 0.96875
111
2
1 1.0625 1.125 1.1875 1.25 1.3125 1.3756 1.4375 1.5 1.5625 1.625 1.6875 1.75 1.8125 1.875 1.9375
3
2 2.125 2.25 2.375 2.5 2.625 2.7512 2.875 3 3.125 3.25 3.375 3.5 3.625 3.75 3.875
4 4.25 4.5 4.75 5 5.25 5.5024 5.75 6 6.25 6.5 6.75 7 7.25 7.5 7.75
Pokud nám výčet čísel není zcela jasný, můžeme vypsat zobrazitelná kladná čísla pro mantisu 2 bity (bez skrytého bitu) a exponent 3 bity. Všimněte si zejména skutečnosti, že nepoužití skrytého bitu vede k tomu, že řada čísel je zobrazitelná více způsoby. Celkem je takto možno uložit 17 kladných čísel + nulu. Tab.3. Zobrazitelná kladná čísla pro mantisu 2 bity a exponent 3 bity 000 Mantisa 00 01 10 11
-4 0 0.015625 0.03125 0.046875
78
Exponent (nahoře bitové vyjádření, dole číselné vyjádření) 001 010 011 100 101 110 -3 0 0.03125 0.0625 0.09375
-2 0 0.0625 0.125 0.1875
-1 0 0.125 0.25 0.375
0
1 0 0.25 0.5 0.75
111
2 0 0.5 1 1.5
3 0 1 2 3
0 2 4 6
Kódování a komprese dat
Zobrazitelná kladná čísla pro mantisu 2 bity, exponent 3 bity
0
0,5
1
1,5
2
2,5
3
3,5
4
4,5
Číselná osa
Zobrazitelná kladná čísla pro mantisu 2 bity, exponent 3 bity
0,01
0,1
1
10
Číselná osa (logaritm ická)
Na číselné ose je dobře patrné, že kolem nuly je soustředěna většina čísel, s rostoucí hodnotou se vzdálenost mezi zobrazitelnými čísly zvětšuje. Tab.4. Vybrané neceločíselné datové typy jazyk C, C++
float ----double long double
jazyk PASCAL
Single Real Double Extended
číslo datového typu float-Single
-24
* 2
rozsah
délka
des. míst
3,4.1038 1,2.1039 1,797.10308 1,2.104932
4 Byte 6 Byte 8 Byte 10 Byte
7 11 15 19
. -8 5,96.10
zn.
exponent (8 bitů) + 128
7.1.4
mantisa (23 bity)
Textová informace
Základním prvkem textu je znak (character). Pro kódování znaků se zpočátku užíval pětibitový kód (32 znaků), nejvíce se však rozšířil kód definovaný Mezinárodní organizací pro standardizaci (ISO), zejména jeho americká verze ASCII – Americký standardní kód pro výměnu informace. Kód je sedmibitový,
79
znak text
Kódování a komprese dat
ASCII-2
řetězec
pole znaků
obsahuje 33 řídicích znaků a 95 tisknutelných znaků. Byl vytvořen zejména pro tisk na tiskárně. Brzy však začala chybět kódová slova pro další znaky (grafické znaky, znaky jiných národních abeced apod.). Nejprve začaly být využívány řídicí znaky také pro zobrazení (na monitoru a pod.), pak byl kód rozšířen na osmibitový pod označením ASCII - 2. Tento kód se značně rozšířil. V dnešní době se používá jeho zpracovaná verze podle normy ANSI. Potřeba velkého množství znaků pro národní abecedy je řešena použitím různých kódových stránek. Např. čeština používá kódovou stránku 852. problém s jednotlivými národními abecedami zcela odstranilo až použití šestnáctibitového kódu Unicode). Spojením několika znaků vzniká řetězec (string). Někdy je jeho délka omezena (typicky na 255 znaků). Některé programovací jazyky přímo podporují operace pro práci s řetězci. Např. jazyk PASCAL pracuje s řetězci maximálně délky 255 znaků. Jazyky C, C++ naproti tomu typ řetězec (string) vůbec nepodporují. S daty typu řetězec se pracuje vždy jako s polem znaků, takže by měl být tento typ zařazen do následující kapitoly věnované složeným datovým typům. 7.1.5
ukazatel dynamická datová struktura
Ukazatel
Mezi základní datové typy náleží také ukazatel. Je určen k tvorbě dynamických datových struktur. Obsahuje adresu paměti na které se nacházejí vlastní data. Jeho kardinalita závisí na několika hlediscích. Adresy (modely adresování) mohou být tzv. blízké (NEAR) nebo vzdálené (FAR). V závislosti na tom může ukazatel zabírat 2 Byte nebo 4 Byte. Manipulaci s ukazateli je věnována samostatná kapitola věnovaná dynamickým datovým strukturám.
7.2
Složené datové typy
Větší množství informace obvykle ukládáme pomocí složitějších datových struktur, které vzniknou skládáním základních datových typů. 7.2.1
pole
vektor matice
Pole
Často používanou datovou strukturou je pole (array) sestávající z prvků stejného datového typu (jednoduchého nebo také složeného, např. typu záznam, který bude představen později). Jednotlivé prvky jsou uspořádány v paměti za sebou a vzestupně očíslovány. V některých programovacích jazycích má první prvek vždy číslo 0, jindy 1, někdy je možno jeho číslo určit, vždy to však musí být číslo celé. Strukturu pole použijeme také pro uložení vektoru hodnot. Pro uložení matice potřebujeme dvourozměrné pole. První rozměr bude udávat číslo řádku a druhý číslo sloupce, na kterém leží prvek v matici. Maximální použitelný rozměr pole se liší podle použitého programovacího jazyka. Na pole se odkazujeme názvem a číslem prvku, nejčastěji v hranaté závorce: - jednorozměrné pole x[1], x[i], ... - dvourozměrné pole x[1,1], x[i,j] ...
80
Kódování a komprese dat
I v případě vícerozměrného pole jsou prvky uloženy v paměti za sebou, a to buď po řádcích nebo po sloupcích. K nalezení konkrétního prvku slouží mapovací funkce. Pro uložení matice po řádcích platí : adresa prvku = adresa prvního prvku matice + +[(i – imin)*(jmax – jmin + 1) + +(j – jmin)]*velikost paměti pro jeden prvek. Vyhodnocování mapovací funkce je programátor většinou ušetřen. Zvláštní datové struktury jsou někdy tvořeny pro ukládání řídkých matic, tedy matic, které mají většinu prvků nulových. Jednou z cest je využití tří jednorozměrných polí. Jedno obsahuje číslo řádku, druhé číslo sloupce a třetí hodnotu prvku matice vždy na stejné pozici v polích. 7.2.2
mapovací funkce
řídká matce
Struktura
Struktura (structure, v některých jazycích také rekord - záznam) je složený datový typ, který umožňuje sdružit informaci složenou z prvků různých datových typů (základních nebo složených) do jednoho celku. Informace je rozdělena na jednotlivé položky označené jejich názvy. Přístup k položkám je možný přes název proměnné typu záznam, za který píšeme tečku a název položky, např. : p.klíč, data.n[i], copy.a.data apod. Záznam má v paměti vymezen kompaktní prostor. Jeho velikost je dána součtem nároků jednotlivých položek. Obvykle se však paměťové prostory jednotlivých položek zarovnávají na celistvý počet datového typu Byte nebo Word (slov o 2 Byte).
struktura
Paměťový prostor proměnné typu záznam p.klíč - celé číslo p.h
- logická hodnota
p.data - pole celých čísel p.další - ukazatel
V dalším textu budeme používat následující syntaxi pro definici datového typu struktura: structure seznam proměnných : datový typ seznam proměnných : datový typ .... end structure 7.2.3
Množina
Některé programovací jazyky (PASCAL) podporují následující datový typ, zatímco většina jiných ho nezná. Množina (set) je skupina prvků určeného datového typu. Množina všech prvků, které je možno do určené množiny 81
množina
Kódování a komprese dat
zařadit se nazývá potenční množina. Může být definována některým základním datovým typem (pak je počet prvků potenční množiny roven kardinalitě základního datového typu), nebo výčtem hodnot. Výčet hodnot je někdy chápán jako samostatný datový typ (výčtový typ), je definován seznamem hodnot, případně rozsahem např. 1 100. Kardinalita množinového datového typu je dána vztahem: kardinalita = 2 kardinalita potenční množiny.
(95)
7.2.3.1 Operace s množinami
* + in
7.2.4
objekt
veřejné rozhraní
-
průnik množin, sjednocení množin, rozdíl množin, operátor příslušnosti prvku k množině (oznamuje, zda se prvek v množině nachází).
Objekt
Když mluvíme o objektově orientované technologii, musíme si ujasnit pomocí jakých nástrojů probíhá vývoj. Jsou to tedy: Objektově Orientovaná Analýza, Objektově Orientovaný Návrh, Objektově Orientované Programování a Objektově Orientované Databáze. Principielně, objektově orientované technologie modelují chování reálného světa tak, že rozdělí komplexní problémy na základní části. Objektová orientace je pak základem pro čtyři klíčové koncepce: Datová Abstrakce (Data Abstraction) Zaobalení (Encapsulation) Ukrytí Informací (Information Hiding) Dědičnost (Inheritance) Datová abstrakce definuje datové typy na vyšší úrovni tak, aby byly pokryty speciální potřeby programovaného problému. Společně s datovou abstrakcí vytváříme zaobalení a ukrytí informací. Zaobalení vzniká, když jsou datové položky a způsoby práce s nimi umístěny do jednoho logického datového typu - třídy (class), jehož konkrétní proměnná se jmenuje objekt. Ukrytí informace se vztahuje k myšlence ukrýt datové položky od okolního světa a poskytnou pouze metody, které umí s nimi pracovat. Těmto metodám se potom říká veřejné rozhraní (public interface). Tímto velice jednoduchým způsobem mohou být data chráněna před poškozením a navíc nemusí být známo, jak jsou interně implementovány. Dědičnost spočívá ve vytváření hierarchie tříd. Použitím koncepce předků, což znamená, že např. třída A je předkem třídy B, která je jeho potomkem, můžeme pak definovat, že třída B dědila všechny atributy třídy A a definuje své další atributy. Abychom využili plnou sílu objektově orientovaných technologií musíme použít při vývoji různé metody systémové analýzy a návrhu, které byly již vyvinuty. V této publikaci se objekty zabývat nebudeme, čtenáře najde potřebné informace ve specializované literatuře, zabývající se objektově orientovaným programováním (OOP – Object Oriented Programming). 82
Kódování a komprese dat 7.2.5
Soubor
Pro uložení větších objemů dat, zejména mimo paměť počítače (na disketě apod.) slouží soubory (file). Soubor je posloupnost za sebou uložených prvků, ke kterým je možno se dostat jen postupným průchodem souboru od jeho začátku. Tento postup nazýváme sekvenční prohledávání, odtud také soubory nazýváme jako sekvenční soubory. Pokud mají všechny prvky souboru stejnou datovou strukturu - stejný datový typ, nazýváme je jako typové soubory. Při známé velikosti datové struktury prvku umožňují rychlejší přístup k i-tému prvku, protože dokáží rychle projít prvky předchozí. V poslední době se začínají ve velké míře využívat textové soubory. V zásadě bychom je mohli chápat jako typové soubory, neboť je do nich uložena posloupnost znaků. Jak víme, jeden znak = 1 Byte. Tyto znaky však tvoří ucelené řetězce, vzájemně oddělené dvojicí řídicích znaků CR a LF (Carriage Return & Line Feed = návrat vozíku & posuv o řádku), které pochází z doby, kdy sloužily pro řízení tiskárny a podobných zařízení. Řetězce znaků tedy představují jednotlivé řádky textu. Délka řádků je různá, může být omezená, např. 255 znaky. Výhodou textových souborů je možnost ruční opravy obsahu, pokud došlo k jeho porušení a možnost přečtení jeho obsahu v jakémkoliv textovém editoru. Dnes je stále častěji používán obdobný přístup pro ukládání strukturovaných dat pomocí formátu XML. Pro ukládání speciálních typů informace se vyvíjejí různé formáty souborů. Soubory ve stejném formátu jsou zpravidla označeny stejnou příponou v názvu souboru. Jako ukázku uvádíme formát "BMP" pro ukládání obrázků složených z jednotlivých bodů (pixelů) umístěných v matici. Někdy jsou takové obrázky nazývány jako bodová grafika. Soubor ve formátu BMP lze rozdělit do čtyř oblastí. Ukážeme si je přímo na rozboru souboru obsahujícího bílou plochu velikosti 10 × 20 bodů. Obsah jednotlivých Byte je zapsán hexadecimálně v (šestnáctkové soustavě): 1. BitMapFileHeader (14 Byte) - záhlaví souboru 42 4D = "BM" - typ souboru, tedy BMP 8E 00 00 00 - délka souboru (142 Byte) 00 00 - rezervováno, musí být nulové 00 00 - rezervováno, musí být nulové 3E 00 00 00 - délka všech záhlaví a palety barev (62 Byte) 2. BitMapInfoHeader (40 Byte) - informace o obrázku 28 00 00 00 - počet Byte vyhrazených pro toto záhlaví (40) 0A 00 00 00 - šířka obrázku v bodech (10) 14 00 00 00 - výška obrázku v bodech (20) 01 00 - počet vrstev, musí být jedna 01 00 - počet bitů na uložení jednoho bodu (1 obrázek je černobílý, 4 16 barev) 00 00 00 00 - použitý typ komprese 00 00 00 00 - velikost obrazu v Byte, pro nekomprimovaný obrázek 0 00 00 00 00 - horizontální rozlišení zdrojového zařízení v bodech na metr
83
soubor
typový soubor
textový soubor
XML formát souboru
Kódování a komprese dat
00 00 00 00 00 00 00 00 00 00 00 00
- vertikální rozlišení zdrojového zařízení v bodech na metr - počet barev v tabulce barev, pokud počet odpovídá počtu bitů k zobrazení bodu, je zde 0 - počet importovaných barev, 0 znamená, že všechny barvy byly importovány
3. RGBQuadArray - určení čtvrtý Byte je rezervovaný, 8 Byte = dvě barvy) 00 00 00 00 FF FF FF 00 -
kódů barev v pořadí modrá, zelená, červená, musí být 0 (Velikost oblasti je v našem případě černá barva bílá barva (svítí vše)
4. Vlastní data (80 Byte) - obrázek je uložen po řádcích, počet Byte pro uložení řádku je vždy zarovnán na nejblíže vyšší celistvý násobek 4 Byte. Informace o bodech je uložena od začátku řádku, nepotřebné bity na konci řádku mohou obsahovat cokoli. FF C0 54 20 FF C0 6A 65 FF C0 28 2A FF C0 43 58 ... Kontrolní otázky: 24. Do jakých skupin dělíme datové typy používané v programovacích jazycích? 25. Jaký je rozdíl mezi definicí a deklarací proměnné? 26. Jaké jsou základní operace prováděné s logickými proměnnými? 27. Jaké kódy pro uložení celých čísel používáme? 28. Jak vzniká přetečení rozsahu číselné proměnné? 29. Co znamená normování čísel a kde se používá? 30. Jak vzniká zaokrouhlovací chyba a jak se projevuje? 31. K čemu slouží počítačové epsilon? 32. K čemu používáme proměnné datového typu ukazatel? Shrnutí obsahu kapitoly V této kapitole byly představeny obvyklé typy strukturovaných dat, pro jejichž optimální uložení v počítači byly vytvořeny vhodné kódy. Současně bylo upozorněno na související problémy jako je omezená přesnost uložení čísel v počítači a s ní související zaokrouhlovací chyby. Po jejím prostudování jsme schopni správně vybrat potřebný kód a jsme si vědomi s tím souvisejících problémů, takže jsme schopni je buď eliminovat nebo vzít v úvahu při jejich používání. Korespondenční úkol 4: 4. Zvolte si některý datový kód pro ukládání reálných čísel a určete co nejvíce informací o jeho realizaci. Nebo využijte nějaký používaný výpočetní nástroj a určete počítačové epsilon použitého datového typu reálných čísel. Zamyslete se nad přesností uložení čísel v tomto nástroji a možnými problémy, které z toho vyplývají.
84
Kódování a komprese dat
8
Bezeztrátová komprese dat
Cíl:
Cílem celé kapitoly je představit základní algoritmy pro bezeztrátovou kompresi. jsou představeny různé algoritmy bezeztrátové komprese a ukázáno, jak pracují. Po jejím prostudování byste měli být schopni:
Popsat základní algoritmy bezeztrátové komprese. Ukázat, jak fungují jednotlivé algoritmy bezeztrátové komprese.
Klíčová slova této kapitoly:
Komprese dat, kompresní poměr, primární a sekundární komprese, metoda opakování znaků, RLE – Run Length Encoding, slovníkové metody komprese, algoritmus Lempel-Ziv 1977, Lempel-Ziv-Welsh 1984, hašování, Huffmanovo kódování, aritmetická komprese. Doba potřebná ke studiu: 6 hodin
Průvodce studiem Studium této kapitoly je nutné k pochopení základních algoritmů bezeztrátové komprese dat a jejich realizace. Na studium této části si vyhraďte šest hodin. Vyřešte samostatně všechny příklady včetně korespondenčního úkolu, abyste si osvojili znalosti o používaných algoritmech bezeztrátové komprese.
85
Kódování a komprese dat
komprese dat
redundance
kompresní poměr
metoda opakování znaků
Komprese nebo také komprimace (zhušťování) dat se objevila spolu s rostoucím množstvím ukládání a přenášení informace. Informační obsahy, které jsou v informačních systémech ukládány, rostou s rozvojem těchto systémů geometrickou řadou. S tím rostou také náklady na jejich uložení a také případné přenášení. Snahou komprese dat je uložit informaci v kratší podobě s tím, že musíme být schopni informaci kdykoliv převést do původní podoby, nesmí tedy docházet ke ztrátě informace. Při kompresi se snažíme odstranit redundanci informace. Odstranění veškeré redundance je přitom problém značně komplikovaný, zabývají se jím mnozí teoretikové. V následujících kapitolách uvedeme některé používané metody komprese. Upozorňujeme přitom na skutečnost, že podle dostupných pramenů jsou některé představované metody autorsky chráněny a jejich použití není bez souhlasu autorů možné. Pro hodnocení kvality zhuštění informace se obvykle používá tzv. kompresní poměr, je to poměr délky zkomprimovaného souboru ku délce původního souboru. Délky souborů přitom nejčastěji vyjadřujeme v počtu Byte, které zabírají. Kompresní poměr se udává buď v procentech z délky původního souboru nebo jako poměr, např. 1: 2 znamená, že zkomprimovaný soubor má poloviční délku oproti původnímu souboru.
8.1
Metoda opakování znaků
Historicky prvním a dosud nejjednodušším postupem komprese dat je metoda opakování znaků. Při rozboru, především grafické informace (obrázků), bylo zjištěno, že se v nich často vyskytují skupiny stejných znaků, u obrázků jsou to např. plochy stejné barvy. Výrazné úspory dosáhneme, jestliže dokážeme takovou skupinu vyjádřit bez nutnosti zápisu všech opakujících se znaků. Nejčastěji takovou skupinu nahrazujeme trojicí znaků: zarážka, počítadlo, opakovaný znak. zarážka počítadlo
opakovaný znak
– je libovolný znak, který se v textu vyskytuje co nejméně, neboť jeho každý výskyt v původním souboru je zapsán pomocí trojice: zarážka, #01, zarážka. – udává počet stejných znaků ležících bezprostředně po sobě, v jednom bloku. Nejčastěji je použito počítadlo osmibitové, v rozsahu 1 255. Můžeme uložit také počet 1 256, protože použití hodnoty 0 nemá reálný význam. – je znak, který tvoří blok opakujících se znaků.
Obvykle pracujeme se soubory znaků ASCII, tedy znaky délky 8 bitů. Pokud volíme znak pro zarážku předem, pevně, pak hovoříme o algoritmu statickém, pokud nejprve nalezneme v komprimovaném souboru nejméně často se vyskytující znak a ten následně použijeme jako zarážku pro kompresi, hovoříme o algoritmu dynamickém. Dynamický algoritmus snižuje prodloužení výstupního souboru při výskytu znaku zarážky na minimum, je však vyváženo nutností dvou průchodů souborem při kompresi. Zvolenou zarážku pak uložíme do výstupního souboru jako první znak.
86
Kódování a komprese dat
Na základě zjištění, že většina skupin opakujících se znaků je spíše kratší délky, vznikla modifikovaná metoda, která se nazývá Run-length encoding. Je používána v grafickém formátu PCX, který používá např. grafický program PaintBrush. Algoritmus Run-length slučuje zarážku a počítadlo do jednoho znaku délky 8 bitů: xx xxxxxxx
Run-length encoding
zarážka počítadlo 0 63. Jako zarážka slouží hodnota horních dvou bitů 11, jiná hodnota znamená, že se jedná přímo o znak. Postup činnosti je velmi jednoduchý. Ze vstupu postupně čteme jednotlivé znaky. Pokud má načtený znak jinou hodnotu, než dva znaky po něm následující (nemá smysl kódovat výskyt dvou stejných znaků – nevede k úspoře) a jeho horní dva bity nemají hodnotu 11, je znak vyslán na výstup. V opačném případě určíme počet opakujících se znaků (nejvýše sekvence 64 znaků 0 = 64), výsledek logicky vynásobíme s binární hodnotou 1100 0000 (počet AND 1100 0000), vyšleme na výstup a za ním vyšleme hodnotu opakujícího se znaku. Celá činnost je velmi rychlá, ale nedosahuje velkých kvalit (kompresního poměru), zejména na programových souborech.
8.2
Výkonné systémy komprese
Výkonné systémy využívají dokonalejší systémy komprese, navíc obvykle využívají dva na sebe navazující algoritmy komprese: – primární na kompresi původního souboru, – sekundární na dodatečnou kompresi. Teoreticky přitom byly prokázány vlastnosti některých algoritmů, které je upřednostňují jako primární nebo sekundární. Také jejich kombinace nejsou voleny náhodně. Většina výkonných kompresních systémů využívá ve své práci pro ukládání informace stromy (strom je konečný souvislý graf neobsahující jako podgraf kružnici). Obvykle se přitom využívají kořenové stromy (rooted tree), které jsou orientované a mají jediný počáteční uzel. Teorií grafů se zde nebudeme zabývat, zájemci naleznou dostatek odborné literatury věnované této oblasti.
87
primární komprese sekundární komprese strom graf kořenový strom
Kódování a komprese dat Binární strom :
kořen stromu
otcovský uzel uzel
hrana
Binární strom je takový strom, který má vždy nejvýše dva následníky pro každý uzel. Informace se přitom ukládá jen do uzlů stromu, hrany určují jen jejich vztahy. Každý uzel pak obsahuje následující informaci. odkaz z otcovského uzlu
dceřiné uzly
klíč = znak počet výskytů apod. levý dceřiný uzel
pravý dceřiný uzel
Obr. 12. Binární vyhledávací strom
vyvážený binární vyhledávací strom AVL strom
Binární vyhledávací strom je takový binární strom (každý uzel má nejvýše dva dceřiné uzly), v němž pro každý uzel platí, že existuje část informace (klíč), podle které jsou uzly uspořádány. Pak v jeho levé větvi je uložena informace s klíči nižší hodnoty, v pravé větvi informace s klíči vyšší hodnoty. Přitom všechny uzly jsou nositeli informace. Vyhledávání je přitom nejrychlejší, pokud se jedná o vyvážený binární vyhledávací strom, tedy strom, u něhož se délka podstromů u každého uzlu liší nejvýše o 1, viz obr. 13. Jejich přesné označení je AVL-stromy (autoři G. M. Adelson-Velskij, E. M. Landis). Jejich vyvážení není dokonalé (to požaduje, aby se počty prvků v levé a pravé větvi lišily nejvýše o 1), zato algoritmy vyvažování nejsou příliš komplikované. E
E
B
A
B
G
C
F
H
D Vyvážený binární vyhledávací strom
G
C
F
D Nevyvážený binární vyhledávací strom
Obr. 13. Vyváženost binárního vyhledávacího stromu Pro úpravy stromů na vyvážené slouží rotace stromů, viz obr. 14. 88
Kódování a komprese dat
pravá rotace
E
C
B
D
B
F
D
A
E
C
F
levá rotace A Obr. 14. Rotace stromů Binární vyhledávací stromy je možno dále řadit do skupin s více kořeny, např. 256 (podle hodnoty prvního znaku řetězce), tím vznikne les stromů vhodný pro rychlé porovnávání delších řetězců.
8.2.1
les stromů
Algoritmus Lempel-Ziv 1977
První výkonný kompresní algoritmus vytvořili američtí matematici Jakob Ziv a Abraham Lempel. Nejstarší verzi používají komerčně úspěšné programy, jako ARJ, LHA, PKZIP 1.10. Algoritmus využívá kruhový zásobník konstantní délky (buffer) obvykle velikosti 32 768 Byte [15]. Do bufferu načteme několik znaků a vyhledáme nejdelší řetězec shodující se s takto načtenou posloupností. Pokud je jeho délka menší než určená minimální hodnota (threshold), zapíšeme první znak posloupnosti na výstup a pokračujeme dalším znakem. V opačném případě zapíšeme na výstup odkaz na nalezený řetězec a pokračujeme znakem za řetězcem. Odkaz se přitom skládá z délky a pozice dřívějšího výskytu řetězce. Pro rozlišení mezi odkazem a běžným znakem se přidává devátý bit. Na výstup se tedy zapisuje posloupnost bitů a nikoliv znaků (Byte). Postup kódování délky a pozice za pomoci tabulek LZ1 a LZ2 je zřejmý z následujícího příkladu: Příklad zápisu opakujícího se řetězce znaků délky 40 a pozice 200 znaků (od počátku právě zpracovávaného řetězce zpět). komprimační algoritmus nalezl duplicitní řetězec délky 40 znaků a v tabulce LZ1 najde této délce přiřazený kód (pro délku 35 až 42 znaků kód 273) a počet upřesňujících bitů (3 bity pro určení přesné délky v příslušném intervalu), tento kód 273 je odeslán na výstup, čímž je také nastaven indikátor komprimace označující řetězec komprimovaných dat (27310 = 1 0001 00012), vypočítají a odešlou se tři bity pro upřesnění délky: zjištěná délka minus spodní hranice výše určeného intervalu: 40 – 35 = 510 = 1012,
89
kruhový zásobník buffer
Kódování a komprese dat
dále komprimační algoritmus stejným způsobem zpracuje a odešle kód pozice duplicity za použití tabulky LZ2. Najde v ní příslušný kód (pro pozici v intervalu 193 až 253 je to kód 15) a počet upřesňujících bitů (6 bitů pro určení přesné pozice v příslušném intervalu), tento kód 15 je odeslán na výstup, vypočítá a odešle se na výstup šest bitů pro upřesnění pozice: zjištěná pozice minus spodní hranice výše určeného intervalu: 200 – 193 = 710 = 0001112 (musí být dodržen počet upřesňujících bitů zjištěný v tabulce). Zkrácené tabulky LZ1 a LZ2 pro zápis hodnoty délky a pozice řetězce
tabulka LZ1: délka duplicity kód počet bitů délka 257 0 3 … 272 2 31-34 273 3 35-42 274 3 43-50 … 284 5 227-257 285 0 258
tabulka LZ2: pozice duplicity kód počet bitů pozice 0 0 1 … 14 6 129-192 15 6 193-256 16 7 257-384 … 28 13 16385-24576 29 13 24577-32768
Dekomprimace probíhá jednoduše – při načítání se hlídá nastavení indikátoru komprimace (první bit devítibitové sekvence je roven jedné). Po jeho nalezení je následující kód (257 až 285) určující pro nalezení délky opakujícího se řetězce v tabulce LZ1 spolu s počtem následujících upřesňujících bitů. Další kód (0 až 29) je stejným způsobem považován za ukazatel pozice v tabulce LZ2 spolu s počtem očekávaných upřesňujících bitů. Výpočet přesné délky a pozice duplicitního řetězce proběhne opačným způsobem, jako při dříve popsané komprimaci. Pak je již tento délkou a pozicí určený shodný řetězec znaků zkopírován z již dekomprimované části souboru na aktuální pozici. Algoritmus se ujal až po použití binárních vyhledávacích stromů, jinak byl velmi pomalý. Používá se les s 256 stromy, nebo dokonce 8192 stromy. K jejich identifikaci slouží speciální funkce dvou prvních znaků.
digitální strom
Známý program LHA využívá digitální strom, pomocí něhož obdržíme nejčerstvější shodu hledaného řetězce, což je výhodné pro následnou sekundární kompresi. Digitální strom je unární spojová struktura, v níž má každý uzel jediného následníka. Čím blíže je řetězec aktuálnímu hledanému řetězci, tím blíže je kořenu digitálního stromu. Protože použití jednoho stromu by bylo stejné jako použití žádného stromu, používá se množiny digitálních stromů. V každém se nachází pouze řetězce, které mají stejnou funkci prvních dvou znaků řetězce. Nejčastěji je to funkce: (První znak OR (Druhý znak 2H-8) AND 2H) kde je
90
H K
– hašovací konstanta rovná log2K, – počet stromů.
(96)
Kódování a komprese dat
Komprimace je pomalejší než při použití binárních stromů, ve spojení se sekundárním algoritmem (např. Huffmanovým algoritmem) produkuje kratší kódy. Dekomprimace je velmi jednoduchá. Postupně načítáme sekvence bitů ze vstupu. Pokud tato sekvence představuje nezakódovaný znak, je tento znak vyslán na výstup. Je-li to ukazatel na předchozí výskyt řetězce, pak z následujících bitů určíme pozici ve výstupním poli a délku řetězce. Tento řetězec zkopírujeme na aktuální pozici.
8.2.2
Algoritmus Lempel-Ziv-Welch 1984
Tento algoritmus využívají programy PKARC, PKZIP. Je založen na určení opakujících se sekvencí. Využívá dva buffery – PREFIX (dvoubytové pole) a TAIL (jednobytové pole), hašovací tabulku pro rychlé vyhledávání a několik proměnných: X – aktuální znak, KX – poslední prefix, D – hodnota hašovací funkce, Z – obsah položky hašovací tabulky. Postup je následující: 1. Inicializujeme hašovací tabulku – naplníme ji jinak nepoužívanými hodnotami, obvykle 1. 2. Do proměnné KX načteme znak ze vstupu, do X následující znak. 3. Spočítáme hodnotu hašovací funkce, obvykle: D = (KX 2H) XOR X AND (Q – 1) kde je
H Q
(97)
– hašovací konstanta (hašování je algoritmus rychlého vyhledávání), – velikost hašovací tabulky.
4. Proměnné Z přiřadíme obsah hašovací tabulky s indexem D. - Má-li Z prázdnou hodnotu, pak sekvenci (KX, X) nelze zkomprimovat, obsah KX zapíšeme na výstup (vyšleme n bitů, kde n je dvojkový logaritmus z délky tabulek, viz dále). Do tabulky PREFIX zapíšeme hodnotu KX na první volné místo, na stejné místo v tabulce TAIL zapíšeme X. Do hašovací tabulky na pozici D uložíme index tohoto prvního volného místa. Do KX přesuneme obsah X, do X načteme další znak, jdeme na bod 3. - Má-li Z hodnotu, pak je ukazatelem do tabulky PREFIX a TAIL a byla nalezena shoda s hledanou posloupností (KX, X). Vyzkoušíme, zda se neshodují i další znaky do KX umístíme hodnotu Z (odkaz na již nalezenou hodnotu), do X další znak ze vstupu a jdeme na bod 3. (na výstup bude vyslána poslední hodnota Z – pozice v tabulce PREFIX a TAIL poslední shody, tedy konce shodného řetězce.). Problémy jsou spojeny s velikostí tabulek TAIL a PREFIX. Každá nová hodnota se do nich ukládá. Čím jsou delší, tím více bitů je nutné na specifikaci pozice v tabulce (tento počet bitů se vysílá při každém výstupu do souboru). Problém je možno řešit následovně:
91
LZW
Kódování a komprese dat Na počátku nastavíme délku na určitou hodnotu (obvykle 512), délka kódu na nejmenší nutný počet znaků (log2 z počtu položek, tedy 9). Prvních 256 položek se přitom nemůže používat, neboť by se shodovaly s nezakódovanými znaky. První volnou pozici tedy nastavíme na 256 (počítáno od nuly). Jakmile se tabulky zaplní (a nejsou příliš dlouhé), zdvojnásobíme jejich délku a kód se prodlouží o 1 bit. Jsou-li tabulky příliš dlouhé, vyprázdní se a celý algoritmus začne znovu od začátku. Dekomprimace probíhá takto: Postupně načítáme sekvence n bitů (n = log2 z velikosti tabulek). – Je-li hodnota sekvence menší než 256, je odeslán na výstup tento znak. – Je-li hodnota nad 256, je rekurzivně zjištěn a vyslán na výstup pomocí tabulek PREFIX a TAIL celý zkomprimovaný řetězec. V obou případech jsou upraveny tabulky PREFIX a TAIL. Díky své rychlosti je metoda velmi oblíbená. Její použití je však patentově chráněno!
Příklad: Řešme kompresi souboru s obsahem znaků „ABABBAABBA“. Předpokládáme, že znaky jsou kódovány v osmibitovém kódu ASCII a platí: znak „A“ = 41H = 0100 0001, znak „B“ = 42H = 0100 0010. Postup komprimace bude následující (pro jednoduchost výpočtu hašovací funkce pokládáme H = 1, Q = 100H): 1. Krok Načteme znak ze vstupu do KX: KX: „A“ = 0100 0001 Načteme další znak ze vstupu do X: X: „B“ = 0100 0010 Spočítáme hašovací funkci: D: C0H = 0 1100 0000 Zjistíme hodnotu Z z hašovací tabulky: Z: 1 nový výskyt řetězce, aktualizace tabulek PREFIX a TAIL na volné pozici 100H = = 1 0000 0000, aktualizace hašovací tabulky, přesun X KX výstup: 0 0100 0001 2. Krok KX: „B“ = 0100 0010 X: „A“ = 0100 0001 D: C5H = 0 1100 0101 Z: 1 nový výskyt řetězce, aktualizace tabulek PREFIX a TAIL na volné pozici 101H = = 1 0000 0001, aktualizace hašovací tabulky, přesun X KX výstup: 0 0100 0010 3. Krok KX: „A“ = 0100 0001 X: „B“ = 0100 0010 D: C0H = 0 1100 0000 Z: 100H opakovaný výskyt řetězce, přesun Z KX výstup: nic
92
Kódování a komprese dat 4. Krok KX: 100H = 1 0000 0000 X: „B“ = 0100 0010 D: 42H = 0 0100 0010 Z: 1 nový výskyt řetězce, aktualizace tabulek PREFIX a TAIL na volné pozici 102H = = 1 0000 0010, aktualizace hašovací tabulky, přesun X KX výstup: 1 0000 0000 5. Krok KX: „B“ = 0100 0010 X: „A“ = 0100 0001 D: C5H = 0 1100 0101 Z: 101H opakovaný výskyt řetězce, přesun Z KX výstup: nic 6. Krok KX: 101H = 1 0000 0001 X: „A“ = 0100 0001 D: 43H = 0 0100 0011 Z: 1 nový výskyt řetězce, aktualizace tabulek PREFIX a TAIL na volné pozici 103H = = 1 0000 0011, aktualizace hašovací tabulky, přesun X KX výstup: 1000 0001 7. Krok KX: „A“ = 0100 0001 X: „B“ = 0100 0010 D: C0H = 0 1100 0000 Z: 100H opakovaný výskyt řetězce, přesun Z KX výstup: nic 8. Krok KX: 100H = 1 0000 0000 X: „B“ = 0100 0010 D: 42H = 0 0100 0010 Z: 102H opakovaný výskyt řetězce, přesun Z KX výstup: nic 9. Krok KX: 102H = 1 0000 0010 X: „A“ = 0100 0001 D: 45H = 0 0100 0101 Z: 1 nový výskyt řetězce, aktualizace tabulek PREFIX a TAIL na volné pozici 104H = = 1 0000 0100, aktualizace hašovací tabulky, přesun X KX výstup: 1 0000 0010 10. Krok KX: „A“ = 0100 0001 X: nelze načíst nový výskyt řetězce, vyslání KX na výstup, konec. výstup: 0 0100 0001
93
Kódování a komprese dat Konečná podoba tabulek: PREFIX adresa hodnota 100H „A“ 101H „B“ 102H 100H 103H 101H 104H 102H 105H .....
TAIL adresa hodnota 100H „B“ 101H „A“ 102H „B“ 103H „A“ 104H „A“ 105H ......
Hašovací tabulka adresa hodnota 42H 102H 43H 103H 44H 1 45H 104H ..... C0H 100H C1H 1 C2H 1 C3H 1 C4H 1 C5H 101H
Celkem byla na výstup vyslána posloupnost bitů (rozdělení skupin slouží pro názornost postupu při dekompresi, v souboru se samozřejmě neuplatňuje): 0 0100 00010 0100 00101 0000 00001 0000 00011 0000 00100 0100 0001
Celkem vysláno 69 = 54 bitů, původní soubor měl 108 = 80 bitů, kompresní poměr činí 67,5 %. Postup dekomprese je velmi podobný. Do proměnné P načteme sekvenci bitů ze vstupu (9 bitů), pokud má hodnotu menší než 100H, jedná se o znak, jinak je to odkaz do tabulek PREFIX a TAIL, nahradíme ho tedy hodnotami z obou tabulek. Pokud hodnota v tabulce PREFIX je větší nebo rovna 100H, pak se opět jedná o odkaz do tabulek, který rozvineme do znaků z tabulek. Tak postupujeme, až získáme celý zkomprimovaný řetězec. V obou případech provedeme postupně se všemi získanými znaky úpravu tabulek PREFIX a TAIL postupem shodným s kompresí.
94
Kódování a komprese dat
1. Krok P: 0 0100 0001 = „A“ výstup: „A“ KX: „A“ 2. Krok P: 0 0100 0010 = „B“ výstup: „B“ KX: „A“ X: „B“ D: C0H Z: 1 úprava tabulek, pozice 100H 3. Krok P: 1 0000 0000 = 100H výstup: „A“, „B“ KX: „B“ X: „A“ D: C5H Z: 1 úprava tabulek, pozice 101H KX: „A“ X: „B“ D: C0H Z: 100H nic, Z KX 4. Krok P: 1 0000 0001 = 101H výstup: „B“, „A“ KX: 100H X: „B“ D: 42H Z: 1 úprava tabulek, pozice 102H KX: „B“ X: „A“ D: C5H Z: 101H nic, Z KX 5. Krok P: 1 0000 0010 = 102H výstup: 100H, „B“
„A“, „B“, „B“ KX: 101H X: „A“ D: 43H Z: 1 úprava tabulek, pozice 103H KX: „A“ X: „B“ D: C0H
95
Kódování a komprese dat Z: 100H nic, Z KX KX: 100H X: „B“ D: 42H Z: 102H nic, Z KX
6. Krok P: 0 0100 0001 = „A“ výstup: „A“ KX: 102H X: „A“ D: 45H Z: 1 úprava tabulek, pozice 104H
Na výstup bylo celkem vysláno: ABABBAABBA 8.2.3
Huffmanův kód
binární vyhledávací strom sekundární komprese
Huffmanův kód
Huffmanův kód (čti hafmenův) vznikl v roce 1952 jako kód s minimální redundancí. Slouží pro zrychlení přenosu zpráv. Vychází ze zjištění, že se jednotlivé znaky zdrojové abecedy nevyskytují ve zprávách stejně často. Jednotlivé znaky jsou umístěny jako koncové uzly (listy) do binárního vyhledávacího stromu. Cesta stromem je popsána jako sekvence nul a jedniček (0 – na levý dceřiný uzel, 1 – na pravý dceřiný uzel), viz obr. 15. Znaky s velkou pravděpodobností výskytu přitom mají kratší kód. Přesný popis konstrukce Huffmanova kódu je popsán v kapitole věnované kódování. Je vhodný především jako sekundární kompresní algoritmus.
0 0 A
Text: „ABYBABABYLADED“.
1 0
1 B
D
1 0 Y
1 0 E
1
Kód: A B D Y E L
– – – – – –
00, 01, 10, 110, 1110, 1111.
L
Obr. 15. Binární vyhledávací strom a výsledný Huffmanův kód Na podobném principu je postaven kód Morseovy abecedy (tečka – na levý dceřiný uzel, čárka – na pravý dceřiný uzel), viz obr. 16. Zde jsou však obsazeny všechny uzly stromu. Potřebujeme tedy třetí hodnotu pro označení konce písmene (pomlku, nejčastěji značenou svislou čarou):
.------- 96
Kódování a komprese dat
bez tohoto znaku nejsme schopni dekódovat zprávu:
.------a to ani „odzadu“. Tento syndrom se nazývá chybějící prefix. Odstraníme ho tak, že obsazujeme až koncové uzly binárního vyhledávacího stromu. .
I
. . H
S
V
-
E
.
.
F
U
. L
R
T
.
-
.
chybějící prefix
A .
W -
P
N
.
-
J
. B
D
X
-
. C
K
M
.
.
Y
Z
G
Q
O
Ch
Obr. 16. Tvorba kódu Morseovy abecedy Pro kompresi dat je jednodušší použít statický strom, tedy dvouprůchodovou kompresi. Při prvním průchodu určíme počty výskytů jednotlivých znaků, s jejich pomocí sestavíme binární vyhledávací strom a sestavíme Huffmanův kód. Binární strom uložíme na výstup. S pomocí kódu při druhém průchodu kódujeme jednotlivé znaky a vysíláme na výstup. Nezbytnost uložení celé struktury stromu způsobuje, že krátké soubory se mohou kompresí prodloužit. Řešením je použití dynamického stromu. Na počátku je vytvořen vyvážený strom vycházející z předpokladu stejných pravděpodobností výskytů všech znaků. Po vyslání každého znaku se upravuje strom do nové podoby respektující skutečný počet vyslaných znaků, takže se tento strom nemusí ukládat do zkomprimovaného souboru.
8.2.4
statický strom
dynamický strom
Aritmetická komprese
Aritmetická komprese je efektivním sekundárním kompresním algoritmem [28]. Vychází z myšlenky, která říká, že i stejné znaky na různých místech souboru mohou být zapisovány různým počtem bitů. Tento algoritmus je velmi náročný na aritmetické operace (zejména násobení a dělení velkých čísel), ale jeho výsledky jsou velmi dobré. Pracuje se v něm s intervalem racionálních čísel a výsledek (tedy výstupní řetězec znaků) se nachází vždy v tomto intervalu. Na začátku práce je interval roven polouzavřenému intervalu <0, 1). Hranice intervalu jsou v paměti uloženy jako binární desetinná čísla (první bit reprezentuje hodnotu 2–1, druhý bit hodnotu 2–2 atd.). Další postup závisí na druhu algoritmu. Statický algoritmus je dvouprůchodový. Při prvním průchodu spočítáme četnosti výskytů jednotlivých znaků a celkový počet znaků. Pro každý znak současně spočítáme součet četností znaků s nižší hodnotou ASCII. Všechny tyto hodnoty uložíme do tabulky. Při druhém průchodu načítáme jednotlivé znaky ze vstupního souboru. Součet četností znaků s nižší hodnotou ASCII vydělíme celkovým počtem znaků a násobíme aktuální délkou intervalu (rozdíl horní a dolní hranice intervalu), podíl přičteme k dolní hranici intervalu a tento součet prohlásíme za novou dolní hranici intervalu. K této dolní hranici přičteme četnost právě načteného znaku vydělenou počtem všech znaků a
97
aritmetická komprese
statický algoritmus
Kódování a komprese dat
dynamický algoritmus
násobenou opět aktuální délkou intervalu (má význam pravděpodobnosti výskytu tohoto znaku v souboru) a získáme tak novou horní hranici intervalu. Poté pokračujeme dalším znakem. Jakmile dosáhneme konce souboru, porovnáme horní a dolní hranici intervalu a odešleme část horní hranice, která začíná nejvyšším bitem hranice (reprezentujícím 2–1) a končí prvním bitem, ve kterém se dolní hranice liší od horní hranice. Pak také odešleme počet znaků souboru a tabulku četností jednotlivých znaků. Nebýt této tabulky, mohli bychom v ideálním případě zkomprimovat mnoho megabitů do jediného bitu. Dynamický algoritmus je jednoprůchodový. Na začátku předpokládáme, že četnosti všech znaků jsou rovny jedné, počet všech znaků je 256. Tabulka četností a celkový součet četností po každém znaku aktualizujeme. Na výstup pak nemusíme ukládat tabulku četností jednotlivých znaků. Dekódování těchto metod je pak obráceným postupem jejich kódování.
Příklad aritmetické komprese. Vstupní soubor: RCSRRTCSRT Tabulka četností znaků a znaků menších má podobu: Znak Počet znaků Počet znaků menších nznak mznak C 2 0 R 4 2 S 2 6 T 2 8 Celkem 10 Postup komprese jednotlivých znaků když je D – dolní mez, H – horní mez intervalu a L – délka intervalu: 1. Znak R
2 2 mR L0 0 1 10 10 n n 2 4 6 H 1 D1 R L0 1 10 10 10 n 6 2 4 L1 H 1 D1 10 10 10
D1 D0
2. Znak C
mC 2 0 4 20 L1 10 10 10 100 n n 20 2 4 28 H 2 D2 C L1 100 10 10 100 n 28 20 8 L2 H 2 D2 100 100 100
D2 D1
3. Znak S
mS 20 6 8 248 L2 100 10 100 1000 n n 248 2 8 264 H 3 D3 S L2 1000 10 100 1000 n
D3 D2
98
Kódování a komprese dat
L3 H 3 D3
264 248 16 1000 1000 1000
4. Znak R
mR 248 2 16 2512 L3 n 1000 10 1000 10000 n 2512 4 16 2576 H 4 D4 R L3 n 10000 10 1000 10000 2576 2512 64 L4 H 4 D4 10000 10000 10000
D4 D3
atd. 0
1
2 10
20 100
248 1000
6 10
28 100
264 1000
Obr. 17. Postup aritmetické komprese
99
Kódování a komprese dat
Kontrolní otázky: 33. Co je cílem všech algoritmů bezeztrátové komprese? 34. Jak hodnotíme kvalitu komprese? 35. Jak funguje zarážka u metody opakování znaků (RLE)? 36. Kolik navazujících algoritmů komprese používají současné kompresní systémy a proč? 37. K čemu slouží v kompresi hašování a jak funguje? 38. Jaký je princip aritmetické komprese? Shrnutí obsahu kapitoly V této kapitole jsme se seznámili se základními metodami bezeztrátové komprese. Víme, že jsou dvě skupiny algoritmů – slovníkové algoritmy, vhodné jako primární komprese, a pro sekundární kompresi jsou vhodné algoritmy jako Huffmanův kód nebo aritmetická komprese. Korespondenční úkol 5: 5. Vytvořte příklad komprese pomocí algoritmu Lempel-Ziv-Welch nebo pomocí aritmetické komprese.
100
Kódování a komprese dat
9
Komprese obrazu
Cíl: Cílem celé kapitoly je představit základní algoritmy pro ztrátovou kompresi, používanou zejména při kompresi obrazových dat. Jsou ukázány principy použití diskrétní kosinové transformace, vlnkové transformace a principy fraktální komprese.
Po jejím prostudování byste měli být schopni:
Porozumět principům ztrátové komprese používané u komprese obrazu. Vysvětlit jak funguje diskrétní kosinová transformace. Ukázat, jak se využívá RLE komprese v rámci realizace komprese JFIF.
Klíčová slova této kapitoly: Ztrátová komprese, modely barev, RGB, CMYK, HSB, YCbCr, luminance, složky chrominance, sekvenční komprese, progresivní komprese, diskrétní kosinová transformace, kvantování, JFIF, formát JPEG, diskrétní vlnková transformace, mateřská vlnka, formát JPEG2000, fraktál, fraktální komprese, fraktální geometrie, soběpodobnost, Hausdorfova dimenze, afinní transformace, dilatace, měřítko, rotace, systém iterovaných funkcí, Sierpinského trojúhelník.
Doba potřebná ke studiu: 8 hodin
Průvodce studiem Studium této kapitoly je nutné k pochopení základních algoritmů ztrátové komprese dat, používané zejména u obrazových dat, a jejich realizace. Na studium této části si vyhraďte osm hodin. Vyřešte samostatně všechny příklady včetně korespondenčního úkolu, abyste si osvojili znalosti o používaných algoritmech bezeztrátové komprese.
101
Kódování a komprese dat
bezeztrátová komprese
model barev RGB
S rozvojem kvality zobrazení informace, zejména obrázků, pomocí výpočetní techniky prudce vzrostly informační objemy dat pro tyto typy informace. Jsou způsobeny jednak vysokou rozlišovací schopností danou počtem zobrazených bodů na jednotku plochy, a také počtem rozlišitelných barevných úrovní nebo stupňů šedi. Při pokusech o kompresi takových souborů pak dosavadní postupy, zejména metoda opakování znaků, selhávají a mohou dokonce produkovat delší výsledné soubory. Tyto postupy využívají bezeztrátovou kompresi, neboť po dekomprimaci obdržíme veškerou informaci, kterou jsme měli před komprimací, v nejlepším případě dosahují kompresního poměru kolem 50 %. Pro kompresi obrázků ve vysokém stupni rozlišení byly postupně vyvinuty speciální kompresní postupy založené na matematických transformacích, které aproximují vztahy obrazových prvků. Přitom se dopouštějí určité ztráty původní informace, která způsobuje některé nepříjemné důsledky (snížení rozlišovací kvality, snížení kontrastu, „rozmazání“ ostrých přechodů apod.).
9.1
Modely barev
Metody komprese obrazu vychází z použitého modelu barel. Nejběžněji se setkáváme s modelem RGB (Red-Green-Blue), který představuje aditivní skládání barev. Všechny barvy vytváříme skládáním ze tří složek – červené (R), zelené (G) a modré (B), jejich intenzita je určena ve stanoveném rozsahu, např. 0 – 255 (1 byte), která dává 256.256.256 = 16.777.216 tedy zhruba 16 miliónů odstínů. Ve skutečnosti lidské oko nevnímá všechny složky stejně intenzivně, proto jsou zobrazovací zařízení upravena tak, aby nastavení všech tří složek reprezentovaly jako šedou barvu, např. R = 127, G = 127, B = 127 reprezentuje tzv. střední šedou, která odráží 18 % světla a na kterou fotoaparáty měří expozici. Skutečnost, že lidské oko nevnímá všechny barvy stejně intenzivně se projevuje také při převodu barevné fotografie na černobílou. Jas každého bodu by se měl vypočítat jako absolutní jas = (R + G + B)/3, ale protože je lidské oko málo citlivé na modrou barvu, počítá se obvykle relativní jas = 0,3 R + 0,59 G + 0,11 B.
Obr. 18. Princip modelu barev BGB [47]
102
Kódování a komprese dat Naproti tomu pro tisk dokumentů je vhodnější model barev CMYK (CyanMagenta-Yellow-blacK), představující subtraktivní zobrazení barev, viz obr. 19. Model vystačí se třemi barvami, ale protože černá barva znamená velkou spotřebu všech tří složek, přidává se do tiskových zařízení černá samostatně a pomáhá ztmavovat barvy, aby se šetřily barevné pigmenty. Převod mezi těmito dvěma modely je relativně jednoduchý, viz porovnání obrázků 18 a 19. Pro kompresi obrazu je však mnohem vhodnější HSB (Hue-SaturationBrightness), který používá tři veličiny: Hue (odstín), udává se ve stupních a popisuje barvu v rozsahu 0° - 360° na okraji tzv. barevného kola, viz obr. 20. Saturation (sytost), udává sytost barvy v procentech od 0 % (bod je šedý v úrovni dané Brightness, tedy bez barvy) do 100 % (bod je barevný zcela podle Hue). Brightness (jas), popisuje v procentech černobílý jas bodu od černé 0 % po bílou 100 %.
HSB hue saturation
brightness
Obr. 19. Princip modelu barev CMYK [47]
Obr. 20. Princip kódování barvy v modelu HSB (barevné kolo) [47]
YCbCr chrominanční komponent
CMYK
103
Kódování a komprese dat V digitální fotografii, ale také ve videosignálech, se často používá model YCbCr, kde Y představuje složku jasu (luminance) a Cb s Cr představují modrý a červený chrominanční komponent (složku). Jednou z výhod je snadný přechod na černobílé zobrazení, kdy se využije přímo složka Y a složky chrominance se ignorují.
Obr. 21. Význam složek chrominance v modelu YCbCr
Formát JPEG
9.2 JFIF
sekvenční komprese progresivní komprese
chrominance
Formát JPEG
Základní myšlenkou komprese obrazu je zjištění, že lidské oko je nedokonalé a není schopno postřehnout malé rozdíly. Přitom samotný princip zobrazení v podobě matice bodů přináší řadu nepřesností daných diskretizací obrazu na jednotlivé body a vyjádřením barvy celého bodu pomocí konečné množiny odstínů. Těchto faktů využíváme v algoritmech ztrátové komprese obrazu, jako je standard JPEG (název je odvozen od pracovní skupiny Joint Photographics Experts Group), která tento formát připravovala. Úplný název formátu je JFIF – JPEG File Interchange Format. JPEG komprimuje obrazy s 24 bitovou reprezentací barev (True Color). Algoritmus a z něj vycházející formát ukládání grafických dat byl převzat do norem ISO a CCITT. Dosahuje kompresního poměru 25: 1, při horší kvalitě výsledného obrazu až 80: 1 i více, využívá postupu nazvaného sekvenční komprese a z něj vycházející progresivní komprese. Nepoužívá obvyklý model barev RGB, ale model YCbCr obsahující jasovou složku Y a dvě barevné složky Cb a Cr. Oba modely barev je možné vzájemně převádět pomocí transformační matice: 0,587 0,114 R 0 Y 0,299 C 0,1687 0,3313 (98) 0,5 G 128 b C r 0,5 0,4187 0,0813 B 128 Přičtení hodnoty 128 ke složkám chrominance má pouze technický význam, všechny tři složky jsou pak vyjádřeny pouze nezápornými hodnotami, takže se s nimi lépe pracuje. Zpětná transformace je důležitá při rekonstrukci obrazu:
104
Kódování a komprese dat
R Y 1,402(C r 128) G Y 0,344(C b 128) 0,714(C r 128)
(99)
B Y 1,772(C b 128) Model barev YCbCr, který má jasovou složku oddělenou od barevných, je pro ztrátovou kompresi mnohem výhodnější. Lidské oko je podstatně méně citlivé na změny barev než na změny jasu. Proto je možné u barev při kompresi připustit větší ztrátu informace než u jasu a dosáhnout tím celkově vyššího kompresního poměru. Při kompresi JPEG je rastrový obraz rozdělen na čtvercové bloky po 8×8 bodech. V každém bloku je nejdříve od hodnot v něm odečtena hodnota 128, tím se hodnoty z intervalu 0 ÷ 255 převedou do intervalu -128 ÷127, čímž se sníží jejich absolutní velikost, a následně je na každý blok samostatně provedena diskrétní kosinová transformace (DCT – Discrete Cosine Transform) podle vztahu: 7 7 1 (2i 1)u (2 j 1)v F (u , v) C (u )C (v) f (i, j ) cos , (100a) cos 16 16 4 i 0 j 0 1 C (u ), C (v) 2 1
u, v 0
.
(100b)
u, v 0
f(i, j) v uvedeném vztahu označují hodnoty jasové nebo barvotvorných složek jednotlivých bodů bloku 8×8 a F(u, v) jsou vypočítané frekvenční koeficienty. Cílem DCT je oddělení informací s nízkými frekvencemi (pomalých změn jasu nebo barev) od vysokých frekvencí (náhlých změn jasu a barev). Koeficient F(0, 0) reprezentuje stejnosměrnou složku (hodnoty kosinů jsou konstantní), ostatní koeficienty vyjadřují střídavé složky. Směrem k pravému dolnímu rohu (tj. směrem ke koeficientu F(7, 7)) se frekvence koeficientů zvyšují. V každém bloku se DCT provádí třikrát, jednou pro jasovou složku a dvakrát pro jednotlivé barvotvorné složky. stejnosměrný koeficient DC
nižší frekvence
nižší frekvence
střídavé koeficienty AC
vyšší frekvence
vyšší frekvence
Obr. 22. Poloha stejnosměrného a střídavých koeficientů v bloku 8x8
105
DCT diskrétní kosinová transformace
Kódování a komprese dat Příklad realizace diskrétní kosinové transformace bloku 8x8 bodů. Původní hodnoty matice Y jsou nejprve sníženy o -128 a následně je realizována diskrétní kosinová transformace: 40 44 41 45 42 48 52 64 Y= 59 62 70 64 75 72 77 74 ‐88 ‐84 ‐87 ‐83 ‐86 ‐80 ‐76 ‐64 Y’ = ‐69 ‐66 ‐58 ‐64 ‐53 ‐56 ‐51 ‐54 ‐396 ‐125 ‐67 8 ‐104 101 28 ‐34 F= 22 ‐5 ‐16 15 ‐4 ‐9 ‐11 3
kvantování
60 55 56 71 75 60 65 69 ‐68 ‐73 ‐72 ‐57 ‐53 ‐68 ‐63 ‐59 ‐14 ‐45 ‐19 16 2 6 8 4
65 69 67 87 84 72 62 89 ‐63 ‐59 ‐61 ‐41 ‐44 ‐56 ‐66 ‐39 22 ‐1 ‐21 15 ‐19 ‐4 10 ‐6
71 109 76 99 97 78 87 67 ‐57 ‐19 ‐52 ‐29 ‐31 ‐50 ‐41 ‐61 ‐8 3 33 ‐21 ‐2 ‐2 ‐21 3
48 56 104 120 150 149 75 65 ‐80 ‐72 ‐24 ‐8 22 21 ‐53 ‐63 6 ‐3 ‐7 15 12 ‐5 17 ‐10
66 69 75 132 156 154 78 65 ‐62 ‐59 ‐53 4 28 26 ‐50 ‐63 ‐4 ‐10 ‐14 ‐3 ‐3 1 13 14
42 55 80 120 150 120 95 82 ‐86 ‐73 ‐48 ‐8 22 ‐8 ‐33 ‐46 ‐1 21 16 7 ‐5 1 ‐25 ‐4
Z příkladu je zřejmé, že největší podíl informace nese stejnosměrný koeficient a střídavé koeficienty s nízkými frekvencemi. Zatím byl výpočet bezeztrátový (neuvažujeme-li chybu danou zaokrouhlováním na celá čísla). Nyní následuje kvantování, při kterém se z DCT-koeficientů F(u, v) počítají koeficienty C(u, v). Kvantováním, při kterém se dělí koeficienty F(u, v) hodnotami kvantovací matice Q, dochází ke zmenšení hodnot koeficientů F(u, v) a malé hodnoty jsou kvantováním zanedbány, tj. vycházejí nulové. Výpočet koeficientů C(u, v) je dán vztahem (funkce Int představuje zaokrouhlení na celé číslo): F (u, v) C (u , v) Int (101) Q(u, v) kde Q(u, v) jsou hodnoty kvantovací matice 8×8. Uveďme nyní běžně používanou matici Q pro jasovou složku a koeficienty matice C spočítané z koeficientů matice F ukázkového bloku uvedeného v předchozím odstavci:
106
Kódování a komprese dat
Q=
C=
16 12 14 14 18 24 49 72 ‐25 ‐6 ‐7 2 1 ‐1 0 0
11 12 13 17 22 35 64 92 ‐11 1 8 ‐2 0 0 0 0
10 14 16 22 37 55 78 95 ‐1 ‐3 ‐1 1 0 0 0 0
16 19 24 29 56 64 87 98 1 0 ‐1 1 0 0 0 0
24 26 40 51 68 81 103 112 0 0 1 0 0 0 0 0
40 58 57 87 109 104 121 100 0 0 0 0 0 0 0 0
51 60 69 80 103 113 120 103 0 0 0 0 0 0 0 0
61 55 56 62 92 92 101 99 0 0 0 0 0 0 0 0
Ukázkový blok neobsahuje výraznější změny jasu. Proto vyšší střídavé složky jsou malé a po kvantování dostaneme vesměs nulové hodnoty. V uvedeném příkladu vypočítaná matice C obsahuje jen 20 nenulových hodnot. Největší velikost -25 má stejnosměrný koeficient C(0, 0). Hodnoty nenulových střídavých koeficientů jsou malé. Jak již bylo popsáno, uvedená matice Q se používá pro jasovou složku Y. Pro zbývající dvě barvotvorné složky Cb a Cr se používají matice poskytující ještě hrubší kvantování. Všimneme si, že pro nižší frekvence jsou hodnoty v matici Q menší (hodnoty v levém horním rohu matice) a ztráty při dělení jasové a barvotvorných složek těmito hodnotami (při kvantování) jsou menší. Naopak pro vyšší frekvence jsou hodnoty větší a kvantování probíhá s většími ztrátami. To je cílem celého výpočtu. Aby ztráty byly především v oblasti vysokých frekvencí, neboť ty jsou na obrazu méně patrné. Poslední fází je statistické kódování hodnot matice C a jejich uložení na výstup. Používá se k tomu QM-coder, což je již adaptivní způsob aritmetické komprese, nebo Huffmanův kód. Zatímco ostatní části standardu JPEG jsou volně dostupné, QM-coder je patentovaný, což je značná překážka při jeho použití v JPEG. Proto se v praxi převážně používá Huffmanovo kódování, i když s ním je účinnost komprese o 10 až 15 procent nižší. Koeficienty každého bloku 8×8 jsou kódovány v tzv. "cik-cak" (zig-zag) pořadí směrem od stejnosměrného koeficientu v levém horním rohu ke koeficientu v pravém dolním rohu podle následujícího obrázku 23.
107
QM-coder aritmetická komprese Huffmanův kód
Kódování a komprese dat DC
AC1
DCi-1
DCi
AC2 AC3 AC9 blok i-1
blok i
AC10
AC63
Obr. 23. Pořadí kódování koeficientů AC Toto uspořádání umožňuje účinnější kódování, protože mezi koeficienty matice C se běžně vyskytuje značný počet nul. První koeficient, na obrázku označený DC (tj. stejnosměrný koeficient C(0, 0)), je v bloku dominantní a jeho hodnota bývá poměrně vysoká. Z hlediska účinnosti komprese je vždy výhodnější, jestliže se kódují menší hodnoty. Proto se nekóduje přímo tato hodnota, ale kóduje se rozdíl mezí ní a hodnotou stejnosměrného koeficientu předchozího bloku (přirozeně vyjma prvního bloku v obraze). Tj. kóduje se rozdíl DCi − DCi-1, kde index i označuje právě kódovaný blok a i-1 předchozí blok. Za koeficientem DC se kódují nenulové střídavé koeficienty. Kódování je ve tvaru dvou hodnot. První hodnota uvádí počet nul od předchozího nenulového koeficientu (metoda RLE) a druhá hodnota reprezentuje nenulový koeficient. Vlastní hodnota nenulového střídavého koeficientu je dále kódována do tvaru dvojice čísel. První číslo udává délku čísla a druhé je vlastní hodnota koeficientu. Kódování každého nenulového koeficientu tedy představuje trojici čísel – počet nul, kód délky hodnoty koeficientu a samotná hodnota koeficientu. Pro zvýšení účinnosti se tato trojice neukládá na výstup přímo, ale používá se při tom statické Hufmanovo kódování. Na následujícím obrázku je kódování našeho ukázkového bloku, který obsahuje celkem 19 nenulových střídavých koeficientů. Přičemž kódované hodnoty až po poslední nenulovou hodnotu jsou: -25; -11; -6; -7; 1; -1; 1; -3; 8; 2; 1; -2; -1; 0; 0; 0; 0; -1; 1; 0; -1; 0; 0; 0; 1; 1; EOB kde na konci je uveden příznak konce bloku EOB, který se kóduje dvěma nulami za sebou.
108
Kódování a komprese dat Stejnosmerný koeficient
Střídavý koeficient (RLE-kód)
2
3
0
4
4
0
3
EOB – konec bloku
1
…
3
1
1
0
1
1
0
0
délka hodnota počet předchozích nul délka hodnota
Obr. 24. Příklad kódování koeficientů DC a AC První je v bloku kódován stejnosměrný koeficient. Předpokládejme, že stejnosměrný koeficient předchozího bloku byl -28. Bude se tedy kódovat hodnota rozdílu -25 – (-28) = 3. Hodnota stejnosměrného koeficientu se kóduje stejně jako hodnoty střídavých koeficientů dvojicí čísel délka+hodnota. Délka je kódována pomocí následující tabulky a pro hodnotu 3 je délka 2. Za stejnosměrným koeficientem následuje kódování 25 nenulových střídavých koeficientů. Například předposlední nenulový střídavý koeficient je kódován trojicí 3, 1, 1, kde první číslice 3 označuje, že před ním jsou 3 nulové střídavé koeficienty, kód délky hodnoty je podle tabulky 1 a poslední v trojici je samotná hodnota 1. Na konci sekvence je dvojice nul označující konec bloku. Vyjádření celočíselné hodnoty pomocí dvojice délka + hodnota se nazývá kódování čísla s proměnnou délkou. Provádí se podle následující tabulky: Délka Rozsah hodnot 1 -1, 1 2 -3 ÷ -2, 2 ÷ 3 3 -7 ÷ -4, 4 ÷ 7 4 -15 ÷ -8, 8 ÷ 15 5 -31 ÷ -16, 16 ÷ 31 … V tabulce 1 udává délka – kolika bity je zakódována vlastní hodnota čísla, např. hodnoty v rozsahu -15 ÷ -8, 8 ÷ 15 budou zakódovány pomocí 4 bitů. Samotné kódování je jednoduché. Nejprve se záporné hodnoty přičtením vhodného čísla převedou na nezáporné, např. hodnoty -15 ÷ -8 se přičtením čísla 15 převedou na hodnoty 0 ÷ 7, čímž získáme souvislý interval 0 ÷ 15 a hodnoty jeho prvků přímo představují čtyřbitová čísla 0000B ÷ 1111B. Celý proces kódování JPEG dokumentuje obr. 25.
109
Kódování a komprese dat DCT koeficienty původní data
/ DCT
Rozklad na čtverce 8x8x
komprimovaná data
kvantizační matice Q
další čtverec
101111001110101 … statistické kódování
zakódovaný čtverec
transformovaná a kvantovaná data
ukládání
Obr. 25. Postup komprese JPEG kvantizační matice Q komprimovaná data
DCT koeficienty dekomprimovaná data
* inverzní DCT
statistické dekódování
Obr. 26 – Postup dekomprese JPEG Proces dekomprese dokumentuje obr. 26. Statistický dekodér (aritmetický nebo Huffmanův) dekóduje koeficienty matice C. Z nich se pomocí kvantovací matice Q a vztahu F(u, v) = Q(u, v).C(u, v) (102) Vypočítají koeficienty matice F. Z nich se inverzní kosinovou transformací vypočítají hodnoty f jasové a barevných složek. Vzorce pro inverzní DCT jsou prakticky identické s již uvedeným vzorci pro přímou DCT. Stačí v nich vzájemně zaměnit F(u, v) s f(i, j) a sumaci provádět přes u a v místo přes i a j: 1 7 7 (2i 1)u (2 j 1)v f (i, j ) C (u )C (v) F (u, v) cos cos , (103) 4 u 0 v 0 16 16
Postup dekomprese ukážeme na použitém příkladu. Nejprve provedeme dekvantování pomocí matice Q a získáme matici F po dekompresi (FD):
FD =
‐400 ‐72 ‐98 28 18 ‐24 0 0
‐121 12 104 ‐34 0 0 0 0
‐10 ‐42 ‐16 22 0 0 0 0
16 0 ‐24 29 0 0 0 0
0 0 40 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
Následně aplikujeme inverzí kosinovou transformaci a získáme matici Y’D:
110
Kódování a komprese dat
Y’D =
‐77 ‐84 ‐94 ‐86 ‐62 ‐56 ‐56 ‐47
‐87 ‐80 ‐77 ‐69 ‐58 ‐63 ‐65 ‐52
‐81 ‐67 ‐61 ‐59 ‐59 ‐69 ‐67 ‐47
‐60 ‐52 ‐54 ‐54 ‐53 ‐61 ‐59 ‐41
‐55 ‐51 ‐47 ‐34 ‐19 ‐31 ‐51 ‐53
‐73 ‐61 ‐41 ‐6 21 1 ‐46 ‐72
‐83 ‐68 ‐43 ‐1 31 11 ‐38 ‐67
‐80 ‐68 ‐49 ‐14 16 5 ‐29 ‐46
Nyní již zbývá pouze přičtení hodnot 128 ke všem prvkům, abychom získali matici YD:
YD =
51 44 34 42 66 72 72 81
41 48 51 59 70 65 63 76
47 61 67 69 69 59 61 81
68 76 74 74 75 67 69 87
73 77 81 94 109 97 77 75
55 67 87 122 149 129 82 56
45 60 85 127 159 139 90 61
48 60 79 114 144 133 99 82
Srovnáme-li výsledek s původním blokem, zjistíme malé rozdíly, způsobené kvantováním:
Y – YD =
‐11 ‐3 8 10 ‐7 ‐2 3 ‐4
3 ‐3 ‐3 5 ‐8 ‐1 9 ‐2
13 ‐6 ‐11 2 6 1 4 ‐12
‐3 ‐7 ‐7 13 9 5 ‐7 2
‐2 32 ‐5 5 ‐12 ‐19 10 ‐8
‐7 ‐11 17 ‐2 1 20 ‐7 9
21 9 ‐10 5 ‐3 15 ‐12 4
‐6 ‐5 1 6 6 ‐13 ‐4 0
Pokud má někdo pochybnosti o tom, zda tyto rozdíly nezpůsobila kosinová transformace, stačí aplikovat inverzní kosinovou transformaci přímo na matici F a získat matici Y’DB:
Y’DB =
‐88 ‐87 ‐86 ‐76 ‐69 ‐58 ‐53 ‐51
‐84 ‐83 ‐80 ‐64 ‐66 ‐65 ‐56 ‐54
‐68 ‐73 ‐72 ‐57 ‐53 ‐68 ‐63 ‐59
‐63 ‐59 ‐61 ‐41 ‐44 ‐56 ‐65 ‐38
‐57 ‐19 ‐52 ‐29 ‐31 ‐50 ‐41 ‐61
‐80 ‐73 ‐24 ‐8 22 21 ‐53 ‐63
‐63 ‐59 ‐53 4 28 26 ‐50 ‐63
‐86 ‐73 ‐47 ‐9 22 ‐8 ‐33 ‐46
Opět přičteme hodnoty 128 ke všem prvkům a získáme matici YDB:
YDB =
40 41 42 52 59 70 75 77
44 45 48 64 62 63 72 74
60 55 56 71 75 60 65 69
65 69 67 87 84 72 63 90
71 109 76 99 97 78 87 67
48 55 104 120 150 149 75 65
65 69 75 132 156 154 78 65
42 55 81 119 150 120 95 82
111
Kódování a komprese dat Ověříme si, že rozdíly oproti původnímu bloku jsou způsobeny pouze zaokrouhlováním:
Y – YDB =
progresivní komprese
0 0 0 0 0 0 0 0
0 0 0 0 0 1 0 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 ‐1 ‐1
0 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 0 ‐1 1 0 0 0 0
Úroveň kvantování a tím i kvalitu obrazu a velikost kompresního poměru může uživatel měnit pomocí Q-faktoru, který lze volit v rozmezí 1−100. Při kvantování jsou koeficienty matice Q děleny hodnotou 50/Q-faktor. Z toho plyne, že čím bude Q-faktor menší, tím budou kvantovací koeficienty větší. Tím zároveň budou menší vypočítané koeficienty matice C, což v důsledku znamená větší kompresní poměr, ale i vyšší ztráty a tím i zhoršení kvality obrazu. Implicitně bývá nastavena hodnota Q-faktoru = 75. Při ní se dosahuje typický kompresní poměru 1:10 a současně zůstává zachována kvalita obrazu tak, že na něm nejsou patrné žádné významné změny. Ještě vyšší komprese dosahuje progresivní komprese, která pracuje na stejném principu, ale postupně provádí kompresi od nejvyššího stupně komprese a v jednotlivých cyklech kompresi opakuje se snižujícím se stupněm komprese. Díky více cyklům lze dosáhnout dalšího zmenšení výsledného souboru (za cenu zhoršení jeho kvality). Systém JPEG dosahuje značných kvalit, má však jednu zásadní vadu. Při pokusu o vykreslení obrazu na zařízení s vyšším stupněm rozlišení než bylo u zařízení původního (což je požadavek zcela běžný díky prudkému rozvoji zobrazovacích zařízení) bude výsledný obraz značně horší.
9.3 JPEG 2000 diskrétní vlnková transformace kvantování Fourierova transformace Heiselbergův princip neurčitosti
JPEG 2000
Vývoj kompresních metod samozřejmě pokračoval a pokračuje i nadále. V současné době se postupně prosazuje formát JPEG 2000, který byl definován stejnou expertní skupinou, ale jeho základem je použití diskrétní vlnkové (waveletové) transformace, skalárního kvantování a entropického kódování. Díky tomu dosahuje lepších vlastností. Vlnková transformace (wavelet transform) je výsledkem snahy o časověfrekvenční popis signálů. Fourierova transformace poskytuje informaci o tom, jaké frekvence se v signálu vyskytují, ale nevypovídají o jejich poloze v čase, proto je vhodná pro popis stacionárních signálů. Řešením problému je použití okna, které ohraničí krátký úsek signálu a umožní určení spektra signálu v tomto intervalu. Z obdoby Heisenbergova principu neurčitosti ale vyplývá, že není možné současně určit frekvenci a polohu jejího výskytu v čase. Proto má toto řešení pro časově konstantní široké okno pro všechny frekvence velkou rozlišitelnost ne frekvenci a malou v čase a naopak pro časově úzké okno velkou rozlišitelnost v čase a malou ve frekvenci. Myšlenkou vlnkové transformace je vhodnou změnou šířky okna a jeho tvarem dosáhnout optimálního poměru rozlišitelnosti v čase a frekvenci. Pro nízké frekvence je 112
Kódování a komprese dat okno širší, pro vysoké užší. Toto okno se nazývá mateřská vlnka (mother wavelet) ψ. Pomocí parametru s (měřítko) je možné měnit její šířku, parametrem τ (poloha) se mění její poloha na časové ose: 1 t , s (t ) s , R, s 0 (104) s s
mateřská vlnka
Spojitá vlnová transformace je definována pro signály s konečnou energií (
2
f (t ) dt ):
Wf ( , s )
f (t )
kde je
1 s
t dt s
(105)
– číslo komplexně sdružené. Výsledkem pro jednorozměrný signál je dvourozměrná funkce, nazývaná vlnkové koeficienty Wf(τ, s). Mateřská vlnka nemůže být zvolena libovolně, musí splňovat několik podmínek. Především musí mít nulovou střední hodnotu a vhodný frekvenční rozsah. Příkladem používaných mateřských vlnek je vlnka Mexican hat, viz obr. 27a: 1 2 2 4 ( x) 1 2 x 2 e x (106) 3
Haarova vlnka
Nebo Haarova vlnka, viz obr. 27b: 1 0 x 1 2 1 x 1 ( x ) 1 2 jinak 0
(107)
Haarova vlnka
Vlnka Mexican hat ψ (x )
2
1,5
ψ (x ) 1
1
0,5
0,5
0
0
-0,5
-0,5 -0,4 -0,3 -0,2 -0,1 0,0 0,1 0,2 0,3 0,4 0,5 0,6 0,7 0,8 0,9 1,0 1,1 1,2 1,3 1,4 1,5
1,5
-5,0 -4,5 -4,0 -3,5 -3,0 -2,5 -2,0 -1,5 -1,0 -0,5 0,0 0,5 1,0 1,5 2,0 2,5 3,0 3,5 4,0 4,5 5,0
Mexican hat
x
-0,5
-1
-1
-1,5
x
Obr. 27 – Příklad mateřských vlnek a – Mexican hat, b – Haarova vlnka Vhodnou volbou závislostí parametrů s a τ můžeme vytvořit z vhodné vlnky ψ ortonormální bázi:
113
Kódování a komprese dat p, k Z
s 2p 2pk
k , p (t )
diskrétní vlnková transformace
1 2p
(108)
t 2pk p 2
(109)
Kde p odpovídá měřítku. Díky ortonormalitě pak takto zvolená vlnka umožňuje neredundantní dekompozici signálu, tzv. analýzu s mnoha rozlišeními. Tento princip je základem diskrétní vlnkové transformace (Discrete Wavelet Transform – DTW). Vlnková funkce ψ se chová jako pásmová propust filtrující vstupní signál kolem centrální frekvence, která je závislá na měřítku mocninou dvou. V následujícím měřítku je filtrována horní polovina pásma předchozí dolnofrekvenční části signálu. S rostoucí frekvencí roste šířka pásma (BW) tohoto filtru. Činitel kvality Q je tak konstantní pro celou množinu měřítkem odvozených filtrů. Pro zvolené minimální měřítko však zůstává nepokryt rozsah nízkých frekvencí. Proto je od vlnky odvozena měřítková funkce φ (scaling function), která má charakter dolní propusti.
ω
DP
HP
ω 4BW DP
HP
ω 2BW DP BW BW 2BW
4BW
HP
ω
Obr. 28. Frekvenční pohled na diskrétní vlnkovou transformaci
FIR filtr podvzorkování
Diskrétní vlnkovou transformaci je možno realizovat rychlým algoritmem, využívajícím FIR (Finite Impulse Response) filtry a podvzorkováním (decimací), viz obr. 28. Oba filtry, dolní propust DP (h - scaling filter) a horní propust HP (g - wavelet filter), tvoří pár kvadraturních zrcadlových filtrů (QMF), které mají komplementární propustná pásma. Výstupy obou filtrů jsou podvzorkovány na polovinu vstupních vzorků. Horní propust poskytuje koeficienty tzv. detailů DWT (cD), dolní propust koeficienty tzv. aproximace (cA). Díky decimaci je celkový počet koeficientů po jednom kroku stejný jako počet vstupních vzorků. Koeficienty aproximace je možné dále analyzovat shodným rozkladem filtry a obdržet tak další soubor koeficientů aproximace a detailů. Tak je možno pokračovat až do vyčerpání vstupní sekvence, viz obr. 29. Jednotlivé konvolute s dedikací je možno formalizovat, viz obr. 29:
114
Kódování a komprese dat N
cAp 1 (k ) h(m 2k )cAp (m)
(110a)
m 1 N
cD p 1 (k ) g (m 2k )cAp (m)
(110b)
m 1
Kde
cAp, cDp
– koeficienty aproximace, resp. detailů měřítka p 0, P ,
N – délka vstupní sekvence, cAp, cA0 = f(n). konvoluce s DP
podvzorkování 2
cAk+1 f cA1
cAk
cD1
pro k = 0 cA0 = f
konvoluce s HP
podvzorkování 2
cDk+1
cD2
cD3
cA2
cD4
cA3 cA4
Obr. 29 – Jeden krok DWT a rozklad na aproximace a detaily Podle výchozí formulace vlnky jsou určeny filtry h a g. Nejčastěji je z měřítkové funkce φ odvozen měřítkový filtr w, který má charakter dolní propusti. Po normalizaci w dělením normou poskytne koeficienty dolnopropustního filtru h. K němu se vypočítá horní propust g jako komplement (kvadraturní zrcadlový filtr). Rekonstrukční FIR filtry h a g jsou pak určeny jako časově obrácené sekvence koeficientů dekompozičních filtrů h a g. Pokud má analyzovaný signál délku N = 2k a maximální měřítko dekompozice je P ≤ k, pak obdržíme N2−1 + N2−2 + … + N2−P+1 + N2−P koeficientů detailů: cD1, cD2, …, cDP−1, cDP a N2−P koeficientů aproximace cAP. Celkem obdržíme N koeficientů, které můžeme označit DW f. Protože je počet koeficientů shodný s počtem vzorků a nedochází ke ztrátě informace, popis signálu je neredundandní. Popis je také úplný, pomocí inverzního postupu k postupu na obrázku 10 je možno přesně rekonstruovat analyzovaný signál. Inverzní diskrétní vlnková transformace se označuje IDWT. Operace podvzorkování je nahrazena převzorkováním, kdy za každým vzorkem původní sekvence následuje doplněný nulový vzorek. Místo původních filtrů jsou použity rekonstrukční filtry h a g . Výsledná aproximace cAP je použita spolu se vstupními detaily cDP jako vstup dalšího kroku IDWT (jde o pohyb nahoru ve schématu pyramidálního rozkladu na obrázku 10). Oproti formátu JFIF pracuje JPEG 2000 s obrázkem jako celkem a převádí je na popisy pomocí vlnkové transformace. Převod je víceprůchodový, počet průchodů určuje kompresní poměr a kvalitu dekomprimovaného obrázku (méně průchodů = vyšší kompresní poměr = nižší kvalita obrazu). Každému průchodu odpovídá zvláštní datový blok komprimovaného souboru. Pro rozměrné obrázky však rychle rostou nároky na paměť. Proto se používá technika rozdělení vstupního obrazu na menší části – dlaždice (tile), tento proces je nazýván tilling. Následně se každá dlaždice komprimuje odděleně. K tomu je použita L-úrovňová DWT s biortogonálními spline vlnkami 9/7 (v
115
převzorkování
dlaždice
Kódování a komprese dat
kvantování
aritmetice s pohyblivou řádovou čárkou) nebo s biortogonálními spline vlnkami 5/3 (v celočíselné aritmetice, v případě bezeztrátové komprese). Lúrovňová transformace má L+1 rozlišení obrazu – L je rozlišení obrazu a 0 je nejnižší frekvence. Ze 4 podpásem (subbandů) rozlišení j se složí jeden s rozlišením j + 1. Následuje kvantování jednotlivých podpásem – reálné koeficienty (v pohyblivé řádové čárce) se kvantují na celá čísla pomocí uniformního kvantování, krok kvantování je možné volit zvlášť pro každé podpásmo (a tím také částečně řídit kvalitu). Při bezeztrátovém režimu komprese se kvantování neprovádí y q sign( y ) (111) b kde je
q y b
– kvantovaná hodnota, – transformovaný koeficient podpásma, – kvantovací krok, často má hodnotu 10.
Obr. 30. Rozdělení dlaždic a packet partitions
EBCOT kódování
Po kvantování je každé podpásmo rozděleno na packet partitions – čtvercové nepřekrývající se oblasti, viz obr. 30. Jsou typicky voleny tak, aby napříč podpásmy tvořily bloky v originálním obrazu. Každá packet partition je dělena na bloky stejné velikosti (kromě bloků na kraji obrazu), všechny bity všech koeficientů v bloku jsou pak kódovány pomocí EBCOT (Embedded Bitplane Coding with Optimal Truncation) v pořadí od nejvýznamnějšího po nejméně významný: Koeficienty se rozdělí do bitových rovin. Bitové roviny obsahující pouze nuly jsou přeskočeny (uchová se jen jejich počet), začne se první rovinou obsahující alespoň jednu jedničku. Bity se z roviny načítají po čtyřřádkových blocích, v rámci bloku po čtyřbitových sloupcích. Každá rovina je pak kódována ve třech průchodech: o Significance Propagation – zakódují se bity, které nejsou důležité, ale sousedí s alespoň jedním důležitým (v některém z 8 směrů). o Magnitude Refinement – zakódují se bity z míst, které se byly v minulých rovinách důležité. o Cleanup Pass – zakódují se všechny zbylé bity.
116
Kódování a komprese dat
Takto získané bity se kódují binárním kontextovým aritmetickým kodérem – MQ kodérem. Kontext koeficientu je tvořen stavem jeho 8 sousedů (okno 3×3 bity). Výsledný proud bitů je rozdělen na pakety – paket spojuje jeden ze tří průchodů všech bloků přes celou packet partition. Pomocí vypouštění méně důležitých paketů se řídí kvalita komprese. diskrétní vlnková transformace
původní data
entropické kódování
kvantizace
datový tok …
hlavička paket 1
paket 2
paket N
Obr. 31. Postup komprese JPEG 2000 Ilustrační příklad: Ukažme si princip diskrétní vlnkové transformace na zjednodušeném příkladu. Máme vstupní posloupnost osmi hodnot. Vypočítáme a uložíme průměry každé dvojice hodnot (součet dělený dvěma). Z těchto dat bychom ale nedokázali vstupní soubor rekonstruovat, proto vypočítáme a uložíme pro každou dvojici hodnot také jejich rozdíl a opět jej vydělíme dvěma (význam tohoto podílu bude zřejmý při dekompresi). Tím získáme opět osm hodnot s tím, že budeme pracovat s hodnotami celočíselnými: 120
126
56
průměr 123
58
102
68
87
85
-1
17
1
rozdíl/2 57
85
86
-3
V druhém průchodu provedeme stejnou operaci s prvními čtyřmi hodnotami a soubor doplníme zbývajícími hodnotami z předchozího průchodu: 123
57
průměr 90
85
86
-3
-1
17
1
-1
-3
-1
17
1
rozdíl/2 86
33
Ve třetím průchodu postup opakujeme s hodnotami průměrů a opět zbylé hodnoty zkopírujeme z předchozího průchodu:
117
Kódování a komprese dat 90
86
33
-1
-3
-1
17
1
33
-1
-3
-1
17
1
průměr rozdíl/2 88
2
Následuje kvantování pro b =10, se zaokrouhlením dolů, které má charakter necitlivosti na malé hodnoty: 88
2
33
-1
-3
-1
17
1
0
0
0
1
0
y q sign( y) b 8
0
3
Vidíme, že výstupní posloupnost obsahuje řadu nul, takže je vhodná pro RLEkódování. Při dekompresi postupujeme opačně. Nejprve provedeme dekvantování, jednoduše vynásobíme hodnoty b : 8
0
3
0
0
0
1
0
30
0
0
0
10
0
y q b
80
0
Nyní provedeme první průchod inverzní diskrétní vlnkové transformace, první výstupní hodnota bude součtem posledního průměru a poloviny rozdílu, druhá jejich rozdílem, tady vidíme, proč bylo výhodné při kompresi rozdíly hodnot dělit dvěma: 80
0
30
0
0
0
10
0
30
0
0
0
10
0
a+b a–b
80
118
80
Kódování a komprese dat
V druhém průchodu uplatníme další dva rozdílové údaje a získáme čtyři průměry, opět první přičtením a druhý odečtením poloviny rozdílu: 80
80
30
0
0
0
10
0
80
80
0
0
10
0
a+b a–b
110
50
V posledním průchodu stejným postupem získáme osm výstupních hodnot: 110
50
80
80
0
0
10
0
50
50
90
70
80
80
7
5
a+b a–b
110
110
Porovnáním s původním souborem hodnot zjistíme rozdíly: 10
16
6
8
12
-2
Tyto rozdíly jsou v menší míře způsobeny výpočty s celými čísly a s tím spojenými zaokrouhlovacími chybami, ale především kvantováním. Proto může být vhodnější kvantování, které více potlačuje rozdílové koeficienty z prvního průchodu, méně z druhého a nejméně resp. vůbec z třetího průchodu.
9.4
Fraktální komprese
Jedním z nových směrů imprese je fraktální komprese. Jedná se o ztrátovou kompresi, která je vhodná pro složité předlohy s velkou barevnou hloubkou. Jejím základem je fraktální geometrie [3, 4, 7], která vznikla v šedesátých letech dvacátého století při řešení popisu přírodních objektů, kdy se klasická geometrie ukázala jako nedostatečná. Ukazuje se, že objekty v přírodě mají náhodný charakter, ale současně dodržují určitá pravidla. Průkopníkem fraktální geometrie byl Benoit B. Mandelbrot, který definoval její principy. Prostor, který budeme používat pro zobrazení má různé dimenze. Pro jednorozměrný prostor použijeme označení IR (IR1), pro dvourozměrný prostor IR2, třírozměrný prostor IR3 a obecně pro n-rozměrný prostor označení IRn. Metrický prostor (X, d) je uspořádaná dvojice, kde X je prostor a d je reálná funkce: d: X x X → IR, (112) která slouží k určení vzdálenosti dvou bodů x a y v X. Předpokládáme následující vlastnosti: 1. d( x, y ) d( y, x) x, y X (symetrie) 2. 0 d( x, y ) x, y X, x y 3. d( x, y ) 0 x, y X, x y (identita) 4. d( x, y ) d( x, z ) d( z, y ) x, y, z X (trojúhelníková nerovnost)
119
fraktální komprese fraktální geometrie
Kódování a komprese dat
Potom funkce d představuje metriku (funkci vzdálenosti) dimenzí prostoru X. Například: 1. V prostoru IR představuje d( x, y ) x y , x, y IR reálnou čáru s Eukleidovskou metrikou. 2. V prostoru IR2 představuje d( x, y ) x1 y1 x 2 y 2 , x, y IR 2 Eukleidovskou rovinu s Eukleidovskou metrikou. 3. V prostoru IR2 představuje d( x, y ) x1 y1 x 2 y 2 , x, y IR 2 Eukleidovskou rovinu 2
2
s Manhattanskou metrikou (taxikářskou). S fraktální geometrií úzce souvisí otázka měření dimenzí a členitosti objektů. Obvykle pracujeme s topologickou dimenzí, kterou můžeme chápat tak, že spojitým zobrazením přiřadí každé křivce přímce, každé ploše rovinu atd. Naproti tomu Hausdorfova dimenze je mírou členitosti objektu. Předpokládejme, že část křivky je rozdělena na N stejných částí, přičemž každá takto vzniklá část je stejná jako původní část křivky s tím, že je zmenšena v poměru r. Platí vztah N.r = 1. Pro čtverec rozdělený na N.N částí je N.r2 = 1, pro krychli obdobně N.r3= 1 atd., obecně je tedy dimenze d objektu exponentem zmenšovacího poměru: N.rd = 1. (113)
Hausdorfova dimenze fraktální dimenze soběpodobnost invariance vůči změně měřítka
Eukleidovské metriky předpokládají celočíselné dimenze objektů. Nás ale zajímá, co se stane, pokud dimenze d nebude celočíselná. Dimenze d pak bude představovat fraktální dimenzi. Logaritmováním předchozího výrazu pak získáme experimentální způsob určení Hausdorfovy dimenze, neboli fraktální dimenze: log N log N (114) d 1 log r log r Soběpodobnost (matematicky se tato vlastnost nazývá invariance vůči změně měřítka) je taková vlastnost objektu, že objekt vypadá podobně, ať se na něj díváme v jakémkoliv zvětšení. Soběpodobnost je hlavním znakem fraktálních útvarů a většinou je také považována za jejich definici. To nám také pomáhá při vyhledávání fraktálních útvarů v přírodě, a jak jistě tušíme, také při fraktální kompresi. Soběpodobné jsou například oblaka, hory, stromy, rostliny ale také krátery apod., tedy objekty živé i neživé přírody. Matematicky je soběpodobná množina definována následovně: Soběpodobná množina A ndimenzionálního Euklidovského prostoru IRn je taková množina, pro níž existuje konečně mnoho kontrahujících zobrazení 1 , ..., n takových, že A vznikne jako: n
A i A
(115)
i 1
Z toho vyplývá, že soběpodobná množina vzniká opakováním sebe sama při použití transformací jako je změna měřítka, rotace, posunutí, zkosení apod., jsou invariantní vůči změně měřítka apod. Princip opakování tvarů je přitom
120
Kódování a komprese dat v přírodě velmi častý, viz např. postupný růst schránky mlžů, tvořící archimedovu spirálu. Afinní transformace v IR je transformace f: IR → IR ve tvaru: f( x) a.x b, x IR ,
(116)
afinní transformace
kde a, b – reálné konstanty. Na daném intervalu I = (0, 1) představuje f(I) nový interval délky a . Levý krajní bod 0 intervalu je přenesen do b a f(I) leží nalevo nebo napravo od něj podle znaménka parametru a. Afinní transformace v IR2 je dvojdimenzionální transformace f: IR2 → IR2 ve tvaru: w( x, y ) (a.x b. y e, c.x d . y f ), x, y IR 2 , (117)
Kde a, b, c, d, e, f – reálné konstanty. Nebo v maticovém tvaru: x a b x e w . A.x T y c d y f
(118)
Kde matice A je deformační matice popisující otočení, zmenšení a zkosení, Matice T je translační vektor způsobující lineární posun. Inverzní afinní transformace je reprezentována následovně: x d b x d b e (119) w 1 . . c a f y c a y Za podmínky a.d b.c 0 Speciálními případy afinní transformace jsou dilatace (pro a = d jde o změnu měřítka): x a 0 x 0 (120) w . y 0 d y 0
121
dilatace změna měřítka
Kódování a komprese dat
y
d.y
y
x
x a.x
Obr. 32. Příklad afinní transformace – dilatace rotace
Dalším zajímavým případem afinní transformace je rotace: x cos sin x 0 w . y sin cos y 0
(121)
Jako podobnostní pak nazýváme afinní transformaci, pokud má některý z následujících tvarů: x r. cos r. sin x e w . , y r. sin r. cos y f (122) x r. cos r. sin x e w . . y r. sin r. cos y f Pro translaci (e, f), měřítko r dané nenulovým reálným číslem a úhel rotace α, kde 0 2 .
122
Kódování a komprese dat
y
translace, rotace, měřítko.
translace, rotace.
translace, rotace, zkosení.
x
Obr. 33. Příklad aplikace podobnostních afinních transformací Pro Eukleidovskou metriku d( x, y ) x1 y1 x 2 y 2 , x, y IR 2 můžeme každé afinní transformaci w přiřadit jediné reální číslo s: w x w(y ) s. x - y (123) 2
2
kde s je nejmenší možné reálné číslo, které splňuje výše uvedenou podmínku. Velikost koeficientu s je důležitá pro typ transformace: Pro s < 1 je w kontrakcí, s = 1 je w symetrií, s > 1 je w extrakcí. Jejich využití je základem fraktální komprese využívající systému iterovaných funkcí (IFS). Můžeme si ho představit jako kopírovací stroj (Multiple Reduction Copying Machine), který obsahuje skupinu čoček kopírujících a zmenšujících originální obraz pomocí kontrakční afinní transformace. Kopírovací stroj pracuje ve zpětnovazebním zapojení, neboli výstup z jedné iterace je vstupem do následující iterace. Obr. 34 ukazuje činnost této kopírky generující Sierpinského trojúhelník s transformacemi: x 0,5 0 x 0 w 1 . , y 0 0 , 5 y 0 x 0,5 0 x 0,5 w 2 . , y 0 0 , 5 y 0
(124)
x 0,5 0 x 0,25 w 3 . y 0 0 , 5 y 0,5
123
systém iterovaných funkcí
Sierpinského trojúhelník
Kódování a komprese dat w3
w1
w2
Obr. 34. Příklad postupné iterace generování Sierpinského trojúhelníku Pro aplikaci na kompresi černobílého obrazu rozšíříme afinní transformaci do podoby: x a b 0 x e (125) w y c d 0 . y f z 0 0 s z o Kde s a o slouží k modifikaci jasové složky. Algoritmus komprese nejprve rozdělí komprimovaný obraz na nepřekrývající se range bloky velikosti 8x8 (4x4) bodů pokrývající celý obraz. Následně se vyhledávají domain bloky, které jsou range blokům podobné a mohou se překrývat. Procházíme obraz zleva doprava, shora dolů s krokem k bodů a které mají dvojnásobnou velikost než range bloky. V každém doménovém bloku jsou průměrovány sousední body a jsou uloženy do nového doménového bloku stejné velikosti jako range blok. Novým doménovým blokem přepíšeme blok původní. Následně pro každý range blok Ri najdeme v souboru doménových bloků ten blok DB, který se mu nejvíce podobá. range bloky
domain bloky
Obr. 35. Princip rozmístění range a domain bloků v obrazu
124
Kódování a komprese dat Tabulka 5: Základní používané afinní transformace Popis Matice A Příklad transformace 1 0 0 0 1 0 Rotace o 0º 0 0 1 0
Rotace o 90º
1 0 0 0
Rotace o 180º
1 0 0 1
1
0
0
1 0
0
0
0 1
0 1 0
Rotace o 270º
Překlopení přes horizontální osu Překlopení přes vertikální osu Překlopení přes hlavní diagonálu Překlopení přes vedlejší diagonálu
1
0
0
0
0
1
1
0
0
0 1 0 0
0
1
1 0 0 0
1 0
0
0 1
0 1 0 1 0 0 0 0 1 0
1 0
1
0
0
0
0
1
Pro každý doménový blok Dj a transformaci wt (t = 1, 2, …, 8) se vypočte D tj wt (D j ) a podle následujících vztahů se určí koeficienty s a o:
125
Kódování a komprese dat n n n n d i ri ri . d i i 1 i 1 s i 1 2 n 2 n n d i d i i 1 i 1 o kvantizace
n 1 n ri s d i n i 1 i 1
(126a)
(126b)
Koeficienty s a o jsou následně kvantovány a pro kvantované koeficienty se podle následujícího vztahu vypočítá chyba podobnosti bloků E(D tj , R i ) : E(D tj , R i ) 2
n n n 1 n 2 n 2 r s s . d 2 d r 2 . o . d o . o . n 2 . d i i i i i i n i 1 i 1 i 1 i 1 i 1 (127)
Najdeme blok D tj s minimální chybou E(D tj , R i ) (t = 1, 2, …, 8) a v souboru doménových bloků najdeme nejpravděpodobnější blok: D B min ( D j ) t 1, 2 ,..., N D
(128)
Kde je ND – počet doménových bloků Výstupem je pak kód wi = (ei, fi, mi, oi, si). Posloupnost těchto transformací je možno následně komprimovat bezeztrátovou kompresí. Je zřejmé, že doba komprese bude značná, oproti tomu dekomprese probíhá i přes iterační postup výrazně rychleji.
Kontrolní otázky: 39. Jaké modely barev znáte a které jsou výhodné pro kompresi? 40. Jakým způsobem jsou do souboru ukládány stejnosměrný a střídavé koeficienty po použití diskrétní kosinové transformace? 41. Používá formát JFIF (JPEG) algoritmus bezeztrátové komprese? 42. K čemu slouží mateřská vlnka u diskrétní vlnkové transformace? 43. Co znamená soběpodobnost u fraktální komprese? 44. Jaké jsou základní používané afinní transformace? Shrnutí obsahu kapitoly V této kapitole jsme se seznámili se základními metodami ztrátové komprese. K tomu bylo nutné se seznámit s různými modely barev a převody mezi nimi. Seznámili jsme se s principy segmentace obrazu, použití diskrétní kosinové transformace a následné RLE komprese získaných koeficientů. Dále jsme se seznámili s diskrétní vlnkovou transformací a jejím použitím pro kompresi obrazu. Nakonec jsme si ukázali principy fraktální geometrie, základních afinních transformací a principů soběpodobnosti a jejich využití ve fraktální kompresi obrazu. Korespondenční úkol 6: 6. Vytvořte ukázkový blok 8x8 reprezentující jas bodů a prezentujte na něm použití diskrétní kosinové transformace, následné kvantování a RLEkomprese. Ukažte, jak se změní blok po dekompresi.
126
Kódování a komprese dat Příklad řešení úkolu K ukázce výpočtu DCT můžeme použít např. tabulkový kalkulátor MS-Excel. Nejprve určíme matici původních dat a upravíme ji odečtením 128:
Nyní je potřeba realizovat samotný výpočet diskrétní kosinové transformace. Výpočet probíhá pro každou výstupní hodnotu ve dvou cyklech, které můžeme realizovat na základě hodnot parametrů u a v, např. následovně:
127
Kódování a komprese dat
128
Kódování a komprese dat Např. pro hodnotu u = 7 a v = 0 získáme hodnotu -11:
129
Kódování a komprese dat Takto můžeme postupně získat hodnoty všech koeficientů a následně aplikovat kvantizační matici Q:
Inverzní operaci budeme realizovat obdobně a zjistit rozdíl dekomprimovaných dat oproti původním.
130
Kódování a komprese dat
10 Komprese videa a zvuku Cíl: Cílem celé kapitoly je představit základní postupy a principy používané při kompresi videa a zvuku.
Po jejím prostudování byste měli být schopni:
Porozumět principům komprese videa. vysvětlit základní principy používané při kompresi zvuku.
Klíčová slova této kapitoly: Vzorkovací perioda, podvzorkování, aliasing, komprese videa, komprese zvuku, vzorkování, kvantování, formát MPEG, formát MP3, kompresní poměr, časové maskování, frekvenční maskování, makroblok, prahová slyšitelnost, frekvenční maskování, časové maskování, Fourierova transformace, diskrétní kosinová transformace.
Doba potřebná ke studiu: 4 hodiny
Průvodce studiem Studium této kapitoly je nutné k pochopení základních algoritmů ztrátové komprese videa a zvuku. Na studium této části si vyhraďte čtyři hodiny. Zamyslete se nad popsanými principy používanými při kompresi videa a zejména zvuku.
131
Kódování a komprese dat
vzorkovací perioda aliasing
Výhody číslicového kódování obrazu a zvuku oproti analogovému jsou značné a vyniknou především při jeho přenosu. Nedochází ke zkreslení, přenos je odolný proti útlumu i proti šumům. Kvalita záznamu se nezhoršuje při běžném opotřebení nosiče, na kterém je uložen. Naproti tomu vznikají jiné problémy. Je to jednak omezení přenášených frekvencí daných vzorkovací periodou a typické projevy aliasingu (podvzorkování) jako je otáčení kol automobilu opačným směrem než odpovídá jízdě automobilu apod. Z našeho pohledu je největším problémem objem přenášených či ukládaných dat a řešení pomocí komprese.
10.1 komprese videa formát MPEG
Komprese videa – MPEG
Velký objem přenášených dat je největším problémem u videa. Příkladem je typický televizní signál. Běžná evropská norma pracuje s rozlišením 625 řádků na snímek. Kdybychom jako ekvivalent pro digitální přenos zvolili rastrový obraz s 600 řádky (tj. formát 800x600) v True Color, dostaneme 800x600x3 Byte na jeden snímek. Televizní obraz používá prokládané řádkování, při němž se v každém snímku střídavě přenáší jen liché nebo sudé řádky. Při běžně používané frekvenci 50 půlsnímků za sekundu by typický film o délce 100 minut vyžadoval přenos nebo uložení objemu dat: 800 x 600 x 3 x 25 x 60 x 100 ≈ 200 GB Dnes není k dispozici běžný nosič (CD-ROM, DVD), na který by bylo možné uložit 200 GB dat, a ani nelze takové množství dat přenášet televizním kanálem. Při použití JPEG komprese se sice objem dat sníží řádově na desetinu, ale i to je stále velmi mnoho pro uložení i pro přenos. Proto jsou vyvíjeny specifické metody komprese pohyblivého obrazu, které využívají skutečnost, že snímky jdou v poměrně rychlém sledu za sebou a mezi dvěma následujícími snímky se scéna většinou příliš nezmění. Při kompresi pohyblivého obrazu se samostatně kódují jen určité snímky a ostatní snímky se kódují pomocí jiného snímku nebo snímků tak, že se kódují rozdíly mezi snímky. Zkomprimovaný pohyblivý obraz je složen ze tří typů snímků, které jsou označíme písmeny I, P a B. Snímky B jsou v obrazu vždy po dvou za sebou a mezi nimi je vždy jeden snímek I nebo P. Jednotlivé typy snímků jsou: – I (Intra-frame) – je samostatný snímek zkomprimovaný metodou JPEG. – P (Forward-predicted frame) – je snímek kódovaný pomocí předchozího snímku typu P nebo I. – B (Bidirectional-predicted frame) – je snímek kódovaný pomocí předchozího a následujícího snímku typu P nebo I.
I
B
B
P
B
B
Obr. 36. Vytvoření snímku typu P
132
P
Kódování a komprese dat
Při kódování snímků P dochází ke ztrátě informace, čímž vznikají chyby, které se postupně kumulují. Proto vždy po třech snímcích P následuje znovu snímek typu I, každý dvanáctý snímek je tedy I.
I
B
B
P
B
B
P
B
B
P
B
B
I
B
B
P
Obr. 37. Vytvoření snímku typu I
I
B
B
P
B
B
P
Obr. 38. Vytvoření snímku typu B Při přenosu obrazu se oba snímky, ze kterých vzniká snímek B, z technických důvodů přenáší před ním. Tímto se snímky ve skutečnosti přenáší v poněkud jiném pořadí, než v obraze následují za sebou, viz obr. 39: předsunuté snímky
0
3
1
2
6
4
5
9
7
8
12 10 11 15 13 14
Obr. 39. Pořadí přenosu snímků Při kompresi snímků typu I metoda MPEG využívá skutečnosti, že oko je méně citlivé na změny barev. Barvotvorné složky chrominance Cb a Cr vždy čtyř sousedních bodů v obrazu jsou vzorkovány a je z nich vytvořena jedna hodnota Cb a jedna hodnota Cr. Při kompresi tak na 4 bloky 8×8 jasové složky Y připadá po jednom bloku 8×8 barevných složek Cb a Cr. Tím se redukuje počet komprimovaných hodnot a zvyšuje kompresní poměr.
133
chrominance
kompresní poměr
Kódování a komprese dat
Y
16 x 16 bodů
Y
Y
Y
Cb
Cr
Obr. 40. Vyjadřování jasové a barvotvorných složek makroblok
Snímky P jsou kódovány dopřednou predikcí. Tato predikce se postupně provádí pro jednotlivé makrobloky obrazu. Makrobloky mají velikost 16×16 bodů a reprezentují 16×16 hodnot jasové složky a po 8×8 hodnotách barevných složek. Nalezení predikce se provádí společně pro jasovou i barevné složky a má jednu až tři fáze: 1. Nejprve se hledá posunutí makrobloku kódovaného snímku vzhledem ke stejnému makrobloku předchozího (referenčního) snímku I nebo P, při kterém se obsah obou makrobloků buďto ztotožní nebo je mezi makrobloky nejmenší rozdíl. Jestliže se najde posunutí, při kterém se obsah makrobloků ztotožní nebo rozdíly mezi nimi nepřesahují určitou velmi malou prahovou hodnotu, kóduje se vektor nalezeného posunutí. 2. Jestliže v předchozím kroku nedošlo k zakódování predikce, postup v dalším kroku navazuje na jeho výsledky. Vychází z nalezeného vektoru posunutí, při kterém je rozdíl mezi makrobloky nejmenší. Jestliže tento rozdíl nepřesahuje určitou velikost, kóduje se rozdílový makroblok, jehož hodnoty jsou tvořeny rozdílem hodnot obou makrobloků, a příslušný vektor posunutí. Rozdílový makroblok se přitom kóduje stejným způsobem jako bloky u snímku I, tj. používá DCT, kvantování a na závěr statistické kódování. 3. Pokud rozdíly mezi makrobloky jsou velké a v druhém kroku proto nedošlo k zakódování, od predikce se upouští a obsah makrobloku se kóduje stejným způsobem jako u snímku typu I.
Makroblok předchozího snímku I nebo P
Původní poloha obsahu makrobloku
Vektor posunutí (predikce) obsahu makrobloku Makroblok aktuálního snímku P
Nová poloha obsahu makrobloku
Obr. 41. Vektor predikce makrobloku
134
Kódování a komprese dat Kódování snímku B probíhá prakticky stejným způsobem jako kódování snímku P s tím rozdílem, že predikce je v tomto případě obousměrná, tedy jde o interpolaci. Makrobloky kódovaného snímku se srovnávají s hodnotami, které jsou aritmetickým průměrem hodnot stejných makrobloků obou referenčních snímků P a I, ze kterých je snímek B odvozen. Zavedení snímků P a B značně zvýšilo účinnost komprese pohyblivého obrazu, protože kompresní poměr je u snímku P přibližně 2,5x vyšší než u snímku I a u snímku B je tento poměr dokonce až 14x vyšší než u I. Popsaný způsob komprese je obsažen ve standardech MPEG. Tento název je odvozen od označení pracovní skupiny Moving Pictures Experts Group, která se přípravě tohoto standardu věnuje. V současné době existuje již řada standardů, zejména: – Standard MPEG-1 (ISO/IEC 11172) používá nižší rozlišení obrazu 352×288, 30 snímků za sekundu. Je určen především pro uložení obrazu na CD-ROM a systémy do přenosové rychlosti 1,5 Mb/s. – Standard MPEG-2 (ISO/IEC 13818) má již rozlišení obrazu 720×576, 30 snímků/sec, což odpovídá úrovni standardní televize. Tento standard počítá i s přenosem televizního signálu (DBV) s vysokým rozlišením 1440×1152, 60 snímků za sekundu pro současný televizní formát 4:3 a 1920×1152, 60 snímků za sekundu pro širokoúhlý formát 16:9. – Standard MPEG-3 původně určený pro standard HDTV. – Standard MPEG-4 (ISO/IEC 14496) kódování audovizuálního obsahu s nízkou přenosovou rychlostí, rozšíření standardu MPEG-1. – Standard MPEG-7 (ISO/IEC 15938) a řada dalších. Komprese MPEG je výpočetně značně náročná záležitost a řeší se technickými prostředky. Dekomprese je sice již o něco jednodušší, přesto i tu na běžných počítačích lze programově realizovat jen pro obrazy se značně nízkým rozlišením, má-li probíhat v reálném čase. Přehrávání obrazu s většími rozlišeními, jako jsou standardy MPEG-1 a MPEG-2, je nutné zajistit technickými prostředky. V současnosti jsou již zcela běžně dostupné integrované obvody pro kompresi a dekompresi MPEG, což přispělo k přechodu na digitální televizní vysílání.
10.2
Komprese zvuku
V případě záznamů zvuku se rovněž projevuje omezení frekvenčního rozsahu uloženého signálu, proto pro špičkovou kvalitu zvuku zůstává v použití nadále analogový záznam (LP-desky), rostoucí obliba elektronických přehrávacích zařízení až po mobilní telefony však iniciovala rozvoj kompresních algoritmů i u zvukových záznamů. Ztrátová komprese zvuku je vedle komprese obrazu součástí standardů MPEG1 a MPEG-2, které byly krátce stručně popsány v předchozí kapitole. Ty specifikují tři postupy kódování zvuku, které se vzájemně liší složitostí a dosahovaným kompresním poměrem. Jsou označovány jako úroveň 1 až 3, přičemž úroveň 1 je nejjednodušší a má nejnižší kompresní poměr, zatímco úroveň 3 je nejsložitější a dosahuje nejlepší kompresní poměr, jak ukazuje tabulka:
135
MPEG
komprese zvuku
Kódování a komprese dat Úroveň 1 2 3 formát MP3 vzorkování kvantování
Kompresní poměr 1:4 1:6 až 1:8 1:10 až 1:12
Nejrozšířenější je úroveň 3, která je známá pod názvem MP3. Uvažujme, jaký objem dat představuje digitalizovaný zvuk v nekomprimované podobě. Zvuk získáváme z běžných zdrojů v analogové podobě. Nejprve je nutné ho převést do digitální podoby. To se provádí vzorkováním a kvantováním. Při vzorkování se v pravidelných intervalech měří amplituda (intenzita) zvuku. Aby digitalizací nedošlo ke zkreslení zvuku, musí měření amplitudy probíhat s frekvencí aspoň dvakrát vyšší, než je frekvenční rozsah měřeného signálu (Shannonův-Kotělnikovův vzorkovací teorém). Jestliže uvažujeme slyšitelnou oblast zvuku jako 20 Hz až 20 kHz, musí vzorkovací kmitočet být nejméně 40 kHz. U standardních zvukových záznamů na kompaktních discích se používá frekvence vzorkování 44,1 kHz. Dále se musí zvolit, jak přesně je při vzorkování měřena amplituda zvuku. Zatímco při digitalizaci obrazu stačilo 256 možných hodnot (8-bitové číslo), zvuk je nutné kvantovat přesněji. Kvantuje se s přesností 16-bitového čísla, tj. 65536 možných velikostí amplitudy. A(t) kvantování 65536 úrovní
vzorkování 44100x za sekundu
t
Obr. 42. Digitalizace zvuku Odtud můžeme vypočítat, kolik Byte má 1 sekunda digitalizovaného zvuku: 44100 x 2 = 88200 Byte Hodinový stereofonní záznam (2 kanály) bude mít velikost: 88200 x 3600 x 2 ≈ 635 MB To je přibližně kapacita běžného kompaktního disku. Při kompresi 1:10 bychom tak na disku mohli mít místo jedné hodiny uloženo 10 hodin hudby. Ztrátová komprese zvuku vychází z řady psychoakustických vlastností lidského ucha. Ty využívá k zanedbání těch informací ve zvuku, na jejichž změnu ucho není citlivé nebo které vůbec nepostřehne. Komprese se tak snaží výrazně snížit objem dat bez znatelného vlivu na kvalitu zvuku. V následujících odstavcích jsou popsány základní principy ztrátové komprese. prahová slyšitelnost
Využití prahové úrovně slyšitelnosti Lidské ucho zvuk slyší až od určité úrovně (hlasitosti), přičemž tato úroveň je pro různé tóny různá. Jak ukazuje následující graf, je ucho nejcitlivější na tóny v oblasti 2 ÷ 4 kHz.
136
Kódování a komprese dat
A(ω)
0
2
4
6
8
10
12
14
16
ω [kHz]
Obr. 43. Závislost prahu slyšitelnosti na frekvenci zvuku Uplatnit individuálně práh slyšitelnost a další psychoakustické vlastnosti ucha pro každý tón je technicky neschůdné. Proto se to řeší rozdělením kmitočtového spektra na dostatečný počet dílčích pásem. Standard MPEG používá dělení na 32 pásem. Úrovně 1 a 2 mají všechna dílčí pásma stejně široká (750 Hz), což je technicky jednodušší, ale méně účinné. Těchto 32 pásem pokrývá rozsah: 750 x 32 = 24 000 Hz Tomu odpovídá vzorkovací kmitočet 48 kHz používaný standardem MPEG. To je více, než vyžaduje oblast slyšitelnosti, jejíž hranice je u člověka typicky 20 kHz. Rezerva ve vzorkovacím kmitočtu je zvolena s ohledem na určitá technická omezení systémů, které způsobují, že ve skutečnosti kmitočtové spektrum je poněkud menší než polovina vzorkovací frekvence. Poznamenejme, že standard MPEG vedle 48 kHz má i nižší vzorkovací frekvence 44,1 kHz a 32 kHz. Úroveň 3 používá již dělení podle tzv. kritických šířek pásem, které umožňují účinněji uplatnit psychoakustické vlastnosti ucha. Kritické šířky pásem jsou pro nízké kmitočty malé (méně než 100 Hz) a směrem k vysokým kmitočtům se postupně zvětšují (až nad 4 kHz). Šířky pásem jsou voleny tak, aby psychoakustické vlastnosti všech tónů v každém z pásem byly přibližně stejné. Počet pásem použitých ve standardu MPEG byl zvolen tak, aby byl optimální jak z hlediska psychoakustických vlastností ucha tak z hlediska komprese.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
18 19 20 21
22
23
24
25
26
Obr. 44. Rozdělení akustického rozsahu na 32 pásem pro jednotlivé filtry
137
Kódování a komprese dat
frekvenční maskování
Maskování slabých zvuků silným zvukem (frekvenční maskování) Je všeobecně známo, že slabé zvuky vnímáme jen, je-li poměrně ticho. Jakmile se objeví silnější zvuk, slabší zvuky přestávají být slyšet. Říkáme, že silný zvuk maskuje slabší zvuky. Silný zvuk maskuje zejména ty zvuky, které jsou mu kmitočtově nejblíže. Křivka závislosti maskování zvuku na frekvenci v okolí hlasitého tónuje na následujícím obrázku. A(ω)
Hlasitý tón Oblast, ve které nejsou slyšet slabé zvuky (jsou maskovány hlasitým tónem)
ω
Obr. 45. Maskování slabých zvuků v okolí hlasitého tónu Je zřejmé, že křivka je strmější směrem k nižším kmitočtům. Proto také kritické šířky pásem při dělení popsaném v předchozím odstavci jsou voleny tak, že u nižších kmitočtů jsou pásma užší a u vyšších kmitočtů je naopak šířka pásem větší. Standard MPEG velmi výrazně využívá maskovacího efektu a kóduje jen ty zvuky, které jsou slyšet.
časové maskování
Maskování po silném zvuku (časové maskování) Když silný zvuk pomine, chvíli trvá, než lidské ucho začne vnímat slabší zvuky. Tuto setrvačnost ukazuje následující obrázek. A(t)
Hlasitý tón
Maskovaná oblast
0
5
10
15
20
25
30
35
40
t [ms]
Obr. 46. Časová závislost maskování slabých zvuků po ukončení hlasitého tónu Efekt maskování se vyskytuje nejen po silném zvuku ale i před ním. Ukazuje se, že mozek potřebuje na zpracováním sluchového vjemu určitý čas. Maskovací efekt před silným zvukem je 2 až 5 ms, po silném zvuku až 100 ms.
Využití vlastností stereofonního signálu Psychoakustických vlastností vjemu stereofonního signálu a korelací mezi oběma kanály se využívá dvěma způsoby:
138
Kódování a komprese dat – Některé veličiny se pro oba kanály kódují společně, což je úspornější, než kdyby se oba kanály kódovaly odděleně. To je využito ve všech třech úrovních standardu MPEG. – Využívá se určitých podobností mezi zvuky v obou kanálech nebo naopak skutečnosti, že některé rozdíly mezi nimi nejsou pro stereofonní vjem podstatné. Tyto skutečnosti využívá až úroveň 3 kódování MPEG.
Kódování a dekódování Kódování má tři fáze: 1. Nejprve se provede tzv. časově-frekvenční převod. Při něm se pro každých 32 vstupních vzorků vypočítá po jednom vzorku pro každé z 32 dílčích frekvenčních pásem. Vzorky se ve filtrech počítají z posledních 512 vstupních vzorků, jež jsou pro tento účel uchovávány ve vstupní paměti. To znamená, že před každým výpočtem se do vstupní paměti načte nových 32 vstupních vzorků, které v ní nahradí 32 nejstarších vzorků. Pro výpočet vzorků pro jednotlivá frekvenční pásma se ve filtrech používá diskrétní kosinová transformace nebo Fourierova transformace. 2. Následuje kvantování. Je to ztrátová fáze komprese. Používá se při ní řada tabulek, které obsahují psychoakustický model. Kvantování provádí maskování informací, které ucho nevnímá. 3. Poslední fází je Huffmanovo kódování. 32 vzorky
Vstupní paměť s 512 vzorky
Filtr 0
1 vzorek
Filtr 1
1 vzorek
… Filtr 31
1 vzorek
Obr. 47. Při každých 32 vstupních vzorcích každý filtr vypočítá jeden vzorek Dekódování má dvě fáze: 1. Dekódování Huffmanova kódu. 2. Frekvenčně-časový převod. Při něm se ze všech 32 dílčích frekvenčních pásem zpětně počítají zvukové vzorky. Dekódování je možné v reálném čase provádět programy na běžných počítačích. Výkon dnešních procesorů je dostatečný pro přehrávání zvuku komprimovaného úrovní 3. Dnes již jsou rovněž k dispozici integrované obvody pro dekompresi úrovně 3 (MP3).
139
MP3
Kódování a komprese dat
Kontrolní otázky: 45. Jak vzniká aliasing, co ho způsobuje? 46. Jaké typy snímků se vyskytují ve formátu videa MPEG? 47. Co znamená zkratka MPEG? 48. Co znamená vzorkování a co kvantování, jak se provádí? 49. Jak se dá při kompresi zvuku využít prahová úroveň slyšitelnosti? 50. Jaké druhy maskování se využívají při kompresi zvuku? Shrnutí obsahu kapitoly V této kapitole jsme se seznámili se základními principy komprese videa a zvuku. Byly popsány základní principy komprese MPEG, typy snímků, jejich pořadí a postup vytváření. U komprese zvuku byly ukázány základní principy vzorkování a kvantování při digitalizaci signálu, byly ukázány základní principy, využívající nedokonalost lidského sluchu, jako je frekvenční a časové maskování.
140
Kódování a komprese dat
11 Řešení úkolů 1. Z četností výskytu zpráv určíme pravděpodobnosti jejich výskytu, následně jejich informační obsah. Součet součinů pravděpodobností a informačních obsahů zpráv dává informační entropii zdroje: zpráva x četnost 1 10 2 12 3 25 4 5 5 10 6 13 7 15 8 10 100
k (x ) P(x )k (x ) 3,32 0,33 3,06 0,37 2,00 0,50 4,32 0,22 3,32 0,33 2,94 0,38 2,74 0,41 3,32 0,33 H= 2,87
P(x ) 0,1 0,12 0,25 0,05 0,1 0,13 0,15 0,1
2. Vezmeme si na pomoc průměrný informační obsah zprávy a vynásobíme jím počet přenesených zpráv, tím získáme přenosovou rychlost kanálu: -1
počet zpráv za sekundu průměrný informační obsah přenosová rychlost
650 [zpráv.s ] 2,87 [b] -1 [b.s ] 1865,5
3. K1: Kraftova nerovnost 1,375, není jednoznačně dekódovatelný. K2: Kraftova nerovnost 1,111, není jednoznačně dekódovatelný. K3: Kraftova nerovnost 0,815, je jednoznačně dekódovatelný i prefixový. K4: Kraftova nerovnost 0,666, je jednoznačně dekódovatelný není prefixový. 4. Podle předpisu pro Huffmanovu konstrukci kódu provádíme postupné redukce abecedy, následně označíme každé rozhodování a určíme kódová slova. Následně určíme jednotlivá kódová slova a součet součinů pravděpodobnosti výskytu zprávy a délky kódového slova určí střední délku kódového slova. Z ní a známé informační entropie zdroje určíme redundanci daného způsobu kódování: zpráva x četnost 3 25 7 15 6 13 2 12 1 10 5 10 8 10 4 5
P(x ) 0,25 0,15 0,13 0,12 0,1 0,1 0,1 0,05
0 1
zprávy 7,(8,4) 3 6,2 1,5
P(x ) 0,3 0,25 0,25 0,2
zprávy (6,2),(1,5) 7,(8,4) 3 0 1
zpráva x 1 2 3 4 5 6 7 8
kód 110 101 01 0011 111 100 000 0010
N(x ) 3 3 2 4 3 3 3 4
zprávy 3 7 8,4 6 2 1 5
P(x ) 0,25 0,15 0,15 0,13 0,12 0,1 0,1
0 1
P(x ) 0,45 0,3 0,25
zprávy (7,(8,4)),3 0 (6,2),(1,5) 1
zprávy 3 1,5 7 8,4 6 2
P(x ) 0,25 0,2 0,15 0,15 0,13 0,12
0 1
P(x ) 0,55 0,45
0 1
zprávy 3 6,2 1,5 7 8,4
P(x ) 0,25 0,25 0,2 0,15 0,15
0 1
P(x) P(x)N(x) 0,10 0,30 0,12 0,36 0,25 0,50 0,05 0,20 0,10 0,30 0,13 0,39 0,15 0,45 0,10 0,40 L= 2,90 0,03 R = L- H=
141
Kódování a komprese dat
5. Hammingovy vzdálenost d = 2, kód celkové kontroly parity jednoduché chyby, neopraví žádnou chybu.
objeví
6. Z kódových slov určíme lineárně nezávislá kódová slova a z nich sestavíme generující matici. Protože pořadí kódových slov v generující matici může být libovolný, uspořádáme je tak, aby tvořily jednotkovou matici. Z ní určíme kontrolní matici daného kódu. kódová slova 0000 0011 0101 0110 1001 1010 1100 1111
lineárně nězávislá kódová slova 0000 0011 0011 0101 0101 1001 0110 1001 1010 1100 1111
generující matice 1001 0101 0011
kontrolní matice 1111
7. Standardní dekódovací tabulka chyb. slovo třída 1. (kód) 0000 0011 0101 0110 1001 1010 1100 1111 třída 2. 1000 1011 1101 1110 0001 0010 0100 0111 Tabulka pro dekódování pomocí syndromů: ei s eTi 0000 1000
0 1
s1011 1, s1110 1, s1111 0 , potom dekódování probíhá následovně: 1011 1011 1000 0011 , 1110 1110 1000 0110 , 1111 1111 0000 1111 . 24. Protože se jedná o (7, 4)-kód, představuje informační slovo 1001 polynom u(z) = z6 + z3. Po dělení informačního slova generujícím polynomem g(z) = z3 + z + 1 získáme zbytek r(z) = z2 + z. Celé kódové slovo tedy bude v(z) = z6 + z3 + z2 + z (1001110). 8. Osoba ženského pohlaví narozená 14. 4. 2014 s pořadovým čísle 014 má informační část rodného čísla 145414014. Zbytek po dělení 11 je 9. Celé rodné číslo pak je: 1454140149. Což je číslo dělitelné 11 beze zbytku.
142
Kódování a komprese dat
12 Rejstřík A abeceda binární..................................12 kódová .................................18 Morseova .............................96 redukovaná ..........................21 zdroje ...................................13 zdrojová ...............................18 adresa blízká ...................................80 FAR .....................................80 NEAR ..................................80 vzdálená...............................80 afinní transformace.................121 dilatace...............................121 rotace .................................122 změna měřítka ...................121 aliasing ...................................132 ANSI.........................................80 array.................................viz pole ASCII .......................................80 automobil číslo......................................60
B Baud .........................................15 báze.....................................34, 46 binary digit ...............................10 bit................................................9 rotace ...................................72 skrytý ...................................75 znaménkový.........................70 zdvojení......................71 BMP .........................................83 bod............................................83 buffer ........................................89 Byte ............................................9
C CD-ROM................................132 cifra platná ...................................74 CRC..........................................52 cyklický kód .............................44
Č čárka řádová pevná ......................... 72 proměnná ................... 73 čárový kód ......................... 57, 61 časové maskování .................. 138 číslice kontrolní.............................. 56 číslo celé ...................................... 69 operace....................... 72 identifikační .................. 58, 60 iracionální ........................... 72 ISBN ................................... 56 ISSN.................................... 56 kód doplňkový............ 70, 74 inverzní ................ 71, 74 přímý ................... 70, 73 racionální ............................ 72 reálné................................... 72 exponent .................... 73 mantisa................. 73, 74 normování.................. 73 operace....................... 74 přesnost................ 73, 74 rovnost ....................... 77 rozsah......................... 73 rodné ................................... 56 rozsah přetečení .................... 71 číslo účtu.................................. 58
D data........................................... 68 struktura .............................. 68 dynamická ........... 68, 80 statická....................... 68 typ ....................................... 68 číselný.................. 69, 72 logický ....................... 69 množina ..................... 81 objekt ......................... 82 pole ............................ 80 soubor ........................ 83 143
Kódování a komprese dat struktura..................... 81 textový ....................... 79 ukazatel...................... 80 datová abstrakce ...................... 82 DCT ....................... 105, 134, 139 dědičnost .................................. 82 definice .................................... 68 deklarace .................................. 68 dekódovací tabulka .................. 38 dekódování hlasování ............................. 25 jednoznačné......................... 18 od konce .............................. 19 od začátku ........................... 19 pomocí syndromů................ 39 standardní...................... 35, 38 délka kódového slova .............. 12 dilatace................................... 121 dimenze fraktální ............................. 120 Hausdorfova...................... 120 diskrétní kosinová transformace105 diskrétní vlnková transformace114 dlaždice .................................. 115 doplněk .................................... 74 DTW ...................................... 114 duální kód ................................ 37 DVD....................................... 132
E EAN-13.............................. 57, 61 EAN-8................................ 57, 61 EBCOT kódování .................. 116 ekvivalentní systematický lineární kód ................................. 35, 37 epsilon počítačové ........................... 74
F file ............................... viz soubor FIR filtr .................................. 114 formát JPEG ................................. 104 JPEG 2000 ........................ 112 MP3................................... 136 MPEG ............................... 132 XML.................................... 83 fraktál..................................... 119 fraktální dimenze ................... 120 fraktální geometrie................. 119 144
fraktální komprese .................119 frekvence................................132 frekvenční maskování ............138 funkce mapovací .............................81
G generující matice ................34, 45 graf ...........................................87 grafika bodová .................................83 grupa ........................................38
H Hammingova vzdálenost..........23 Hammingův kód.......................40 rozšířený ..............................41 hartley ......................................10 Heiselbergův ..........................112
Ch chrominance ...................104, 133 chyba ..................................23, 75 náhodná ...............................14 násobnost.............................23 odhalení .........................14, 23 odstranění ............................14 oprava ..................................25 pravděpodobnost .................15 shluková ........................14, 52
I IBAN........................................59 IČ..............................................58 IČO...........................................58 Identifikační číslo.....................58 informace .................................68 číselná............................69, 72 entropie................................11 jednotka .................................9 kód.................................13, 68 logická .................................69 operátor ......................69 množina ...............................81 objekt...................................82 obsah....................................11 pole ......................................80 přenos ............................13, 23 rychlost.......................15
Kódování a komprese dat redundance.....................12, 86 soubor ..................................83 struktura...............................81 textová .................................79 ukazatel................................80 zdroj.....................................10 informační poměr .....................26 informatika .................................8 inverze ......................................71 ISBN.........................................56 ISMN........................................56 ISSN .........................................56
J jednotka informace ...............................9 násobná.......................10
K kanál analogový ............................14 bezpaměťový .......................14 bezšumový ...........................14 číslicový...............................14 diskrétní ...............................14 kvantovaný ..........................14 paměťový.......................14, 52 přenosový ............................14 spojitý ..................................14 šumový ................................14 Karnaughova mapa...................64 kód....................12, 17, 25, 34, 68 (15,11) .................................40 (3, 4) ....................................24 (3,1) .....................................40 (32, 21) ................................26 (5, 1) ....................................25 (7,4) .....................................40 (n, k) ....................................24 ANSI....................................80 ASCII.............................26, 80 báze................................34, 46 blokový ................................19 CRC .....................................52 cyklický43, 55, 67, 85, 101, 131 použití.........................52 realizace .....................50 čárový ............................57, 61 číselný doplňkový.............70, 74
inverzní ................ 71, 74 přímý ................... 70, 73 dekódování.......................... 18 duální .................................. 37 dva z pěti ............................. 25 Grayův ................................ 63 Hammingův ........................ 40 Huffmanův21, 96, 107, 108, 139 koktavý................................ 36 konstantní změny ................ 63 kontroly parity..................... 23 lineární ................................ 33 matice generující ............. 34, 45 kontrolní .............. 35, 46 maticový.............................. 34 minimální délka .................. 12 nejkratší............................... 20 optimální ....................... 20, 68 parita ................................... 23 dvourozměrná ............ 26 perfektní .............................. 40 polynom generující ................... 45 kontrolní .................... 46 polynomický ....................... 44 prefixový............................. 19 prostý .................................. 18 redundance .......................... 12 samoduální .......................... 38 Shannon-Fanův ................... 22 slovo.............................. 18, 68 stránka................................. 80 střední délka ........................ 12 systematický........................ 50 teorie ................................... 17 Unicode ............................... 80 vzdálenost ........................... 24 kódování ...................... 12, 13, 17 blokové................................ 19 EBCOT ............................. 116 prefixové ............................. 19 prosté................................... 18 systematické........................ 50 kódové slovo délka.................................... 12 minimální................... 12 střední ........................ 12 komprese aritmetická .................. 97, 107
145
Kódování a komprese dat dynamická.................. 98 statická....................... 98 bezeztrátová ...................... 102 fraktální ............................. 119 Huffmanův kód ................... 96 dynamický ................. 97 statický....................... 97 Lempel-Ziv ......................... 89 Lempel-Ziv-Welch.............. 91 obraz fraktální.................... 119 JPEG ........................ 104 JPEG2000 ................ 112 opakování znaků ................. 86 primární............................... 87 progresívní ................ 104, 112 Run-length........................... 87 sekundární ............... 87, 96, 97 sekvenční........................... 104 video.................................. 132 ztrátová.............................. 104 zvuk................................... 135 kontrolní matice ................. 35, 46 kontrolní polynom ................... 46 Kraftova nerovnost .................. 19 kvantování106, 116, 126, 134, 136 kybernetika ................................ 8
M makroblok .............................. 134 mapa Karnaughova ....................... 64 maskování časové................................ 138 frekvenční ......................... 138 mateřská vlnka ....................... 113 Haarova ............................. 113 Mexican hat....................... 113 matice...... viz pole-dvourozměrné generující............................. 45 kontrolní........................ 35, 46 řídká .................................... 81 Mc Millanova věta................... 20 minimální vzdálenost............... 24 množina ................................... 81 operace ................................ 82 potenční............................... 82 výčet hodnot........................ 82 model barev ........................... 102 CMYK............................... 103 146
HSB ...................................103 RGB...................................102 YCbCr .......................104, 133 MP3................................136, 139 MPEG ............................132, 135 myšlení .......................................8
N nat.............................................10 nerovnost Kraftova...............................19 normování ..........................73, 75
O objekt........................................82 objektově orientovaná analýza.82 objektově orientované databáze82 objektově orientované programování .......................82 objektově orientovaný návrh....82 objevování chyb .......................23 okruh polynomů .......................44 oparátor ....................................69 opravování chyb.......................24
P parita dvourozměrná......................26 lichá .....................................23 sudá......................................23 pixel..................................viz bod platná cifra ...............................74 počítačové epsilon....................74 podvzorkování........................114 pole...........................................80 dvourozměrné......................80 funkce mapovací....................81 jednorozměrné.....................80 prvek....................................80 rozměr..................................80 vícerozměrné .......................81 položka .....................................81 polynom generující.............................45 kontrolní ..............................46 poměr informační ...........................26 kompresní ....................86, 133 pravděpodobnost ........................9
Kódování a komprese dat prohledávání sekvenční .............................83 proměnná..................................68 definice ..........................68, 69 deklarace..............................68 inicializace ...........................69 NULL ..................................69 vytvoření..............................68 prvek...................................80, 83 přenos kanál ....................................14 řetězec..................................13 přetečení ...................................71 převzorkování.........................115
Q QM-coder ...............................107
R record....................... viz struktura redundance ...............................12 rodné číslo ................................56 rotace ......................................122 dolů ......................................72 nahoru ..................................72 rychlost modulační ............................15 přenosu ................................15 telegrafní..............................15
Ř řetězec.......................................80 přenosový ............................13 znak......................................80 pole.............................80
S samoduální kód ........................38 set .............................viz množina shannon.....................................10 Sierpinského trojúhelník ........123 signál diskrétní ...............................14 kvantovaný ..........................14 spojitý ..................................14 skrytý bit...................................75 slovo kódové ...........................18, 23 nekódové..............................23
syndrom .............................. 35 soběpodobnost ....................... 120 soubor ...................................... 83 formát.................................. 83 BMP........................... 83 prvek ................................... 83 přípona ................................ 83 sekvenční ............................ 83 textový ................................ 83 řádek .......................... 83 znak ........................... 83 typový ................................. 83 standardní dekódovací tabulka 38 stránka kódová................................. 80 string ........................... viz řetězec strom ........................................ 87 AVL .................................... 88 binární ........................... 88, 96 digitální ............................... 90 dynamický........................... 97 hrana.................................... 87 uzel...................................... 87 vyhledávací ................... 88, 96 struktura ................................... 81 datová.................................. 68 položka................................ 81 syndrom ............................. 35, 39 systém iterovaných funkcí ..... 123
T teorie informace .............................. 9 teorie kódů ............................... 17 text ........................................... 79 řetězec ................................. 80 znak..................................... 80 pole ............................ 80 transformace afinní ................................. 121 Fourierova......................... 112 Fourierova......................... 139 kosinová .................... 105, 139 vlnková...................... 112, 114 trídy kódu K............................. 38 třída.......................................... 82 typ datový.................................. 68 jednoduchý .......... 68, 80 kardinalita .................. 68 147
Kódování a komprese dat logický ....................... 69 složený................. 68, 80
U účet........................................... 58 ukazatel .................................... 80 ukrytí informací ....................... 82 UPC ......................................... 61 úroveň slyšitelnosti ................ 136 útlum...................................... 132
V vektor ..... viz pole-jednorozměrné věta Mc Millanova...................... 20 VIN .......................................... 60 vlnka mateřská ............................ 113 vlnková transformace ............ 112 vzdálenost Hammingova....................... 23 minimální ............................ 24
148
vzorkování......................132, 136
X XML.........................................83
Z zaobalení ..................................82 zásobník kruhový................................89 zdroj informace ........................10 zkreslení .................................132 změna měřítka ........................121 znak ..........................................80 kódový.................................18 pole ......................................80 zdrojový...............................18 znaménko .................................70 zdvojení ...............................71 zobrazení prosté ...................................18 zpráva .........................................8 zdroj.....................................10
Kódování a komprese dat
13 Vysvětlivky k používaným symbolům Průvodce studiem – vstup autora do textu, specifický způsob, kterým se studentem komunikuje, povzbuzuje jej, doplňuje text o další informace Příklad – objasnění nebo konkretizování problematiky na příkladu ze života, z praxe, ze společenské reality, apod.
Pojmy k zapamatování.
Shrnutí – shrnutí předcházející látky, shrnutí kapitoly. Literatura – použitá ve studijním materiálu, pro doplnění a rozšíření poznatků. Kontrolní otázky a úkoly – prověřují, do jaké míry studující text a problematiku pochopil, zapamatoval si podstatné a důležité informace a zda je dokáže aplikovat při řešení problémů. Úkoly k textu – je potřeba je splnit neprodleně, neboť pomáhají dobrému zvládnutí následující látky. Korespondenční úkoly – při jejich plnění postupuje studující podle pokynů s notnou dávkou vlastní iniciativy. Úkoly se průběžně evidují a hodnotí v průběhu celého kurzu. Úkoly k zamyšlení. Část pro zájemce – přináší látku a úkoly rozšiřující úroveň základního kurzu. Pasáže a úkoly jsou dobrovolné. Testy a otázky – ke kterým řešení, odpovědi a výsledky studující najdou v rámci studijní opory.
Řešení a odpovědi – vážou se na konkrétní úkoly, zadání a testy.
149
Kódování a komprese dat
150
Kódování a komprese dat
14 Literatura [1] [2] [3] [4] [5] [6] [7] [8]
[9] [10] [11] [12] [13] [14] [15] [16] [17] [18] [19] [20] [21] [22]
ADÁMEK, J. Kódování. Praha: SNTL 1989. 192 s. ADAMS R. Bar Code 1 Page [on-line].USA [cit. 2002-10-31]. HTML Format. Available from web:
ANSON, L. F. Komprese obrázků – fraktály. Bajt, 1993, č. 10, s. 99 - 103. ANSONOVÁ, L. & BARNSLEY, M. Kompresní metody pro grafiku. PC World, 1993, č. 3, s. 85. - 90. BAHENSKÝ, Z. Huffmanův kód. Elektronika, 1990, č. 1, s. 27-28. BENADIKOVÁ, A., MADA, Š. & WEINLICH, S. Čárové kódy: automatická identifikace. Praha: Grada, 1994, 252 s. ISBN 80-85623-66-8 BENEŠ, B. Fraktály. Bajt, 1991, č. 3, s. 15 - 17. BOGOMOLNY, A. Divisibility Criteria [on-line]. In Interactive Mathematics Miscellany and Puzzles. Poslední aktualizace: February 28, 2002. Dostupný z WWW: BOWKER, R. R. isbn.com [on-line]. USA [cit. 2002-10-31]. HTML Format. Available from web: . BŘEZINA, T. a kol. Informatika pro strojní inženýry I. Brno: ES VUT Brno 1991, 187 s. CORGE, CH. Elementy informatyki. Informatyka i myśl ludska. Warszawa: PW Naukowe 1981. (překlad z francouštiny) ČAPEK, J., FABIAN, P. Komprimace dat – principy a praxe. Praha: Computer Press, 2000. ISBN 80-7226-231-9. ČASTOVÁ, N. & ŠARMANOVÁ, J. Počítače a algoritmizace. Ostrava: VŠB Ostrava 1983. Data Protection Codes of Practice. Oxford (UK): Blackwell Publischers 1990. 126 s. DEUTSCH L. P. DEFLATE Compressed Data Format Specifications. [online] HTML formát [cit. 2002-11-24]. Dostupný www EAN ČESKÁ REPUBLIKA. Web information system. [on-line]. Praha: EAN Česká republika [cit. 2002-10-31]. HTML Format. Available from web: . EAN INTERNATIONAL. Web information system. [on-line]. USA: EAN International [cit. 2002-10-31]. HTML Format. Available from web: . ECBS IBAN: International Bank Account Number. Dokument EBS204 V 3.2, srpen 2003. EXPORT911. EAN Version 13 (EAN-13) [on-line]. USA [cit. 2002-10-31]. HTML Format. Available from web: . FARANA, R. Kapitoly ze základů informatiky. 1. vyd. Ostrava: VŠB-TU Ostrava, 2003. 108 s. ISBN 80-248-0265-1. FARANA, R. Zaokrouhlovací chyby a my. Bajt 1994, č. 9, s 243 – 244. Handbook of Data Communications. Oxford: Blackwell Publischers 1993.
151
Kódování a komprese dat [23] HÁTLE, J. & KAHOUNOVÁ, J. Úvod do teorie pravděpodobnosti. Praha: SNTL 1987. [24] HLAVIČKA, J., RACEK, S., GOLAN, P. & BLAŽEK, T. Číslicové systémy odolné proti poruchám. 1. vyd. Praha: Vydavatelství ČVUT, 1992, 330 s. ISBN 80-01-00852-5. [25] HYNEK, J. Komprese dat Huffmanovým kódováním. PC World, č. 8, 1994, s. 110- 112. [26] IVÁNEK, J. Základy kódování a kryptografie. Ostrava: Ostravská univerzita v Ostravě, 2006, 73 s. Studijní materiál pro distanční studium. [27] JANOUŠEK, R., KLIMEŠ, C. Kódování. Ostrava: Ostravská univerzita v Ostravě, 2005, 127 s. Učební text pro distanční studium. [28] JELÍNEK, J. Komprese dat. PC World, 1992, č. 12, s. 28 - 31. [29] JEŘÁBEK, A. Národní registrační systémy [on-line]. Praha: Národní knihovna ČR. Poslední úprava 2002-02-11. Dostupný z WWW: [30] KALUŽA, J., KALUŽOVÁ, L. & MAŇASOVÁ, Š. Informatika. 5. vyd. Ostrava: VŠB–TU Ostrava, 2000, 152 s. ISBN 80-7078-394-X. [31] KALUŽA, J., KALUŽOVÁ, L. & MAŇASOVÁ, Š. Základy informatiky v ekonomice. Ostrava: VŠB Ostrava 1992. [32] KAČMÁŘ, D., FARANA, R. Vybrané algoritmy zpracování informací. 1. vyd. Ostrava: VŠB-TU Ostrava, 1996. 136 s. ISBN 80-7078-398-2. [33] KELEMEN, J. AJ. Základy umelej inteligencie. Bratislava, Alfa 1992. [34] KLIKA, O. & LÉBL, M. Teorie diskrétních kódů. 1. vyd. Praha: NADAS 1968, 192 s. [35] KLÍMA, V. Metody zabezpečení dat. Chip, č. 8, 1993, s. 166-169. [36] KLÍMA, V. Metody zabezpečení dat - 2. Chip, č. 9, 1993, s. 212-215. [37] KONEČNÁ, P. Kódy a šifry – jejich matematický základ a historie. Ostrava: Ostravská univerzita v Ostravě, 2006, 83 s. [38] KÖNIGOVÁ, M. AJ. Matematické a statistické metody v informatice. 1. vyd. Praha: Státní pedagogické nakladatelství, 1988, 189 s. [39] KULIKOWSKI, J. L. Informacja i świat w którym żyjemy. Warszawa: PW „Wiedza Powszechna“ 1978. [40] LUHAN, J. PhotoStacker. Malý program na veliké obrázky. PC World, 1994, č. 2, s. 59 - 61. [41] MAŠTÁLKA, O. Obrázky v počítači. Chip, 1993, č. 12, s. 230 - 233. [42] MERTA, A. & MERTOVÁ, D. Anglicko-český slovník informatiky. 1. vyd. Praha: Ústředí vědeckých, technických a ekonomických informací, 1988, 215 s. ISBN 80-212-0000-6. [43] MOOS, P. Informační technologie. 1. vyd. Praha: Vydavatelství ČVUT, 1993, 200 s. ISBN 80-01-01048-1. [44] MOLNÁR, Z. Moderní metody řízení informačních systémů. Praha, Grada 1992. [45] MORKES, D. Komprimační a archivační programy. Brno: Computer Press, 1998. ISBN 80-7226-089-8. [46] NÁRODNÍ KNIHOVNA ČESKÉ REPUBLIKY. Web information system. [online]. Praha: Národní knihovna České republiky [cit. 2002-10-31]. HTML Format. Available from web: . [47] PIHAN, R. Fotoromán [on-line]. [cit. 2012-12-02] Available from web: .
152
Kódování a komprese dat [48] PODLUBNÝ, I. Počítať na počítači nie je jednoduché. PC World, 1994, č. 2, s. 112 – 115. [49] RAK R. Unikátní objektové identifikátory a obecný požadavek přesnosti dat – I. Data Security Management, 1998, r. II, č. 6, s. 16-18. [50] RAK R. Unikátní objektové identifikátory a obecný požadavek přesnosti dat – II. Data Security Management, 1999, r. III, č. 1, s. 14-17. [51] SLAVÍK, P. Komprese grafické informace a multimediální systémy. Softwarové noviny, 1994, č. 12, s. 19 - 24. [52] ŠARMAN, A., NĚMEC. M. Základy počítačové grafiky. Studijní texty. [cit. 2012-12-02] Ostrava: VŠB-TU Ostrava, 2007. Available from web: [53] ŠARMANOVÁ, J. Teorie zpracování dat. Ostrava, FEI VŠB-TU Ostrava, 2003, 160 s. [54] ŠMÍD, R. Úvod do vlnkové transformace [on-line]. [cit. 2012-12-02] Available from web: . [55] TURSKI, W. M. Propedeutyka informatyki. Warszawa, PW Naukowe 1989. [56] UHLÍŘ, J. & SOVKA, P. Číslicové zpracování signálů. 1. vyd. Praha: Vydavatelství ČVUT, 1995, 313 s. ISBN 80-01-01303-0. [57] VEČERKA, A. Komprese dat. Olomouc: Univerzita Palackého v Olomoci, 2008, 65 s. [58] VLČEK, J. Inženýrská informatika. 1. vyd. Praha: Vydavatelství ČVUT, 1994, 281 s. ISBN 80-01-01071-6. [59] VLČEK, K. Teorie informace, kódování a kryptografie. 1. vyd. Ostrava: VŠB–TU Ostrava, 1999, 184 s. ISBN 80-7078-614-0. [60] WIRTH, N. Algoritmy a štruktúry udajov. 2. vydání. Bratislava, Alfa 1989, s. 19 – 89. [61] ZELINKA, I., OPLATKOVÁ, Z., ŠEDA, M., OŠMERA, P. & VČELAŘ, F. Evoluční výpočetní techniky. Principy a aplikace. 1. vyd. Praha, BEN – Technická literatura, 2009. ISBN 978-80-7300-218-3.
153