Sunteți pe pagina 1din 7

3.

Coduri detectoare / corectoare de erori

Scopul lucrării: ÎnŃelegerea modalităŃilor de codare a datelor pentru detecŃia şi corecŃia


erorilor care pot apărea la transmisia prin canale cu perturbaŃii. Studiul teoretic al funcŃionării
schemelor de generare şi verificare a codurilor cu redundanŃă ciclică, rezolvarea unor probleme.

3.1. ConsideraŃii teoretice.


3.1.1. Principiul detecŃiei şi corecŃiei.

Deoarece datele transmise pe un canal real sunt afectate de perturbaŃii diverse, pentru
reducerea probabilităŃii de eroare (ratei de eroare) se adaugă biŃi suplimentari care asigură
detecŃia şi eventual corecŃia erorilor de transmisie. În cazul detecŃiei erorii, se retransmite cadrul
de date curent, iar în cazul posibilităŃii de corecŃie a erorii, se dispune de suficientă informaŃie
suplimentară redundantă pentru a cunoaşte exact poziŃia sa şi a o corecta.
Asocierea informaŃiei suplimentare redundante cu informaŃia originală ce trebuie
transmisă se realizează respectând un anumit algoritm matematic, prin intermediul codurilor
detectoare sau corectoare de erori. InformaŃia este codată înaintea transmisiei pe canal, iar la
recepŃie se realizează operaŃia inversă, decodarea, prin extragerea informaŃiei utile cu detecŃia
sau corecŃia eventualelor erori ce au afectat-o.
Un cuvânt de cod va fi format din n = m + k biŃi, prin adăugarea unui număr de m biŃi de
control la cei k biŃi de date ce formează mesajul de transmis. BiŃii de control conŃin informaŃie
redundantă, fiind calculaŃi din biŃii de date.
Pentru a putea determina la receptor dacă a avut loc o eroare în transmisie, cuvântul
recepŃionat cu eroare trebuie să nu fie un cuvânt de cod valid pentru codul considerat, deci dintre
cele 2n de combinaŃii binare posibile cu n biŃi, se aleg numai 2k cuvinte de cod valide, adică doar
numărul combinaŃiilor realizabile cu biŃii de date, celelalte reprezentând cuvinte fără sens.
RecepŃionarea unui cuvânt fără sens în locul unui cuvânt de cod semnalează apariŃia unei erori.
Alegerea cuvintelor de cod valide se face în aşa fel încât distanŃa Hamming dintre oricare
două astfel de cuvinte să fie mai mare decât o valoare minimă.

3.1.2. DistanŃa Hamming.

DistanŃa Hamming dintre două cuvinte binare A =


b2 [a1 a2 … ai … an] şi B = [b1 b2 … bi … bn], de aceeaşi
lungime (număr de biŃi) se defineşte ca fiind numărul de
100 110 poziŃii binare prin care cele două cuvinte diferă între ele.
Dacă se calculează suma modulo 2, bit cu bit, a celor două
101 111 cuvinte (C = A XOR B), atunci distanŃa Hamming este de
fapt egală cu ponderea W a cuvântului sumă (numărul de
biŃi cu valoarea “1”):
000 010 b1 n n
d h ( A, B ) = ∑ (ai ⊕ bi ) = ∑ (ci ) = W (C ) (3.1.)
001 011 i =1 i =1
b0 MulŃimea combinaŃiilor binare realizabile cu k biŃi
Fig. 3.1. Cubul format de de date este formată din 2k cuvinte ce se înscriu pe
combinaŃiile binare cu 3 biŃi. vârfurile unui hipercub în spaŃiul vectorial k-dimensional.
DistanŃa Hamming între oricare două astfel de cuvinte nu
reprezintă altceva decât o distanŃă dintre două vârfuri ale hipercubului, măsurată prin valori
discrete binare. De exemplu (fig. 3.1.), combinaŃiile binare din 3 biŃi formează un cub în spaŃiul

1
vectorial tridimensional cu coordonatele (b2, b1, b0). DistanŃa dintre oricare două vârfuri
adiacente ale cubului (care diferă printr-un singur bit) este 1, cea între vârfurile situate pe
diagonalele unei feŃe este 2, iar distanŃa dintre vârfurile situate pe diagonalele spaŃiale ale cubului
este 3. Deci distanŃa Hamming dintre oricare două cuvinte aparŃinând acestei mulŃimi poate lua
valorile: dh=1, 2, 3, distanŃa Hamming minimă fiind 1.
Dacă se face însă o selecŃie în acest spaŃiu (fig. 3.1.), păstrând doar vârfurile situate pe
diagonalele feŃelor în raport cu originea: S1 = {000, 011, 101, 110} ⊂ S, atunci această mulŃime
va forma un tetraedru pe care distanŃa Hamming minimă este 2. Dacă se păstrează doar două
vârfuri poziŃionate pe una din diagonalele spaŃiale ale cubului: S2 = {000, 111} ⊂ S, atunci
distanŃa Hamming minimă în această mulŃime va fi 3.
Presupunând că în procesul de transmisie au fost eronaŃi e biŃi, atunci cuvântul
recepŃionat se va afla la o distanŃă Hamming e de cuvintele de cod valide. Pentru a detecta
eroarea, trebuie ca distanŃa Hamming minimă dintre oricare două cuvinte de cod să fi fost mai
mare decât e, adică: dh ≥ e+1. Dacă această condiŃie este îndeplinită, la recepŃia unui cuvânt de
cod aflat la o distanŃă Hamming e mai mică decât cea normală dh, se detectează eroarea de e biŃi.
Pentru corecŃia erorii, se utilizează criteriul distanŃei minime: se calculează distanŃa
Hamming dintre cuvântul recepŃionat şi toate cuvintele care ar fi putut fi transmise şi se alege
acela pentru care această distanŃă este minimă. De exemplu (fig. 3.2.), în urma recepŃionării
cuvântului V, pentru a putea decide că s-a tramnsmis Ui şi nu Uj, este necesar ca distanŃa
Hamming minimă dintre toate cuvintele de cod să fie mai mare decât dublul distanŃei la care
poate apărea cuvântul eronat: dh ≥ 2e+1.
e e 1
Ui V Uj

dh
Fig. 3.2. DistanŃa Hamming minimă necesară pentru corecŃia erorii de “e” biŃi.

Concluzie: Unui cod care are toate cuvintele de cod astfel alese încât să fie la o distanŃă
minimă egală cu 2e+1, i se spune cod detector de “2e”-erori şi corector de “e”-erori.

3.1.3. Codul Hamming liniar corector de o eroare.

În cazul codurilor liniare (de grup), cele m simboluri de control se calculează ca fiind
combinaŃii liniare din cele k simboluri de date, iar cuvântul de cod este considerat vector într-un
spaŃiu vectorial n-dimensional structurat pe mulŃimea valorilor {0, 1} (adică toate componentele
vectorilor sunt biŃi), prin operaŃiile:
“⊕” = XOR = suma modulo 2 binară;
“•” = AND = produsul logic binar.
Pentru determinarea simbolurilor de control se rezolvă un sistem de ecuaŃii liniare
omogene cu soluŃie unică, ce poate fi scris sub forma matriceală:
[H ]⋅ vT = 0m (3.2.)
RelaŃia (3.2.) reprezintă matematic operaŃia de codare, adică aflarea coeficienŃilor binari
hij ai matricii [H] mxn, cu: i = 1..m şi j = 1..n, care se numeşte matricea de control a codului. În
spaŃiul vectorial considerat, produsul matricii cu vectorul transpus format din biŃii cuvântului de
cod se realizează în mod clasic (linie-coloană), înlocuind suma obişnuită cu operaŃia de sumare
modulo 2 a valorilor binare.
Produsul unui cuvânt de cod nenul: v = [v1 v2 … vi … vn], unde vi sunt biŃi “0” sau “1”, cu
matricea [H] de control a codului, are de fapt ca rezultat un vector-coloană format din suma
modulo 2 dintre vectorii-coloană hi din [H], corespunzători poziŃiilor cu biŃi de “1” în cuvântul

2
de cod: [H ]⋅ v T = [ h 1 ⋅ v 1 ⊕ h 2 ⋅ v 2 ⊕ ... ⊕ h n ⋅ v n ] . Practic, vectorii-coloană din [H]
corespunzători poziŃiilor cu biŃi “0” în cuvântul de cod nu mai apar în sumă.
Cum vectorul nul verifică implicit ecuaŃia (3.2.), acesta va fi întotdeauna cuvânt de cod,
iar toate cuvintele codului aflate la o distanŃă Hamming minimă d între ele şi faŃă de cuvântul
nul, vor trebui să aibă o pondere a biŃilor mai mare sau egală cu d, adică măcar d biŃi de “1”. Din
acest motiv, codul liniar va avea o distanŃă Hamming minimă d numai dacă toate cuvintele cu
ponderea mai mică decât d nu verifică ecuaŃia de control a codului (nu sunt cuvinte de cod),
adică toate sumele modulo 2 dintre vectorii-coloană ai matricii [H] cu mai puŃin de “d” termeni
trebuie neapărat să fie nenule. Sumele modulo 2 cu d sau mai mulŃi termeni pot fi nule sau nu,
după cum cuvântul din care au provenit este sau nu cuvânt de cod.
Deoarece codul Hamming corector de o eroare trebuie să aibă o distanŃă Hamming
minimă d=3, oricare din sumele modulo 2 formate cu 1 sau 2 vectori-coloană trebuie să fie
nenule, deci toate coloanele matricii [H] luate separat şi suma modulo 2 a oricăror două coloane
trebuie să fie diferite de vectorul nul. Metoda cea mai simplă de definire a matricii de control
pentru a realiza această configuraŃie este aceea în care fiecare coloană hi reprezintă transcrierea
binară a numărului coloanei respective i.
În procesul de transmisie, datorită unor perturbaŃii, pot apărea erori care vor transforma
cuvântul cu sens v într-un cuvânt fără sens v*, care diferă de cuvântul iniŃial printr-un vector de
eroare ε ce are valori “1” pe poziŃiile binare cu erori şi “0” în rest:
v* = v ⊕ ε (3.3.)
La recepŃie, cuvântul iniŃial se poate deduce din cel recepŃionat dacă se cunoaşte vectorul
eroare (adică poziŃiile tuturor biŃilor eronaŃi), prin sumarea modulo 2 a vectorului de eroare la
cuvântul fără sens recepŃionat, conform relaŃiei:
v * ⊕ε = (v ⊕ ε ) ⊕ ε = v ⊕ (ε ⊕ ε ) = v ⊕ 0 = v (3.4.)
Pentru detecŃia şi corecŃia erorii, la recepŃie se verifică dacă cuvântul recepŃionat este un
cuvânt de cod sau este fără sens, prin calcularea produsului său cu matricea de control a codului.
În mod evident, toate cuvintele de cod valide trebuie să verifice ecuaŃia omogenă de control a
codului (3.2.), deci acest produs, numit corector, va da un vector coloană cu m componente care
este nenul numai dacă s-au produs erori la transmisie:
z = [H ]⋅ (v*)T = [H ]⋅ ε T (3.5.)
łinând cont că un cod corector de o eroare va putea corecta doar erori de un singur bit,
vectorul eroare considerat va conŃine în acest caz doar un singur bit “1” pe poziŃia i în care a
apărut eroarea. Prin relaŃia (3.5.) se va calcula corectorul, care va fi în acest caz chiar coloana i a
matricii de control, deci corectorul este exprimarea în binar a poziŃiei erorii. CorecŃia se
realizează apoi prin calculul (3.4.) al sumei modulo 2 între cuvântul recepŃionat şi vectorul de
eroare, obŃinut cu decodarea corectorului din binar în zecimal.
Pentru corecŃia tuturor erorilor de un bit, este necesar să se poată calcula la recepŃie un
număr de corectori distincŃi cel puŃin egal cu numărul posibil de cuvinte recepŃionate pentru un
anumit cuvânt transmis. Deci numărul corectorilor 2m = numărul combinaŃiilor distincte cu m
biŃi, trebuie să fie mai mare egal cu numărul cuvintelor cu o eroare în diferite poziŃii = n plus 1 =
numărul cuvintelor fără eroare:
2m ≥ 1 + n = 1 + m + k (3.6.)
Această relaŃie permite determinarea numărului m al biŃilor de control ce trebuie adăugaŃi
la cei k biŃi de date pentru a obŃine un cod corector de o eroare.

ObservaŃie: Pentru uşurarea codării, este preferabilă plasarea simbolurilor de control ci în


poziŃiile binare date de puterile lui 2, deoarece acestea se transcriu în binar cu un singur bit “1” şi
relaŃia (3.2.) devine gata explicitată cu privire la necunoscute:
v T = [c1 c2 d 3 c4 d 5 d 6 d 7 c8 d 9 d10 ... d n ] (3.7.)

3
3.1.4. Coduri polinomiale cu redundanŃă ciclică.

Codurile corectoare de erori sunt mai rar folosite în practică, fiind preferată detecŃia
erorilor urmată de retransmisia cadrului numai în caz de eroare, care poate fi mai eficientă
deoarece se adaugă mai puŃini biŃi suplimentari la fiecare cuvând transmis. Cea mai utilizată
metodă de detecŃie a erorilor se bazează pe codul polinomial, denumit şi cod cu redundanŃă
ciclică (CRC = “Cyclic Redundancy Code”).
Codurile polinomiale tratează un şir de k biŃi ca o listă de coeficienŃi ai unui polinom de
grad k-1, astfel: bitul cel mai semnificativ este coeficientul lui xk-1, următorul bit este coeficientul
lui xk-2, şi tot aşa până la ultimul bit din şir, care este coeficientul lui x0. De exemplu, şirul de biŃi
“101101” reprezintă polinomul de grad 5: x 5 ⊕ x 3 ⊕ x 2 ⊕ x 0 . Aritmetica utilizată în calcule este
tot de tip sumă modulo 2.
Metoda CRC adaugă la sfârşitul şirului de date utile o sumă de control de lungime m,
astfel încât polinomul asociat cuvântului de cod rezultat să fie divizibil printr-un polinom g(x), ce
poartă denumirea de polinom generator al codului. Acest polinom trebuie să aibă gradul egal cu
numărul m al simbolurilor de control adăugate, deci coeficientul lui xm din g(x) trebuie să fie
întotdeauna 1.
Construirea polinomului cuvântului de cod se realizează prin înmulŃirea cu xm a
polinomului d(x) format din şirul biŃilor de date, la care se adaugă polinomul de control c(x):
v( x) = c( x) ⊕ x m ⋅ d ( x) (3.8.)
Această operaŃie este practic echivalentă cu introducerea biŃilor de control prin adunarea
lor la biŃii de date deplasaŃi cu m poziŃii la stânga. Se poate demonstra că v(x) astfel alcătuit va fi
divizibil cu g(x) dacă polinomul de control este restul împărŃirii polinomului de date deplasat, la
polinomul generator:
 x m ⋅ d ( x) 
c ( x ) = rest   (3.9.)
 g ( x) 
Erorile ce pot apărea în transmisie vor transforma polinomul asociat cuvântului de cod
v(x) într-un polinom fără sens v*(x), care diferă printr-un polinom de eroare ε(x), conform relaŃiei
(3.3.) în care vectorii au fost înlocuiŃi prin polinoamele asociate:
v ( x)* = v ( x) ⊕ ε ( x ) (3.10.)
Pentru recunoaşterea unui polinom la recepŃie, se verifică regula de generare a codului:
dacă polinomul recepŃionat este un cuvânt de cod, acesta trebuie să fie divizibil cu polinomul
generator al codului. Practic, se calculează polinomul asociat corectorului ca fiind restul
împărŃirii polinomului recepŃionat la polinomul generator, egal conform (3.10.) şi cu restul
împărŃirii polinomului de eroare la cel generator:
 v* ( x)   ε ( x) 
z ( x ) = rest   = rest   (3.11.)
 g ( x)   g ( x) 
După cum se observă din relaŃia (3.11.), acest polinom corector este nenul numai dacă au
apărut erori pe parcursul transmisiei.
Alegerea polinomului generator este decisivă pentru capacitatea de detecŃie a codului. De
exemplu, dacă se presupune o singură eroare, vom avea ε(x) = xi, unde i dă poziŃia erorii. Pentru
a detecta eroarea, corectorul trebuie să fie nenul ca s-o semnaleze, deci g(x) nu trebuie să fie
divizor al lui xi, adică trebuie să aibă cel puŃin 2 termeni dintre care unul să fie obligatoriu x0.
Din aceste considerente, rezultă că pentru a detecta măcar eroarea de un bit în orice
poziŃie, toate codurile ciclice vor avea coeficientul lui x0 din polinomul generator diferit de zero.
Deoarece pentru a păstra gradul polinomului şi coeficientul lui xm trebuie să fie diferit de zero,
orice polinom generator va conŃine cel puŃin termenii: g ( x ) = x m ⊕ ... ⊕ 1 .

4
ObservaŃie: Datorită proprietăŃilor suplimentare legate de ciclicitate, codurile CRC
prezintă capabilităŃi de detecŃie a erorilor superioare codurilor liniare. De exemplu, prin alegerea
adecvată a polinomului generator astfel încât să fie multiplu de x ⊕ 1 , codul poate detecta orice
număr impar de erori, nu numai cele de un singur bit.

3.2. Modul de lucru în laborator.


Generarea şi verificarea codurilor cu redundanŃă ciclică se implementează în hardware
folosind circuite secvenŃiale liniare, bazate pe un registru de deplasare cu reacŃie obŃinută prin
sumatoare modulo 2 din diferite ranguri ale sale. Rangurile din registrul de deplasare care
contribuie la reacŃie corespund unor coeficienŃi nenuli ai polinomului generator. În laborator se
va studia funcŃionarea teoretică a unor structuri logice de generare şi verificare CRC care
includ astfel de circuite secvenŃiale liniare.

Registru de deplasare pentru CRC


SelecŃie
MUX:
0 1 2 3 AND 1→0
x x x x după
XOR 8 x TxC
TxC
OSC
0 TxD
Ceas de Registru de deplasare “PISO”
transmisie XOR 1

SI b b b b b b b b MUX
0 1 2 3 4 5 6 7 SO
TxC

Fig. 3.3. Schema logică simplificată a unui circuit de generare CRC la transmisie.

În figura 3.3. este prezentată schema simplificată a unui circuit de generare a 4 biŃi CRC
pentru fiecare 8 biŃi de date, care funcŃionează în felul următor:
– IniŃial se încarcă octetul de date în registrul de serializare PISO = “Parallel Input-Serial
Output”, se resetează bistabilii registrului de deplasare pentru CRC, iar linia de selecŃie a
multiplexorului este în “1” logic, validând astfel şi poarta AND care închide reacŃia registrului
CRC, devenind transparentă.
– La fiecare perioadă a ceasului de transmisie TxC biŃii de date se deplasează în registru
cu câte o poziŃie spre dreapta şi sunt emişi succesiv pe linia TxD prin ieşirea SO = “Serial
Output”, în locul lor intrând biŃi de zero prin SI = “Serial Input”.
– În acelaşi timp, biŃii de date ajung şi la intrarea porŃii XOR din reacŃia registrului CRC,
complementând sau nu valoarea logică de reacŃie care intră în acest registru pe tactul următor,
după cum bitul de date este “1” sau respectiv “0”, contribuind astfel în calculul restului împărŃirii
la polinomul generator.
– După ce au trecut 8 perioade de ceas TxC, toŃi biŃii de date au fost deja transmişi pe
linie, iar în registrul CRC s-a obŃinut restul împărŃirii octetului la polinomul generator al codului.
În acest moment selecŃia multiplexorului devine “0” logic, comută linia de date TxD la ieşirea
registrului CRC prin poarta XOR şi decuplează reacŃia acestuia, conectând intrarea lui la “0” prin
blocarea porŃii AND.

5
– Deoarece în registrul de deplasare a datelor au intrat numai biŃi de zero, poarta XOR
devine practic transparentă, permiŃând transmiterea succesivă la ieşire a celor 4 biŃi de control, în
următoarele 4 perioade de ceas. Simultan cu transmisia acestor biŃi are loc şi reiniŃializarea
registrului CRC prin intrarea biŃilor zero de la ieşirea porŃii AND blocate.
Verificarea cuvântului de cod recepŃionat are loc prin recalcularea restului împărŃirii
octetului de date la polinomul generator, simultan cu deserializarea biŃilor în registrul de
deplasare SIPO = “Serial Input-Parallel Output”, prin utilizarea unui registru de deplasare CRC
identic cu cel de la transmisie (fig. 3.4.). După citirea octetului de date, recepŃia biŃilor pe linia
RxD continuă cu cei 4 biŃi de control, care trec şi ei prin registrul CRC cu reacŃie, obŃinîndu-se
restul împărŃirii întregului cuvînt recepŃionat de 12 biŃi la polinomul generator. Dacă restul citit
apoi din registrul CRC este nul, cuvîntul a fost recepŃionat fără nici o eroare.

Registru de deplasare pentru CRC

0 1 2 3
x x x x
XOR
XOR

Registru de deplasare “SIPO”

RxD SI b b b b b b b b
0 1 2 3 4 5 6 7
Ceas de
RxC recepŃie

Fig. 3.4. Schema logică simplificată a unui circuit de verificare CRC la recepŃie.

– Se studiază într-un scurt referat scris funcŃionarea schemelor prezentate, pentru o


anumită secvenŃă de date, prin alcătuirea unor tabele cu valori logice şi desenarea formelor de
undă care descriu stările celor 4 ranguri binare din registrul CRC.
– Se verifică polinomul generator utilizat: g(x) = x4 ⊕ x3 ⊕ 1, precum şi reflectarea sa
în structura schemei de reacŃie a registrului CRC.

3.3. Probleme propuse.


(1.) Se consideră o sursă de date care poate transmite 16 mesaje pe un canal cu perturbaŃii,
utilizând un cod Hamming liniar corector de o eroare. Se cere:
a.) Să se determine lungimea cuvântului de cod;
b.) Să se determine matricea de control [H] a codului;
c.) Folosind mediul Matlab, să se determine cuvintele de cod cu sens;
d.) Folosind mediul Matlab, să se determine distanŃa Hamming minimă şi maximă a
codului;
e.) Să se aprecieze şi să se testeze capacităŃile de detecŃie şi respectiv de corecŃie ale
codului obŃinut.
(2.) Un număr de 16 mesaje se transmit pe un canal cu perturbaŃii utilizând un cod ciclic
detector de o eroare. Se cere:

6
a.) Să se determine numărul simbolurilor de date (k), al celor de control (m) şi lungimea
cuvântului de cod (n);
b.) Să se aleagă polinomul generator dintre polinoamele: x ⊕ 1, x2 ⊕ x ⊕ 1, x3 ⊕ x2 ⊕ 1,
x5 ⊕ x2 ⊕ x ⊕ 1;
c.) Să se determine cuvântul de cod corespunzător mesajului: d = [1 0 1 1] ;
d.) Să se determine corectorul corespunzător cuvântului: v = [1 0 0 1 0 1 1] şi să se
precizeze dacă acesta este sau nu cuvânt de cod;
e.) Să se creeze în mediul Matlab o funcŃie care să permită codarea unui mesaj pe baza
unui polinom generator dat.

3.4. Întrebări de verificare a cunoştintelor:


(1.) Ce reprezintă distanŃa Hamming dintre două cuvinte binare?
(2.) Care este distanŃa Hamming minimă impusă tuturor cuvintelor de cod pentru a putea
detecta e biŃi eronaŃi?
(3.) Care trebuie să fie distanŃa Hamming minimă dintre cuvintele de cod pentru a fi posibilă
corecŃia unui număr de e biŃi eronaŃi?
(4.) Câte erori poate detecta şi câte poate corecta un cod cu distanŃa Hamming minimă d?
(5.) Ce criterii matematice trebuie să satisfacă vectorii-coloană ai matricii de control astfel
încât codul liniar să aibă o distanŃă Hamming minimă d între toate cuvintele sale?
(6.) Ce relaŃii matematice trebuie să satisfacă coloanele matricii de control a unui cod liniar
corector de o eroare?
(7.) Care este numărul minim de corectori distincŃi ce trebuie să poată fi calculat pentru
corecŃia tuturor erorilor de un singur bit?
(8.) Cum se calculează biŃii de control la transmisie în cazul utilizării unui cod ciclic detector
de erori?
(9.) Cum se recunoaşte un cuvânt recepŃionat eronat în cazul codurilor cu redundanŃă ciclică?
(10.) Ce termeni trebuie să conŃină orice polinom generator al unui cod ciclic pentru a detecta
măcar toate erorile de un singur bit?
(11.) Ce proprietăŃi suplimentare prezintă codurile ciclice faŃă de cele liniare? ExemplificaŃi.

Laborator “Transmisia datelor”


Prep. drd. ing. & fiz. IOAN Aleodor Daniel

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