Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Записка по КиЗИ.doc
Скачиваний:
2
Добавлен:
12.07.2019
Размер:
112.64 Кб
Скачать

Заключение

В ходе выполнения курсовой работы мы закрепили знания, полученные в процессе изучения дисциплины «Кодирование и защита информации». В соответствии с вариантом задания был рассмотрен код Рида-Соломона с исправлением 4-х кратных ошибок. При некоторых условиях циклические коды Рида-Соломона (РС) являются частным случаем кодов БЧХ.

Коды РС обладают огромной корректирующей способностью и позволяют исправлять несколько пачек ошибок.

То обстоятельство, что коды РС при любой заданной скорости имеют наибольшее возможное минимальное расстояние, делает их привлекательными с точки зрения практического использования.

В то же время структура этих кодов допускает относительно простую техническую реализацию, поэтому практическое применение не только желательно, но и возможно.

Библиография

1. Василенко В.А. '' Конспект лекций''

2. Блейхут Р. '' Теория и практика кодов, контролирующих ошибки ''

3. Цымбал В.П. '' Теория информации и кодирования ''

4. Березюк Н.Т., Андрущенко А.Г. ''Кодирование информации ''

5. Шварцман В.О., Емельянов Г.А. '' Теория передачи дискретной информации ''

ПРИЛОЖЕНИЕ А

Текст программы

unit Coder_Unit;{кодер}

interface

Uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Buttons, StdCtrls, ComCtrls, Math;

procedure Main;

var

n,S:integer;

Nk:integer;

h:integer;

ro:integer;

Px:integer;

Ix,I1x:integer;

Rx:integer;

Xnk:integer;

Coding_file:textfile;

Line_file:file of integer;

implementation

Uses Main_Unit;

const

{ 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29}

Poly_table:array[1..6,1..15]of integer=

{ 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29}

(( 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),

( 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),

(11, 13, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),

(19, 31, 28, 25, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),

(37, 61, 55, 47, 55, 59, 0, 0, 0, 0, 0, 0, 0, 0, 0),

(67, 87,103, 73,104,109, 0, 0, 0, 0, 0, 0, 0, 0, 0));

{--------------------- функция определения значения h ----------------------}

function Poryadoc_Poly(D:integer): integer;

Var

i:integer;

x:integer;

k:integer;

Begin

i:=10;

x:=0;

k:=0;

while i>=0 do

begin

x:=floor(power(2,i));

if ((D and x)=x)and(i<>0) then begin k:=i; i:=0 end;

i:=i-1;

end;

Poryadoc_Poly:=k;

End;

function Funk_H(n,S:integer): integer;

var

h:integer;

x:real;

Begin

x:=n+1;

h:=floor(log2(x));

Funk_H:=h;

End;

function Multym2(A,B,k:integer):integer;

Var

c:integer;

E:integer;

D:integer;

Begin

E:=0;

D:=0;

D:=floor(power(2,k));

C:=B and D;

while k>=0 do

begin

if C=D then

Begin

E:=E xor(A shl k);

end;

k:=k-1;

D:=floor(power(2,k));

C:=B and D;

End;

Multym2:=E;

End;

function Create_Poly: word;

var

i,j:integer;

J0:integer;

C:integer;

m:integer;

Begin

{Px:= X14+X13+X12+X11+X10+X9+X8+X7+X6+X5+X4+X3+X2+X1+1}

Create_Poly:=32767;

End;

function Divm2(A,B:integer):byte;

var

r,c,x:integer;

begin

c:=A ;

r:=Poryadoc_Poly(c)-Poryadoc_Poly(B);

repeat

if r>=0 then

begin

x:= B shl r;

c:= c xor x;

r:=Poryadoc_Poly(C)-Poryadoc_Poly(B);

end;

until r<0;

divm2:=c;

end;

function Stepen_Poly(n,s:integer):integer;

Begin

{ P:=Create_Poly;}

End;

function Coding_message(Ix:integer): integer;

var

Qx,Rx:integer;

Begin

{!!!!!!!!!!!!!!!!!!!Кодирование сообщения!!!!!!!!!!!!!!! }

{3-- Qx:=Ix*Xnk}

Qx:=Ix shl (h*S);

{ Showmessage('Qx -'+inttostr(Qx));

}

{4-- Qx/Px}

Rx:=Divm2(Qx,Px);

{ Showmessage('Rx -'+inttostr(rx));}

{5-- сдвиг Ix}

{6-- Code_Ch:=Ix xor Rx}

Coding_message:=Qx xor Rx;

End;

procedure Main;

var

Ch:char;

cr:integer;

i:integer;

Begin

n:=16;

S:=4;

{1-- определение Nk-}

showmessage('S:='+IntToStr(S));

ro:=2*S-1;

showmessage('ro:='+inttostr(ro));

h:=Funk_H(n,S);

showmessage('h='+inttostr(h));

Nk:=h*S;

{2-- Определение Px}

Px:=Create_Poly;

showmessage('Полином='+inttostr(Px));

assignfile(Line_file,Line_File_Paht);

i:=1;

assignfile(Coding_file,Main_Unit.Coding_File_Path);

reset(Coding_file);

rewrite(Line_file);

while not eof(Coding_file) do

begin

while not eoln(Coding_file) do

Begin

read(Coding_file,Ch);

cr:=Coding_Message(ord(ch));

write(line_file,cr);

end;

cr:=-1;

write(line_file,cr);

readln(Coding_file);

end;

Closefile(Coding_file);

Closefile(Line_file);

end;

end.

unit Decoder_Unit;{декодер}

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Buttons, StdCtrls, ComCtrls, Math, Coder_Unit;

procedure Main_Decoding;

var

Decode_File:textfile;

Line_File: file of integer;

Cx: integer;

implementation

uses Main_Unit,Error_line;

function sdL(A,k:integer):integer;

var

i,x: integer;

B:integer;

Begin

x:=floor(power(2,k));

{ showmessage('До сдвига влево В='+inttostr(A));

showmessage('порядок ='+inttostr(x));}

B:=A shl 1 ;

if (B and x )=x then

begin

B:=B-x;

B:=B+1;

end

else B:= A shl 1;

{ showmessage('После сдвига влево В='+inttostr(b));}

sdL:=B;

End;

function sdR(A,k:integer):integer;

var

i,x: integer;

B:integer;

Begin

x:=floor(power(2,k));

B:=A;

{ showmessage('До сдвига вправо Dx='+inttostr(b)); }

if (A and 1 )= 1 then

begin

B:=B+x;

B:=B shr 1;

end

else B:= A shr 1;

{ showmessage('После сдвига вправо В='+inttostr(b));}

sdR:=B;

End;

{---------------------------------------------------------------}

function Poryadoc_Poly(D:integer): integer;

Var

i:integer;

x:integer;

k:integer;

Begin

i:=16;

x:=0;

k:=0;

while i>=0 do

begin

x:=floor(power(2,i));

if ((D and x)=x)and(i<>0) then begin k:=i; i:=0 end;

i:=i-1;

end;

Poryadoc_Poly:=k;

End;

{----------------------------------------------------------------------}

function Divm2(A,B:integer):byte;

var

r,c,x:integer;

begin

c:=A ;

r:=Poryadoc_Poly(c)-Poryadoc_Poly(B);

repeat

if r>=0 then

begin

x:= B shl r;

c:= c xor x;

r:=Poryadoc_Poly(C)-Poryadoc_Poly(B);

end;

until r<0;

divm2:=c;

end;

{-------------------------------------------------------------}

function Wess(A:integer):integer;

var

i:integer;

c:integer;

f:integer;

Begin

c:=0;

f:=0;

for i:=0 to 15 do

Begin

f:=floor(power(2,i));

if A and f = f then c:=c+1;

End;

Wess:=c;

end;

{------------------------------------------------------------------------}

function Decoding(CR: integer):integer;

Var

Cx:integer;

Dx:integer;

w:integer;

Cound: integer;

Begin

Cound:=-1;

Dx:=sdR(Cr,n);

{ showmessage('начальный сдвиг вправо Dx1='+inttostr(Dx));}

w:=0;

repeat

Cound:=Cound+1;

Dx:=sdL(Dx,n);

{ showmessage('Делимое Dx='+inttostr(Dx)); }

{Деление}

Cx:= divM2(Dx,Px);

{ showmessage('Остаток отделения Cx1='+inttostr(Cx));}

w:=Wess(Cx);

{ showmessage('Вес остатка w='+inttostr(w));}

Until w<=S;

{ Cound:=cound-1;}

if Cound>0 then

begin

Dx:=Dx xor Cx;

{ showmessage('Код без дополнения Dx99='+inttostr(Dx));}

While cound>0 do

Begin

Dx:= sdR(Dx,n);

Cound:=Cound-1;

End;

{ showmessage('Декодированное сообщение Dx_End='+inttostr(Dx));}

end;

Decoding:=Dx;

End;

{--------------------------------------------------------------------------}

procedure Main_Decoding;

Var

cr: integer;

ch: char;

i: integer;

Begin

i:=1;

assignfile(Line_file,Line_File_Paht);

assignfile(Decode_File,Decoding_File_Path);

reset(Line_file);

rewrite(Decode_File);

while not eof(Line_file) do

Begin

read(Line_file,cr);

if cr<0 then

begin

writeln(Decode_File);

end

else

Begin

ch:=chr((Decoding(cr)xor Rx) shr Nk);

write(Decode_File,ch);

End;

End;

Closefile(Line_File);

Closefile(Decode_File);

End;

end.

unit Main_Unit;{основная программа}

interface

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Buttons, StdCtrls, ComCtrls, Menus;

type

TMain_Form = class(TForm)

GroupBox3: TGroupBox;

Coding_File_OpenDialog: TOpenDialog;

SpeedButton7: TSpeedButton;

Decoding_file_SaveDialog: TSaveDialog;

GroupBox2: TGroupBox;

Out_ComboBox: TComboBox;

In_ComboBox: TComboBox;

SpeedButton2: TSpeedButton;

SpeedButton9: TSpeedButton;

SpeedButton10: TSpeedButton;

SpeedButton11: TSpeedButton;

SpeedButton12: TSpeedButton;

SpeedButton13: TSpeedButton;

StaticText3: TStaticText;

Edit1: TEdit;

StaticText1: TStaticText;

UpDown1: TUpDown;

procedure UpDown1Click(Sender: TObject; Button: TUDBtnType);

procedure UpDown2Click(Sender: TObject; Button: TUDBtnType);

procedure SpeedButton7Click(Sender: TObject);

{ procedure SpeedButton5Click(Sender: TObject);}

{ procedure SpeedButton8Click(Sender: TObject);}

procedure SpeedButton9Click(Sender: TObject);

procedure SpeedButton2Click(Sender: TObject);

procedure SpeedButton10Click(Sender: TObject);

procedure SpeedButton11Click(Sender: TObject);

procedure SpeedButton12Click(Sender: TObject);

procedure SpeedButton1Click(Sender: TObject);

procedure SpeedButton13Click(Sender: TObject);

procedure FormCreate(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;

var

Main_Form: TMain_Form;

Line_File_Paht:string;

Coding_File_Path,

Decoding_File_Path:string;

n_word:integer;

S_count:integer;

D:integer;

implementation

uses Start_Message_Unit,coder_unit,Decoder_Unit,Error_line;

{$R *.DFM}

procedure TMain_Form.UpDown1Click(Sender: TObject; Button: TUDBtnType);

begin

{количество ошибок в канале} D:=UpDown1.Position;

end;

procedure TMain_Form.UpDown2Click(Sender: TObject; Button: TUDBtnType);

begin

S_count:= 4; { возможно исправлять кол-во ошибок}

end;

procedure TMain_Form.SpeedButton7Click(Sender: TObject);

begin

Close();

end;

procedure TMain_Form.SpeedButton9Click(Sender: TObject);

begin

{выбор входного файла}

Coding_File_OpenDialog.Execute;

if Coding_File_OpenDialog.FileName<>'' then

Out_ComboBox.Text:= Coding_File_OpenDialog.FileName;

Out_ComboBox.Items.Append( Out_ComboBox.Text);

end;

procedure TMain_Form.SpeedButton2Click(Sender: TObject);

begin

{выбор выходного файла}

Coding_File_OpenDialog.Execute;

if Coding_File_OpenDialog.FileName<>'' then

In_ComboBox.Text:=Coding_File_OpenDialog.FileName;

In_ComboBox.Items.Append( In_ComboBox.Text);

end;

procedure TMain_Form.SpeedButton10Click(Sender: TObject);

begin {просмотр файла}

Message_Form:=TMessage_Form.create(self);

Message_Form.Caption:='Исходное сообщение';

Message_Form.visible:=true;

end;

procedure TMain_Form.SpeedButton11Click(Sender: TObject);

begin {просмотр файла}

Message_Form:=TMessage_Form.create(self);

Message_Form.N2.visible:=false;

Message_Form.N2.Enabled:=false;

Message_Form.N4.visible:=false;

Message_Form.N4.Enabled:=false;

Message_Form.Caption:='Полученное сообщение';

Message_Form.visible:=true;

end;

procedure TMain_Form.SpeedButton12Click(Sender: TObject);

begin

{запуск кодера}

Decoding_File_Path:=Out_ComboBox.Text;

Coding_File_Path:=In_ComboBox.Text;

coder_unit.Main;

Error_line.errors(16,4,Line_File_Paht);

end;

procedure TMain_Form.SpeedButton1Click(Sender: TObject);

begin

{просмотр файла}

{ Coding_File_OpenDialog.Execute;

if Coding_File_OpenDialog.FileName<>'' then

StaticText3.Caption:=Coding_File_OpenDialog.FileName;

Line_File_Paht:=Coding_File_OpenDialog.FileName;}

end;

procedure TMain_Form.SpeedButton13Click(Sender: TObject);

begin

{запуск декодера}

Decoder_Unit.Main_Decoding;

Error_line.errors(16,4,Line_File_Paht);

end;

procedure TMain_Form.FormCreate(Sender: TObject);

begin

Line_File_Paht:='c:\111.dat';

end;

end.