Sei sulla pagina 1di 7

Codice di Golay Esteso Studio e implementazione

Corso di Combinatoria per la Protezione delle Informazioni

Francesco Miscia Prof. Norberto Gavioli 2 luglio 2013

Indice
1 Introduzione 2 Codici Estesi 3 Il codice di Golay esteso 4 Decodica del Codice 5 Lalgoritmo di decodica 6 Implementazione in Matlab 6.1 La funzione peso . . . . . . . . . . 6.2 La codica . . . . . . . . . . . . . 6.3 Lintroduzione dellerrore . . . . . 6.4 La correzione e la decodica . . . . 6.5 Una funzione main() di simulazione 2 2 2 3 4 4 4 5 6 6 7

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

. . . . .

Sommario Nel presente documento verr` a presentato il codice correttore di Golay esteso e ne verr` a discussa una sua implementazione sviluppata in Matlab.

Introduzione

Il codice di golay esteso, ` e un codice perfetto utilizzato ampiamente in passato. La NASA ne scelse infatti ladozione in particolar modo per la trasmissione di immagini a colori di Giove e Saturno nei voli a bassa quota delle sonde Voyager 1 e Voyager 2. Viene inoltre utilizzato anche come standard de facto nella correzione di errori nelle trasmissioni in HF

Codici Estesi

Alcune volte aumentare la lunghezza del codice di 1 o pi` u elementi pu` o risultare utile per migliorare la correzione e lindividuazione degli k . errori in una trasmissione, a scapito per` o, del trasmission rate: = n Sia C un codice lineare di lunghezza n, deniamo C di lunghezza n+1 il codice ottenuto da C aggiungendo un bit ad ogni parola in modo che il peso di Hamming della parola stessa rimanga pari. Se il codice originale C possedeva una matrice generatrice Gkn , deniamo allora G = [G, b], con b colonna di parit` a. La matrice di controllo di parit` a H pu` o essere costruita da G oppure dalla matrice H originale in modo H j che H = la quale ha rango n-k+1 (jn1 ` e la colonna formata 0 1 da soli uno). Inoltre G H = [GH, Gj + b] = 0, perch` e GH=0 e Gj+b=0 dato che b ` e la colonna di parit` a di G. Da notare ` e il fatto che non ` e possibile estendere un codice pi` u di una volta.

Il codice di Golay esteso

Il codice di Golay esteso ` e un codice correttore perfetto (difatti verica la stima di Hamming) che permette di correggere al massimo 3 errori. Sia B1212 la seguente matrice: 1 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 1 0 1 1 1 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 1 . B= 0 0 0 1 0 1 1 0 1 1 1 1 0 0 1 0 1 1 0 1 1 1 0 1 0 1 0 1 1 0 1 1 1 0 0 1 1 0 1 1 0 1 1 1 0 0 0 1 0 1 1 0 1 1 1 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 0

Sia G1212 = [IB ] la matrice generatrice del codice, con I=I1212 la matrice identit` a. Il codice lineare C formato da G ` e il codice di Golay esteso C24 . In generale per ricordare la struttura di B, basta considerare la porzione B1111 e shiftare circolarmente la prima riga di ununit` a, in B1111 j questo modo B pu` o esser vista nel seguente modo: . jT 0 Seguono ora 7 importanti propriet` a di C24 : C24 ha lunghezza n=24, k=12 e quindi contiene 212 = 4096 parole Una matrice di parit` a per C24 ` e H2412 = B I

Unaltra matrice di parit` a per C24 ` e H2412 =

I ` possibile . E B vericare infatti che ogni riga di B ` e ortogonale ad ogni altra riga di B applicando manualmente il prodotto scalare (che sar` a uguale a 0) e quindi BB T = I B = B T B 2 = BB T GH = 0

Unaltra matrice generatrice di C24 ` e G = [BI ]


T C24 ` e duale, cio` e C24 = C24

La distanza di C ` e8 C24 ` e un codice che corregge tre errori

Decodica del Codice

Per impostare un algoritmo di decodica del codice di Golay esteso osserviamo subito che deve essere wt(u) 3, con u il pattern derrore, perch` e abbiamo detto di trovarci di fronte ad un codice 3-correttore. Lobiettivo ` e quello quindi di trovare un coset leader u del coset contenente w (la parola ricevuta) senza dover fare riferimento ad un SDA. Sia u=[u1 u2 ], con ui di lunghezza 12, allora poich` e wt(u) 3, accadr` a che o wt(u1 ) 1, oppure wt(u2 ) 1. Sia quindi s1 la sindrome di w tale che s1 = wH = [u1 u2 ]H = u1 + u2 B , possono allora accadere le seguenti situazioni: Se wt(u2 ) 1: s1 consiste: in una parola di peso (al massimo) 3 (se wt(u2 ) = 0), oppure in una riga di B con al massimo 2 dei suoi bit cambiati (se wt(u2 ) = 1) Se wt(u1 ) 1: s2 (la sindrome ottenuta moltiplicando w per la seconda matrice H) consiste: in una parola di peso (al massimo) 3 (se wt(u1 ) = 0), oppure in una riga di B con al massimo 2 dei suoi bit cambiati (se wt(u1 ) = 1) ` possibile inoltre calcolare una sindrome a partire dallaltra noE tando che B 2 = I , infatti s2 = u1 B + u2 = (u1 + u2 B )B = s1 B . Ovviamente una volta determinato u ` e possibile decodicare w con v = u + w.

Lalgoritmo di decodica
Calcolare s = wH se wt(s) 3 allora u = [s0] se wt(s + bi ) 2 per qualche riga bi di B allora u=[s + bi ei ] (con ei liesima riga di I1212 ) Calcolare la seconda sindrome sB se wt(sB) 3 allora u = [0sB ] se wt(sB + bi ) 2 per qualche riga bi di B allora u=[ei s + bi ] (con ei liesima riga di I1212 )

Lalgoritmo naturalmente richiede nel caso peggiore 26 calcoli del peso, e difatti non ` e ecientissimo, ma ` e possibile fermare ogni ciclo una volta che u ` e stato determinato.

Implementazione in Matlab

Seguendo lalgoritmo mostrato nella precedente sezione ` e possibile quindi implementare lintero meccanismo di codica e decodica del codice di Golay esteso.

6.1

La funzione peso

Una delle parti pi` u importanti dellalgoritmo ` e la funzione peso. Il seguente listato mostra quindi come questa funzione ` e stata implementata
1 2 3 4 5 6 7 8 9 10

%Funzione p e s o : d a t a una p a r o l a b i n a r i a %l a f u n z i o n e c a l c o l a i l numero d i 1 function [ w e i g h t ] = compute weight ( s ) w e i g h t =0; f o r x=1: numel ( s ) i f ( s ( x)==1) w e i g h t = w e i g h t +1; end end end

6.2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31

La codica

Presa una parola (8 bit) viene eettuata la codica nel codice C24 %M a t r i c e B B =[1 1 0 1 1 0 1 1 0 1 1 1 1 1 1 0 1 1 0 0 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1

1 1 0 0 0 1 0 1 1 0 1 1

1 0 0 0 1 0 1 1 0 1 1 1

0 0 0 1 0 1 1 0 1 1 1 1

0 0 1 0 1 1 0 1 1 1 0 1

0 1 0 1 1 0 1 1 1 0 0 1

1 0 1 1 0 1 1 1 0 0 0 1

0 1 1 0 1 1 1 0 0 0 1 1

1 1 1 1 1 1 1 1 1 1 1 0];

%M a t r i c e i d e n t i c a I 1 2 = eye ( 1 2 ) ; %M a t r i c e G e n e r a t r i c e d e l c o d i c e G = [ I12 B ] ; %M a t r i c e d i c o n t r o l l o p a r i t a H = [ I12 B] ; % code : i n p u t c o d i f i c a t o i n u n i c o d e % word : p a r o l a b i n a r i a d i 12 b i t word = d e 2 b i ( d o u b l e ( code ) , 1 2 ) ; %C o d i f i c a word G s e n t = mod( d o u b l e ( word ) d o u b l e (G) , 2 ) ;

6.3

Lintroduzione dellerrore

Viene poi simulato linserimento di un errore nella parola in esame casuale allinterno del canale di comunicazione, lerrore pu` o variare da 1 a 3.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

%send = i n p u t , p a r o l a i n v i a t a %r e c e i v e d = o u t p u t received = sent ; %Viene c r e a t o un v e t t o r e con 1 ,2 o 3 e l e m e n t i %che d e f i n i r a n n o g l i i n d i c i d e i b i t che verranno %m o d i f i c a t i (somma modulo 2) j = randi ( [ 1 , 3 ] ) ; i = randi ( [ 1 , 2 4 ] , 1 , j ) ; f o r x=1: numel ( i ) r e c e i v e d ( i ( x ) ) = mod( r e c e i v e d ( i ( x ) ) + 1 , 2 ) ; end

6.4

La correzione e la decodica

La decodica della parola ricevuta avviene come descritto nella sezione 5. In generale lalgoritmo continua a ciclare nch` e un pattern di errore non nullo viene identicato e, nel caso in cui a ciclo terminato nessun pattern derrore ` e stato identicato, si dovr` a richiedere la ritrasmissione della parola.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

%c u o r e d e l l a l g o r i t m o function [ r e s u l t ] = g o l a y c o r e ( c ) ... ... ... %r e c e i v e d = p a r o l a r i c e v u t a %s = sindrome s = mod( r e c e i v e d H, 2 ) ; %u = p a t t e r n d e r r o r e [ 0 0 . . . 0 ] u=zeros ( 1 , 2 4 ) ; %c a l c o l o d e l p e s o w e i g h t = compute weight ( s ) ; %A l g o r i t m o d i d e c o d i f i c a i f ( weight <=3) u = [ s 0 0 0 0 0 0 0 0 0 0 0 0]; else

21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53

f o r x =1:12 sum = mod(B( x , : ) + s , 2 ) ; w e i g h t = compute weight ( sum ) ; i f ( weight <=2) u=[sum I 1 2 ( x , : ) ] ; break ; end end end s = mod( s B , 2 ) ; w e i g h t = compute weight ( s ) ; i f ( u (1 ,:)== zeros ( 1 , 2 4 ) ) i f ( weight <=3) u = [0 0 0 0 0 0 0 0 0 0 0 0 s ] ; else f o r x =1:12 sum = mod(B( x , : ) + s , 2 ) ; w e i g h t = compute weight ( s ) ; i f ( weight <=2) u=[ I 1 2 ( x , : ) sum ] ; break ; end end end end %C a l c o l o d e l l a p a r o l a d e c o d i f i c a t a c o r r e c t i o n = mod( u+r e c e i v e d , 2 ) ; %C o n v e r s i o n e i n u n i c o d e p e r l o u t p u t r e s u l t = char ( bi2de ( c o r r e c t i o n ( 1 , 1 : 1 2 ) ) )

6.5

Una funzione main() di simulazione

Per simulare lalgoritmo viene richiesto allutente di inserire come input del testo, che verr` a codicato, sottoposto ad errori randomici e corretto. Ecco quindi la funzione che lancer` a la simulazione.
1 2 3 4 5 6 7 8 9 10

s t r = input ( I n s e r i s c i l a p a r o l a da i n v i a r e : , s ) r e s = zeros ( 1 , numel ( s t r ) ) ; %p e r o g n i l e t t e r a i n i n p u t v i e n e e f f e t t u a t o l a l g o r i t m o f o r x=1: numel ( s t r ) res (x) = golay core ( str (x ) ) ; end disp ( La p a r o l a i n v i a t a e s t a t a c o r r e t t a con : ) ; disp ( char ( r e s ) ) ;