Come si determina il numero di errori nell'algoritmo Welch-Berlekamp?


9

Nell'algoritmo Welch-Berlekamp per la decodifica dei codici Reed-Solomon, viene fornito un elenco di punti (ai,bi) rappresentano un messaggio con errori e su bi in posizioni sconosciute (ed e viene dato all'algoritmo). L'output è un polinomio che passa attraverso tutti i punti dati tranne quelli in cui si sono verificati errori.

Il metodo prevede la risoluzione di un sistema di equazioni lineari della forma

biE(ai)=Q(ai)

per tutti i cui E ha grado e e Q ha grado massimo e+k . Le variabili sono i coefficienti di E e Q .

Per garantire che E ha grado e uno di solito aggiunge il vincolo che il coefficiente di xe è 1 per il sistema lineare di cui sopra. Tuttavia, in pratica non si conosce necessariamente e . Un modo inefficiente (ma ancora tempo polinomiale) di gestirlo è provare e per tutti i valori che iniziano con (n+k1)/21 che scende fino a trovare una soluzione.

La mia domanda è: esiste un modo più efficiente per determinare ? eIn alternativa, esiste una modifica al sistema lineare che consente di utilizzare un limite superiore su anziché il valore esatto?e

In particolare, voglio usare questo decodificatore specifico per i codici Reed-Solomon e non un algoritmo completamente diverso basato su altre tecniche.


In risposta alla risposta di DW, ecco il mio esempio di lavoro. Tutto è fatto modulo 7.

plain message is: [2, 3, 2]
polynomial is: 2 + 3 t^1 + 2 t^2
encoded message is: [[0, 2], [1, 0], [2, 2], [3, 1], [4, 4]]
corrupted message is: [[0, 2], [1, 0], [2, 3], [3, 1], [4, 4]]

Quindi l'errore è nel terzo punto.

Quando l'equazione polinomiale in questionee=2

bi(e0+e1x+e2x2)q0q1xq2x2q3x3q4x4=0

E collegando ottiene il sistema in forma di matrice:x=0,1,2,3,4

[2, 0, 0, 6, 0, 0, 0, 0, 0]
[0, 0, 0, 6, 6, 6, 6, 6, 0]
[3, 6, 5, 6, 5, 3, 6, 5, 0]
[1, 3, 2, 6, 4, 5, 1, 3, 0]
[4, 2, 1, 6, 3, 5, 6, 3, 0]
[0, 0, 1, 0, 0, 0, 0, 0, 1]

L'ultima riga è il vincolo che . Ottenendo l'applicazione dell'eliminazione gaussianae2=1

[1, 0, 0, 0, 0, 0, 1, 4, 0]
[0, 1, 0, 0, 0, 0, 3, 3, 1]
[0, 0, 1, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 1, 0, 0, 2, 1, 0]
[0, 0, 0, 0, 1, 0, 2, 2, 5]
[0, 0, 0, 0, 0, 1, 4, 5, 2]

E selezionando 1 per entrambe le variabili libere otteniamo un vettore di soluzione

[2, 2, 1, 4, 1, 0, 1, 1]

Che si traduce in

E is 2 + 2 t^1 + 1 t^2
Q is 4 + 1 t^1 + 0 t^2 + 1 t^3 + 1 t^4

E non divide Q . Si noti che QEQQ fattori come (t+6)(t3+2t2+2t+3)mod7

Per ottengo una buona soluzione:e=1

system is:    
[2, 0, 6, 0, 0, 0, 0]
[0, 0, 6, 6, 6, 6, 0]
[3, 6, 6, 5, 3, 6, 0]
[1, 3, 6, 4, 5, 1, 0]
[4, 2, 6, 3, 5, 6, 0] 
[0, 1, 0, 0, 0, 0, 1]

reduced system is:

[1, 0, 0, 0, 0, 0, 5]
[0, 1, 0, 0, 0, 0, 1]
[0, 0, 1, 0, 0, 0, 3]
[0, 0, 0, 1, 0, 0, 3]
[0, 0, 0, 0, 1, 0, 6]
[0, 0, 0, 0, 0, 1, 2]

solution is [5, 1, 3, 3, 6, 2]
Q is 3 + 3 t^1 + 6 t^2 + 2 t^3
E is 5 + 1 t^1
P(x) = 2 + 3 t^1 + 2 t^2 # this is correct!
r(x) = 0

Si noti che mentre il controesempio sopra è stato generato dal codice che ho scritto da zero (era sostanzialmente la prima cosa che ho provato), si può verificare che le soluzioni siano valide a mano, quindi anche se il mio codice è difettoso è ancora un controesempio valido per il reclamo che usando funziona.e=2


@DW il vettore della soluzione è valido. In realtà è 1 * 2 + 1 * 1 + 4 * 1 (la dimensionalità del vettore della soluzione è una tantum perché l'ultima colonna della matrice è esclusa). Il mio lasciare fuori il è un errore di battitura nel writeup qui, ma è corretto nella mia implementazione. Puoi vedere il suo effetto, ad esempio, nella seconda riga del sistema che utilizza il punto [1, 0], e i primi tre impegni sono tutti zero perché moltiplicati per 0. Se il mio esempio non è chiaro, posso pubblicare il mio codice su github. Considero il mio codice pulito, ma sarebbe più disordinato a causa della sua generalità. bi
JeremyKun,

Risposte:


3

La stessa procedura funziona effettivamente per correggere qualsiasi numero di errori fino a .e

Il requisito è che l'errore polinomiale debba essere zero in ogni punto a i in cui si è verificato un errore. Nulla dice che deve essere zero solo in quei punti; puoi avere unE(x)ai che è zero anche in altri punti, e va bene, purché il suo grado sia e .E(x)e

Quindi, se è un limite superiore al numero di errori, esisterà un polinomio E ( x ) con tutte le proprietà desiderate (ovvero, ha grado esattamente e ed è zero in ogni punto in cui si verifica un errore). Ad esempio, se ci sono meno di errori e , allora esiste un polinomio E ( x ) che è zero ad ogni errore e zero in alcuni punti in più per portare il numero di zeri fino a e .eE(x)eeE(x)e

Infine, il teorema di correttezza afferma che se esiste un tale polinomio , allora l'algoritmo di Berlekamp-Welch sarà in grado di trovarlo. Quindi, anche se ci sono meno di e errori, la procedura continuerà a funzionare correttamente per identificare E ( x ) . Una volta che hai E ( x ) , puoi identificare le posizioni n - e che sono prive di errori e quindi puoi decodificare in modo semplice.E(x)eE(x)E(x)ne


Per documentare il risultato della conversazione sul "controesempio" nella domanda:

nk+1(nk)/2n=5k=3(nk)/2=1e=1e=2

Quindi, il controesempio non è in realtà un controesempio e non contraddice la mia risposta sopra.


1
nk+1(nk)/2

E(x)E(x)

n=7e=2

Ok, questo funziona con gli esempi su cui ci sto provando. Eccellente!
JeremyKun,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.