Sunteți pe pagina 1din 12

Obiectivul lucrarii

In cadrul acestei lucrari vor fi explicate particularitatile algebrice ale codurilor


ciclice si modul de implementare al operatiilor de codare si decodare.

Aspecte teoretice

Particularitatile codurilor ciclice


Codurile ciclice reprezinta un caz particular al codurilor bloc. In plus fata de
caracteristicile specifice categoriei din care fac parte, codurile ciclice prezinta
proprietati algebrice ce le fac adecvate pentru detectia si corectia erorilor.

Particularitatea principala a codurilor ciclice consta in faptul ca, daca


v = [a0  a1   ⋯ an−1 ] reprezinta un cuvant de cod, atunci fiecare permutare
circulara vi a acestei secvente, vi = [ai  ai+1   ⋯ an−1  a0  a1   ⋯ ai−1 ] va
reprezenta la randul ei un cuvant de cod, i = 1 ⋯ n − 1, ai ∈ {0, 1} .

In consecinta, implementarile hardware si software ale acestor coduri vor avea


complexitate mai redusa decat in cazul codurilor grup.

Lucrarea are ca scop studiul codurilor ciclice binare. Coeficientii acestui tip de
coduri apartin campului Galois de ordin 2 - GF (2), deci ai ∈ {0, 1}. Ca
urmare, toate operatiile aritmetice ce vor fi mentionate sunt modulo 2.
Fiecare cuvant de cod de lungime n contine m biti de control si k biti de
informatie (n = k + m) . Bitii de control au ca scop detectia si corectia
posibilelor erori aparute in urma transmiterii secventei binare printr-un canal cu
perturbatii.

Codurile ciclice capabile sa corecteze o eroare si sa detecteze doua erori au


distanta de cod (distanta Hamming minima intre cuvintele codului)
dH min = 3 , iar intre lungimea acestor cuvinte si numarul de biti de control
exista relatia n = 2
m
− 1 .

Codarea ciclica se poate realiza atat in mod nesistematic (bitii de control vor fi
intercalati cu cei de informatie), cat si in mod sistematic (bitii de control vor fi
grupati inaintea bitilor de informatie).

Polinoamele asociate
Fiecarui cuvant de cod v i se asociaza un polinom v(x) ai carui coeficienti sunt
reprezentati de bitii codului, ai . Gradul maxim al polinomului este n − 1:
2 n−1
v(x) = a0 + a1 x + a2 x + ⋯ ⋯ an−1 x

Multimea Cn a tuturor cuvintelor binare de dimensiune n contine N = 2


n

elemente, si reprezinta inelul claselor de resturi modulo p(x), unde p(x) este
un polinom de grad n cu coeficienti binari. Pentru convenienta, acest polinom
se alege de forma:
n
p(x) = x + 1

Multimea Vn a tuturor cuvintelor de cod ciclic (cuvintele cu sens v) contine 2


k

elemente, si reprezinta un ideal in inelul Cn . Cuvintele de cod sunt generate pe


baza unui element de grad m al inelului Cn (m = n − k) , reprezentat prin
polinomul g(x), denumit polinom generator:
2 m−1 m
g(x) = g0 + g1 x + g2 x + ⋯ ⋯ gm−1 x + x
Se observa faptul ca polinomul g(x) este monic (coeficientul elementului de
grad maxim este 1). Acest polinom poate fi generator pentru codul ciclic daca
si numai daca este divizor al polinomului p(x):
p(x)
rest = 0
g(x)

Astfel, cuvintele cu sens sunt multiplii ai polinomului generator. Prin urmare,


daca v este un cuvant de cod, polinomul asociat v(x) este multiplu al
polinomului generator g(x). Permutarea circulara cu p pozitii a cuvantului este
reprezentata in clasa modulo p(x) prin polinomul xp v(x) , care implicit este
multiplu al lui g(x), deci permutarea circulara reprezinta la randul ei un cuvant
cu sens.

Celor k simboluri de informatie li se asociaza polinomul:


2 k−1
i(x) = i 0 + i 1 x + i 2 x + ⋯ ⋯ i k−1 x

Polinomul simbolurilor de control se scrie sub forma:


2 m−1
c(x) = c0 + c1 x + c2 x + ⋯ ⋯ cm−1 x

Raportul dintre polinomul p(x) si polinomul generator g(x) poarta denumirea


de polinom de control:
p(x)
h(x) =
g(x)

Gradul polinomului de control este egal cu k :


k
h(x) = h0 + h1 x + ⋯ ⋯ hk x

Evident, produsul dintre polinomul generator si polinomul de control este nul in


spatiul modulo p(x).

Matricea generatoare si matricea de control


Polinomul v(x) asociat fiecarui cuvant de cod poate fi exprimat ca o
combinatie liniara a polinoamelor:
2 k−1
g(x),  xg(x),  x g(x), ⋯ ⋯ , x g(x)

Matricea generatoare G contine pe fiecare linie i coeficientii polinomului:


i−1
x g(x), i = 1 : k
fiind formata din k linii si n coloane:
g0 g1 ⋯ gm−1 1 0 ⋯ 0 0
⎡ ⎤

⎢ 0 g0 ⋯ gm−2 gm−1 1 ⋯ 0 0 ⎥
⎢ ⎥
⎢⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯⎥
⎣ ⎦
0 0 ⋯ ⋯ ⋯ ⋯ ⋯ gm−1 1

Matricea de control este formata din m linii ce contin coeficientii polinomului


de control dispusi sub forma:
0 0 ⋯ 0 hk hk−1 ⋯ h0
⎡ ⎤

⎢ 0 0 ⋯ hk hk−1 ⋯ h0 0 ⎥
H = ⎢ ⎥
⎢⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯ ⋯⎥
⎣ ⎦
hk hk−1 ⋯ ⋯ ⋯ ⋯ ⋯ 0

Cele doua matrici sunt ortogonale:


T
HG = 0

Codarea ciclica

Codarea ciclica nesistematica


Polinomul asociat cuvantului de cod v(x) se obtine prin multiplicarea
polinomului de informatie i(x) cu polinomul generator g(x):
v(x) = i(x)g(x)

In cadrul cuvantului de cod, bitii de informatie vor fi intercalati cu cei de control.


Relatia de codare se poate scrie si sub forma matriceala:
v = iG

unde v este un vector linie ce contine bitii cuvantului de cod iar i este vectorul
linie format din coeficientii polinomului de informatie. Datorita ortogonalitatii
dintre matricea generatoare si matricea de control, relatia de codare devine
echivalenta cu:
T
Hv = 0

Exemplu
Fie codul ciclic C (6, 3) − n = 6, k = 3. Sa se identifice un polinom generator
pentru acest cod si sa se realizeze codarea nesistematica a mesajului
i = (1 0 1 ) .

Polinomul generator g(x) are gradul m=3 (m=n-k) si este divizor la polinomului
p(x) = x
6
+ 1 . Descompunerea polinomului p(x) in campul GF (2) care
contine cel putin un factor de grad 3 este:
3 3
p(x) = (1 + x )(1 + x )

prin urmare singura forma posibila a polinomului generator este:


3
g(x) = 1 + x

Polinomul asociat mesajului este:


2
i(x) = 1 + x

Codarea nesistematica se realizeaza prin multiplicarea polinoamelor g(x) si


i(x) :
3 2 2 3 5
v(x) = (1 + x )(1 + x ) = 1 + x + x + x

deci cuvantul de cod este v = (1 0 1 1 0 1) .

Codarea ciclica sistematica


Particularitatea codarii sistematice consta in faptul ca, in orice cuvant de cod v,
bitii de control cj , j = 0 ⋯  m − 1 vor fi grupati inaintea bitilor de informatie
ci , i = 0 ⋯  k − 1 :
v = (c0  c1   ⋯ cm−1  i 0  i 1   ⋯ i k−1 )

Polinomul asociat cuvantului de cod, v(x) se poate obtine pe baza


polinoamelor simbolurilor de cod si de informatie, c(x) respectiv i(x) , cu
ajutorul relatiei:
m
v(x) = c(x) + x i(x)

Tinand cont de faptul ca restul impartirii polinomului v(x) la polinomul de


control g(x) este nul, polinomul asociat cuvintelor de cod se poate calcula
astfel:
m
x i(x)
c(x) = rest
g(x)
Polinomul cuvantului de cod sistematic poate fi deci generat pe baza
polinomului simbolurilor de informatie i(x) si a polinomului generator g(x) cu
relatia:
m
x i(x)
m
v(x) = rest + x i(x)
g(x)

In esenta obtinerea unui cod ciclic in forma sistematica presupune parcurgerea


urmatoarelor etape:

1. premultiplicarea polinomului mesajului prin xm ;


2. calculul polinomului simbolurilor de control c(x);
3. formarea polinomului de cod.

Exemplu

Fie codul ciclic C (9, 6). Sa se identifice polinomul generator al acestui cod si
sa se realizeze codarea sistematica a mesajului i = (0 1 0 0 1 1) .

Mesajele contin k = 6 biti si sunt codate pe n = 9 biti. Gradul polinomului


generator este m = n − k , deci m = 3 . In plus, polinomul generator trebuie
sa fie divizor al polinomului p(x) = 1 + x
9
. Polinomul p(x) trebuie
descompus astfel incat sa contina cel putin un factor de grad 3:
3 3 6
p(x) = (1 + x )(1 + x + x )

Prin urmare exista o singura forma posibila a polinomului generator:


3
g(x) = 1 + x

Mesajul i are asociat polinomul:


4 5
i(x) = x + x + x

Pentru a realiza codarea sistematica a mesajului, trebuie determinat restul


impartirii polinomului x3 i(x) la polinomul generator:
4 7 8
x + x + x
2
c(x) = rest = x
3
1 + x

Cuvantul de cod care urmeaza sa fie transmis este:


3 2 4 7 8
v(x) = c(x) + x i(x) = x + x + x + x

Forma vectoriala a cuvantului de cod este v = (0 0 1 0 1 0 0 1 1) . Se observa


faptul ca bitii de informatie din vectorul i sunt grupati la sfarsitul cuvantului,
dupa bitii de control.
Codul ciclic Hamming (7,4)
Fie un cod ciclic binar ce contine k = 4 biti de informatie per cuvant de cod. Sa
se determine lungimea minima n a cuvintelor astfel incat codul sa fie corector
de o eroare, ec = 1 . Sa se identifice un polinom generator al codului si sa se
codeze mesajul i = (1 0 0 1) folosind matricea generatoare.

Pentru a putea corecta cel putin o eroare, intre numarul de biti de control m si
lungimea totala a cuvintelor de cod n trebuie sa existe egalitatea:
m
n = 2 − 1

Exprimand lungimea totala a cuvintelor in functie de parametrii m si k (


,
n = m + k k = 4 in cazul de fata) se obtine urmatoarea ecuatie:
m
2 = 5 + m

deci numarul de biti de control este m = 3 , iar lungimea totala a cuvintelor


n = 7 . Codul ciclic este deci de tipul C (7, 4).

Polinomul generator g(x) are gradul m = 3 , si trebuie sa fie divizor al


polinomului p(x) = 1 + x
6
. Polinomul p(x) poate fi descompus in campul
GF (2) astfel incat sa contina factori de grad 3 astfel:
3 2 3
p(x) = (1 + x)(1 + x + x )(1 + x + x )

Exista deci doua forme posibile ale polinomului generator. Vom alege varianta:
3
g(x) = 1 + x + x

In acest caz, matricea generatoare este:


1 1 0 1 0 0 0
⎡ ⎤

⎢0 1 1 0 1 0 0⎥
G = ⎢ ⎥
⎢0 0 1 1 0 1 0⎥
⎣ ⎦
0 0 0 1 1 0 1

Cuvantul de cod v asociat mesajului i se obtine cu folosind relatia:


v = iG

1 1 0 1 0 0 0
⎡ ⎤

⎢0 1 1 0 1 0 0⎥
v = (1001) ⎢ ⎥
⎢0 0 1 1 0 1 0⎥
⎣ ⎦
0 0 0 1 1 0 1
Cuvantul de cod astfel rezultat este v = (1 1 0 0 1 0 1) , bitii de informatie
fiind intercalati cu bitii de control.

Decodarea codurilor ciclice


In exemplul anterior, am evidentiat codurile ciclice C (7, 4) corectoare de o
eroare. Cuvantul de cod obtinut in cadrul acestei aplicatii este
v = (1 1 0 0 1 0 1) .

Presupunem ca aceasta secventa este transmisa printr-un canal cu perturbatii,


cuvantul receptionat la iesirea canalului fiind v′ = (1 1 1 0 1 0 1) , s-a eronat
pozitia 3. Stiind polinomul generator g(x) al codului, sa se identifice pe baza
secventei receptionate eroarea aparuta in cadrul transmisiei. Sa se decodeze
cuvantul receptionat si sa se verifice daca eroarea a fost corect identificata.

Polinomul generator al codului ciclic C (7, 4) a fost identificat sub forma:


3
g(x) = 1 + x + x

Polinomul asociat cuvantului receptionat este:


′ 2 4 6
v (x) = 1 + x + x + x + x

Pentru identificarea erorii, polinomul asociat sindromului reprezinta restul


impartirii polinomului secventei receptionate la polinomul generator:
2 4 6
1 + x + x + x + x
2
s(x) = rest = x
3
1 + x + x

Avand in vedere ca acest tip de cod poate fi aplicat pentru corectia erorilor in
cazul in care cel mult un bit al cuvantului a fost eronat receptionat, polinomul
asociat erorii va fi de forma:
l
ϵl (x) = x , l = 0 : n − 1

S-a aratat faptul ca restul impartirii polinomului eroare la polinomul generator


este egal cu sindromul. Se cauta deci valoarea exponentului l pentru care se va
indeplini aceasta conditie. Se obtine urmatoarea egalitate:
2
x
2
x = rest
3
1 + x + x

Prin urmare, forma estimata a polinomului eroare este:


2
ϵϵ (x) = x
ceea ce indica faptul ca al 3-lea bit al cuvantului a fost eronat receptionat.

Polinomul asociat cuvantului transmis se estimeaza ca suma dintre polinomul


cuvantului receptionat si polinomul eroare, obtinandu-se sub forma:
2 2 4 6
vϵ (x) = 1 + x + x + x + x + x

deci secventa decodata este vϵ = (1 1 0 0 1 0 1) . Se observa ca aceasta


secventa este identica cu cea transmisa, operatia de decodare generand
rezultatul anticipat.

Desfasurarea lucrarii - Implementarea codarii si


decodarii ciclice in Pyhton
Se genereaza un mesaj binar de lungime k urmarindu-se transmiterea acestuia
printr-un canal afectat de perturbatii folosindu-se un cod definit de polinomul
generator g(x) Pentru protectia la erori acest mesaj va codat ciclic pe
n = m + k biti unde m este numarul simbolurilor de control ce se determina
din marginea Hamming. Se vor studia posibilitatile de corectie si detectie ale
unor coduri Hamming pentru care se variaza parametrii, n, k si m.

Hamming (7,4)
Pentru codul Hamming (7,4) descris de polinomul $g(x) =1+x+x^3$ operatiile de
codare/decodare si marimile calculate sunt prexzentate mai jos.

import numpy as np
from LinearBlockCode import LinearBlockCode
from CyclicCode import CyclicCode

#definirea polinomului generator prin introducerea coeficientilor de la g0 
g = np.array([1,1,0,1])
cc = CyclicCode(g, 7) # C(g, n) unde g este pol generator iar n=m+k
cc.printInfo()
-> Linear Block Code Cb( 7 , 4 )
-> Message length (k): 4
-> Codeword length (n): 7
-> Coding rate (R = k/n): 0.5714285714285714
-> Minimum Distance (dmin): 3
-> Error Detection Capability: 2
-> Error Correction Capability (t): 1
-> Weight Distribution (A): [0 0 7 7 0 0 1]
-> Generator Matrix (G):

[[1 1 0 1 0 0 0]
[0 1 1 0 1 0 0]
[1 1 1 0 0 1 0]
[1 0 1 0 0 0 1]]

-> Parity Check Matrix (H):

[[1 0 0 1 0 1 1]
[0 1 0 1 1 1 0]
[0 0 1 0 1 1 1]]

-> Message Codeword Table:

Messages -> Codewords


[0 0 0 0] [0 0 0 0 0 0 0] m(X) = 0 c(X) = 0
[1 0 0 0] [1 1 0 1 0 0 0] m(X) = 1 c(X) = 1 + X + X^3
[0 1 0 0] [0 1 1 0 1 0 0] m(X) = X c(X) = X + X^2 + X^4
[1 1 0 0] [1 0 1 1 1 0 0] m(X) = 1 + X c(X) = 1 + X^2 + X^3 + X^4
[0 0 1 0] [1 1 1 0 0 1 0] m(X) = X^2 c(X) = 1 + X + X^2 + X^5
[1 0 1 0] [0 0 1 1 0 1 0] m(X) = 1 + X^2 c(X) = X^2 + X^3 +
[0 1 1 0] [1 0 0 0 1 1 0] m(X) = X + X^2 c(X) = 1 + X^4 + X^
[1 1 1 0] [0 1 0 1 1 1 0] m(X) = 1 + X + X^2 c(X) = X + X^3 + X^
[0 0 0 1] [1 0 1 0 0 0 1] m(X) = X^3 c(X) = 1 + X^2 + X^6
[1 0 0 1] [0 1 1 1 0 0 1] m(X) = 1 + X^3 c(X) = X + X^2 + X^
[0 1 0 1] [1 1 0 0 1 0 1] m(X) = X + X^3 c(X) = 1 + X + X^4
[1 1 0 1] [0 0 0 1 1 0 1] m(X) = 1 + X + X^3 c(X) = X^3 + X^4 +
[0 0 1 1] [0 1 0 0 0 1 1] m(X) = X^2 + X^3 c(X) = X + X^5 + X^
[1 0 1 1] [1 0 0 1 0 1 1] m(X) = 1 + X^2 + X^3 c(X) = 1 + X^3 + X^
[0 1 1 1] [0 0 1 0 1 1 1] m(X) = X + X^2 + X^3 c(X) = X^2 + X^4 +
[1 1 1 1] [1 1 1 1 1 1 1] m(X) = 1 + X + X^2 + X^3 c(X) = 1 +

-> Parity Check Equations:

c0 = m0 ⊕ m2 ⊕ m3
c1 = m0 ⊕ m1 ⊕ m2
c2 = m1 ⊕ m2 ⊕ m3
c3 = m0
c4 = m1
c5 = m2
c6 = m3

-> Syndrome Vector Equations:

s0 = r0 ⊕ r3 ⊕ r5 ⊕ r6
s1 = r1 ⊕ r3 ⊕ r4 ⊕ r5

Hamming C(7,3)
Un cod ciclic liniar binar C(n, k) are lungimea codului n = 7 și polinomul
generator $g(X) = 1 + X^2 + X^3 + X^4$$g(X) = 1 + X^2 + X^3 + X^4$.

1. Aflati rata codului, scrieti matricea generatoare si matricea de control în


formă sistematică și identificati distanța Hamming pentru acest cod.
2. Dacă toate simbolurile de informații sunt „1”, care este cuvantul de cod
corespunzător?
3. Găsiți sindromul corespunzător unei erori pentru primul simbol de
informatie și arătați că codul este capabil să corecteze această eroare.

C(n,6)
Fie un cod ciclic ce contine $k=6$$k=6$ biti de informatie, avand polinomul
generator de forma $g(x)=1+x+x^2+x^3+x^4$$g(x)=1+x+x^2+x^3+x^4$.

1. Sa se identifice lungimea totala a cuvintelor de cod. Cate erori poate


detecta si corecta acest tip de cod?
2. Sa se realizeze atat codarea nesistematica cat si cea sistematica a
mesajului $i = (1 1 0 1 0 0)$$i = (1 1 0 1 0 0)$.

Hamming(15,11)
Fie codul ciclic Hamming $(15,11)$$(15,11)$ generat de polinomul
$g(x)=1+x+x^4$$g(x)=1+x+x^4$. Determinati:

1. Polinomul de control h(x) al acestui cod.


2. Matricea generatoare si matricea de control a acestui cod, in forma
sistematica.
Hamming(21,11)
Demonstrati ca polinomul
$g(x)=1+x^2+x^4+x^6+x^7+x^{11}$$g(x)=1+x^2+x^4+x^6+x^7+x^{11}$ este
polinom generator pentru un cod ciclic $(21,11)$$(21,11)$. Calculati sindromul
pentru polinomul receptionat $r(x)=1+x^5+x^{17}$$r(x)=1+x^5+x^{17}$.

Intrebare: Pentru care dintre cele 4 coduri studiate obtinem cea mai buna rata a
codului?

REFERINTA [1] Christian Siegel - Coding Theory Algorithms-


https://github.com/christiansiegel/coding-theory-algorithms

Observatie: Când NumPy creează un polinom dintr-un vector, folosește cel mai
mare indice al vectorului drept coeficientul cel mai mic și invers. Astfel pt codul
anterios s-a inversat fiecare vector înainte de a-l converti într-un polinom!
Exemplu: Default NumPy behaviour: [0,1,0,1] -> X^2 + 1 Modificare: [0,1,0,1] -> X
+ X^3

Produse cu plată din Colaborare - Anulați contractele de aici

S-ar putea să vă placă și