380 likes | 502 Views
A digitális átvitel minőségének javítása kódolással. példa. A feladat, és megoldása.
E N D
A feladat, és megoldása Adott egy 4.25dB-es jel-zaj viszonyú rádiócsatorna, amin nagy biztonsággal adatot szeretnénk átküldeni. Az információ folyamot k=10 bites blokkokban kell kódolni, BPSK modulációt használunk, és a megengedett blokk-hibavalószínűség nem lehet több 2*10–5 -nél, amit hibajavító kódolással kell biztosítanunk. Tervezzük meg az adott kódot! Vizsgáljuk meg a rendszer spektrális hatékonyságát kódolással és kódolás nélkül! Megoldás: Adott tehát: 1. A csatorna jel-zaj viszonya: SNRdB=4.25dB 2. Az adatblokkok mérete: k=10bit 3. Az elérendő bithiba-valószínűség: ~2*10–5
A feladat, és megoldása Tudjuk, hogy BPSK moduláció mellett a csatorna bithiba-valószínűsége: A SNR=4.25 dB-t behelyettesítve a csatornánk bithiba-valószínűsége ~10–2. Írjuk fel, hogy miként számoljuk ki a blokk-hibavalószínűséget k=10 bites blokkok esetében (hibajavító kódolás nélkül): Behelyettesítve a blokk-hibavalószínűség kódolatlan esetben 10–1. Ezt kell följavítani 2*10–5 -re!
A feladat, és megoldása Oldjuk meg a feladatot Reed-Solomon kódolással! Azt kell kiszámolnunk, hogy mennyire kell választani a kódszóhosszt, hogy a kódnak elegendő legyen a hibajavító képessége ahhoz, hogy a kívánt javulást elérjük. Következőképpen gondolkozunk: tudjuk, hogy a RS-kód MDS tulajdonságú, ami alapján egyértelmű kapcsolatot tudunk adni az üzenethossz, kódszóhossz és a hibajavítóképesség között: Ha a kód t hibát tud javítani, akkor az n hosszú blokkok hibavalószínűsége: (Kódolt esetben egy üzenetblokk akkor hibás, ha t-nél több bit romlott el)
A feladat, és megoldása Tehát a megoldandó egyenlet n-re (k=10 esetén): amit nyilván csak próbálgatással tudunk megoldani. Ráadásul, mivel RS-kódokat használunk, n nem lehet akármilyen szám, csak q-1, ahol a kód GF(q) fölött értelmezett. n>k, így esetünkben GF(13), GF(17), GF(19), stb. jöhet számításba. A hatékonyság érdekében persze a legkisebb q-t kell választani. Némi számolás után kiadódik, hogy GF(17) , azaz n=16 választás esetén a kódolt blokk-hibavalószínűség 1.985*10–5, ami teljesíti az előírt feltételt.
A feladat, és megoldása Tehát a kezdeti feltételek teljesítéséhez egy RS(16,10) kódra van szükségünk. Ezen RS kód alkalmazása a GF(17) feletti aritmetika ismeretét igényli, amit a következőkben ismertetünk…
Reed-Solomon-kódok előállítása A (nem rövidített) Reed-Solomon kódok GF(q) ABC-fölötti, lineáris, ciklikus kódok. Ráadásul MDS-tulajdonságúak, vagyis dmin=n-k+1. Ilyen kódok generátor- ill. paritásellenőrző mátrixa: ahol a egy primitív elem GF(q)-ban. Mivel a GF(q) fölötti primitív elem (q-1)-dik hatványa 1, ezért az aq-1 hatványt már nem használhatjuk, hiszen egy ugyanolyan oszlopot eredményezne G-ben, mint amilyen már szerepelt (csupa 1-es), ezért n=q-1.
RS-kód GF(17) fölött A digitális csatorna „feljavítási” feladata során meghatároztuk, hogy célunkat elérhetjük egy 3 hibát javító, C(16,10) paraméterű RS-kóddal. Most egy ilyen kódnak megmutatjuk, hogyan adható meg a generátormátrixa. Keresni kell egy primitív elemet (olyan testelem, amelynek az egymást követő hatványai kiadják az összes testelemet). A 3 egy primitív elem GF(17)-ben. Az előbbi általános képletbe helyettesítve megkapható a generátor- ill. a paritásellenörző mátrix. (A generátormátrix második sorából kiolvashatók a primitív elem különböző hatványai). Megjegyzés: Vigyázzunk arra, hogy olyan esetekben, amikor ap –ben p>q, akkor nem ap mod q -t kell venni, hanem (ap)mod q-t kell kiszámolni, ami a p-szeri összeszorzását jelenti. Mivel aq-1=1, ezért ez megfelel annak, hogy a kitevőt mod (q-1) kiszámoljuk, és ezzel hatványozunk.
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 3 9 10 13 5 15 11 16 14 8 7 4 12 2 6 1 9 13 15 16 8 4 2 1 9 13 15 16 8 4 2 1 10 15 14 4 6 9 5 16 7 2 3 13 11 8 12 1 13 16 4 1 13 16 4 1 13 16 4 1 13 16 4 1 5 8 6 13 14 2 10 16 12 9 11 4 3 15 7 1 15 4 9 16 2 13 8 1 15 4 9 16 2 13 8 1 11 2 5 4 10 8 3 16 6 15 12 13 7 9 14 1 16 1 16 1 16 1 16 1 16 1 16 1 16 1 16 1 14 9 7 13 12 15 6 16 3 8 10 4 5 2 11 G = 1 3 9 10 13 5 15 11 16 14 8 7 4 12 2 6 1 9 13 15 16 8 4 2 1 9 13 15 16 8 4 2 1 10 15 14 4 6 9 5 16 7 2 3 13 11 8 12 1 13 16 4 1 13 16 4 1 13 16 4 1 13 16 4 1 5 8 6 13 14 2 10 16 12 9 11 4 3 15 7 1 15 4 9 16 2 13 8 1 15 4 9 16 2 13 8 H = Behelyettesítve a generátormátrix és a paritásellenőrző mátrix általános formulájába, megkapjuk a konkrét mátrixokat:
Kódoljuk most az u=[1,0,0,9] üzenetvektort! (Gyakorlásként leellenőrizhetjük, hogy a kapott c kódszót a paritásmátrixszal beszorozva tényleg 0 szindrómát kapunk-e.) A c kódszót átküldjük egy (memóriamentes) zajos csatornán, amely a kód szimbólumait adott valószínűséggel (a memóriamentesség miatt egymástól függetlenül) elronthatja. A tévesztés jellegét a hibavektor mutatja meg: ahol a hibavektorban nem 0 elem áll, ott hiba volt, méghozzá a hiba értékét a nem 0 szám mutatja meg. (A valóságban persze a hibavektort nem ismerjük, most a példa kedvéért mi magunk konstruáljuk, „hasraütészserűen”, modellezve a csatorna véletlen „hibázási kedvét”). Legyen a hibavektor:
RS-kód dekódolása Peterson-Zierler algoritmussal Először általánosan áttekintjük a PGZ dekódolás lépéseit, utána pedig a konkrét vett vektort fogjuk dekódolni. Feladatunk az, hogy az (n-k) dimenziós szindrómavektorból megkapjuk a legkisebb súlyú, n-dimenziós e hibavektort (majd e-t kivonva a vett vektorból megkapjuk azt a kódot, amelyik a legközelebb áll a vett vektorhoz). Nembináris esetben (márpedig az RS-kódnak csak nembináris esetben van érteleme) nem elegendő a hibahelyek meghatározása, hanem a hiba értékére is szükségünk van. További ismeretlen maga a hibák száma. Jelölések: t: a hibák száma, x-et hibahely lokátornak nevezzük, hiszen a szerinti logaritmusa a hibahely. y pedig a hiba értéke. (ij a j. hibahelyet jelenti, amely most a kódszó i. pozíciójában van)
A Peterson-Zierler algoritmus lépései 1. Számítsuk ki a szindrómát, s=[s1,s2,…,sn-k] 2. Keressük meg azt a legnagyobb r-t, amelyre Ur invertálható. Ekkor t=r. 3. Oldjuk meg az egyenletrendszert. Legyen L(x)=1+L1x+…+Ltxt az ún. hibahelypolinom. 4. Keressük meg L(x) gyökeinek az inverzeit, ezek lesznek az xj hibalokátorok.
5. Számítsuk ki a hibahelyeket a lokátorokból: 6. Végül a hiba értékeket megint egy egyenletrendszer megoldással kaphatjuk meg: Az yt vektorban pedig megkaptuk a hibaértékeket. Így az e hibavektort megszerkesztettük. Ezt kivonva a vett vektorból kapjuk a döntött kódszót.
Példa a dekódolásra Folytassuk az előbbi példát, a GF(17) fölötti RS-kód esetét. A vett vektort magunk konstruáltuk, önkényesen megadva egy hibavektort, hogy a dekódolás eredménye ellenőrizhető legyen. Ahogy korábban láttuk: 1. Először a szindrómát kell kiszámolni: Ebből rögtön látszik, hogy volt hiba az átvitelben, hiszen ellenkező esetben a szindróma a zérus vektor lenne.
2. A kódot úgy konstruáltuk, hogy 3 hiba javítására legyen alkalmas. Azután, hogy eldöntöttük, hogy volt hiba, először a hibák számát kell meghatározni. Ehhez meg kell keressük azt a legnagyobb r-t, melyre Ur determinánsa nem 0: Mivel U3 determinánsa sem 0, ezért t=3. (Megjegyezzük, hogy U4 kiszámítására nincs szükség – sőt nincs is elég szindrómakomponensünk a konstrukcióhoz, tehát elő sem lehet állítani – hiszen a kód úgyis csak 3 hibát képes javítani. Ennyi hiba dekódolásának van csak értelme (több hiba esetén a Hamming-távolság minimalizálásán alapuló dekódolás úgyis rossz eredményt adna).
3. Meg kell tehát oldanunk az alábbi egyenletrendszert: Megjegyzés: az eredményvektor elős komponense -st+1=-s4= -2 mod 17=15. segyenletrendszert. A megoldásnál ugyanúgy járunk el, ahogy azt a valós számoknál megszoktuk, azonban minden műveletet mod17 értelmezünk. (pl. a „mindkét oldalból kivonunk 2-t” helyett a „mindkét oldalhoz hozzáadjuk a 2 additív inverzét, azaz 15-öt” alkalmazzuk, stb. Az eredményvektor:
Az eredményvektorból megalkotjuk a hibahelypolinomot: 4. Most keressük meg az L(x) polinom gyökeit. (Itt be kell a polinomba helyettesíteni minden GF(17) beli elemet, véges test fölötti polinomokra nincs jobb megoldás. A gyökök: 1,6,12, hiszen L(1)=L(3)=L(6)=0. A gyökök inverzei lesznek a hibahely lokátorok (xij). Ezek: A hibahelyeket a lokátorok logaritmálásával kapjuk: Vagyis az 1., 2., és 4., pozícióban van hiba.
5. Hátra van még a hibaértékek meghatározása: A részletek mellőzésével a megoldás: 6. És végül a döntés: Visszalapozva látható, hogy sikerült kijavítani mindhárom hibát, és visszakaptuk ugyanazt a kódszót a dekódolás során, mint amit küldtek.
Mivel a kódunk nem szisztematikus, ezért az üzenetvektor megfejtése a dekódolt kódszóból nem egyszerű, nem lehet levágással megkapni. A megoldást (nagyméretű) táblázat jelentheti, vagy a véges test feletti Fourier transzformáció bevezetése oldja meg.
A spektrális hatékonyság Nézzük meg, hogy az RS(16,10) kódolással kapott blokk-hibavalószínűség, milyen ekvivalens (kódolatlan esetben) bit-hibavalószínűséget eredményez. Azaz feltesszük, hogy kódolatlan esetben így tehát kaptunk egy ekvivalens bit-hibavalószínűséget. Összehasonlítva a bit-hibavalószínűséget: megjegyzés: Kiszámolható, hogy kódolással ugyanazt értük el, mintha kódolás nélkül a rádiócsatorna jel-zaj viszonyát 4.25dB-ről 10.27dB-re javítottuk volna fel!
A spektrális hatékonyság Hasonlítsuk össze a spektrális hatékonyságot kódolt, illetve kódolatlan esetben. Ehhez, az SE=C/B deffiníciót alkalmazva, szükségünk lesz a csatornakapacitásra (C) és a sávszélességre (B), ami BPSK moduláció esetén közelítőleg ahol Rbit a bitsebességet jelöli. Ezen képletekbe behelyettesítve a bit-hibavalószínűségeket:
Hibajavítás BCH-kódokkal Az alábbiakban azt fogjuk megvizsgálni, hogy milyen bit-hibavalószínűség javulás érhető el csatornánk esetében t=2 hibát javító n=31 szóhosszúságú bináris BCH-kóddal! Adjuk meg a kód generátorpolinomját! Megjegyzés: Az itt szereplő tárgyalásmód – a gyakorlati szempontból legfontosabb – bináris BCH-kódokra vonatkozik. A teljesen általános tárgyalás a tankönyvben található meg.
Mi is a BCH-kód: definíció A GF(q) fölötti n=qm-1 hosszúságú kódot t hibát javító BCH kódnak nevezzük, ha a g(x) generátorpolinomjának (melyet most a GF(qm) testben értelmezünk) a gyökei az testelemek.
A generátorpolinom megalkotása Első ránézésre az előbbi definíció alapján nagyon egyszerűnek tűnhet a BCH kódok generátorpolinomjának megalkotása: keresni kell egy (primitív) elemet GF(qm)-ben, ennek elő kell állítani az i=1,2,…,2t hatványait, majd a képlet alapján adódik a generátorpolinom. A nehézséget az okozza, hogy olyan g(x) polinomot kell kapnunk a konstrukció során, amelynek együtthatói GF(q)-ban is értelmezhetőek, hiszen a kódunk GF(q) fölötti!
Ezt úgy érhetjük el, hogy a szükéséges gyökökön túl (esetleg) más gyököket is fölhasználunk a konstrukció során úgy, hogy az eredményül kapott g(x) polinom együtthatói GF(q)-ban is értelmes értékek legyenek. Ennek technikája a következő: Föl kell bontani a GF(qm) testelemeket ún. konjugált halmazokra, ami azt jelenti, hogy egy halmzaba a b testelemen kívül minden olyan elem beletartozik, amelyre igaz, hogy előáll a alakban úgy, hogy Megmutatható, hogy a konjugált halmazban levő gyökökből alkotott polinom együtthatói értelmezhetőek a GF(q) testben is. Tehát a g(x) generátorpolinomot úgy konstruáljuk, hogy a szükséges ai,…,a2t gyökökön túl minden olyan gyököt is beleveszünk a polinomba, amely az előbb felsoroltakkal közös konjugált halmazokban van benne.
A generátorpolinom meghatározása Először is szükségünk lesz a GF(32) szorzótáblájára, hiszen primitív elemet kell keresnünk, majd később a gyöktényezős alakot össze kell szoroznunk.
GF(32) szorzótáblája A testelemeket a 0-31 decimális számokkal ábrázoljuk, a szorzások elvégzéséhez viszont a bináris alakot, mint polinomot értelmezzük a következő (önkényes) összerendelés alapján: decimális ábr. bináris ábr. polinom ábr. 0 00000 0 1 00001 1 2 00010 x … 31 11111 x4+x3+x2+x+1 A primitív polinom: x5+x2+1
Ezután keresni kell egy primitív elemet GF(32)-ben. A továbbiakban a 2 primitív elemet használjuk !!! Megjegyzés: a hatványok a szorzótáblából gyorsan kiolvashatók: a2=a*a; an=an-1*a rekurzió segítségével.
Most a konjugált halmazok megkeresése a feladat: A korábban megadott szabály szerint a konjugált halmazokat úgy kapjuk meg, hogy kiválasztva egy b testelemet elkezdjük a 2., 4., stb. hatványaira emelni (bináris BCH esetében) és ezt addig folytatjuk, míg vissza nem kapjuk a testelemet. (Esetünkben ez a 32. hatványnál mindenképpen bekövetkezik).
A generátorpolinom összeállítása: Tudjuk, hogy a generátorpolinomnak gyöke kell legyen az a1, …,a2t azaz a,…,a4GF(32) testelemek, azaz esetünkben a 2, 4, 8, 16. Ahhoz, hogy a gyöktényezős alak összeszorzása után olyan polinomot kapjunk, ami binárisan is értelmezhető (azaz együtthatói 0 vagy 1 értékűek), a fentieken kívül minden olyan gyököt be kell vennünk a generátorpolinomba, amelyek a 2,4,8,16 elemekkel közös konjugált halmazban vannak, azaz az A2 és A6 halmazokban szereplő összes testelemet. Már most látszik, hogy a g(x) n-k-ad fokú polinom most 10-ed fokú lesz, így a kapott kód (31,21) paraméterű lesz.
A gyöktényezős tagok összeszorzása: Látható, hogy a g(x) első 5 és második 5 tagja (első sor) egy-egy konjugált-halmazhoz tartozó összes testelemből áll, ezért ezek összeszorzásakor (4. sor) már csak 0 ill. 1 együtthatójú polinomok szerepelnek. Vigyázzunk, hogy a szorzások (és összeadások) mind GF(32) fölött értelmezendők !!!
BCH-kódok generálása A kód generálás történhet: w nem szisztematiukusan a c(x)=u(x)g(x) szabály használatával. Pl. legyen az üzenetpolinom u(x)=1+x6. Ekkor c(x)=(1+x6)(x10+x9+x8+x6+x5+x3+1)= =x16+x15+x14+x12+ x11+ x10+x8+x7+x6+x5+x3+ 1 Vigyázat! u(x), c(x) bináris polinomok!!! (g(x)-et eredetileg GF(32) fölött értelmeztük, itt persze g(x)-et is binárisként értelmezzük) w vagy nem szisztematikusan a jegyzet 220. oldalán található szabály szerint.
BCH-kódok dekódolása A BCH-kódok dekódolására léteznek a PGZ algoritmushoz hasonló eljárások, ebben a témában viszont még mindig nagyon élénk a kutatás, mert nem létezik minden szempontból kifogástalan algoritmus. Ezek ismertetése meghaladja a Kódelmélet tárgy kereteit.
Feladatunk megoldása BCH kód esetében Nézzük meg miként alakul a spektrális hatékonyság a BCH kódolás esetében. Az előzőekben meghatározott BCH(31,21) kód t=2 hibát tud javítani. A már ismert szükséges képlet: Az előzőekhez hasonlóan, most is megkeressük azt a hibajavitás nélküli „ekvivalens” csatornát, amelyik ugyanazt a blokkhibavalószínűséget eredményezné: összevetve a két bit-hibavalószínűséget:
Feladatunk megoldása BCH kód esetében Ezen képletekbe behelyettesítve a bit-hibavalószínűségeket látható, hogy a kódolással közel kétszeresére növeltük a spektrális hatékonyságot:
RS(16,10) BCH(31,21) blokkhossz növ. (n-k)/k 60% 47.6% feljavított blokk-hibavalószínűség 1.985*10-5 3.65 *10-3 ekvivalens bit-hibavalószínűség 1.985 *10-6 1.74 *10-4 feljavított csatornakapacitás 0.99996 0.998 spektrális hatékonyság 0.667 bit/sHz 0.665 bit/sHz RS(16,10) és BCH(31,21) kódok összevetése