Sunteți pe pagina 1din 9

Obiectivul lucrarii

Prezenta lucrare are ca scop introducere codurilor grup pentru codarea


canalelor cu perturbatii si prezentarea influentei codului Hamming (7,4) asupra
ratei de eroare intr-un canal de transmisiune.

Aspecte teoretice
In matematica si teoria informatiei, codurile grup reprezinta tipuri importante
de coduri bloc (coduri la care informatia este organizata in cuvinte, blocuri de n
simboluri) folosite in schemele de detectie si corectie a erorilor. Codurile grup
permit o codare si decodare eficienta fata de alte coduri.

Codurile grup sunt folosite la transmiterea simbolurilor (e.g. biti), in canalele de


comunicatie, astfel incat erorile ce apar pot fi detectate de receptorul mesajului
bloc. Un numar de k biti de informatie *este urmat de un numar de *m biti de
control, derivati din cei de informatie astfel 'incat la receptor, bitii de control
sunt folositi pentru a valida bitii de informatie. Un cod de lungime n = m + k

transmite blocuri continand n simboluri.

Un exemplu este codul Hamming (7,4), ce este un cod binar ce reprezinta 4


bi'ti - simboluri de informatie folosind 7 biti, prin adaugarea simbolurilor de
control. In acest fel, receptorul poate corecta si detecta erori.

Determinarea numarului de simboluri


Un cuvant de cod de lungime n are k simboluri de informatie si m simboluri de
control si poate fi reprezentat sub forma unui vector:

v = [a1 , a2 , ⋅, an ], n = m + k

Daca se foloseste pentru codare un alfabet X = 0, 1 , pentru transmisiunea a


N simboluri ale sursei, sunt necesare k simboluri de informatie, numar care
satisface relatia:
k
2 ≥ N

Fiecare bloc de k biti este codat intr-un bloc de n biti (n > k ) prin adaugarea
n − k = m biti de control. Numarul de biti de control m este stabilit de
marginea Hamming prin relatia:
e

m i
2 ≥ ∑ Cn

i=1

ce reprezint\a o conditie necesara, dar nu suficienta.

In cazul corectiei unei singure erori (ec = 1 ), relatia anterioara devine:


m
2 − 1 ≥ n

Distanta intre cuvintele de cod


Pentru ca un cod sa poata avea proprietati de corectie, este necesar ca din
multimea de cuvinte de n litere, numai o parte sa constituie cuvinte cu sens.
Rezulta astfel in spatiul cuvintelor o distanta care a fost definita de Hamming
ca fiind egala cu numarul pozitiilor prin care 2 cuvinte difera. Distanta dintre
cuvintele de cod vi si vj reprezinta ponderea unui cuvant de cod vi .

Conditia necesara si suficienta pe care trebuie sa o indeplineasca distanta


dintre cuvinte pentru a se \textbf{corecta} ec erori este:

dmin = P min = 2 ⋅ ec + 1

Pentru a detecta ed erori condi'tia este:

dmin = P min = ed + 1

Se poate observa ca un cod corector de ec erori este detector de 2 ⋅ ed erori.

Orice cod corector sau detector de erori este caracterizat prin matricea de
control H (m, n) si matricea generatoare G(k, n) . Intre aceste doua matrici
exista relatia: H GT = 0 . Orice cuvant de cod, fiind o combinatie liniara a
liniior matricii G satisface relatia H vT = 0 . Aceasta permite determinarea
simbolurilor de control cand se cunosc cele de informatie, operatie efectuata la
codare.
Relatia H vT = 0 este similara cu v = iG , unde v este cuvantul de cod, i
cuvantul de date, iar G matricea generatoare G = [I k |P ] , cu Ik matricea
unitate de ordin k , iar P este regula predefinita de codare.

Codor si decodor Hamming corector de o eroare


Fie {k} numarul simbolurilor informaționale necesare transmiterii unei
informații. Numarul simbolurilor de control, m, ce trebuie adaugate in scopul
corectiei unei erori, se determina din relatia:
m
2 − 1 ≥ n

Hamming a propus intocmirea matricei de control dupa urmatoarea regula:


coloana hi sa fie reprezentarea binara a numarului i pe m biti, cu bitul cel mai
semnificativ in prima linie. Conform acestei reguli, matricea de control va avea
forma:

0 0 0 0 ⋯ 1
⎡ ⎤

⎢0 0 0 0 ⋯ 1⎥
H = ⎢ ⎥
⎢0 1 1 0 ⋯ 1⎥
⎣ ⎦
1 0 1 0 ⋯ 1
(m×n)

De asemenea, Hamming a propus ca in structura matriceala a cuvintelor de


cod, simbolurile de control sa fie plasate pe pozitiile 2 ,
0 1 2 m
,2 ,2 ,...,2 − 1

numaratoarea efectuandu-se de la stanga la dreapta. Cele k simboluri de


informatie vor ocupa locurile ramase libere, adica:
[v] = [c1 , c2 , i 3 , c4 , i 5 , i 7 , c8 , i 9 … . . i n ] . Codul Hamming este
nesistematic. Determinarea simbolurilor de control, cunoscute fiind simbolurile
informationale, se efectueaza cu relatia H vT = 0 , dupa cum urmeaza:
c1
⎡ ⎤

⎢ c2 ⎥
⎢ ⎥
⎢ ⎥
i3
⎢ ⎥
⎢ ⎥
0 0 0 0 ⋯ 1 ⎢ c4 ⎥
⎡ ⎤ ⎢ ⎥
⎢ ⎥
⎢0 0 0 0 ⋯ 1⎥ ⎢ i5 ⎥
⎢ ⎥ ⎢ ⎥ = [0]
⎢0 1 1 0 ⋯ 1⎥ ⎢ i6 ⎥
⎢ ⎥
⎣ ⎦ ⎢ ⎥
1 0 1 0 ⋯ 1 ⎢ i7 ⎥
⎢ ⎥
⎢ ⎥
⎢ c8 ⎥
⎢ ⎥
⎢ ⋯⎥
⎣ ⎦
in

Ecuatia matriceala este echivalenta cu urmatorul sistem de ecuatii:

c1 = i 3 ⊕ i 5 ⊕ i n

c2 = i 3 ⊕ i 6 ⊕ i n

c4 = i 5 ⊕ i 6 ⊕ i n

................

Codorul, care are misiunea de a calcula simbolurile de control, cunoscute fiind


simbolurile informationale, va fi format dintr-un registru care contine n circuite
basculante bistabile in care se stocheaza simbolurile informationale in pozitiile
corespunzatoare din cuvantul de cod si o serie de sumatoare modulo 2 care,
conform sistemului de ecuatii, calculeaza simbolurile de control. Simbolurile
de control astfel calculate se stocheaza apoi în pozitiile in care acestea
intervin in cuvantul de cod.

Decodorul implementeaza relatia z = Hv


T
, unde z se numeste corectorul
cuvantului receptionat, [v′ ] ′ ′ ′
= [c c i c i i i c i
1 2 3

4

5

6

7

8

9
⋯ cn ]

.
′ ′ ′ ′
zm = c ⊕ i ⊕ i ⊕ ⋯ ⊕ in
1 3 5

′ ′ ′ ′
zm−2 = c ⊕ i ⊕ i ⊕ ⋯ ⊕ in
2 3 5

′ ′ ′ ′
zm−1 = c ⊕ i ⊕ i ⊕ ⋯ ⊕ in
4 3 5

..............................

Structura matriceala a corectorului este data de:

z1
⎡ ⎤

⎢ z2 ⎥
[Z ] = ⎢ ⎥ = αi [hi ] = [hi ]
⎢ ⎥

⎣ ⎦
zm

Deoarece coloana hi este reprezentarea binara a numarului i pe m biti, rezulta


ca pozitia erorii in cuvantul receptionat se deduce astfel:

se calculeaza componentele corectorului cu sistemul de ecuatii de mai


sus;
se transcrie in zecimal numarul binar corespunzator componentelor
corectorului, obtinandu-se pozitia i a erorii.

Decodorul Hamming, corector de o eroare va fi format, deci, dintr-un registru cu


n circuite basculante bistabile in care va fi memorat cuvantul receptionat, o
serie de sumatoare modulo 2 care, conform sistemului de ecuatii, calculeaza
componentele corectorului si un decodificator din binar in zecimal cu m intrari
si n iesiri.

Desfasurarea lucrarii

import numpy as np
import matplotlib.pyplot as plt
import warnings
warnings.filterwarnings('ignore')
from IPython.display import Audio

Aplicatia 5.1
Fie dat un cod bloc C (6, 3) generat de matricea predefinita P :
0 1 1
⎡ ⎤
P = ⎢1 0 1⎥
⎣ ⎦
1 1 0

1. Scrieti in Python o secventa de cod care sa realizeze codarea mesajelor


,
[1 1 1] [1 0 0] .
2. Codati toate mesajele posibile emise de sursa si identificati numarul de
erori pe care codul le poate corecta/detecta.

m = 3
k = 3
n = m + k
P = np.array([[0, 1, 1], [1, 0, 1], [1, 1, 0]]) #declaram matricea, cea ar
#mesajele ce urmeaza a fi codate
msj1 = np.array([1, 1, 1])
msj2 = np.array([1, 0, 0])
#definirea matricii generatoare prin concatenare 
genmat = np.concatenate([np.identity(3), P], axis=1) #axa 0 - coloane, axa
print(genmat)

#codarea cu G - primul mesaj 
cod1 = np.dot(msj1, genmat)
cod1 = cod1%2  # genereaza restul la impartirea cu 2
print(cod1)

#codarea cu G - al doilea mesaj
cod2 = np.dot(msj2, genmat)
cod2 = cod2 % 2
print(cod2)

Aplicatia 5.2
Fie H, matricea de control a unui cod bloc liniar.
1 0 0 0 1 1 1
⎡ ⎤
H = ⎢0 1 0 1 0 1 1⎥
⎣ ⎦
0 0 1 1 1 0 1

1. Scrieti in Python o secventa de cod pentru identificarea matricei


generatoare.
2. Verificati relatia H GT = 0 .
3. Identificati toate cuvintele de cod ce se pot forma cu acest cod. Cate
erori poate corecta acest cod?
H = np.array([[1, 0, 0, 0, 1, 1, 1], 
              [0, 1, 0, 1, 0, 1, 1],
              [0, 0, 1, 1, 1, 0, 1]])
#retinem dimensiunile matricii de control H 
m, n = H.shape   #forma este un atribut la vectorii din numpy ;-)
#Extragerea matricii Q din matricea H.
Q = np.array([H[0][3:], H[1][3:], H[2][3:]])
print(Q,'\nMatricea  Q are dimensiunile:\n ' ,Q.shape)

[[0 1 1 1]
[1 0 1 1]
[1 1 0 1]]
Matricea Q are dimensiunile:
(3, 4)

P = Q.T
#matricea Q e P transpus, de unde P.T . T e un atribut in numpy, nu o meto
print(P,'\nMatricea P are dimensiunile:\n', P.shape)

#Matricea generatoare are forma  G = [P, In]=[P, I(n-m)] unde P(4,3)
G = np.concatenate([P, np.identity(n-m)], axis = 1)
print(G)

#Verificarea H * G transpus = 0
print(np.dot(H, G.T) % 2)

k, n = G.shape
N = 2**k
print('Numarul de mesaje este {}.'.format(N))

indici = np.arange(0, N-1) #generam nr. mesajului in baza 10 de la 0 la N-
#si scriem in binar aceste numere ca sa obtinem mesajele
mesajele_in_binar = [np.binary_repr(i, width=k) for i in indici] 
print(mesajele_in_binar)
#width=k ii spune functiei cate 0 uri sa adauge cand face conversia. Cum m
#sa putem inmulti. De asemenea, functia  ne intoarce valorile in format st

mesaje_binar = [] #initierea unei liste pentru stocarea tuturor mesajelor

for i in mesajele_in_binar: 
    temp = [] # lista temporara, care se goleste la fiecare ciclu
    for litera in i: # daca de exemplu i = '0000' este primul element, un 
        temp.append(int(litera)) #convertim din str in int si salvam in li
    mesaje_binar.append(temp) #salvam prima lista in a doua

mesaje_binar = np.array(mesaje_binar)
print(mesaje_binar)
    

#in sfarsit, folosim matricea G pentru codarea celor N=2^k mesaje ale surs
cuvinteCod = np.dot(mesaje_binar, G) % 2
print(cuvinteCod) #fiecare linie are codarea unui cuvant

# pentru fiecare cuvant de cod calculam distanta fara de cuvantul cu toate
distante np sum(cuvinteCod[1:] axis 1) tolist()

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