Сверточное кодирование
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
?ного программного продукта составляет 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);;
{**
* инвертирование