# Kódování Hlavní důvod pro kódování: - přizpůsobení zdrojových řetězců vstupní abecedě kanálu Další důvody: - efektivnější využití sdělovacího kanálu či paměťového média - zvýšení odolnosti dat proti rušení - šifrování zpráv **Kódování pro kanál bez šumu** - předpoklad: kanál je stoprocentně spolehlivý - zvyšuje efektivitu využití kanálu/média snižováním redundance - umožňuje bezeztrátovou kompresi dat **Kódování pro kanál se šumem** - vkládá do zpráv redundantní informace - za určitých pravděpodobnostních předpokladů umožňují - detekci chyb (detekční kódy) - opravy chyb (korekční = samoopravné kódy) **Kódování** - definice - $A = \{a_{1}, a_{2}, \dots, a_{r}\}$ - abeceda zdroje ($r$ prvků) - $B = \{b_{1}, b_{2}, \dots, b_{s}\}$ - vstupní abeceda kanálu (kódová abeceda, $s$ prvků) - $r > s$ + kódováním znaků rozumíme prosté (injektivní) zobrazení $K : A \to B^+$ + blokovým kódováním délky $n$ rozumíme zobrazení $K^* = A^* \to B^*$, jež je jednoznačně určeno kódováním znaků $K$ takto + $K^*(a_{1} a_{2} \dots a_{l}) = K(a_{1}) \cdot K(a_{2}) \cdot \dots \cdot K(a_{l}), \quad K^*(e) = e$ + podmínka jednoznačné dekódovatelnosti + kódování retězců $K^*$ je prosté zobrazení + každý blokový kód je jednoznačně dekódovatelný ### Prefixové kódování Prefixový kód je kód, ve kterém žádná kódová značka není začátkem jiné kódové značky. - každý prefix. kód je jednoznačně dekódovatelný - lze je dekódovat znak po znaku v reálném času přenosu bez nutnosti čekat na ukončení Dekódování zvládne konečný automat s výstupní funkcí Mealyho typu - **vstupní symboly**: vstupní abeceda kanálu - **výstupní symboly**: zdrojová adresa a o neutrální symbol $u$ - **množina stavů** odpovídá prefixům kódových značek s výjimkou kódových značek samotných - **počáteční stav** automatu S odpovídá předponě $e$ - přechodová funkce a výstupní funkce - pokud je zpracován symbol, který doplní předponu reprezentovanou aktuálním stavem na kódovou značku, přejde automat do stavu S s tím, že vygenerovaný výstupní symbol odpovídá značce - pokud doplněním nevzniká kódová značka, automat přejde do stavu odpovídajícímu nové předponě s tím, že na výstupu bude vygenerován neutrální symbol $u$ #### Kraftova nerovnost $s^{-d_{1}} + s^{-d_{2}} + \dots + s^{-d_{r}} \leq 1$ - $s$ - počet prvků kódové abecedy - $d_{i}$ - délka $i$-té kódové značky - $r$ - počet prvků zdrojové abecedy **Mc Millanova věta** - Každé jednoznačně dekódovatelné kodování splňuje Kraftovu nerovnost. Důsledek: - prefixové kódy lze chápat jako dostatečně obecnou reprezentativní podtřídu jednoznačně dekódovatelných kódů (mají nejjednodušší mechanizmus dekódování) - ke každému jednoznačně dekódovatelnému kódu existuje ekvivalentní prefixový kód #### Kódy s minimální střední délkou - pro efektivní využití kanálu vyžadováno, aby znaky s vyšší pravděpodobností měly menší délku a naopak - exaktní ukazatel = střední délka kódové značky - pro výpočet nutno znát pravděpodobnostní rozložení znaků zdrojové abecedy $$ A = \{ a_{1}, a_{2}, \dots, a_{r} \}, \quad P(A) = (p(a_{1}), p(a_{2}), \dots, p(a_{r})), \quad\sum_{i=1}^{r} p(a_{i}) = 1 $$ Střední délka kódové značky kódu $K$ definována jako $$\overline{d}(K) = \sum_{i=1}^r p(a_{i}) \cdot d(K(a_{i}))$$ - $a_{i}$ - písmeno zdrojové abecedy - $p(a_{i})$ - pravděpodobnost výskytu písmena $a_{i}$ ve zprávách - $K(a_{i})$ - kódová značka příslušející písmenu $a_{i}$ - $d(K(a_{i}))$ - délka kódové značky písmena $a_{i}$ **Huffmanův algoritmus konstrukce pref. kódu s min. střední délkou kódové značky** - **vstupy** - zdrojová abeceda $A$ o $r$ prvcích a její pravděpodobnostní rozložení $P(A)$ - kódová abeceda $B$ o $s$ prvcích - **výstup** - prefixové kódování $K : A \to B^+$ takové, že $\overline{d}(K)$ je minimální (tj. neexistuje jiíné kódování $K_{2}$, pro které by platilo $\overline{d}(K_{2}) < \overline{d}(K)$) - **algoritmus** 1. prvky zdrojové abecedy seřadíme podle jejich pravděpodobnosti $p(a_{i})$ do nerostoucí posloupnosti 2. takto seřazené prvky rozdělíme do skupin - začínáme od prvků s největší pravděpodobností - skupiny budou mít $s - 1$ prvků - výjimkou může být poslední skupina, která může mít $2 - s$ prvků 3. sdružíme prvky v poslední skupině a nahradíme je sdruženou skupinou, kterou zařadíme podle její součtové pravděpodobnosti na správné místo v posloupnosti 4. sdružíme posledních $s$ prvků v posloupnosti a nahradíme je sdruženou skupinou, kterou zařadíme podle její součtové pravděpodobnosti na správné místo do posloupnosti 5. bod 4 opakujeme, dokud nezískáme jedinou sdruženou skupinu se součtem 1 6. zpětným chodem po větvích $s$-árního stromu vytvořeného v bodech 3 až 5 přiřadíme kódové značky listům stromu, tj. znakům kódové abecedy ### Bezpečnostní kódy **Modelové důsledky šumu** - **záměna vyslaného znaku za jiný znak** - příčiny: vnější elmg. rušení, tepelný šum, kosmické záření, ... - **porušení synchronizace** (tj. ztráta znaku/vytvoření falešného znaku) - příčiny: chyba přenosového kanálu - bráno jako mimořádná událost, řešeno jinak než kódováním **Detekce chyb v kódech** - vložení redundance, například parity - všechny n-tice je možné rozložit na dvě třídy - **množina kódových značek** - přijato v pořádku nebo došlo k takové chybě, že se vytvořila jiná kódová značka (není ji možné detekovat) - **množina nekódových značek** - při přenosu došlo k chybě, kterou příjemce detekuje - společná vlastnost kódových značek může být např. sudý počet 1 ve značce (chybu v jedné pozici můžeme detekovat) - kód tedy detekuje jednoduché chyby + $t$-násobnou chybou rozumíme libovolnou chybu, kde je počet chybně přenesených prvků menší nebo roven $t$ + kód $t$-násobnou chybu detekuje právě tehdy, když je při přijmutí kódové značky s $t$-násobnou chybou vždy přijata nekódová značka #### Hammingova vzdálenost Hammingovou vzdáleností slov $u$ a $v$ stejné délky je počet pozic, ve kterých se slova liší. **Minimální Hammingovou vzdáleností** kódu $K$ je nejmenší Hammingova vzdálenost mezi dvěma kódovými značkami kódu $K$. - rozhoduje o tom, jaké chyby je kód schopen detekovat - značení $d_{0}$ Blokový kód s minimální Hammingovou vzdáleností $d_{0}$ detekuje všechny chyby s násobností $t k$, matice má tedy i $k$ lineárně nezávislých sloupců - pokud je lineárně nezávislých prvních $k$ sloupců $G$, vytvoříme matici $G'$ ekvivalentními řádkovými úpravami matice $G$ - tím získáme jinou bázi prostoru kódových značek generovaných maticí $G$, tedy jinou bázi téhož kódu - pokud prvních k sloupců matice $G$ není lineárně nezávislých, provedeme takovou permutaci sloupců matice $G$, abychom dostali nezávislé sloupce do prvních k pozic; pak vytvoříme systematickou matici $G'$ ekvivalentními řádkovými úpravami (sloupcově permutované) matice $G$ - v tomto případě budou množiny značek generované maticemi $G$ a $G'$ různé, ale bude mezi nimi existovat vzájemně jednoznačné zobrazení dané provedenou záměnou sloupců matice - kódy tedy budou ekvivalentní #### Perfektní kódy Lineární kód je perfektní pro opravu $t$-násobných chyb, jestliže všechna chybová slova váhy $\leq t$ jsou reprezentanty chybových tříd a neexistují žádné jiné chybové třídy. - každému syndromu přísluší jedinečný chybový vektor váhy $\leq t$ - každému chybovému vektoru váhy $\leq t$ přísluší jedinečný syndrom Perfektní kódy mají ze všech kódů pro opravu t-násobných chyb minimální redundanci. Existuje jich jen málo - Hammingovy kódy pro opravu jednoduchých chyb - Golayovy kódy pro opravu trojnásobných chyb - opakovací kódy s délkou značky $n = 2 \cdot t + 1$ pro opravu t-násobných chyb **Oprava chyb u opakovacích kódů** - předpokládejme systematický opakovací kód pro přenos čtyřprvkových informačních částí ($k = 4$) pro opravu dvojitých chyb ($t = 2$) - potřebná minimální vzdálenost: $d_{0} = 2 \cdot t + 1 = 5$ - potřebný počet opakování = 5 $\implies$ délka značky $n = 5\cdot k = 20$ - jeden informační prvek je roven (v případě bezchybného přenosu) všem jeho 4 kopiím - v případě chyby vybereme většinovou hodnotu **Golayovy kódy** - $G_{23}$ - pro opravu trojnásobných chyb - generující matice s rozměry 12/23 - čtvercová submatice $B$ řádu 11 vznikla cyklickými posuvy prvního řádku doprava - jedničky v prvním řádku na pozicích kvadrátů prvků tělese $Z_{11}$ (0, 1, 3, 4, 5, 9) - každý chybový vektor váhy $t \leq 3$ generuje jiný syndrom - kód tedy opravuje trojnásobné chyby - $G_{24}$ - vznikne rozšířením kódu $G_{23}$ o celkovou kontrolu parity - generující matice má rozměry 12/24 - v posledním řádku podmatice $B$ bude 11 jedniček - jako kontrolní matici lze použít $H_{24} = G_{24}$ **Reed-Mullerovy kódy** $K_{r,m}$ - třída nesystematických kódů, které umožňují opravy předem zadaného počtu chyb - současně jsou relativně snadné na dekódování - vytvoření generující matice - pro libovolná čísla $m \in N$ a $r \in N_{0}$, kdy $0 \leq r \leq m$, lze zkonstruovat matici o $n = 2^m$ sloupcích jako blokovou matici - do matice $G$ se postupně dávají řádky z matic $G_{0}, G_{1}, \dots, G_{r}$ - $G_{0}$ obsahuje samé jedničky - $G_{1}$ obsahuje polovinu nul a polovinu jedniček, poté další řádky, kde se poloviny opět rozdělují na poloviny - $G_{2}$ obsahuje součin 1. a 2., 2. a 3., 3. a 1. řádku matice $G_{1}$ - $G_{3}$ obsahuje součin 1., 2. a 3. řádku matice $G_{1}$ - obecně platí - $K_{0,m}$ - opakovací kód - $K_{m-2,m}$ - rozšířený Hammingův kód - $K_{m-1,m}$ - paritní kód - $K_{m,m}$ je $Z_{2}^n$, kde $n = 2^m$ #### Cyklické kódy Jsou zvláštním případem lineárních kódů. - platí vše, co pro lineární kódy + něco navíc S každou značkou $v \in K$ je prvkem kódu i cyklický posuv značky. Značky budou reprezentovány polynomy místo vektorů. - $v = [v_{0}v_{1}\dots v_{i}\dots v_{n-1}]^T$ - $v(x) = v_{0} + v_{1}x + \dots + v_{i}x^i + \dots + v_{n-1}x^{n-1}$ Násobení polynomů nad $x^n-1$: - řeší se tím problém přetečení při posunu doprava (násobení) - zavedeno speciální násobení $u(x) * v(x)$ - vlastnost $x^n = x^0 = 1$ **Generující mnohočlen** $g(x)$ - množina značkových polynomů tvořena všemi násobky generujícího - polymony $g(x), x \cdot g(x), \dots, x^{k-1} \cdot g(x)$ tvoří bázi kódu $K$ - generující mnohočlen je nerozložitelný a primitivní (je dělitelem polynomu $x^n - 1$) **Nesystematický cyklický kód** - matice je tvořena polynomem a jeho posunem doprava na každém dalším řádku - z tvaru matice $G$ je zřejmé, že se jedná o nesystematický polynom - řádky v matici: $b_{0}, b_{1}, \dots, b_{k-1}$ **Kódování informační části** - $v = \varrho(u) = u_{0} \cdot b_{0} + u_{1} \cdot b_{1} + \dots + u_{k-1} \cdot b_{k-1}$ - $v(x) = u_{0} \cdot g(x) + u_{0} \cdot x g(x) + \dots + u_{k-1} \cdot x^{k-1} g(x) = u(x) \cdot g(x)$ - u cyklických kódů přebírá úlohu generující matice generující mnohočlen $g(x)$ - informační část o $k$ prvcích převedeme na informační mnohočlen $u(x)$ - $u = [u_{0}u_{1}\dots u_{k-1}] \approx u(x) = u_{0} + u_{1} \cdot x + \dots + u_{k-1} \cdot x^{k-1}$ - zakódujeme: $v(x) = u(x) \cdot g(x)$ **Kontrola přijaté značky** - u cyklických kódů se používá místo kontrolní matice kontrolní mnohočlen - je jednoznačně určen generujícím mnohočlenem $g(x)$ - $h(x) = (x^n - 1) : g(x)$ - vždy beze zbytku - každý značkový polynom $v(x) \in K$ vyhovuje podmínce $h(x) * v(x) = 0$ - kontrolní matici sestavíme z koeficientů kontrolního mnohočlenu $h(x)$ - vložíme do prvního řádku od konce (postupně $h_{0}, h_{1}, \dots, h_{k}$) - na dalších řádkách posuneme o jednu pozici doleva #### Systematické cyklické kódy - tvoří se z nesystematických kódů - prvky vektorů indexujeme zprava - $u = [u_{k-1} u_{k-2} \dots u_{0}]$ **Kódování informační části** - tento mnohočlen se poté vynásobí členem $x^{n-k}$ - projeví se to doplněním nul zprava k informační části - vynásobený polynom se poté vydělí mnohočlenem $g(x)$ - pro podíl $q(x)$ a zbytek $r(x)$ poté platí - $u(x) \cdot n^{n-k} = q(x) * g(x) + r(x)$ - levá strana rovnosti po přičtení $-r(x)$ je násobkem generujícího mnohočlenu $g(x)$ - je mnohočlenem reprezentujícím **kódovou značku** - efektem je složení značky ze dvou částí - informační a zabezpečovací - kód takto vytvořený je proto systematický **Kontrola přijaté značky** - kontroluje se dělením generujícím mnohočlenem - zbytek vyjde nulový, pokud nedošlo k chybě **Důsledek cykličnosti** - umožňují detekovat shluky chyb - shlukovou chybou délky $b$ rozumíme takové chybové slovo $e$, jehož všechny chybové prvky ležé v úseku ohraničeném indexy $i$ a $i+b-1$, přičemž krajní prvky shluku jsou nenulové - **cyklické kódy detekují všechny shluky chyb délky $b \leq n-k$**