Documente Academic
Documente Profesional
Documente Cultură
Decodificarea codurilor
convoluţionale
193
194PRELEGEREA 17. DECODIFICAREA 0 CODURILOR
00000000 . . . CONVOLUŢIONALE
g0 (X) 11010000 . . .
2
X g0 (X) 00110100 . . .
(1 + X 2 )g0 (X) 11100100 . . .
... ...
Dacă se primeşte - de exemplu - u = 11110001, vom determina cel mai apropiat
cuvânt - cod, care este (1 + X 2 + X 4 )g0 (X), adică 11101001. Primul grup de n = 2
biţi este 11, deci primul bit de informaţie (k = 1) este 1. Fie acum
u := u − C(1) = 11110001 − 11010000 = 00100001.
Se ignoră primele două simboluri din noul u şi se determină cel mai apropiat
cuvânt - cod de 100001; acesta este 000 . . . 0; deci al doilea grup cadru este 00 - adică
al doilea simbol de informaţie este 0.
Refacem u := u − X 2 C(0) = 00100001. Se şterg primele patru simboluri din u
şi se caută cel mai apropiat cuvânt - cod de 0001. Acesta este din nou 00 . . .. Deci
u se corectează ı̂n
C(1 + 0X + 0X 2 ) = 11000000.
Definiţia 17.1 Pentru un (n, k) - cod convoluţional se defineşte distanţa liberă prin
Similar observaţiei de la codurile liniare, dlib este cea mai mică pondere a unui cuvânt
- cod C(a00 (X)) cu proprietatea a000 a001 . . . a00k−1 6= 0. (s-a notat a00 (X) = a(X) − a0 (X)
unde a(X), a0 (X) sunt două mesaje de informaţie arbitrare distincte).
Exemplul 17.2 Reluând codul construit ı̂n Exemplul 17.1, acesta are dlib = 3,
deoarece g0 (X) are ponderea 3 şi orice cuvânt C(a0 + a1 X + . . .) cu a0 =
6 0 are
ponderea minim 3.
Propoziţia 17.1 Un cod convoluţional corectează t erori dacă şi numai dacă dlib >
2t.
Demonstraţie: Să presupunem dlib > 2t. La recepţia unui cuvânt v(X) cu cel mult t
erori, există un cuvânt - cod u(X) = C(a(X)) aflat la o distanţă Hamming minimă
de acesta: dH (u(X), v(X)) = s. Dacă u0 (X) = C(a0 (X)) este cuvântul - cod trimis
prin canal (recepţionat drept v(X)), din ipoteză dH (v(X), u0 (X)) ≤ t. Deci, cu
inegalitatea triunghiului, d(u(X), u0 (X)) ≤ s + t. Cum s este cea mai mică distanţă
Hamming, avem s ≤ t, deci d(C(a(X)), C(a0 (X))) ≤ s + t ≤ 2t < dlib . Din definiţia
distanţei libere rezultă că primele k simboluri din a(X) au drept cel mai apropiat
grup de k simboluri generat de cod grupul primelor k simboluri din a0 (X), ceea ce
permite decodificarea şi corectarea erorilor.
Pentru următoarele grupuri, procedeul decurge analog.
Invers, să presupunem dlib ≤ 2t şi fie u(X) = C(a(X)), u0 (X) = C(a0 (X)) cu
dH (u(X), u0 (X)) = dlib şi u0 . . . uk−1 6= u00 . . . u0k−1 . Fie i1 , i2 , . . . idlib toţi indicii i
pentru care ui 6= u0i . Construim
( următorul cuvânt v(X):
ui dacă ui = u0i sau i = i2s+1
vi = 0
ui dacă i = i2s
Avem dH (u(X), v(X)) ≤ dH (u0 (X), v(X)) ≤ t. Presupunem că a fost trimis
u0 (X) şi recepţionat v(X). Atunci eroarea, care a modificat cel mult t simboluri -
17.2. DECODIFOCAREA CODURILOR SISTEMATICE 195
poate conduce la o decodificare incorectă, deoarece u(X) este cuvântul cod cel mai
apropiat.
Deci, ı̂n această ipoteză, codul nu va corecta t erori. 2
Din analiza de sus rezultă că un parametru important pentru un cod convolu-
ţional este distanţa liberă, care specifică numărul maxim de erori care pot fi corec-
tate. Din nefericire ([1]), nu se cunoaşte nici o metodă analitică de construcţie de
coduri convoluţionale ”bune”, ı̂n sensul unei maximizări a dlib pentru n şi k date.
Folosind calculatorul, au fost găsite ı̂nsă o serie de astfel de coduri bune. Listăm
câteva din ele pentru cazul binar şi k = 1:
n dlib g0 (X)
2 5 110111 = 1 + X + X 3 + X 4 + X 5
2 6 11110111
2 7 1101011011
2 8 110111011011
2 10 11011111001011
2 10 111011110111
3 8 111011111
3 10 111011101111
3 12 111011101011111
4 10 111101111111
4 13 1111011110011111
Din aceste relaţii, se poate deduce o formulă pentru calculul elementelor sindro-
mului, ı̂n funcţie de caracterele secvenţei - eroare:
k
X k
X k
X
sp (j) = ep (k + j) − ep (i)g0 (i, j) − ep−1 (i)g1 (i, j) − . . . − ep−N +1 (i)gN −1 (i, j),
i=1 i=1 i=1
1 ≤ j ≤ n − k,
unde e = e0 (1) . . . e0 (n) e1 (1) . . . e1 (n) . . . ep (1) . . . ep (n) . . .
| {z }| {z } | {z }
e0 e1 ep
este secvenţa de eroare - tip, segmentată ı̂n blocuri de lungime n. Deci, pentru orice
j = 1, 2, . . . , n − k, putem scrie:
k
X
s0 (j) = e0 (k + j) − e0 (i)g0 (i, j),
i=1
Xk k
X
s1 (j) = e1 (k + j) − e1 (i)g0 (i, j) − e0 (i)g1 (i, j),
i=1 i=1
..
.
N
X −1 X
k
sN −1 (j) = eN −1 (k + j) − ep (i)gN −p−1 (i, j),
p=0 i=1
N
X −1 X
k
sN (j) = eN (j) − ep+1 (i)gN −p−1 (i, j),
p=0 i=1
..
.
N
X −1 X
k
sN +m (j) = eN +m (k + j) − ep+m−1 (i)gN −p−1 (i, j)
p=1 i=1
..
.
De remarcat că secvenţa e0 afectează numai primele N componente ale sin-
dromului: s0 , s1 , . . . , sN−1 , deoarece apare numai ı̂n primele N (n − k) ecuaţii din
sistemul de sus.
Pentru corectarea erorilor, se determină iniţial secvenţa e0 ; după aceasta, sindro-
mul se recalculează scăzând din el componentele lui e0 . Această operaţie se numeşte
rearanjarea sindromului. În paralel, e0 se foloseşte la corectarea primelor n caractere
recepţionate; operaţia se realizează identic cu cea de la codurile liniare.
În continuare, se va folosi un nou sindrom, anume:
s00 (j) = 0
m−1
XX k
s0m (j) = em (k+j)− em−p (i)gp (i, j), 1 ≤ m ≤ N −1, 1 ≤ j ≤ n−k
p=0 i=1
s0N +m (j) = sN +m (j), ∀m ≥ 0.
De remarcat că secvenţa e1 figurează numai ı̂n expresiile lui s01 , s02 , . . . , s0N unde
s0i = s0i (1) . . . s0i (n−k), 1 ≤ i ≤ N . Deci aceste componente apar ı̂n N (n−k) ecuaţii.
17.3. ALGORITMUL VITERBI 197
-
0 1 2 3 4 ...
6
s 10 -s 10 -s 10 -s
11
¢¢̧@ ¢ ¢̧ @ ¢ ¢̧ @ ¢¢̧
¢ @ ¢ @ ¢ @ ¢
¢ @ 01 ¢ @ 01 ¢ @ 01 ¢
¢ @ ¢ @ ¢ @ ¢
¢ @¢ @¢ @¢
¢ ¢ @ ¢ @ ¢ @
01 ¢ s ¢ @
Rs
@ ¢ @
Rs
@ ¢ @Rs
@
¢ µA@
¡
¡ ¢ ¡
µA@
¡ ¢ ¡¡
µA@ ¢ ¡µ
¡
¢ ¡ A@ ¢ ¡ A@ ¢ ¡ A@ ¢ ¡
¢ ¡ 10 A ¢@ ¡ 10 A ¢@ ¡ 10 A ¢@ ¡10
01
¢ ¡ 01
¢A ¡@
01
¢A ¡@
01
¢A ¡ @
¢ ¡ ¢ A¡ @ ¢ A¡ @ ¢ ¡A @
¢¡ ¢¡ A 00 @ ¢¡ A 00 @ ¢¡ A 00 @
10 ¢s¡ s¢¡ 11A @
R¢¡
@ s A
11 @
@
R s¡
¢ 11A @Rs
@
¡
µ
¡ µ
¡
¡ A ¡
µ
¡ A ¡¡
µ A ¡µ
¡
¡ ¡ A ¡ A ¡ A ¡
¡ ¡ ¡A ¡A ¡A
11
¡ 11
¡ 11
¡ A 11
¡ A 11
¡ A
¡ ¡ ¡ A ¡ A ¡ A
¡ ¡ ¡ A ¡ A ¡ A
s
¡ -s¡ -s¡ - AAU¡s - AAU¡s - AAUs
00 00 00 00 00 00
0 1 2 3 4 5 ...
Orice drum prin reţea, care pleacă din momentul 0 conduce - prin citirea marcajelor
arcelor - la un cuvânt - cod. De exemplu, pentru intrarea 100110, codul generat este
C(100110) = 111000011001 (reamintim, spre dreapta pleacă totdeauna două arce,
iar arcul pentru intrarea 0 este situat sub arcul pentru intrarea 1).
Invers, orice cuvânt - cod reprezintă marcajul unui drum ı̂n reţea.
17.3. ALGORITMUL VITERBI 199
Algoritmul Viterbi:
Intrare: Secvenţa v0 v1 . . . , vp = vp,0 vp,1 . . . vp,n−1 ;
Algoritm:
2. Se marchează di(S0 ) = 0;
3. for i := 1 to b do
Pentru toate stările S accesibile la momentul p+i se determină
di(S) folosind formula (1), şi se listează toate drumurile active care
duc la S.
5. p := p + 1, S0 := S1 , salt la pasul 3.
Exemplul 17.5 Să reluăm codul descris ı̂n Exemplul 17.4, ı̂mpreună cu diagrama
sa de reţea. Presupunem că s-a primit secvenţa v = 10010100101100000 . . . Deci
v0 = 10, v1 = 01, v2 = 01, v3 = 00, v4 = 10, v5 = 11, v6 = 00 . . ..
Vom lucra cu o fereastră de decodificare b = 7. Detaliem grafic numai procedura
de decodificare a primului bloc (cazul p = 0).
200PRELEGEREA 17. DECODIFICAREA CODURILOR CONVOLUŢIONALE
i=0: s 0
s
©* 1
©
i=1: s© -s 1
s 1
¡
µs
¡©
* 3
s © s
©
¡ 2
©
* ©
*
i=2: s©©-s©©-s 2
sH s 2
µ H¡
¡ µ
j
H
¡ ¡ s 1
s
¡ s
¡ s 3
©
* ©
* *
©
i=3: s©©-s©©-s©©-s 3
s s -s 3
H HH
µ H¡
¡ µ
¡ ¡ sH H
j
H js 3
s
¡ s
¡ @ Hjs
H
©©
* ©© * @ 1
i=4: s© -s© -s -s @ R
-s 3
sH sH -s -s 3
µ H¡
¡ js HH
µ µs
¡
¡ ¡H j
HH sH¡ *
© 1
s
¡ s
¡ ©
H
j¡
H s H
© js 4
©©
* ©© * ©*
©
i=5: s© -s© -s -s -s© -s 4
sH sH -s 4
µ HH
¡ js ¡s HH
µ js
¡ H ¡
©*H
© 4
s
¡ HH
js¡
© @ Hjs
H
©
* @ 3
i=6: s©© @
Rs 3
s sH s 4
H
µ HH
¡ js ¡s HH
µ ¡
µ
js ¡ s
¡ H ¡©
*H ©
* 4
s
¡ HH
j¡s © @HH
© j@s © s
©
¡ 3
©©
* @
@
R© ©©
@*
i=7: s
© s @Rs 4
Se ajunge la concluzia că toate arcele active au acelaşi ı̂nceput: arcul marcat cu
11. Deci primul bloc v0 = 10 se decodifică ı̂n 11, după care se ia ca nod iniţial
S0 = 10 şi procesul se repetă.
De remarcat că pentru o fereastră de decodificare b = 5, eroarea nu s-ar fi putut
corecta (primul arc nu este unic).
În această prezentare a algoritmului Viterbi, apare o problemă: cât de mare este
fereastra b ? Cât de departe mergem prin diagrama reţea până să fim siguri că totuşi
este posibilă decodificarea şi corectarea erorilor ?
Pentru aceasta să refacem sub o formă finită reprezentarea diagramelor - reţea.
Din definiţia dată ı̂n Prelegerea 16 se observă că dacă g0 (X), g1 (X), . . . ,
gn−1 (X) sunt polinoamele generatoare şi a(X) un mesaj de informaţie, codificarea
poate fi scrisă ca o secvenţă de n componente (infinite)
c(X) = (a(X)g0 (X), a(X)g1 (X), . . . , a(X)gn−1 (X))
ale căror caractere se transmit ı̂n paralel, ı̂n ordinea crescătoare a puterilor lui
X.
17.3. ALGORITMUL VITERBI 201
Exemplul 17.6 Fie (2, 1)- codul generat de g0 (X) = 1 + X + X 3 şi g1 (X) = 1 + X.
Mesajul a(X) = 1 + X 2 este codificat ı̂n
c(X) = ((1 + X 2 )(1 + X + X 3 ), (1 + X 2 )(1 + X)) = (1 + X + X 2 + X 5 , 1 + X +
X + X 3 ).
2
Definiţia 17.2 Se defineşte lungimea unui drum ca fiind numărul de arce care
formează acel drum.
Ponderea unui drum este suma ponderilor arcelor care formează drumul.
Reamintim, ponderea unui cuvânt este numărul de caractere nenule din cuvântul
respectiv.
Conform Definiţiei 17.1, distanţa liberă a unui cod este ponderea nenulă minimă
a unui cuvânt cod - deci a unei secvenţe care marchează un drum prin diagrama de
translatare.
Propoziţia 17.2 Distanţa liberă a unui (n, 1) - cod convoluţional este egală cu pon-
derea nenulă minimă a unui ciclu care trece prin starea iniţială 00 . . . 0 a diagramei
de translatare a codului.
Demonstraţie: Este imediată.
" #
dlib − 1
Fie S0 = 00 . . . 0 starea iniţială. Pentru orice t, 1 ≤ t ≤ , se de-
2
fineşte d(t) ca fiind cel mai mic număr ı̂ntreg pozitiv p cu proprietatea că orice
202PRELEGEREA 17. DECODIFICAREA CODURILOR CONVOLUŢIONALE
drum S0 → S1 → . . . Sp−1 , (S0 6≡ S1 ) are ponderea mai mare de 2t. Pentru de-
terminarea algoritmică a lui d(t) se poate adapta imediat un algoritm similar din
teoria grafurilor.
Deoarece codul este liniar, valoarea lui d(t) se păstrează pentru orice stare a
diagramei de translatare.
Acum, ı̂n condiţiile că pot apare maxim t erori, algoritmul Viterbi va funcţiona
corect pentru o fereastră b = d(t) (datorită Propoziţiei 17.1).
Reluarea algoritmului Viterbi la fiecare pas cu fereastra maximă d(t) este ı̂nsă
destul de costisitoare ca timp; de aceea, practic, se foloseşte o fereastră mobilă
b ≤ d(t) şi algoritmul trece la faza de decodificare atunci când toate drumurile
active selectate au acelaşi prim arc. Dacă s-a ajuns la b = t(b) şi nu s-a selectat un
prim arc comun, algoritmul eşuează.
Se observă din acest exemplu că tot necazul provine din faptul că diagrama conţine
două cicluri distincte cu ieşirea 0: 000 − 000 şi 110 − 011 − 101 − 110.
Observaţie: Orice cod convoluţional conţine un ciclu de pondere zero, anume bucla
care pleacă şi intră ı̂n starea iniţială. Reamintim, ponderea unui drum este suma
ponderilor arcelor sale.
Teorema 17.1 Un (n, 1) - cod convoluţional este catastrofic dacă şi numai dacă
cmmdc(g0 (X), . . . , gn−1 (X)) 6= 1.
17.5 Exerciţii
17.1 Determinaţi dlib pentru fiecare din codurile următoare:
(a) g0 (X) = 1 + X 2 , g1 (X) = 1 + X + X 2 ;
(b) g0 (X) = 1 + X + X 2 + X 3 , g1 (X) = 1 + X 2 + X 3 ;
(c) g0 (X) = 1 + X 3 + X 4 , g1 (X) = 1 + X + X 2 + X 4 .
17.2 Folosind (2, 2) - codul convoluţional definit ı̂n Exemplul 17.4, şi fereastra de
decodificare b = 7, decodificaţi (cât este posibil) secvenţele
v = 01000001000 . . .
v = 11000110010010001110010 . . .
b = 2, b = 3, b = 4.
s- -
6
6
?
²¯ ²¯
- ?- + -+ -
±° ±°²¯?
- + -
6 ±°
? s - - 6
6
? -
17.11 Pentru fiecare din codurile următoare, decideţi dacă sunt catastrofice sau nu.
În caz afirmativ, determinaţi ciclurile de pondere 0.
(a) g0 (X) = 1 + X, g1 (X) = 1 + X + X 2 + X 3 ;
(b) g0 (X) = 1 + X + X 4 , g1 (X) = 1 + X 2 + X 4 ;
(c) g0 (X) = 1 + X + X 2 , g1 (X) = 1 + X + X 3 + X 4 .
Bibliografie
[2] L. Bahl, J. Cocke, F. Jelinek, J. Raviv - Optimal decoding of linear codes for
minimizing symbol error rate, IEEE Inf. Theory, pp. 284-287, Martie 1974;
[3] M. Blaum - A (16, 9, 6, 5, 4) error correcting dc-free block code, IEEE Transac-
tions on Information Theory, vol. 34, 1988, pp. 38-141;
[5] G. Cullmann - Coduri detectoare şi corectoare de erori, Editura Tehnică, 1972;
[7] D.G. Hoffman, D.A. Leonard, C.C. Lindner, K.T. Phelps, C.A. Rodger, J.R.
Wall - Coding Theory; The Essentials, Marcel Dekker, Inc, 1991;
[9] A. M. Kerdok - A class of low-rate non linear codes, Information and control,
20 (1972), 182-187;
[11] J.H. van Lindt - Introduction to Coding Theory, Springer Verlag, 1982;
[12] W.E.Ryan - A Turbo Code Tutorial, IEEE Trans. comm. pp. 1261-1271, Oct.
1996;
205