diff --git a/KIV TI/04. Kódování.md b/KIV TI/04. Kódování.md new file mode 100644 index 0000000..e12ed0d --- /dev/null +++ b/KIV TI/04. Kódování.md @@ -0,0 +1,402 @@ +# 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$** +