Jak określić liczbę błędów w algorytmie Welch-Berlekamp?


9

W algorytmie Welcha-Berlekampa do dekodowania kodów Reeda-Solomona podaje się listę punktów reprezentujących komunikat z błędami na w nieznanych lokalizacjach (i otrzymuje się do algorytmu). Wyjście jest wielomianem przechodzącym przez wszystkie podane punkty z wyjątkiem tych, w których wystąpiły błędy.(ai,bja)mibjami

Metoda polega na rozwiązaniu układu równań liniowych formy

bjami(zaja)=Q(zaja)

dla wszystkich gdzie ma stopień a ma stopień co najwyżej . Zmienne są współczynnikami i .jamimiQmi+kmiQ

Aby upewnić się, że ma stopień zwykle dodaje się ograniczenie, że współczynnik wynosi 1 do układu liniowego powyżej. W praktyce jednak niekoniecznie wiadomo . Jednym nieefektywnym (ale wciąż wielomianowym sposobem) radzeniem sobie z tym jest wypróbowanie dla wszystkich wartości zaczynających się od , aż do znalezienia rozwiązania.mimixmimimi(n+k-1)/2)-1

Moje pytanie brzmi: czy istnieje bardziej skuteczny sposób na określenie ? miAlternatywnie, czy istnieje modyfikacja układu liniowego, która pozwala na użycie górnej granicy na zamiast dokładnej wartości?mi

W szczególności chcę użyć tego konkretnego dekodera dla kodów Reeda-Solomona, a nie zupełnie innego algorytmu opartego na innych technikach.


W odpowiedzi na odpowiedź DW, oto mój działający przykład. Wszystko odbywa się 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]]

Zatem błąd tkwi w trzecim punkcie.

Gdy omawiane równanie wielomianowe wynosimi=2)

bi(e0+e1x+e2x2)q0q1xq2x2q3x3q4x4=0

Podłączenie daje układ w postaci macierzy: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]

Ostatni wiersz jest ograniczeniem, że . Stosując eliminację Gaussa otrzymujemye2=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]

I wybierając 1 dla obu wolnych zmiennych otrzymujemy wektor rozwiązania

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

Co przekłada się na

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

I nie dzieli . Zauważ, że współczynniki jakEQQ(t+6)(t3+2t2+2t+3)mod7

Dla mam dobre rozwiązanie: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

Zauważ, że chociaż powyższy kontrprzykład został wygenerowany przez kod, który napisałem od zera (była to zasadniczo pierwsza rzecz, której próbowałem), można sprawdzić, czy rozwiązania są poprawne ręcznie, więc nawet jeśli mój kod jest wadliwy, nadal jest prawidłowym kontrprzykładem do roszczenia że użycie działa.e=2)


@DW wektor rozwiązania jest prawidłowy. W rzeczywistości jest to 1 * 2 + 1 * 1 + 4 * 1 (wymiar wektora rozwiązania jest jeden, ponieważ ostatnia kolumna macierzy jest pominięta). Moje pomijanie jest literówką w opisie tutaj, ale jest poprawne w mojej implementacji. Możesz zobaczyć jego efekt, na przykład, w drugim rzędzie systemu, który używa punktu [1, 0], a pierwsze trzy wpisy są zerowe, ponieważ są pomnożone przez 0. Jeśli mój przykład jest niejasny, mogę opublikować mój kod na github. Uważam mój kod za czysty, ale ze względu na ogólność byłby bardziej nieporządny. bja
JeremyKun,

Odpowiedzi:


3

Ta sama procedura faktycznie koryguje dowolną liczbę błędów do e.

Wymagany jest wielomian błędu E(x) w każdym punkcie musi wynosić zero zajagdzie wystąpił błąd. Nic nie mówi, że musi to być zero tylko w tych punktach; możesz miećmi(x) w innych punktach jest to zero i to jest w porządku, pod warunkiem, że ma stopień mi.

Więc jeśli mi jest górną granicą liczby błędów, będzie wielomian mi(x) ze wszystkimi pożądanymi właściwościami (tj. ma dokładnie stopień mii wynosi zero w każdym punkcie, w którym wystąpił błąd). Na przykład, jeśli jest ich mniej niżmi błędy, wtedy istnieje wielomian mi(x) to zero przy każdym błędzie i zero w kilku kolejnych punktach, aby dokładnie zwiększyć liczbę zer mi.

Wreszcie twierdzenie o poprawności mówi, że jeśli taki wielomian mi(x)istnieje, wówczas algorytm Berlekamp-Welch będzie w stanie go znaleźć. Tak więc, nawet jeśli jest ich mniej niż mi błędy, procedura będzie nadal działać poprawnie w celu identyfikacji mi(x). Kiedy już to zrobiszmi(x), możesz zidentyfikować n-mi pozycje, które są wolne od błędów, a następnie można dekodować w prosty sposób.


Aby udokumentować wynik rozmowy na temat „kontrprzykładu” w pytaniu:

To właściwie nie jest prawidłowy kontrprzykład. Wada polegała na obliczeniu, ile błędów należy oczekiwać od Berlekamp-Welch, aby móc je poprawić. Odległość wynosin-k+1, więc powinieneś oczekiwać, że będzie w stanie poprawić do (n-k)/2)błędy (jak wskazuje Ran G.). W twoim kontrprzykładzien=5 i k=3), więc (n-k)/2)=1, więc powinieneś oczekiwać, że ta procedura będzie w stanie poprawić jeden błąd, tj. mi=1. Więc kiedy uruchomiłeś procedurę na przykładzie zmi=2), nie ma powodu, aby oczekiwać, że procedura będzie działać poprawnie.

Zatem kontrprzykład nie jest tak naprawdę kontrprzykładem i nie jest sprzeczny z moją odpowiedzią powyżej.


1
@JeremyKun odległość wynosi n-k+1 więc kod może poprawić do (n-k)/2)błędy, prawda?
Ran G.

Chociaż brakuje dowodu, wyjaśnienie w tej odpowiedzi ma dla mnie sens. Ustawienie zera wmi(x)„mówi” algorytmowi, które punkty powinien zignorować podczas interpolacji wielomianu. Dlatego tak długo, jak zbiór zer wmi(x) zawiera zestaw momentu, w którym wystąpiły błędy, dekodowanie powinno działać. W takim przypadku powinno być więcej wolnych zmiennych (aby ustawić inne miejsca zer w dowolny sposób).
Ran G.

Ooooh, czy to jest problem ... że pomieszałem związanie Singletona? Więc, aby sprawdzić, czy miałbym ustawićn=7, wprowadź pojedynczy błąd i ustaw mi=2), powinniśmy oczekiwać, że wszystko się ułoży. Spróbuję teraz.
JeremyKun,

Okej, działa to na przykładach, na których próbuję. Świetny!
JeremyKun,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.