Циклический код

Пример разработки алгоритма

 

 

Для формирования кодовой комбинации будем использовать генераторный многочлен вида: 1(+)у(+)у3. Где (+) – операция "суммирование" для той системы исчисления, в которой записано кодовое слово (в данном случае – кодовое слово есть двоичный код, а следовательно используем бинарную систему счисления).

Такому многочлену будет соответствовать следующая схема аппаратной реализации (рис. 1):

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 


Рис. 1

 

Число ячеек соответствует степени многочлена (в данном случае 3). Многочлен можно представить в виде Р(у)=L0*1(+)L1*у(+)L2*0(+)L3*у3, где Li – коэффициент при члене в степени i. Каждая ячейка А1…А3 может иметь состояние 1 или 0. Суммирование осуществляется по модулю 2.

Алгоритм заключается в следующем:

На первой итерации все ячейки имеют состояние 0. На вход подается двоичная последовательность (например 1101). А1 получает значение первого члена входной последовательности (1). Т.о. на сумматор подается комбинация 100. На выход идет 1 (т.к. в 1+0+0=1). На следующей итерации А1 получает значение второго члена (1), А2 получает значение ячейки А1 с предыдущей итерации(1). На сумматоре 110, на выходе 0. Аналогично, на 3-ей итерации: А1=0, А2=1, А3=1, SUM=0. На 4-ой: А1=1, А2=0, А3=1, SUM=0. Таким образом мы получили проверочную кодовую комбинацию 1000.

 

Передача кода происходит так:

Сторона-передатчик, используя известный генераторный многочлен Р(у) вычисляет проверочную кодовую комбинацию и присоединяет ее "в хвост" передаваемому коду. Сторона-приемник, получив кодовую комбинацию, отбрасывает "хвост", а для "полезного" кода вычисляет проверочную кодовую комбинацию, используя тот же многочлен Р(у). Если принятая и вычисленная кодовые комбинации отличаются друг от друга, то при передачи возникла ошибка.

 

Проиллюстрируем кодом программы (Pascal):

unit main;

 

//вычисление проверочного "хвоста":

function Crc(sin:string):

string; //входная последовательность

var

sout: string[4]; //выходная строка

sl1,                                //первый член

sl2,         //второй член

sl3 :char;       //третий член

i: integer;      //счетчик

begin

 

sl1:='0';

sl2:='0';

sl3:='0';

 

for i:=1 to 4 do

    begin

    if i>2 then sl3:=sl2;

    if i>1 then sl2:=sl1;

    sl1:=sin[i];

    if (strtoint(sl1)+strtoint(sl2)+strtoint(sl3)=3) then

       sout:=sout+'1';

    if (strtoint(sl1)+strtoint(sl2)+strtoint(sl3)=2) then

       sout:=sout+'0';

    if (strtoint(sl1)+strtoint(sl2)+strtoint(sl3)=1) then

       sout:=sout+'1';

    if (strtoint(sl1)+strtoint(sl2)+strtoint(sl3)=0) then

       sout:=sout+'0';

    end;

Crc:=sout;

end;

 

//Декодирование

procedure ButtonDecodeClick(Sender: TObject);

var SBuf1, SBuf2: string[8]; //буферы обмена строк

    i:            integer;      //счетчик

begin

SBuf1:=EditCoded.Text;

SBuf2:='0000';

SBuf2[1]:=SBuf1[5];

SBuf2[2]:=SBuf1[6];

SBuf2[3]:=SBuf1[7];

SBuf2[4]:=SBuf1[8];

if crc(SBuf1)=SBuf2 then

        begin

        EditRez.Text:='Все нормально.';

        EditDecoded.Text:=SBuf1;

        end

        else

        EditRez.Text:='Обнаружена ошибка!';

end;

end.

 

(С) МорокЪ 2004

Hosted by uCoz