Giornata Tecnica da Piave Servizi, 11 aprile 2024 | DISCIPIO Antonio
Codici di Reed-Solomon
1. Codici di Reed-Solomon
Filippo Ragazzo
26 Novembre 2013
Sommario
Approfondimento per il corso di Reti di Calcolatori del Corso di
Laurea in Informatica, Ca' Foscari, A.A. 2013-2014.
1
3. 1 Generalità
Nel 1960 Irving Reed e Gus Solomon pubblicarono un articolo sul Journal of
the Society for Industrial and Applied Mathematics[3]. Tale articolo descri-
veva una nuova classe di codici a correzione d'errore che sono oggi conosciuti
come Codici di Reed-Solomon (R-S). Questi codici sono molto potenti e tro-
vano molte applicazioni, come nei sistemi di archiviazione di massa, nella
lettura di informazioni dai codici a barre e anche nelle trasmissioni spaziali.
I codici di Reed-Solomon sono codici ciclici non binari con simboli com-
posti di sequenze di m bit, ove m è un qualsiasi intero positivo maggiore o
uguale a 2. Codici R-S(n, k) su simboli di m bit esistono per ogni n e k tali
che
0 k n 2m + 2
ove k è il numero di simboli del dato da codicare e n è il numero totale
di simboli di codice nel blocco codicato.
La convenzione più utilizzata è R-S(n, k) con
(n, k) = (2m − 1, 2m − 1 − 2t)
ove t rappresenta il numero massimo di errori correggibili del codice e
n − k = 2t è il numero di bit di parità.
Esempio: Un codice R-S spesso utilizzato è R-S(255, 223) con simboli di
8 bit. Ogni parola di codice ha dimensione 255 byte, dei quali 223 byte sono
di dati e 32 byte sono di parità. Dunque
n = 255, k = 223, 2t = 32 ⇒ t = 16
In questo caso si possono correggere no a 16 simboli errati, nella fattispecie
no a 16 byte con errore in qualsiasi punto della parola di codice.
Parleremo di errore sul simbolo quando accade che anche un solo bit che
compone il simbolo risulta errato. Dunque un codice R-S può correggere, nel
caso peggiore, no a t bit errati (ogni simbolo errato presenta un solo bit di
errore) e, nel caso migliore, no a t·m bit errati (se i t simboli sono totalmen-
te errati). Appare chiaro, dunque, che i codici R-S risultano particolarmente
ecaci nel correggere errori a raca (o burst).
3
4. In fase di decodica vedremo che gli algoritmi utilizzati permettono la
correzione di un massimo di t simboli errati e la correzione di un massimo di
2t cancellazioni.
In fase di decodica si possono vericare tre casi:
Se il numero di errori e cancellazioni è minore o uguale a 2t la parola di
codice verrà corretta.
Se il numero di errori e cancellazioni è maggiore a 2t il decoder rileverà
la presenza di errori, oppure vi sarà un errore di decodica nel caso in cui la
sequenza di errori abbia trasformato la codeword trasmessa in una codeword
dierente, ma valida.
2 Campi di Galois
Per comprendere i principi di codica e decodica dei codici non binari, come
quelli di Reed-Solomon, è necessario conoscere la teoria dei campi niti di
Galois.
Un campo di Galois K è in eetti un insieme nito di elementi sul quale
sono denite le operazioni di somma e prodotto che godono delle seguenti
proprietà:
• Associatività:
(a + b) + c = a + (b + c), ∀a, b, c ∈ K
(a ∗ b) ∗ c = a ∗ (b ∗ c), ∀a, b, c ∈ K
• Commutatività:
a + b = b + a, ∀a, b ∈ K
a ∗ b = b ∗ a, ∀a, b ∈ K
• Esistenza dell'elemento neutro:
∃0 ∈ K, a + 0 = 0 + a = a, ∀a ∈ K
∃1 ∈ K, a ∗ 1 = 1 ∗ a = a, ∀a ∈ K
• Esistenza dell'opposto:
∀a ∈ K, ∃(−a) ∈ K | a + (−a) = 0
∀a ∈ K, ∃a−1
∈ K | a ∗ a−1
= 1
4
5. • Distributività del prodotto rispetto alla somma:
a ∗ (b + c) = a ∗ b + a ∗ c, ∀a, b, c ∈ K
Per ogni numero primo p, esiste un campo di Galois che denoteremo
GF(p), che contiene p elementi. È possibile estendere GF(p) ad un campo
di pm
elementi: tale campo verrà detto un campo di estensione di GF(p) e
denotato con GF(pm
), con m intero positivo. Notare che GF(pm
) contiene
gli elementi di GF(p) come sottoinsieme.
Nella costruzione di un codice R-S vengono tipicamente utilizzati simboli
del campo di estensione GF(pm
), con p = 2.
Oltre agli elementi 0 e 1, che esistono per denizione, il campo GF(2m
)
contiene un elemento α, detto elemento primitivo, tale che
∀e ∈ GF(pm
), ∃k ≥ 0 | e = αk
In questo modo è possibile denire un insieme innito di elementi a par-
tire da { 0, 1, α } moltiplicando progressivamente l'ultimo elemento per α. Si
otterrà
F = { 0, 1, α, α2
, . . . , αj
, . . . } = { 0, α0
, α1
, α2
, . . . , αj
, . . . }
Per costruire un insieme nito di cardinalità 2m
chiuso rispetto alla mol-
tiplicazione è necessario imporre la seguente condizione di chiusura:
α2m−1
+ 1 = 0
o, equivalentemente
α2m−1
= 1 = α0
In questo modo ogni elemento del campo risultante da una potenza di
α 2m−1
sarà equivalente ad un elemento pari ad una potenza di α 2m−1
.
Ad esempio:
α2m+n
= α2m−1
∗ αn+1
= αn+1
e dunque avremo
F = { 0, 1, α, α2
, . . . , α2m−2
, α2m−1
, α2m
, . . . } =
= { 0, α0
, α1
, α2
, . . . , α2m−2
, α0
, α1
, . . . } =
= { 0, α0
, α1
, α2
, . . . , α2m−2
}
5
6. Le operazioni aritmetiche su GF(2m
) sono denite come segue:
L'addizione è equivalente all'OR esclusivo (XOR) eettuato bit-a-bit sulle
due m-ple che rappresentano gli addendi.
La sottrazione, per come è denito lo XOR, risulta analoga.
Il prodotto risulta leggermente più complesso: si utilizza la cosiddetta
index form, per la quale il risultato è dato dalla somma degli elementi presi
in rappresentazione logaritmica.
Tali operazioni aritmetiche sono fondamentali poiché gli algoritmi di co-
dica e decodica si basano su queste operazioni compiute sui simboli rap-
presentanti le parole di codice, visti come elementi di un opportuno campo
di Galois.
3 Codica (generalità)
Come abbiamo detto, la forma più utilizzata per i codici R-S è R-S(2m −
1, 2m−1−2t) ove n−k = 2t rappresenta il numero di simboli di ridondanza
e t è la capacità di correzione del codice.
Il polinomio generatore di un codice R-S di questo tipo è della forma
g(x) = g0 + g1x + g2x2
+ . . . + g2t−1x2t−1
+ x2t
Il grado del polinomio generatore è uguale al numero di simboli di ridon-
danza e questo è vero per tutti i codici BHC, dei quali i codici R-S sono una
sottoclasse. Dato che 2t è il grado del polinomio, esso ammetterà esattamen-
te 2t potenze successive di α che sono radici del polinomio. Indicheremo tali
radici con
α, α2
, ..., α2t
Notare che non è vincolante la scelta della radice α di partenza; è possi-
bile partire da una qualsiasi potenza di α.
Esempio: Consideriamo R-S(7, 3). Possiamo ottenere il polinomio genera-
tore nei termini delle sue n − k = 4 radici come segue:
g(x) = (x − α)(x − α2
)(x − α3
)(x − α4
) =
= (x2
− (α + α2
)x + α3
)(x2
− (α3
+ α4
)x + α7
) =
= (x2
− α4
x + α3
)(x2
− α6
x + α0
) =
= x4
− (α4
+ α6
)x3
+ (α3
+ α10
+ α0
)x2
− (α4
+ α9
)x + α3
=
= x4
− α3
x3
+ α0
x2
− α1
x + α3
6
7. che riscritto in ordine crescente di grado delle x e cambiando segno ai
termini negativi, risulta:
g(x) = α3
+ α1
x + α0
x2
+ α3
x3
+ x4
4 Codica (esecuzione)
Sia (d1, d2, . . . , dk) la dataword da codicare, con ogni di composto da m
bit, rappresentabile dunque da un elemento del campo GF(2m
). A questi k
simboli ordinati possiamo associare un polinomio della forma
d(x) = d0 + d1x + d2x2 + ... + dk−1xk−1
Il passo successivo è quello di ottenere una codeword rappresentata da
un polinomio c(x) di grado n − 1 divisibile per il polinomio generatore g(x)
denito precedentemente. Un metodo semplice per ottenere questo sarebbe
denire c(x) come c(x) = d(x) · g(x). Tale metodo, però, porta ad un codice
non sistematico, ragion per cui si considera come codeword
c(x) = x2t
d(x) + p(x)
con
p(x) = x2t
d(x) mod g(x)
Operando in questo modo il polinomio c(x) presenta come coecienti
dei termini di grado 0, ..., 2t i simboli di ridondanza e come coecienti dei
termini di grado maggiore di 2t i simboli dell'informazione da trasmettere.
Inoltre c(x) risulta divisibile per il polinomio generatore g(x), dunque
nel caso di errori di trasmissione che modichino i simboli della codeword,
il decoder potrà valutare la validità della stessa andando ad eseguire una
divisione per g(x). La presenza di un resto non nullo indicherà la sicura
presenza di un errore.
5 Decodica
Assumiamo che in fase di trasmissione siano stati introdotti degli errori sul-
la codeword inviata. Rappresentiamo polinomialmente il pattern d'errore in
questo modo:
e(x) = r(x) − c(x)
ove r(x) è la codeword ricevuta. In generale e(x) sarà del tipo
e(x) = e0 + e1x + e2x2
+ ... + en−1xn−1
7
8. con gli ei appartenenti al campo GF(2m
).
A dierenza dei codici binari, per i quali risulta suciente la sola posizione
del bit errato per procedere alla correzione mediante negazione del bit stesso,
nei codici non binari come i codici R-S risulta necessario conoscere non solo
la posizione del bit errato, ma anche il suo valore originario. Tale necessità
si traduce nel dover avere una condizione aggiuntiva per poter correggere la
codeword.
6 Calcolo della sindrome
In primo luogo è necessario rilevare la presenza di errori. Per fare ciò intro-
durremo il concetto di sindrome di una codeword, intendendo un vettore che
risulta nullo solo se non sono stati introdotti errori di trasmissione.
La sindrome S è composta da n − k simboli, { Si }(i=1,...,n−k). Dunque, ad
esempio, per un codice R-S(7, 3) ci sono 4 simboli in ogni vettore sindrome.
I loro valori possono essere calcolati a partire dal polinomio risultante dalla
ricezione r(x).
Per come è stato strutturato il codice, il calcolo degli elementi della sin-
drome sarà facilitato, infatti ogni codeword valida deve essere proporzionale
al polinomio generatore g(x). Essendo, dunque, α, α2
, ..., α2t
le radici di g(x),
il polinomio rappresentante una codeword valida deve avere le stesse radici.
I simboli della sindrome S associata alla codeword ricevuta r(x) si calco-
leranno come
Si = r(αi
), ∀i = 1, 2, ..., 2t.
Essendo che
r(x) = c(x) + e(x)
e che
c(αi
) = 0, ∀i = 1, 2, . . . , 2t
di fatto la sindrome sarà data dal polinomio e(x) che rappresenta il pattern
di errori calcolato sulle radici del polinomio generatore g(x).
Se, ad esempio, viene ricevuta una codeword r(x) con k errori nelle
posizioni xj1
, xj2
, ..., xjk avremo
e(x) = ej1 xj1
+ ej2 xj2
+ ... + ejk
xjk
ove i = 1, ..., k indica il numero di sequenza dell'errore e j la posizione nella
codeword. Allora scriveremo
Si = r(αi
) = e(αi
) = ej1 bi
1 + ej2 bi
2 + ... + ejk
bi
k, ∀i = 1, 2, ..., 2t
8
9. ove bl = ajl , l = 1, ..., k.
Non essendo note le posizioni dei simboli con errore, la forma vista non
può essere utilizzata per il calcolo della sindrome, la quale sarà determinata
a partire da r(x) e gli Si ottenuti verranno utilizzati come termini noti nel
sistema descritto sopra che avrà, come detto, 2t relazioni. Risulta ora evidente
il limite di correzione di t errori, in quanto il sistema sarà compatibile solo se
k non eccede t, caso in cui il sistema è di 2t incognite. Con ogni probabilità
il sistema ottenuto sarà non lineare, dunque devono essere utilizzate tecniche
più ranate delle usuali tecniche di risoluzione di sistemi lineari.
7 Implementazione
Per permettere un'implementazione più agevole sono utilizzati diversi algo-
ritmi per risolvere questo problema. In generale, si seguono due passi:
• Costruire un polinomio di locazione degli errori
Può essere fatto utilizzando l'algoritmo di Berlekamp-Massey o iteran-
do l'algoritmo di Euclide. Quest'ultimo viene utilizzato spesso per la sua
facilità di implementazione, sebbene l'algoritmo di Berlekamp-Massey
risulti più ecace. Ha complessità (O(n2
)), si basa sulla rappresenta-
zione polinomiale delle sequenze di byte e fornisce come risultato un
polinomio (Λ) le cui radici sono le posizioni degli errori.
Quindi si vanno a trovare le radici del polinomio costruito utilizzando
l'algoritmo della Chien search, algoritmo veloce di ricerca (O(n − k))
delle radici di polinomi su campi niti.
• Trovare i valori di errore
Note le posizioni degli errori, si possono ricavare i valori degli stessi
risolvendo il sistema di 2t equazioni dato dalle relazioni tra gli elementi
della sindrome e il polinomio e(x) calcolato nelle radici di g(x).
Nella pratica, si utilizza l'algoritmo di Forney che permette, al termi-
ne dell'algoritmo di Berlekamp-Massey, di ottenere, oltre al polinomio
Λ, anche un polinomio specico (Ω) che, valutato per le radici di Λ,
restituisce i valori degli errori. La complessità è di (O(n − k)).
9
10. Riferimenti bibliograci
[1] L. Giuzzi: Codici correttori: Un'introduzione. Springer-Verlag Italia,
Milano 2006.
[2] G.M. Piacentini Cattaneo: Algebra. Un approccio algoritmico. Decibel-
Zanichelli, 1996.
[3] I.S. Reed and G. Solomon: Polynomial Codes Over Certain Finite Fields.
SIAM Journal of Applied Math., vol. 8, 1960, pp. 300-304.
[4] B. Sklar: Reed-Solomon Codes.
[5] Wen Xu: Implementation and Performance Evaluation of Reed-Solomon
Codes. Cornell University, 2001.
10