2.3 Procedura uproszczonego dekodowania
Procedura dekodowania dla wszystkich kodów cyklicznych jest bardzo podobna. Oczywiście każdy kod ma soje specyficzne operacje, jednak ogólny zarys procesu dekodowania taki sam. W praktyce najczęściej stosuje się uproszczony algorytm, jest prosty w implementacji, a jego działanie nie odbiega od procedur nie uproszczonych.
Algorytm wykrywa i koryguje wszystkie błędy znajdujące się na n-k sąsiadujących ze sobą pozycjach wektora kodowego.
Aby rozpocząć proces korekcji błędów w wektorze, należy obliczyć syndrom. W przypadku kodów cyklicznych, a więc i kodów Reeda-Solomona syndrom jest resztą z dzielenia wielomianu odpowiadającego wektorowi odebranemu Cy(x) oraz wielomianu generującego dany kod g(x). Dzielenie to można przestawić jak poniżej:
q(x) - oznacza część całkowitą,
g(x) - oznacza wielomian generujÄ…cy,
s(x) - resztÄ… z dzielenia inaczej zwany syndromem.
Syndrom to inaczej wektor współczynników wielomianu stopnia n-k-1, współczynniki pozwalają stwierdzić czy odebrany wektor jest wektorem kodowym czy też podczas przesłania wystąpiły błędy. Obliczamy to w sposób następujący, gdy obliczony syndrom ( lub inaczej wagi) maja wartość zero odebrany wektor nie posiada zniekształceń. Jednak gdy chociaż jedna wartość wektora wag jest różna od zera wtedy wiemy że wystąpiły błędy i dany wektor poddajemy procedurze korekcji.
Poszczególne operacje algorytmu wyglądają następująco:
Odbieramy wektor kodowy ( w naszym przypadku odbiór poprzedza procedura deszyfrowania która zostanie omówiona dalej),
Następnie obliczamy wagi (lub inaczej syndrom) dla odebranego wektora,
Po obliczeniu wektora wag, następuje sprawdzenie czy wektor jest równy zero, czy posiada niezerowe elementy,
Kolejnym krokiem jest sprawdzenie czy ewentualna ilość błędów nie przekracza możliwości korekcyjnych kody następuje korekcja błędów, polega to na dodaniu do wektora kodowego obliczonego wektora wag (syndromu), a powstały wektor zwiera skorygowaną informacje.
Jeżeli ilość błędów czyli niezerowych wartości wektora wag, jest większa od możliwości korekcyjnych kodu następuje przesunięcie cykliczne o jedną pozycje, tak aby błędne wartości znalazły się w części nadmiarowej wektora kodowego, następnie algorytm wraca do punktu drugiego. Operacja jest powtarzana do momentu wykonania pełnego cyklu przesunięć lub gdy po przesunięciu ilość błędów pozwoli na ich korekcje.
Schemat blokowy algorytmu:
Procedury realizujÄ…ce dekodowanie:
Odczyt wektor kodowy
Obliczenie syndromu
Tu następuje sprawdzenie wartości wag
Korekcja błędów, przez sumowanie wektora wag z wektorem kodowym
Przesunięcie cykliczne wektora o jedna pozycje
Syndrom = 0
Syndrom ≠0
procedure Decode(n, r, nce: Byte);
var
jk, js, k, ks, xx: Byte;
i: Integer;
procedure Correct;
var kk: Byte;
begin
js:=i;
for kk:=0 to r-1 do
begin
jk:=(n+kk-js) mod n;
vr[jk]:=S(vr[jk], sn[kk])
end
end; {Correct}
procedure Shift(x, y: Byte);
var j: Byte;
begin
xx:=S(x, y);
for j:=r-1 downto 0 do
sn[j]:=S(sn[j-1], P(pg[j], xx))
end; {Shift}
procedure Weight;
var j: Byte;
begin
ks:=0;
for j:=0 to r-1 do if sn[j]<>0 then Inc(ks);
if ks<>0 then
begin
case ks<=nce of
TRUE : begin Correct; inf:='Korekcja OK !!!'; end;
FALSE: inf:='Brak korekcji !!!';
end
end
end; {Weight}
begin
for i:=r-1 downto -1 do sn[i]:=0;
for i:=n-1 downto r do Shift(vr[i], sn[r-1]);
for i:=r-1 downto 0 do sn[i]:=S(vr[i], sn[i]);
i:=0; Weight;
if ks>nce then
repeat
Inc(i); Shift(0, sn[r-1]); Weight
until (ks<=nce) OR (i=n)
end; {Decode}