Documente Academic
Documente Profesional
Documente Cultură
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.
v = [a1 , a2 , ⋅, an ], n = m + k
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
dmin = P min = 2 ⋅ ec + 1
dmin = P min = ed + 1
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.
0 0 0 0 ⋯ 1
⎡ ⎤
⎢0 0 0 0 ⋯ 1⎥
H = ⎢ ⎥
⎢0 1 1 0 ⋯ 1⎥
⎣ ⎦
1 0 1 0 ⋯ 1
(m×n)
⎢ 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
c1 = i 3 ⊕ i 5 ⊕ i n
c2 = i 3 ⊕ i 6 ⊕ i n
c4 = i 5 ⊕ i 6 ⊕ i n
................
′ ′ ′ ′
zm−2 = c ⊕ i ⊕ i ⊕ ⋯ ⊕ in
2 3 5
′ ′ ′ ′
zm−1 = c ⊕ i ⊕ i ⊕ ⋯ ⊕ in
4 3 5
..............................
z1
⎡ ⎤
⎢ z2 ⎥
[Z ] = ⎢ ⎥ = αi [hi ] = [hi ]
⎢ ⎥
⋯
⎣ ⎦
zm
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
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
[[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()