Сверточное кодирование
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
?троки
*}TTreeHandler.rotateString(val: string): string;: string;: int;: int;:= '';:= length(val);:= strLen;(i >= 1) do:= res + val[i];:= i-1;;:= res;;
// декодер - КОНЕЦ
// методы формы - НАЧАЛО
{**
* Создание формы
*}TmyForm.FormCreate(Sender: TObject);
// инициализируем автомат мили:= MealyAutomaton.init();
// инициализируем декодер:= TTreeHandler.init();.DoubleBuffered := true;:= TBitmap.Create;();.Clear();.Text := 'тест1.';;
{**
* перерисовка формы
*}TmyForm.FormPaint(Sender: TObject);(treeHandler.pleft, 0);;
{**
* Отображение дерева
*}TmyForm.printTree(t:TListElemPtr; levelNum :int);: int;: TNodeDataPtr;: TNodeDataPtr;: int;: int;: int;: int;: int;: int;: int;: int;: int;: int;:= 60 - leftTreePaintPosition.Position;:= 40{+myForm.GroupBox2.Height};:=35;:=60;:=12;:= 0;:= 0;
// очищаем канву.Width := myForm.Width;.Height := myForm.Height;.Canvas.Brush.Color:= {clWhite}clBtnFace;.Canvas.Pen.Style:= psSolid;.Canvas.Pen.Color:= clBlack;.Canvas.FillRect(Rect(0,0,myForm.Width,myForm.Height));
// Рекурсивное прохождение заканчивается на пустом поддереве
while (t NIL)then:= topPos + levelHeight*i; := t^.nodes[i];
// рисуем связь с родителем
nodeParent := node^.parent;(nodeParent <> NIL) then(nodeParent.val = '00') then parentNodeY :=0if(nodeParent.val = '10') then parentNodeY :=1if(nodeParent.val = '01') then parentNodeY :=2parentNodeY :=3;:= topPos + levelHeight*parentNodeY;:= levelX-levelWidth;
// выделяем минимальный путь(node^.minWayBelong) then.Canvas.Pen.Color:= clRed;.Canvas.Pen.Width :=2;.Canvas.Pen.Color:= clBlack;.Canvas.Pen.Width :=1;;.Canvas.MoveTo(levelX, levelY);.Canvas.LineTo(parentNodeX, parentNodeY);;.Canvas.Pen.Color:= clBlack;.Canvas.Pen.Width :=1;
// рисуем текущий узел.Canvas.Ellipse(levelX-ellipse, levelY-ellipse, levelX+ellipse, levelY+ellipse);.Canvas.TextOut(levelX-7, levelY-6, IntToStr(node^.way));
// перерисовывам родителя(nodeParent <> NIL) then.Canvas.Ellipse(parentNodeX-ellipse, parentNodeY-ellipse, parentNodeX+ellipse, parentNodeY+ellipse);.Canvas.TextOut(parentNodeX-7, parentNodeY-6, IntToStr(nodeParent^.way));;;
// номер уровня.Canvas.TextOut(levelX-7, topPos-6 + levelHeight*4, IntToStr(levelNum+1));
// декодируемый код.Canvas.TextOut(levelX-7+ trunc(levelWidth/2), 10, t^.code);;
// рисуем следующий уровень
t := t^.pnext;
levelNum := levelNum+1;;(treeHandler.pleft 0) then.Visible := true;.Max := max;.Visible := false;.Visible := false;;;
{**
* преобразование строки в двоичный код
*}TmyForm.step0();: char;: int;: int;: string;Data.Text := '';i := 1 to length(inputData.Text) do:= inputData.Text[i];:= '';j:=0 to 7 do(int(sym) and (1 shl j) > 0) then str :='1'+strstr :='0'+str;;Data.Text := step0Data.Text + str;;Label.Caption := 'Соощение в двоичном коде ('+IntToStr(length(step0Data.Text))+' бит)';;
{**
* кодирование строки с помощью автомата мили
*}
procedure TmyForm.step1();
var
y1: int;// Выходы автомата Мили
y2: int;
res: string;// Результат кодирования
i: int;: int;:= '';.init();i := 1 to length(step0Data.Text) do((step0Data.Text[i] = '0') OR (step0Data.Text[i] = '1')) then:= int(step0Data.Text[i])-int('0');.Coding(sym, @y1, @y2);:= res + IntToStr(y1)+IntToStr(y2);;;Data.Text := res;Label.Caption := 'Закодированное сообщение ('+IntToStr(length(step1Data.Text))+' бит)';;
{**
* имитация канала связи
*}TmyForm.step2();: int;: int;: int;: int;: int;// промежуток, в котором возможно появление пачки ошибок: int;// местоположение ошибки: string; : int;// максимальное количество ошибок
errorCount : int;// счетчик количества ошибок
begin:= 1;:= StrToInt(errorMultiplicityBox.Text);:= trunc(StrToFloat(errorProbabilityBox.Text) * 100);
// очищаем стилиData.SelStart:= 1;Data.SelLength := length(step2Data.Text);Data.SelAttributes.Color:= clBlack;Data.SelAttributes.Style:= [];Data.Lines.Clear();:= step1Data.Text;();:= round(length(str) * (errorProbability/100));:= 0;:=1;((i = maxErrors) then;;(random(99) + 1 <= errorProbability) then
errorPosition := 0;
// меняем 1 на 0 и 0 на 1 (т.е. генерируем ошибку)
for j:=i+errorPosition to i+errorPosition+errorMultiplicity - 1 do(j > length(str)) then;;(str[j] = '0') then[j] := '1'[j] := '0';;:= errorCount + 1;:= i + 1;; := i - 1;
// стараемся сделать так, чтобы ошибки не "слепливались"
if ((errorProbability errorProbability)) then:= i + 1;;;:= i + errorInterval;;Data.Text := str;Label.Caption := 'После прохождения канала ('+IntToStr(length(step2Data.Text))+' бит)';
// выделяем ошибочные символыi:=1 to length(str) do(str[i] <> step1Data.Text[i])thenData.SelStart:= i-1;Data.SelLength:= 1;Data.SelAttributes.Color:= clFuchsia;Data.SelAttributes.Style:= [fsUnderline, fsBold];;
end
end;
{**
* декодирование в двоичный код
*}TmyForm.step3();: string;: int;: int;:= step2Data.Text;:= length(code);(codeLen > 0) then
// удаление дерева (если уже был запуск декодера)
treeHandler.DeleteTree(treeHandler.pleft);
// Инициализация дерева
treeHandler.CreatRoot();
// строим дерево декодера
i := 1;
while (i < codeLen) do.createLevel(treeHandler.pleft, copy(code, i, 2)); := i+2;
end;
// выводим результат декодирования
step3Data.Text := treeHandler.decode();
// рисуем дерево декодера
printTree(treeHandler.pleft, 0);;;
{**
* перевод из двоичного кода в строку
*}TmyForm.step4();: string;: int;: int;: int;:= '';:= 1;(i < length(step3Data.Text)) do
{str := str + copy(step3Data.Text, i, 8);}:= 0;j:=0 to 7 do:= (sym shl 1) + (byte(step3Data.Text[i+j]) and 1) ;
{sym + integer(step3Data.Text[i+j])-integer('0');:= sym shr 1;};
//sym := 176;:= str + char(sym);:= i+8;;Data.Text := str;;
{**
* кнопка "закодировать"
*}TmyForm.step1BtnClick(Sender: TObject);();();;
{**
* кнопка "канал связи"
*}TmyForm.step2BtnClick(Sender: TObject);();;
{**
* кнопка "декодировать"
*}TmyForm.step3BtnClick(Sender: TObject);();();;
{**
* кнопка "все шаги сразу"
*}TmyForm.allStepsBtnClick(Sender: TObject);();();();();4();
end;
{**
* прокрутка отображения дерева
*}
procedure TmyForm.leftTreePaintPositionChange(Sender: TObject);(treeHandler.pleft, 0);;
// методы формы - КОНЕЦ
end.
Приложение Б
Таблица ASCII кодов ASCII Таблица символов 0 - 127.
dechexсимвпояснениеdechexсимвdechexсимвdechexсимв00NULПустой символ3220пробел6440@9660`11SOHНачало заголовка3321!6541A9761a22STXНачало текста3422"6642B9862b33ETXКонец текста3523#6743C9963c44EOTКонец передачи3624$6844D10064d55ENQЗапрос372545E10165e66ACKПодтвержд. получения3826&7046F10266f77BELЗвуковой сигнал3927'7147G10367g88BS**Обратный ход каретки4028(7248H10468h99TAB**Горизонт. табуляция4129)7349I10569i10ALF**Начало строки422A*744AJ1066Aj11BVTВертикальная табуляция432B+754BK1076Bk12CFFНачало формы442C,764CL1086Cl13DCR**Возврат каретки452D-774DM1096Dm14ESOПередача462E.784EN1106En15FSIПрием472F/794FO1116Fo1610DLEЗакр. канала связи483008050P11270p1711DC1Упр. устройством 1493118151Q11371q1812DC2Упр. устройством 2503228252R11472r1913DC3Упр. устройством 3513338353S11573s2014DC4Упр. устройством 4523448454T11674t2115NAKОтрицание получения533558555U11775u2216SYNСинхронизация543668656V11876v2317ETBКонец пакета553778757W11977w2418CANОтмена563888858X12078x2519EMЗакрытие среды573998959Y12179y261ASUBЗамена583A:905AZ1227Az271BESCЗавершение593B;915B[1237