Monday, June 20, 2011

HW: Bezpecnostne kody

Bezpecnostny kod je taky kod, ktory sluzi k bezchybnemu prenosu dat. Niektore z tychto kodov dokazu nielen detekovat chyby, ale ich aj opravit. Mozme ich rozdelit do dvoch skupin a to

  • detekcne kody 
    To su kody, zistujuce chyby. Princip zistenia chyby spociva v zisteni, ci je prijate slovo kodovym slovom, alebo nie.
  • samoopravne kody 
    Kody, ktore v pripade detekcie chyby dokazu nahradit chybne slovo najpravdepodobnejsim kodovym slovom. 
Cast znakov bezpecnostneho kodu moze tvorit zobrazovana informacia. Takymto kodom sa hovori systematicky kod a uvedenej casti kodu nadavame informacna cast. Dalsia cast, kontrolna cast, je pridana kvoli detekcii a korekciam. Kod, ktoreho informacnu a kontrolnu cast nejde oddelit nazyvame nesystematicky kod.

Na vstupe mame povodne data a o velkosti k bitov. Tie prejdu koderom a vybehne kodove slovo b o velkosti n bitov (n > k). Slovo b je prenasane kanalom, kde moze/nemusi dojst k chybe e. Na konci kanalu je na vystupe prijate slovo c o velkosti n bitov. Ak doslo k chybe, tak c <> b, inak c == b. Slovo c prebehne dekoderom a odstrania sa kontrolne bity, kde sa moze najst chyba s priznakom s - to moze byt vlastne aj signal NOK/OK. Na vystupe dekoderu je povodne alebo opravene slovo d. 

Kanal, ktorym nam informacia moze pretiect moze byt
  • symetricky, kde chyba 0 -> 1 a 1 -> 0 sa mozu udiat s rovnakou pravdepodobnostou  
  • asymetricky, pravdepodnost ako v symetrickom kanali nie je fifty-fifty :)
  • bez pamate, chyby v susednych bitoch su nezavisle 
  • s pamatou, chyby susednych bitov su pravdepodobnejsie (po tom, ako nastane chyba jedneho z nich) 

Je dolezite zdoraznit, ze opravne a detekcne kody sa nepouzivaju len v telekomunikaciach, ale napriklad aj v pamatiach. Takze aj ten HW, na ktorom teraz tukam do klavesnice ma (a verim tomu, ze na viacerych miestach) nejaky algoritmus detekcie a opravy chyb. Napriklad Hammingov kod sa vraj pouziva v RAM-kach. 


Na obrazku je priklad kodu K1, K2 a K3. Kazdy z nich ma inu velkost a inak koduje data. Podstatne teraz je, kolkymi bitmi koduju informaciu. Na vstupe mame 2 bity, K1 a K2 su 3 bitove, K3 je 5 bitovy. K1 a K2 nam umoznia zistit jednu chybu, K3 umozni zistit dve chyby, alebo opravit 1 chybu (nie oboje!). 


Prikladom K3 moze byt prijate slovo 11100. Alfa sa lisi v 3 bitoch, Beta sa lisi v 4 bitoch, gama v 2 bitoch a delta v jednom bite. Najpravdepodobnejsie spravne slovo je delta. Pocet kodovych slov, ktore mozu vyhovovat mnozine je 2^k, kde k je pocet bitov povodnej spravy. 

Iste ste zaregistrovali istu redundantnost v prenasanych informaciach. Ta je nielen dolezita, ale aj nevyhnutna, pretoze detekovat a opravovat chyby dokazeme len v pripade, ze 
  • predpokladame limitovany pocet chyb 
  • doplnkove informacie musia byt zahrnute

Hammingova vzdialenost 
Hammingova vzdialenost je kodova vzdialenost 2 slov. Vzdialenost 2 slov je pocet odlisnych bitov. Kodova vzdialenost je minimalnou vzdialenostou dvojic kodovych slov, to znamena, v minimalne kolkych bitoch sa lisia jednotlive slova.  Takze napriklad 11100 a 01011 maju kodovu vzdialenost 4. 

Kodova vzdialenost v = d + o + 1, kde d je pocet chyb, ktore je mozne detekovat, o je pocet chyb, ktore je mozne opravit a plati, ze d => o. Takze pre v = 4 je mozne bud najst 3 chyby bez opravy, alebo detekovat 2 chyby a jednu opravit. 

Vaha slova w(b) je pocet jedniciek v slove b. Plati, ze hamingova vzdialenost dvoch slov (a, b) = w(a XOR b). 

Opakovaci (repeticny) kod (rm, m)
Repeticny kod je snad najjednoduchsim sposobom ako vytvorit bezpecnostny kod. Spociva v opakovanom prenose tej istej spravy. Jedna sa o detekcny kod a nie je schopny opravit chybu. Podla poctu opakovani r nazyvame kod repeticnym kodom r-teho stupna. Tento kod sa vyznacuje velkou redundanciou (rm - m) a malym informacnym obsahom. Trocha matematiky a priklad. 

Mame mnozinu informacii, ktora obsahuje vsetky usporiadane m-tice bitov. 
(a1 ... am) je povodnou informaciou 
(b11 ... b1r, b21, ... ,bmr) je zakom repeticneho kodu r-teho stupna, kde r = pocet opakovani. 

Vsimnite si, co sme to spachali, rozdelili sme informaciu do bitov a kazdy bit opakujeme. Predpoklada sa, ze v pripade, ze vsetko bude klapat, tak bude platit (0..9, m a r su indexy b a a). 

b11 = b12 = ... = b1r = a
b21 = b22 = ... = b2r = a
...
bm1 = bm2 = ... = bmr = am

Priklad pre m = 2 a r =2. n = rm = 4. 

 m      n                m znaci m-tice bitov a n je vlastne pocet opakovani * m-tice bitov = dlzka kodu pre  
00   0000            informaciu o dlzke m
01   0011
10   1100
11   1111

repeticny kod (5,1) by vyzeral asi takto
0     00000
1     11111

Chyba sa zisti tak, ze sa porovnaju data. Repeticny kod je systematickym kodom. Hammingova vzdialenost je r (pocet opakovani). 


Koktavy kod (jk, k)
Je kod, kde sa j krat opakuje k bitov s . Koktavy kod ma velku renundanciu (jk - k) a maly informacny obsah. Kodova vzdialenost slova je rovna j - a to je dolezita informacia preto, lebo potom vieme, kolko chyb mozme najst! 

Ak ho porovname s opakovacim kodom, tak vidime rozdiel. Koktavy kod "kokta" cele slovo a opakovaci kod opakuje jeden bit r-krat a potom dalsi bit r-krat. 



Kody zabezpecene paritou
Parita pridava k datam paritny bit. Tento bit je suctom vsetkych k bitov. 

Paritny bit je redundantny bit pridany k datovemu slovu a obsahuje tzv. paritnu informaciu o pocte jednickovych bitov v slove. Je urceny k jednoduchej detekcii chyb v slove. Pomocou paritneho bitu sa da identifikovat neparny pocet chyb v slove (neparny pocet bitov). 

Parita moze byt parna a neparna. Uplne po lopate by sme mohli povedat, ze parnost/neparnost je vlastne to, kam sa chceme dostat. Ak pouzivame parnu paritu, tak paritny bit je 1 ak je pocet 1-ovych bitov neparny a spravime ich tak parny. Ak pouzivame neparnu paritu, tak je paritny bit = 1 ak je pocet 1-ovych bitov parny. 

Pomocou parity zistime chybu, pretoze v pripade chyby nam nebude sediet parita. Ale to len v pripade, ze chyby sa nestanu 2 :). Paritny bit nam umozni zistit chybu, ale neumozni nam zistit, ktory bit je chybny. Zvykne sa pouzivat na prenos ASCII znakov, napriklad. ASCII znaky maju 7-bitov a s paritou 8. 

Priklad z wiki: 
Transmission sent using even parity:
A wants to transmit:          1001
A computes parity bit value:  1^0^0^1 = 0 
A adds parity bit and sends:  10010
B receives:                   10010
B computes parity:            1^0^0^1^0 = 0
B reports correct transmission after observing expected even result.
Transmission sent using odd parity:
A wants to transmit:          1001
A computes parity bit value:  ~(1^0^0^1) = 1
A adds parity bit and sends:  10011
B receives:                   10011
B computes overall parity:    1^0^0^1^1 = 1

A teraz priklad, ked mame dve chyby
A wants to transmit:          1001
A computes even parity value: 1^0^0^1 = 0
A sends:                      10010
*** TRANSMISSION ERROR ***
B receives:                   11011
B computes overall parity:    1^1^0^1^1 = 0
B reports correct transmission though actually incorrect.

Aby toho nebolo malo, tak existuje este nieco, co sa vola Cross-parity code, alebo horizontalne a vertikalne parity. 


Horizontalna parita p1 = a1 XOR a2, p2 = a3 XOR a4. Vertikalna parita p3 = a1 XOR a3 a p4 = a2 XOR a4. Informacia, ktora sa prenesie po kodovani je (a1, a2, a3, a4, p1, p2, p3, p4) a po prejdeni kanalom dostaneme informaciu c (vid obrazok na zaciatku). Pri dekodovani budeme robit znovu xor a to takto, s1 = c1 xor c2 xor c5, teda a1 xor a2 xor p1. Ak syndrom budu same 0-y, tak je vsetko OK a je hotovo. 

Tento kode je (8,4). Mozme napriklad paritny kod (9,4), kedy nam pribudne dalsia parita p5 a ta bude xor vsetkych hodnot. 

Chceme preniest informaciu 1,0,1,0 a pouzijeme cross-parity (8,4). Teda, informacia ma 4 bity a 4 budu na kodovanie. Hammingova vzdialenost bude 3.

1   0  | 1    
1   0  | 1
---------
0   0 

informacia (1,0,1,0,1,1,0,0) prejde kanalom a my musime zistit, co sme to dostali. Predpokladajme, ze pride v poriadku (1,0,1,0,1,1,0,0). 
s1 = 1 xor 0 xor 1 = 0
s2 = 1 xor 0 xor 1 = 0
s3 = 1 xor 1 xor 0  = 0
s4 = 0 xor 0 xor 0 = 0

Hammingov kod
Hammingov kod je linearny samoopravny kod. Pre kazdy integer m => 2 existuje kod s m paritnymi bitmi a 2^m - m - 1 datovymi bitmi. Takze, ak mame 0101, tak existuje kod so 4 paritnymi bitmi a 11 datovymi bitmi.  Hammingov kod je prikladom perfektneho kodu, kodu ktory presne vyhovuje teoretickej hornej hranici, co sa tyka cisla rozdielnych kodovych slov pre dany pocet bitov a schopnosti opravit chyby. 

Spravme si hammingov kod na priklade. Nech mame slova o 4-och bitoch a 3 paritne bity, teda Hammingov kod (7,4). Kodova vzdialenost v tomto pripade bude 3. 

informacia a = (a1,a2,a3,a4)
po kodovani bude b = (b1, ..., b7), kde 
b1 = a1 xor a2 xor a4 
b2 = a1 xor a3 xor a4 
b3 = a1
b4 = a2 xor a3 xor a4
b5 = a2
b6 = a3
b7 = a4

takze b1, b2, b4 bude parita. A teraz by nas asi malo zaujimat, ako sme na to preboha prisli. A odpoved nam da algoritmus hammingovho kodu:
  1. vsetky bitove pozicie, ktorych cislo je rovne mocnine 2 su pouzite ako paritne bity (1,2,4,8 .. )
  2. vsetky ostatne bitove pozicie su rovne kodovanemu slovu 
  3. kazdy paritny bit je vypocitany z bitov informacneho slova (niektorych)
Nasledne vygenerujeme genrujucu a kontrolnu maticu hammingovho kodu. A toto sme uz nerobili, takze to necham na inokedy ..