Sunteți pe pagina 1din 8

5 CODURI BLOC

5.1 CODURI BLOC LINIARE


Dacă transmitem pe un canal real un şir de biţi (utilizând o modulaţie adecvată), fără a încerca
să detectăm şi, dacă este posibil, să şi corectăm erorile care sunt inevitabile din cauza
zgomotului, erorile de bit vor rămâne nedepistate.

DEFINIŢIA 5.1 Numim probabilitate de tranziţie probabilitatea ca, din cauza zgomotului,
receptorul să transforme un 1 în 0 sau un 0 în 1.

Diagrama probabilităţii de tranziţie a unui canal binar simetric este arătată mai jos.

1−𝑝
bit 0 bit 0
p

1−𝑝
bit 1 bit 1

Este clar că, dacă nu luăm anumite măsuri de prevedere, orice eroare de bit rămâne
nedetectată. Pentru a mări şansele ca receptorul să decidă corect, împărţim şirul biţilor de
emisie în blocuri de câte k biţi, numiţi biţi de mesaj, iar la aceştia adăugăm 𝑛 − 𝑘 biţi
redundanţi, legaţi algebric de cei k biţi de mesaj, rezultând astfel blocuri de n biţi numite
cuvinte de cod.

DEFINIŢIA 5.2 Un cod bloc este mulţimea celor 2𝑘 cuvinte de cod.

Lungimea cuvântului de cod fiind n, există 2𝑛 blocuri de câte n biţi, dintre care numai
2𝑘 < 2𝑛 sunt cuvinte de cod. Dacă receptorul constată că blocul de n biţi nu este un cuvânt de
cod, interpretează aceasta ca indiciu că s-a produs o eroare: spunem că detectează eroarea. Un
cod bloc bine proiectat este înzestrat şi cu o oarecare capacitate de a corecta erorile. Rata
codului R = k/n determină volumul redundanţei.

DEFINIŢIA 5.3 Un spaţiu vectorial V este o mulţime de elemente numite vectori împreună
cu două operaţii, una internă, numită adunare vectorială, şi o alta externă, numită înmulţire
cu scalari dintr-un corp S. Spaţiul vectorial are structură algebrică de grup pentru adunarea
vectorială, elementul neutru fiind notat cu 0. Scalarii din S au un element neutru pentru
adunare notat cu 0 şi un element neutru pentru înmulţire notat cu 1. Trebuie ca 1 ∙ 𝐯 = 𝐯
pentru orice 𝐯 ∈ 𝑉.

DEFINIŢIA 5.4 Un spaţiu vectorial este n-dimensional dacă el conţine un set de n vectori
liniar independenţi şi dacă orice set de (n + 1) vectori este liniar dependent. Orice astfel de set
de n vectori liniar independenţi constituie o bază a spaţiului vectorial pe care se spune că îl
generează, în sensul că orice vector din V se poate scrie ca o combinaţie liniară de vectorii
bazei. Baza nu este unică.

Fie {𝐡0 , 𝐡1 , ⋯ , 𝐡𝑛−1 } o asemenea bază. Orice vector v se scrie atunci ca o combinaţie liniară
de vectorii bazei: 𝐯 = 𝑣0 𝐡0 + 𝑣1 𝐡1 + ⋯ + 𝑣𝑛−1 𝐡𝑛−1 . Vedem că vectorul este univoc
determinat de scalarii 𝑣0 , 𝑣1 , ⋯ , 𝑣𝑛−1 . Prin urmare, putem scrie vectorul v utilizând numai
componentele sale: 𝐯 = (𝑣0 , 𝑣1 , ⋯ , 𝑣𝑛−1 ). O bază particulară convenabilă este baza standard,
în care vectorul bazei 𝐡𝑖 are componenta din poziţia i egală cu 1, iar toate celelalte
componente egale cu 0.

Un set de 𝑘 < 𝑛 vectori liniar independenţi generează un subspaţiu vectorial k-dimensional al


spaţiului vectorial n-dimensional.

DEFINIŢIA 5.5 Un cod bloc de lungime n compus din 2𝑘 cuvinte de cod se numeşte cod
liniar (n, k) dacă şi numai dacă cele 2𝑘 cuvinte de cod formează un subspaţiu k-dimensional al
spaţiului vectorial al tuturor n-tuplurilor cu elemente din corpul Galois CG(2).

DEFINIŢIA 5.6 Corpul Galois de ordinul 2, notat cu CG(2), are numai două elemente: 0 şi 1.
Operaţiile de adunare şi de înmulţire se efectuează modulo 2, adică, 1 + 1 = 0.

Să aplicăm aceste definiţii la cazul unui cod bloc liniar. Este deci posibil să găsim k cuvinte
de cod liniar independente 𝐠 0 , 𝐠1 , ⋯ , 𝐠 𝑘−1 astfel încât fiecare cuvânt de cod v să fie o
combinaţie liniară a acestora:

𝐯 = 𝑢0 𝐠 0 + 𝑢1 𝐠1 + ⋯ + 𝑢𝑘−1 𝐠 𝑘−1

unde 𝑢𝑖 = 0 sau 1 pentru 0 ≤ 𝑖 ≤ 𝑘 − 1.

Aranjăm cele k cuvinte de cod liniar independente ca linii ale unei matrice 𝑘 × 𝑛 după cum
urmează:

𝐠0 𝑔00 𝑔01 𝑔02 ⋯ 𝑔0,𝑛−2 𝑔0,𝑛−1


𝐠1 𝑔10 𝑔11 𝑔12 ⋯ 𝑔1,𝑛−2 𝑔1,𝑛−1
∙ ∙ ∙ ∙ ⋯ ∙ ∙
𝐆= = ∙ ∙ ∙ ⋯ ∙ ∙

∙ ∙ ∙ ∙ ⋯ ∙ ∙
[𝐠 𝑘−1 ] [𝑔𝑘−1,0 𝑔𝑘−1,1 𝑔𝑘−1,2 ⋯ 𝑔𝑘−1,𝑛−2 𝑔𝑘−1,𝑛−1 ]

unde 𝐠 𝑖 = (𝑔𝑖0 , 𝑔𝑖1 , ⋯ , 𝑔𝑖,𝑛−1 ) pentru 0 ≤ 𝑖 ≤ 𝑘 − 1.

Să scriem blocul celor k biţi de mesaj ca vector linie 𝐮 = (𝑢0 , 𝑢1 , ⋯ , 𝑢𝑘−1 ). Să scriem şi
cuvântul de cod v ca un vector linie 𝐯 = (𝑣0 , 𝑣1 , ⋯ , 𝑣𝑛−1 ). Este clar că putem scrie cuvântul
de cod corespunzător v după cum urmează:
𝐠0
𝐠1
𝐯 = 𝐮 ∙ 𝐆 = (𝑢0 , 𝑢1 , ⋯ , 𝑢𝑘−1 ) ( ⋮ ) = 𝑢0 𝐠 0 + 𝑢1 𝐠1 + ⋯ + 𝑢𝑘−1 𝒈𝑘−1 .
𝒈𝑘−1

Componentele vectorului v sunt combinaţii liniare ale componentelor vectorului u. Spunem


că un astfel de cod bloc liniar are o structură nesistematică. Putem simplifica întrucâtva
această structură? Da.

DEFINIŢIA 5.7 Un cod bloc liniar are o structură sistematică dacă oricare cuvânt de cod se
compune din două părţi, partea de mesaj şi partea redundantă de control.

Să notăm cu 𝑐0 , 𝑐1 , ⋯ , 𝑐𝑛−𝑘−1 cei (𝑛 − 𝑘) biţi de control. Structura unui cuvânt de cod


sistematic este cea de mai jos:

𝑐0 , 𝑐1 , ⋯ , 𝑐𝑛−𝑘−1 𝑢0 , 𝑢1 , ⋯ , 𝑢𝑘−1
Aceasta înseamnă că

𝑣0 = 𝑐0

𝑣1 = 𝑐1

𝑣𝑛−𝑘−1 = 𝑐𝑛−𝑘−1

𝑣𝑛−𝑘 = 𝑢0

𝑣𝑛−𝑘+1 = 𝑢1

𝑣𝑛−1 = 𝑢𝑘−1 .

Acest format permite extragerea directă a mesajului din cuvântul de cod. Matricea generatoare
pentru un cod bloc sistematic are forma următoare:

𝐆 = [𝐏 𝐈𝑘 ]

unde Ik este matricea identitate 𝑘 × 𝑘 iar P este o matrice 𝑘 × (𝑛 − 𝑘) de forma


𝑝00 𝑝01 ⋯ 𝑝0,𝑛−𝑘−1
𝑝10 𝑝11 ⋯ 𝑝1,𝑛−𝑘−1
𝐏=[ ⋮ ⋮ ⋮ ⋮ ]
𝑝𝑘−1,0 𝑝𝑘−1,1 ⋯ 𝑝𝑘−1,𝑛−𝑘−1

unde 𝑝𝑖𝑗 = 0 sau 1.

Vom introduce acum o altă matrice importantă, şi anume, matricea de control al parităţii. Se
ştie de la teoria spaţiilor vectoriale că, pentru orice matrice generatoare 𝑘 × 𝑛, notată cu G, cu
cele k linii liniar independente, există o matrice (𝑛 − 𝑘) × 𝑛, notată cu H, cu cele (𝑛 − 𝑘)
linii liniar independente, astfel încât orice vector din spaţiul generat de liniile lui G este
ortogonal cu liniile lui H, iar orice vector care este ortogonal cu liniile lui H se găseşte în
spaţiul generat de liniile lui G. Putem, deci, descrie codul liniar (n, k) generat de G şi în
modul următor: un n-tuplu v este un cuvânt de cod din codul bloc generat de G dacă şi numai
dacă

𝐯 ∙ 𝐇 𝑇 = 𝟎.

Mai sus, 𝐇 𝑇 este matricea transpusă a lui H.

EXEMPLUL 5.1 Cod bloc liniar sistematic (7, 4)

1 1 0 1 0 0 0 1 0 0 1 0 1 1
1 0 1
𝐆 = [0 1 0 0] 𝐇 = [0 1 0 1 1 1 0].
1 1 1 0 0 1 0
0 0 1 0 1 1 1
1 0 1 0 0 0 1

5.2 SINDROMUL ŞI DETECŢIA ERORILOR


Fie 𝐯 = (𝑣0 , 𝑣1 , ⋯ , 𝑣𝑛−1 ) un cuvânt de cod care a fost transmis serial, bit cu bit, pe un canal
zgomotos, utilizându-se o modulaţie binară (de amplitudine, de frevenţă sau de fază). Din
cauza zgomotului, receptorul recepţionează vectorul 𝐫 = (𝑟0 , 𝑟1 , ⋯ , 𝑟𝑛−1 ) care poate fi diferit
de v.

DEFINIŢIA 5.8 Vectorul de eroare e este diferenţa dintre vectorul recepţionat r şi cuvântul
de cod emis v. Fiindcă simbolurile sunt binare, această diferenţă este totuna cu suma:

𝐞 = 𝐫 + 𝐯 = (𝑒0 , 𝑒1 , ⋯ , 𝑒𝑛−1 ).

DEFINIŢIA 5.9 Sindromul de eroare este vectorul cu (𝑛 − 𝑘) componente

𝐬 = 𝐫 ∙ 𝐇 𝑇 = (𝑠0 , 𝑠1 , ⋯ , 𝑠𝑛−𝑘−1 ).

Deoarece 𝐯 ∙ 𝐇 𝑇 = 𝟎, avem de asemenea că 𝐬 = 𝐞 ∙ 𝐇 𝑇 . Remarcăm că sindromul nu depinde


de cuvântul de cod emis v ci de vectorul de eroare e. Dacă nu avem erori, vectorul sindrom
are toate componentele sale egale cu zero.

EXEMPLUL 5.2 Considerăm acelaşi cod bloc sistematic (7, 4) din Exemplul 5.1. Fie
𝐫 = (𝑟0 , 𝑟1 , 𝑟2 , 𝑟3 , 𝑟4 , 𝑟5 , 56 ) vectorul recepţionat. Sindromul este dat de

1 0 0
0 1 0
0 0 1
𝐬 = (𝑠0 , 𝑠1 , 𝑠2 ) = (𝑟0 , 𝑟1 , 𝑟2 , 𝑟3 , 𝑟4 , 𝑟5 , 𝑟6 ) 1 1 0.
0 1 1
1 1 1
[1 0 1]
Efectuând înmulţirea matriceală, obţinem:

𝑠0 = 𝑟0 + 𝑟3 + 𝑟5 + 𝑟6
𝑠1 = 𝑟1 + 𝑟3 + 𝑟4 + 𝑟5

𝑠2 = 𝑟2 + 𝑟4 + 𝑟5 + 𝑟6 .

5.3 DISTANŢA MINIMĂ A UNUI COD BLOC


Am văzut că, pentru un cod bloc liniar de lungime n şi de dimensiune k, notat cu (n, k), unde
𝑛 > 𝑘, numărul cuvintelor de cod este egal cu 2k. Dar numărul vectorilor de lungime n este
egal cu 2n, unde, desigur, 2𝑛 > 2𝑘 . Aceasta înseamnă că există 2𝑛 − 2𝑘 vectori de lungime n
care nu sunt cuvinte de cod. Dacă recepţionează unul dintre aceşti vectori, receptorul poate fi
sigur că s-a produs o eroare. Pentru aceasta, receptorul are nevoie de o măsură a distanţei
dintre doi vectori.

DEFINIŢIA 5.10 Ponderea Hamming (sau ponderea, pe scurt) a unui vector binar v
=(𝑣0 , 𝑣1 , ⋯ , 𝑣𝑛−1 ) este numărul de componente ale sale diferite de zero şi se notează cu p(v).

Spre exemplu, ponderea Hamming a lui v = (1 0 0 1 0 1 1) este 4.

DEFINIŢIA 5.11 Fie v şi w doi vectori n-dimensionali. Distanţa Hamming (sau distanţa, pe
scurt) dintre v şi w, notată cu d(v, w), este numărul de coordonate în care ele diferă.

Spre exemplu, pentru acelaşi v şi w = (1 0 1 0 1 1 0), d(v, w) = 4.

Deoarece în corpul Galois de ordinul 2 CG(2) avem că 0 + 0 = 0 şi 1 + 1 = 0, iar 0 + 1 = 1 + 0


= 1, distanţa Hamming dintre doi vectori v şi w este egală cu ponderea Hamming a sumei lor
v + w:

d(v, w) = p(v + w).

Pentru exemplul de mai sus, v + w = (0 0 1 1 1 0 1), care are pondere 4.

DEFINIŢIA 5.12 Pentru un cod bloc liniar (n, k), distanţa minimă este egală cu ponderea
minimă a cuvintelor de cod diferite de 0 şi se notează cu dmin.

5.4 CAPACITATEA UNUI COD BLOC LINIAR DE DETECŢIE

ŞI DE CORECŢIE A ERORILOR
Dacă se transmite un cuvânt de cod v pe un canal afectat de zgomot şi se produc  erori de bit,
vectorul recepţionat r va diferi de cel emis în  componente: d(v, r) = . Fie dmin distanţa
minimă a unui cod bloc (n, k), ceea ce înseamnă că oricare două cuvinte de cod diferă în cel
puţin dmin componente. Este clar că un număr de 𝑑min − 1 erori de bit sau mai puţine nu
transformă un cuvânt de cod în altul. Altfel spus, 𝑑min − 1 erori de bit sau mai puţine produc
un vector recepţionat r care nu este cuvânt de cod. Atunci când vectorul de cod recepţionat nu
este cuvânt de cod, spunem că receptorul a detectat erori. Prin urmare, un cod bloc liniar cu
distanţa minimă dmin poate detecta 𝑑min − 1 erori de bit sau mai puţine dintr-un cuvânt de n
biţi.
Pe de altă parte, între cei 2𝑛 − 1 posibili vectori de eroare diferiţi de zero, există 2𝑘 − 1 care
sunt identici cu cele 2𝑘 − 1 cuvinte de cod diferite de cuvântul de cod 0, care este elementul
neutru pentru adunarea vectorială şi deci nu poate lipsi din codul bloc liniar. Dacă zgomotul
produce oricare dintre aceşti 2𝑘 − 1 vectori de eroare, vectorul emis va fi transformat într-un
alt cuvânt de cod w. Sindromul lui w este zero, astfel încât decodorul acceptă w ca pe
cuvântul de cod transmis şi face, deci, o decodare incorectă. Prin urmare, există 2𝑘 − 1
vectori de eroare nedetectabili şi 2𝑛 − 2𝑘 vectori de eroare detectabili.

Notăm cu 𝐴𝑖 numărul cuvintelor de cod de pondere i din codul nostru (n, k). Numerele
𝐴0 , 𝐴1 , ⋯ , 𝐴𝑛 constituie distribuţia de pondere a codului. Pentru un cod bloc liniar, 𝐴0 = 1,
iar numerele de la 𝐴1 la 𝐴𝑑min −1 sunt egale cu zero.

Vom calcula probabilitatea ca decodorul să nu detecteze prezenţa erorilor la transmisia pe un


canal binar simetric cu probabilitate de tranziţie p. Notăm cu 𝑃𝑛 probabilitatea unei erori
nedetectabile. O eroare nedetectabilă apare numai atunci când vectorul de eroare este identic
cu un cuvânt de cod diferit de zero din codul nostru (n, k):
𝑛

𝑃𝑛 = ∑ 𝐴𝑖 𝑝𝑖 (1 − 𝑝)𝑛−𝑖 .
𝑖=𝑑𝑚𝑖𝑛

EXEMPLUL 5.3 Pentru codul (7, 4) considerat în exemplul 5.1, distribuţia de pondere este:
𝐴0 = 1, 𝐴1 = 𝐴2 = 0, 𝐴3 = 7, 𝐴4 = 7, 𝐴5 = 𝐴6 = 0 şi 𝐴7 = 1. Probabilitatea unei erori
nedetectate este

𝑃7 = 7𝑝3 (1 − 𝑝)4 + 7𝑝4 (1 − 𝑝)3 + 𝑝7 .

Dacă 𝑝 = 10−2 , avem că 𝑃7 ≅ 7 ∙ 10−6 . Aşadar,dacă transmitem pe un canal binar simetric


cu 𝑝 = 10−2 un milion de cuvinte de cod, în medie, numai 7 cuvinte de cod eronate vor trece
prin decodor fără a fi detectate.

Distanţa minimă dmin este un număr natural par sau impar. Fie t un număr natural astfel încât

2𝑡 + 1 ≤ 𝑑min ≤ 2𝑡 + 2.

Codul nostru bloc liniar poate corecta toţi vectorii de eroare ce conţin t erori de bit sau mai
puţine. Într-adevăr, dacă se emite cuvântul de cod v şi se produc t erori de bit, vectorul de
recepţie r va avea o distanţă Hamming de cel puţin t + 1 de oricare alt cuvânt de cod, astfel
încât receptorul va decide corect că v a fost cuvântul de cod emis iar nu altul.

5.5 TABLOUL STANDARD ŞI DECODAREA CU AJUTORUL SINDROMULUI


Fie 𝐯0 , 𝐯1 , ⋯ , 𝐯2𝑘−1 cele 2𝑘 cuvinte din codul nostru bloc liniar (n, k). Indiferent ce cuvânt de
cod particular v este transmis pe canalul de comunicaţie, din cauza zgomotului electric,
vectorul recepţionat r poate fi oricare din cei 2𝑛 vectori definiţi pe corpul Galois de ordinul 2,
CG(2). În vederea decodării, partiţionăm mulţimea celor 2𝑛 vectori în 2𝑘 submulţimi notate
cu 𝐷0 , 𝐷1 , ⋯ , 𝐷2𝑘 −1 astfel încât cuvântul de cod 𝐯𝑖 să fie conţinut în submulţimea 𝐷𝑖 pentru
0 ≤ 𝑖 ≤ 2𝑘 − 1. Vom fi realizat astfel o bijecţie între mulţimea cuvintelor de cod şi mulţimea
{𝐷𝑖 }.

REGULA DE DECODARE: Dacă vectorul recepţionat r se găseşte în submulţimea 𝐷𝑖 ,


rezultatul decodării este 𝐯𝑖 .

Decodarea este corectă dacă şi numai dacă vectorul recepţionat r aparţine acelei submulţimi
𝐷𝑖 corespunzătoare cuvântului de cod transmis. Apartenenţa vectorilor la submulţimi se
stabileşte după cum urmează:

1. Cele 2𝑘 cuvinte de cod din codul nostru (n, k) se dispun pe un rând de la stânga la
dreapta începând cu v0 = (0, 0, 0,⋯, 0).
2. Din restul de 2𝑛 − 2𝑘 vectori n-dimenionali (care nu sunt cuvinte de cod), se alege
unul, notat cu e1, şi se aşează sub v0. Se completează al doilea rând adunând vectorul
e1 la fiecare cuvânt de cod vi din primul rând şi se aşează suma 𝐞1 + 𝐯𝑖 sub 𝐯𝑖 .
3. La completarea rândului al doilea, se alege un vector neutilizat e2 şi se aşează sub e1.
Se adună e2 la fiecare vector de cod 𝐯𝑖 din primul rând şi se aşează e2 + vi sub 𝐞1 + 𝐯𝑖 .
4. Se procedează la fel până ce se vor fi utilizat toţi vectorii n-dimensionali.

Rezultă tabloul standard al codului nostru bloc liniar.

v0 = 0 v1 ⋯ vi ⋯ 𝐯2𝑘 −1
e1 e1 + v1 ⋯ e1 + vi ⋯ e1+𝐯2𝑘 −1
e2 e2 + v1 ⋯ e2 + vi ⋯ e2+𝐯2𝑘 −1
⋮ ⋮ ⋮ ⋮ ⋯ ⋮
e e + v1 ⋯ e + vi ⋯ e+𝐯2𝑘 −1
⋮ ⋮ ⋮ ⋮ ⋮ ⋮
𝐞2𝑛−𝑘 −1 𝐞2𝑛−𝑘 −1 + v1 ⋯ 𝐞2𝑛−𝑘 −1+ vi ⋯ 𝐞2𝑛−𝑘 −1+ 𝐯2𝑘−1

Observăm că suma dintre oricare doi vectori de pe acelaşi rând este un cuvânt de cod. În
acelaşi rând al unui tablou standard, nu există doi vectori identici. Fiecare vector apare într-un
rând şi numai în unul.

În tabloul standard, există 2𝑛 /2𝑘 = 2𝑛−𝑘 rânduri disjuncte, iar fiecare rând constă din 2𝑘
elemente distincte. Cele 2𝑛−𝑘 rânduri se numesc coseturile codului nostru, care este un
subspaţiu vectorial, iar primul vector e din fiecare coset se numeşte lider de coset. Orice
element dintr-un coset poate fi luat drept lider de coset. Aceasta nu schimbă elementele din
coset, ci doar le permută.

Este esenţial ca liderii de coset să fie aleşi ca vectorii de eroare cei mai probabili. Cei mai
probabili n vectori de eroare au o singură componentă egală cu 1, toate celelalte componente
fiind egale cu 0. Urmează vectorii cu două componente egale cu 1 şi celelalte egale cu 0,
ş.a.m.d.
PROBLEME

1. Fie codul bloc liniar (7, 4) din Exemplul 5.1.


a) Considerând cele 16 mesaje drept numerele binare de la 0 la 15, să se utilizeze
matricea generatoare G pentru a calcula cuvintele de cod corespunzătoare.
b) Determinaţi ponderile cuvintelor de cod.
c) Care este distanţa Hamming minimă a codului?
d) Ce capacitate de corecţie are acest cod?
e) Utilizând matricea de control al parităţii H, calculaţi sindromul.
2. Fie codul bloc liniar cu matrice generatoare G şi matrice de control H date mai jos.

1 0 1 1 0 0 0
1 1 1 0 1 0 0
0 1
𝐆 = [0 1 1 0 0] şi 𝐇 = [0 1 1 1 0 1 0].
0 0 1 0 1 1 0
0 0 1 1 1 0 1
0 0 0 1 0 1 1

Restul ca la Problema 5.1.

3. Fie codul bloc liniar cu matrice generatoare G şi matrice de control H date mai jos.

1 1 0 1 0 0 0
1 0 1 1 1 0 0
1 0
𝐆 = [0 1 1 0 0] şi 𝐇 = [0 1 0 1 1 1 0].
0 0 1 1 0 1 0
0 0 1 0 1 1 1
0 0 0 1 1 0 1

Restul ca la Problema 5.1.