Adattovábbító csatorna Kódelmélet Adattovábbító csatorna Adókészülék Vevőkészülék Adó-Információs csatorna-Vevő A={a1,…,an} ábécé (véges szimbólumkészlet) Elsődleges közlés: ai1,…,ain jelsorozat
Adatátviteli csatorna Kapacitása (Jelkészlete): K={k1, k2,…kn}, általában |K|<|A| A jelkészlet átvitelének fizikai megvalósítása Adó-készülék Kódoló Modulátor Demodulátor Dekódoló Vevő-készülék Fizikai jelek Kódolt jelek Elsődleges közlés
Kétirányú adattovábbítás Adókészülék +kódoló +modulátor Vevőkészülék +dekódoló +demodulátor Vevőkészülék +dekódoló +demodulátor Adókészülék +kódoló +modulátor Adó+vevő=adóvevő Kódoló+dekódoló=kodek Modulátor+demodulátor=modem Def: ha a kódoló "aÎA elsődleges betűhöz a K halmazból vett Ka=<ka1, ka2,…, kan,> sorozatot rendel, akkor azt betű szerinti kódolásnak nevezzük. Bináris modell: K={0,1}
Def: Ka=<ka1, ka2,…, kan> sorozat: kódszó, {Ka} halmaz: kód, a az elsődleges közlésnek megfelelő kódszavak konkatenáltja pedig kódolt közlés Példa: A={a,b,c,d}, kód={00, 01, 100, 101} dac 10100100 a betű szerinti kódolása Def: H:A*{0,1}* kódolás, az A sorozataiból a K sorozataiba vivő függvény Def: H-1: {0,1}* A* dekódolás, a K sorozataiból az A sorozataiba vivő függvény Feltétele: ne legyen két olyan közlés, amit H ugyanabba a kódolt közlésbe visz át, vagyis H egy-egyértelmű Példa: A={a,b,c,d}, kód={00, 01, 11, 0001} nem egy-egyértelmű, mert ab0001, és d0001 Def: Ha H-1 létezik, azt mondjuk: a kód felbontható
Mikor felbontható egy kód: Ha a kódszavak hossza egyforma a kód felbontható Def: Egy kódot prefix kódnak nevezünk akkor, ha egyik kódszó sem valódi kezdőszelete a másiknak Tétel: a prefix kód felbontható Biz: Tfh. a K= {k1, k2,…, kn} kód nem felbontható. Ekkor létezik egy olyan S=<s1,s2,…,sn> sorozat, ami kétféleképpen <ak1,ak2,…,akn> és <al1,al2,…,alm> módon felbontható (dekódolható). Tfh. a két sorozat első különböző tagja az aki ill. az alj elemek, amelyekhez tehát ugyanaz a kód tartozik. A |H(aki)|<|H(alj)|, akkor aki alj valódi kezdőszelete, egyébként fordítva ellentmondás…
McMillan-féle egyenlőtlenség Tétel: Ha a K={k1,k2,…,kn} kód felbontható i=1Σn2-li<=1, ahol li a ki kódszó hossza. Biz: Emeljük fel az összeget a t-ik hatványra. (i=1Σn2-li)t=(i1=1Σn2-li1)*(i2=1Σn2-li2)*…*(it=1Σn2-lit)= (i1,i2,…,itΣ 2 –(li1+li2+…+lit))…, ahol 1<=ij<=n és 1<=j<=t Az li1+li2+…+lit hossz-sorozat nem más, mint az {ai1,ai2,…,ait} t hosszú elsődleges közlés kódolásának hossza. Jelöljük ezt L(ai1,ai2,…,ait)-vel. …=(ai1,ai2,…,aitΣ 2 –L(ai1,ai2,…,ait)), vagyis az összes t hosszú elsődleges közlésre összegzünk. Jelölje N(t,r) azoknak a t hosszúságú elsődleges közléseknek a számát, amelyre L(ai1,ai2,…,ait)=r, és legyen M a K beli kódszavak hosszának a maximuma. Ekkor t<=L(ai1,ai2,…,ait)<=M*t
(ai1,ai2,…,aitΣ 2 –L(ai1,ai2,…,ait))=(r=tΣM*t N(t,r)*2 –r)… Másrészt: N(t,r)<=2r, hiszen 2r-nél több szimbólum felbontható módon nem kódolható le r bittel. Ezért: …<=(r=tΣM*t 2r*2–r)=(r=tΣM*t 1)=(r=tΣM*t 1)=(M-1)*t+1 Vagyis tetszőleges t-re: (i=1Σn2-li)t<=(M-1)*t+1 Ha (i=1Σn2-li)>1 lenne igaz, akkor eléggé nagy t-re a fenti egyenlőtlenség nem állhatna fenn. Tehát (i=1Σn2-li)<=1 áll fenn.
Kódfa Olyan bináris fa, amely csomópontjaihoz vezető út megfelel a kódszavaknak. (pl. jobbra=0, balra=1) Prefix kód: csak a falevelekhez van kódszó rendelve Pl: A={a,b,c,d,e,f},H(A)={10,11,01,0011,0010,000} Dekódolás: a bejövő bitektől függően gyalogolunk a fán. Minden prefix kódhoz lehet kódfát létrehozni. a b c d e f 1
Optimális kódok Legyen A egy adatforrás ábécéje, amely az egyes jeleket egymástól függetlenül adja ki. Legyen a P={p1,p2,…pn} a kibocsátott jelek valószínűségeinek halmaza. Világos, hogy pi<1, és i=1Σn pi=1. Pl: magyar szövegre: pe<pq.Az e-t elég lenne kevesebb bittel kódolni, mint a q-t. Legyen L={l1,l2,…ln} a K kódkészlet kódhosszainak a vektora. (Csökkenthető-e) egy m hosszú közlés átlagos hossza: Lm=m*p1l1+m*p2l2+…+m*pnln=m*i=1Σm pi li Def: a L(K)=i=1Σm pi li összeget a K kód F forrás melletti költségének nevezzük. Rögzített F forrás mellett többféle K kód is létrehozható. Def: optimálisnak nevezzük a Ko kódot a F forrásra nézve, ha L(Ko)<=L(K)
Shannon-féle entrópia Tétel: Tetszőleges F forráshoz létezik optimális prefix kód L(Ko). ???De melyik az??? Def: Az F forráshoz tartozó H(F)=i=1Σn log(pi)/pi összeget a F forrás (Shannon-féle) entrópiájának nevezzük. Tétel: Az F forráshoz tartozó bármely felbontható K kódra L(K)>=H(F). Megjegyzés: Ha az eloszlás egyenletes (pi=1/n), akkor H(F)= i=1Σm 1/m*log(1/m)=log(1/m) ilyenkor az optimális kódfa egyenletes, magassága a kód költsége=log(1/m) a b c d 1
Egy kis filozófia Barkochba: kód: egy fogalom kitalálásához vezető kérdések száma. Mikor jók a kérdések? egy halmaz elemeinek a kiválasztásához szükséges információmennyiség szürke halmazokra (ha nincs előzetes információnk) költséges egyéniséggel rendelkező halmazelemek esetén (ha van előzetes információnk) olcsóbb ha nem készülünk fel (nem gyűjtünk előzetes infót), akkor többe kerül a kiválasztási művelet… kódfageneráláskor az igen/nem vlszségnek közel 50-50% kell lennie.
Optimális kód konstrukciója (Shannon-Fanno szuboptimális) Állítsuk sorba az elemeket és a vlszségeket. A Shannon-Fanno kódfa „oldalra nyomott” lesz (rövidebb kódokat kapnak a nagyobb vlszségű elemek, hosszabbakat a kisebbek) Shannon-Fanno: A fát a gyökerénél kezdjük építeni, osszuk fel a vlszségi listát kb. 50-50% arányban (stb. rekurzíve). 0.09 0.11 0.12 0.19 0.2 1
Az optimális kód Huffman féle konstrukciója Tétel: Az F jelforráshoz (A={a1,a2,…,an} ábécéhez és P={p1>=p2 >= … >= pn} eloszláshoz) létezik legalább egy K= {k1, k2,…, kn} optimális prefix kód, hogy l1<=l2<=…<=ln-1=ln, és az utolsó két kódszó a0, ill. a1, alakú. Biz: legyen Ko egy olyan optimális kód, amelyre az állítás nem igaz, vagyis létezik i<j pár, hogy pi>=pj, de li>lj. - Ha éppen pi=pj lenne, akkor a két elemet kicserélve egy másik olyan optimális kódot kapunk, amelyre eggyel kevesebb li>lj pár létezik. - Ha viszont pi>pj lenne, akkor ez és li-lj>0 összeszorzásával pi*(li-lj)>pj*(li-lj) pi*li+pj*lj> pj*li+ pi*lj vagyis a helycserével alacsonyabb költségű kódot kapnánk, ami viszont ellentmond a feltételnek ÁLLÍTÁS első fele
Tfh. (indirekt) ln-1<ln, vagyis a 2 leghosszabb kód nem egyforma hosszú. Legyen b az an ln-1 hosszú kezdőszelete. b nem lehet a kezdőszelete egyetlen más kódszónak, mert nem rövidebb. Ezek sem lehetnek b kezdőszeletei, mert akkor an kezdőszeletei is lennének. Ha ekkor kicserélnénk an-t b-ra, akkor egy olcsóbb kódot kapnánk, ami ellentmond a feltételnek a két leghosszabb kód egyforma hosszú, és csak az utolsó bitben tér el. Tétel: Legyen F jelforrás (A={a1,a2,…,an} ábécével és P={p1>=p2 >= … >= pn} eloszlással), és K={k1, k2,…,kn} optimális prefix kód. Tfh. pi= q1+q2. Ekkor a K’={k1, k2,…,ki-1,ki+1,…,kn,ki0 ,ki1} szintén optimális prefix kód lesz A={a1,a2,…,an,an+1} ábécével és P={p1>=p2>=pi-1 >=pi+1…>=pn>=q1>=q2} eloszlással. Biz: HF
Huffmann algoritmusa vlszlista sorbaállítása DO WHILE kételeműnél hosszabb a lista két legkisebb vlsz. összevonása összevont vlsz. Beillesztése LOOP a két elem a kódfa gyökere DO WHILE van összevont elem az összevont elemnél a kódfát felhasítjuk LOOP
1 0.2 0.2 0.6, 0.4 0.19 0.12 0.11 0.4, 0.37, 0.23 0.09 0.09 0.37, 0.23, 0.2, 0.2 HF: kiszámolni, hogy tényleg olcsóbb-e a Huffmann fa, mint a Shannon-Fanno. 0.2, 0.2, 0.23, 0.19, 0.18 0.2, 0.2, 0.19, 0.18, 0.12, 0.11 0.2, 0.2, 0.19, 0.12, 0.11, 0.09, 0.09
Zajos csatorna. Hibajavító kódolás Fix méretű kódszavakat (blokkokat), felbontható (prefix) kódokat vizsgálunk. a közlés mérete többszöröse a kódméretnek. Def: A csatorna legfeljebb t egyedi hibát okoz, ha a egy blokkban max ennyi hibás bit fordulhat elő. Pl: ha a legfeljebb 1 hiba fordulhat elő, akkor a kódolásban megduplázhatjuk a bitekethibafelismerő kódolás. Ha megtriplázzukhibajavító kódolás… Def: Legyen K={k1, k2,…,km} n blokkméretű kód. A log(m)/n arányt a kód sűrűségének nevezzük. Def: Az a és b n szélességű bitvektorok Hamming-távolságán a és b egymástól eltérő bitjeinek a számát értjük. Jelölése r(a, b). Példa: r(001, 111)=2
A Hamming távolság tulajdonságai 1. r(a,b)>=0 2. r(a,b)=0 a=b 3. r(a,b)=r(b,a) 4. r(a,b)<=r(a,g)+r(g,b) Biz: Jelölje P(a,b) azoknak a pozícióknak a halmazát, amelyekben a és b egymástól eltérnek. Ekkor P(a,b)=P(a,g) U P(g,b)ÁLLÍTÁS Az 1-4. Tulajdonságokat metrikának nevezzük. A Hamming távolság tehát metrika a bináris számok felett. Háromszög egyenlőtlenség
Def: Kódtávolságnak nevezzük és d(K)-val jelöljük egy K kód-beli szavak távolságának a minimumát. Példa: hibafelfedés nélkül: 1, hibafelfedéssel (dupla): 2, hibajavítással (tripla): 3. Tétel: Egy K kód pontosan akkor alkalmas t db. hiba felismerésére, ha d(K)>=t+1 Biz: tfh. az aÎK kódszóban legfeljebb t db hiba keletkezik, és így a b szót kapjuk. r(a,b)<=t, viszont a d(K)>t bÏK. Vagyis a hiba úgy ismerhető fel, hogy a beolvasott szó nem eleme a K kódnak. Indirekt: Ha d(K)<=t, akkor létezhet r(a,b)<=t. Ilyenkor viszont, ha a csatorna legfeljebb t hibát okoz, nem dönthető el, hogy b vételekor tényleg b-t adtak le, vagy a-ból változott azzá.
Példa: Álljon a B kód az n hosszú, páros számú 1-t tartalmazó kódokból Példa: Álljon a B kód az n hosszú, páros számú 1-t tartalmazó kódokból. d(B)=2 1 hiba felfedésére alkalmas. Elnevezés: paritásellenőrző kód. Def: Jelölje St(a) azon b szavak halmazát, amelyekre r(a,b)<=t. Ezt nevezzük a középpontú, t sugarú gömbnek. Ha St(a)ÇSt(b)<>Æ r(a,b)<=2t. Tétel: a K kóddal pontosan akkor lehet t hibát javítani, ha d(K)>=2t+1. Biz: Rajzoljunk a kódszavak köré t sugarú gömböt. Ezek nem metszhetik egymást. Legyen g egy olyan kódszó, amely a-ból legfeljebb t változtatással keletkezett. G mindenképpen beleesik egy St(a) gömbbe, és a diszjunktság miatt csak egybe eshet. A feladat tehát meghatározni a gömb középpontját. Indirekt: tfh. d(K)<=2t. Ekkor van olyan St(a) és St(b), amelyek nem diszjunktak, legyen a közös pont g. Ennek vétele esetén nem dönthető el, hogy a küldött szó a vagy b volt, vagyis nem tudjuk kijavítani a hibát.
Lineáris kódok Legyenek a={a1,a2,…,an} és b={b1,b2,…,bn} bináris n-esek. Def: Az a és b vektorok összege alatt a a+b={a1+b1, a2+b2,…,an+bn} vektort értjük. Def: Az a és b vektorok skaláris szorzata alatt a a1Çb1+a2Çb2+…+anÇbn szorzatösszeget értjük. (az összeg mod 2 értendő) Def: Ha q bináris konstans (0 vagy 1), akkor az a vektor q-val vett szorzata alatt a qa={qa1,qa2,…,qan} vektort értjük. (1*a=a, 0*a=0). Def: az a vektor w(a) súlya alatt az a vektorban levő nem nulla elemek számát értjük. Példa: w({1,0,0,1,1})=3, w({0,0,1,0,1})=2
Látható, hogy a Hamming távolságra: r(a,b)= w(a+b) Def: Egy K kódot akkor nevezünk lineárisnak, ha a,bÎK esetén a+bÎK is teljesül. Köv: A 0 kódszó minden lineáris kódnak eleme. Biz: az a+a 0-t ad ki. Def: Egy K kód w(K) súlya alatt a nem nulla kódszavainak a minimumát értjük. Tétel: Lineáris kódokra d(K)=w(K). Biz: Legyen a és b olyan kódszavak, amelyekre d(K)=r(a,b)=w(a+b)>=w(K) Másrészt, legyen gÎK olyan kódszó, amelyre w(K)=w(g). Ekkor: w(K)=w(g)=w(g+0)=r(g,0)>=d(K)
Egy kis lineáris algebra A lineáris kódok nem mások, mint a Bn n dimenziós vektortér alterei a kételemű (0,1 Boolean) test felett, ahol az összeadás mod 2 érvényes, és a skalárszorzás a konjunkciónak felel meg. Ha K n hosszúságú lineáris kód, akkor létezik k<=n szám, és léteznek a1,a2,…,an vektorok, hogy tetszőleges K-beli a kódszó felírható, mint az ai vektorok lineáris kombinációja, vagyis a=g1a1+ g2a2+… +gnan . ai-k helyett másik bi vektorrendszert választva a k szám nem változik. Biz: nélkül
Az ilyen tulajdonságú ai-k a K kód egy bázisát alkotják, k-t pedig a K kód dimenziójának nevezzük. Az ily módon kapott gi–k egyértelműek Az ai–k egymástól függetlenek, vagyis egyik sem írható fel a többi lineáris kombinációjaként. Ilyenkor |K|=2k. A K kód sűrűsége=k/n A K kód egy bázisát alkotó ai vektorokból képzett G=(a1/a2/…/ak) mátrixot a K kód generátormátrixának nevezzük. Tehát a K kód tetszőleges szava megkapható a generátormátrix alkalmas kombinációjaként.
Ha két vektor skaláris szorzata=0, akkor azt mondjuk, hogy merőlegesek (ortogonálisak) egymásra. Tétel: Legyen K egy m dimenziós, de n elemű lineáris kód. Ekkor léteznek olyan (b1,b2,…,bn-m) egymástól független vektorok, hogy egy aÎBn pontosan akkor aÎK is, ha (a, bi )=0 a fenti vektorokra. Vagyis: K az n-dimenziós Bn tér egy altere (síkja). Ilyenkor a síknak léteznek normálisvektorai, amelyek elemei a Bn térnek, de nem elemei a K kódnak (mert merőlegesek rá).
Jelöljük K^-sel (K-duálissal) a (b1,b2,…,bn-m) bázis által kifeszített kódot. K^ dimenziója n-m K^ független a (b1,b2,…,bn-m) bázis konkrét megválasztásától Ha bi=(bi1,bi2,…, bin), akkor a belőle felépíthető H=(b1/b2/…/bn-m)=((bi1,bi2,…,bin)/…/(bn-m1,bn-m2, …,bn-m n)) mátrix a K^ kód generátormátrixa. Ezt (a duális kód generátormátrixát) a K kód ellenőrző mátrixának is hívjuk. Azért ellenőrző, mert ilyenkor egy aÎK ha H*aT=((bi1,bi2,…,bin)/…/(bn-m1,bn-m2,…,bn-m n)) *(a1/a2/…/bn)=(0/…/0)
H*aT=a1*(b11/b21/…/bn-m 1)+…+an*(b12/b22/…/bn-m 2) =(0 /…/0) Vagyis, ha az aÎK a<>0 kódszó súlya t, akkor a H mátrixban van t összefüggő oszlopvektor, és fordítva: ha van a H mátrixban t összefüggő oszlopvektor, akkor van t súlyú kódszó (ennek elemei: a kiválasztott pozíciókon 1, máshol 0). Ha ennél többet választunk ki, akkor azok már bizonyosan összefüggők lesznek. Vagyis: d(K)>t ha a K kód ellenőrző mátrixából tetszőlegesen kiválasztva t oszlopot, ezek lineárisan függetlenek.
Hamming kódok Tétel: egy K lineáris kóddal pontosan akkor lehet t hibát kijavítani, ha a K ellenőrző mátrixában tetszőlegesen kiválasztva 2t oszlopot, ezek lineárisan függetlenek lesznek. Legyen a K kód blokkmérete n=2l-1. Álljon a K kód ellenőrző mátrixa az összes l hosszú, <>0 vektorból. Ilyenkor semelyik 2 oszlop nem lineárisan összefüggő, vagyis a kódtávolság d(K)>2, vagyis legalább 1 hibát javítani tudunk. Az ilyen kódokat Hamming kódoknak nevezzük. A Hamming kód dimenziója: n-l= 2l-l-1. A Hamming kód sűrűsége: (2l-l-1)/=2l=1-(l+1)/2l» 1-log(n)/n Ez lényegesen jobb, mint a korábbi példa
Példa: Legyen l=3, a blokkméret=23-1=7 Az ellenőrző mátrix: H=(0/0/1,0/1/0,0/1/1,1/0/0,1/0/1,1/1/0,1/1/1) Tfh aÎK, vagyis H*aT=0. Változtassuk most meg az a kódszó egy bitjét. Tfh az eredmény b=a+e, ahol e egyetlen 1 bitet tartalmaz a változtatás helyén. Ellenőrizzük, hogy b benne van-e K-ban? H*bT=H*(a+e)T=H*aT+H*eT=H*eT Ez utóbbi nem más, mint a H mátrix annyiadik oszlopa, mint ahol a változás történt. Pl. legyen a=(0,0,0,1,1,1,1), e=(0,0,0,1,0,0,0). H*bT=H*(0/0/0/1/1/1/1)+H*(0/0/0/1/0/0/0)=(0/0/0)+(1/0/0)=(1/0/0) Vagyis: ha a beolvasott kódszót megszorozzuk az ellenőrző mátrixxal, az eredmény közvetlenül megadja a hibás bit sorszámát.