Сверточное кодирование

Дипломная работа - Компьютеры, программирование

Другие дипломы по предмету Компьютеры, программирование



?ного программного продукта составляет 28%. Анализ экономической эффективности подтвердил целесообразность создания данного программного продукта.

В разделе Охрана труда и окружающей среды проведён анализ условий труда в помещении, в котором производится разработка данного ПО.

В разделе Гражданская оборона оценена обстановка и предусмотрены мероприятия по защите студентов и работников университета в зоне радиоактивного загрязнения после аварии на АЭС.

Библиографический список

.Никитин Г. И. Сверточные коды: Учебное пособие.. - С-П.: Сов. радио, 2001. - 78 с

.Бернард Скляр Цифровая связь. Теоретические основы и практическое применение.

.Витерби А.Д., Омура Дж.К. Принципы цифровой связи и кодирования /Пер. с англ. под ред. К.Ш. Зигангирова. - М.: Радио и связь, 1982. - 536 с.

.Чернега В., Платтнер Б. Компьютерные сети: Учебник для вузов/ В. Чернега, Б. Платтнер - Севастополь: Изд-во СевНТУ, 2006. - 500 с.

.Культин Н.Б. Delphi 6. Программирование на Object pascal. БХВ-Петербург, 2001 г. 528с.

Приложение А

Текст программыViterbi_Unit;, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,, StdCtrls, ComCtrls, Grids;

{**

* сокращенные названия для типов

*}

pint = ^integer;

int = integer;

{**

* узел сети используемый при декодировании

*}= ^TNodeData;= record: string;// содержимое вершины: int;// метрика длины пути

minWayBelong: bool;// принадлежит минимальному пути

parent: TNodeDataPtr;// указатель на родителя

end;

{**

* уровень сети используемой при декодировании

*}

TListElemPtr =^TListElem;= record: array [0..3] of TNodeDataPtr;// узлы текущего уровня: string;// декодируемый код

pnext: TListElemPtr;// указатель на следующий уровень

pprev: TListElemPtr;// указатель на предыдущий уровень

end;

{**

* форма

*}= class(TForm)Btn: TButton;Btn: TButton;Btn: TButton;: TButton;: TGroupBox;: TRichEdit;Data: TRichEdit;Data: TRichEdit;Data: TRichEdit;Data: TRichEdit;Data: TRichEdit;: TLabel;Label: TLabel;: TLabel;: TLabel;Label: TLabel;: TLabel;Label: TLabel;: TLabel;: TComboBox;: TComboBox;: TScrollBar;step1BtnClick(Sender: TObject);step2BtnClick(Sender: TObject);step3BtnClick(Sender: TObject);allStepsBtnClick(Sender: TObject);FormCreate(Sender: TObject);FormPaint(Sender: TObject);leftTreePaintPositionChange(Sender: TObject);printTree(t:TListElemPtr; levelNum :int);step0();step1();step2();step3();step4();: TBitmap;

{ Public declarations };

{**

* автомат Мили (кодер)

*}= class:int;// регистры сдвига:int;

// конструкторinit;

// побитовый кодерcoding(X:int; Y1:pint; Y2:pint);;

{**

* декодер работающий по алгоритму Витерби

*}

TTreeHandler = class

public

pleft: TListElemPtr;// указатель на корневой узел сети

// вычисляет сумму по модулю 2 для двух строк

function xorStrings(val_1: string; val_2: string) : string;

// конструктор

constructor init;

// вычисление пути до узла

function calcWayToNode(parent: TNodeDataPtr; nodeVal:string; inputCode: string):int;

// создание корня

procedure creatRoot;

// создание узла сети

function createNode(parent1: TNodeDataPtr; parent2: TNodeDataPtr; nodeVal:string; inputCode: string):TNodeDataPtr;

// вес вершиныweightCalc(val: string) : int;

// Создание очередного уровня сетиcreateLevel(temp:TListElemPtr; code:string);

// Удаление всех узлов сетиdeleteTree(pleft:TListElemPtr);

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

function decode() : string;

// инвертирование строки

function rotateString(val: string): string;;: TmyForm;// форма: MealyAutomaton;// кодер: TTreeHandler;// декодер

{$R *.dfm}

// автомат Мили - НАЧАЛО

{**

* конструктор

*}MealyAutomaton.init;:=0;:=0;;

{**

* побитовый кодер

*}MealyAutomaton.coding(X:int; Y1:pint; Y2:pint);^:= X xor R2;^:= X xor R2;:= R1;:= X;1^:= y1^ xor R2;

end;

// автомат Мили - КОНЕЦ

// декодер - НАЧАЛО

{**

* вычисляет сумму по модулю 2 для двух строк

*}TTreeHandler.xorStrings(val_1: string; val_2: string) : string;: string;: int;(length(val_1) <> length(val_2)) then:= '';i:=1 to length(val_1) do(val_1[i] = val_2[i]) then:=res+'0':=res+'1';;:= res;;

{**

* конструктор

*}TTreeHandler.init;:= NIL;;

{**

* вычисление пути до узла

*}

function TTreeHandler.calcWayToNode(parent: TNodeDataPtr; nodeVal:string; inputCode: string):int;: int;:= 0;

// Вершина "00"(parent^.val = '00') then

// левый потомок(nodeVal = '10') then:= parent^.way + WeightCalc(xorStrings('11', inputCode));

// правый потомок:= parent^.way + WeightCalc(xorStrings('00', inputCode));

// Вершина "10"if(parent^.val = '10') then

// левый потомок(nodeVal = '11') then:= parent^.way + WeightCalc(xorStrings('01', inputCode));

// правый потомок:= parent^.way + WeightCalc(xorStrings('10', inputCode));

// Вершина "11"if(parent.val = '11') then

// левый потомок(nodeVal = '11') then:= parent^.way + WeightCalc(xorStrings('10', inputCode));

// правый потомок:= parent^.way + WeightCalc(xorStrings('01', inputCode));

// Вершина "01"if(parent^.val = '01') then

// левый потомок(nodeVal = '10') then:= parent^.way + WeightCalc(xorStrings('00', inputCode));

// правый потомок:= parent^.way + WeightCalc(xorStrings('11', inputCode));;:= resultWay;;

{**

* создание корня

*}TTreeHandler.creatRoot;(pleft);^.pnext:= NIL;^.pprev:= NIL;(pleft^.nodes[0]);^.nodes[0]^.val:= '00';^.nodes[0]^.way:= 0;^.nodes[0]^.minWayBelong := true;^.nodes[0]^.parent:= NIL;^.nodes[1]:= NIL;^.nodes[2]:= NIL;^.nodes[3]:= NIL;;

{**

* создание узла сети

*}TTreeHandler.createNode(: TNodeDataPtr;: TNodeDataPtr;:string;: string

):TNodeDataPtr;: TNodeDataPtr;: TNodeDataPtr;: int;: int;: int;((parent1 = NIL) AND (parent2 = NIL)) then:= NIL;(parent1 = NIL) then:= parent2;if (parent2 = NIL) then:= parent1;:= calcWayToNode(parent1, nodeVal, inputCode);:= calcWayToNode(parent2, nodeVal, inputCode);(way2 > way1) then nodeParent := parent1nodeParent:= parent2;;:= calcWayToNode(nodeParent, nodeVal, inputCode);(resultNode);^.val := nodeVal;^.way := resWay;^.minWayBelong := false;^.parent := nodeParent;;:= resultNode;;

{**

* вес вершины

*}TTreeHandler.weightCalc(val: string) : int;: int;: int;:= 0;i:=1 to length(val) do(val[i] = '1') then:= res + 1;;

:= res;

end;

{**

* Создание очередного уровня

*}TTreeHandler.createLevel(temp:TListElemPtr; code:string);: TListElemPtr;((temp^.pnext <> NIL)) then(temp.pnext, code);(newLevel);^.pnext := newLevel;^.code:= code;^.pnext:= NIL;^.pprev:= temp;^.nodes[0]:= createNode(temp^.nodes[0], temp^.nodes[2], '00', code);^.nodes[1]:= createNode(temp^.nodes[0], temp^.nodes[2], '10', code);^.nodes[2]:= createNode(temp^.nodes[1], temp^.nodes[3], '01', code);^.nodes[3]:= createNode(temp^.nodes[1], temp^.nodes[3], '11', code);

end;

{**

* Удаление всех узлов дерева

*}TTreeHandler.deleteTree(pleft:TListElemPtr);(pleft <> NIL) then(pleft.pnext);(pleft);;:= NIL;;

{**

* декодирование

*}TTreeHandler.decode() : string;: TListElemPtr;: string;: TNodeDataPtr;: int;:= pleft;(temp^.pnext NIL) do:= resultStr + minWayNode^.val[1];^.minWayBelong := true;:= minWayNode^.parent;;:= rotateString(resultStr);;

{**

* инвертирование