Заключение
В ходе выполнения курсовой работы мы закрепили знания, полученные в процессе изучения дисциплины «Кодирование и защита информации». В соответствии с вариантом задания был рассмотрен код Рида-Соломона с исправлением 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.