Новичок
Профиль
Группа: Участник
Сообщений: 4
Регистрация: 1.6.2005
Репутация: нет Всего: 1
|
Ребята помогите кто нибудь написать комментарии к проге ... в универе достал готовую прогу и никак немогу в ней разобраться ... если кому не сложно помогите ... завтра вечером сдавать а как не знаю В общем прога по предмету "Теория информации и кодирования" << Цель работы : Моделирование системы передачи сигналов. Задание. Написать программу, моделирующую работу системы передачи сигналов. Сообщения источни-ка кодируются (сжимается) кодером источника (кодирование Хаффмена), затем кодером канала добавля-ется избыточность, необходимая для обнаружения и исправления независимой одиночной ошибки (ко-дирование по Хеммингу), которая вносится в сообщение при прохождении через канал ( белый шум). Декодер канала исправляет ошибки и декодирует сообщение (удаляет проверочные символы). Декодер приемника восстанавливает принятое сообщение. >> Код | {Лабораторная работа №5} program lab_05; var stroka: string[100]; stroka_z,symb,stroka_r,stroka_b,stroka_fc,symb_5,symb_6,symb_7: string; stroka_ac,place,stroka_rz:string; bukv: array[1..50] of char; {Массив, в котором находятся буквы} kod: array[1..50,1..2] of string; {Массив, в кот. хранятся коды Хаффмана} {Перв. строка - буферная Вторая - основная} vero: array[1..50,1..50] of longint; {Массив, в котором преобразуются вероятности} bait:array[1..50] of string; i,k,ind,l,ind2,len_bukv,prov,dobav:integer; posl2:longint;
{Функция преобразования строкового типа в целочисленный} function value(st: string):integer; var I,Code:integer; begin Val(st, I, Code); if code = 0 then value:=I; if code<>0 then value:=0; end;
(* Подпрограмма канала *) function chanel(s1:string) : string; var poz: integer; begin {выбор случайным образом количества ошибок} poz:=random(6)+1; if s1[poz]='1' then s1[poz]:='0' else s1[poz]:='1'; chanel:=s1; end;
{Функция преобразования двоичного числа в десятичное} function bin2dec(s: string): integer; var razm,i,k,index: integer; y: char; vv,chislo: integer; begin razm:=length(s); index:=2; vv:=0; chislo:=0; for i:=razm downto 1 do begin if (i=razm) and (s[i]='1') then chislo:=1; if (i=razm-1) and (s[i]='1') then chislo:=2;
if (i<(razm-1)) and (s[i]='1') then begin chislo:=1; for k:=1 to index do chislo:=chislo*2; end; vv:=vv+chislo; if i<(razm-1) then index:=index+1; chislo:=0; end; bin2dec:=vv; end;
BEGIN write('Введите строку: '); readln(stroka);
{Блок получения неравномерного кода Хаффмана}
{Поиск всех вероятных букв в сообщении} bukv[1]:=stroka[1]; ind:=2; l:=0; for i:=2 to length(stroka) do begin for k:=1 to ind do if bukv[k]=stroka[i] then inc(l); if l=0 then begin bukv[ind]:=stroka[i]; inc(ind); end; l:=0; end;
dec(ind); {Просчет вероятностей} for i:=1 to length(stroka) do for k:=1 to ind do if stroka[i]=bukv[k] then begin vero[1,k]:=vero[1,k]+1; break; end; for i:=1 to ind do { vero[1,i]:=round((vero[1,i]/length(stroka))*1000);}
{ind - индекс столбца .. .. .. .. ..} ind2:=2; {Индекс строки .. .. ..} l:=ind; len_bukv:=ind;
while ind>2 do begin posl2:=vero[ind2-1,ind]+vero[ind2-1,ind-1]; {складываем 2 последних элемента} k:=1; for i:=1 to ind-1 do begin if vero[ind2-1,k]>posl2 then begin vero[ind2,i]:=vero[ind2-1,k]; inc(k); end else begin vero[ind2,i]:=posl2; posl2:=-1; end; end; inc(ind2); dec(ind); end;
dec(ind2); writeln; writeln(' Матрица вероятностей: '); writeln; write(' '); for k:=1 to l do write(' ',bukv[k],' '); writeln; writeln; for k:=1 to ind2 do begin for i:=1 to l do write(' ',(vero[k,i]/length(stroka)):3:3); writeln; readln; dec(l); end;
{------------------------------------------------------------------------}
{Блок Распределения кодов (0 и 1)}
if vero[ind2,1]>=vero[ind2,2] then begin kod[1,1]:='0'; kod[2,1]:='1'; end else begin kod[1,1]:='1'; kod[2,1]:='0'; end;
kod[1,2]:=kod[1,1]; kod[2,2]:=kod[2,1];
while (ind<len_bukv) and (ind2>1) do begin
{------------------------------------------------------------------} {Нахождение вероятности, кот. явл. суммой двух последних предыдущих вероятностей} {2- осн. строка, 1 - буферная} for i:=1 to ind do if vero[ind2,i]=vero[ind2-1,ind]+vero[ind2-1,ind+1] then begin kod[ind+1,1]:=kod[i,2]; kod[ind,1]:=kod[i,2]; prov:=i; break; end; {------------------------------------------------------------------------}
{Блок просмотра вероятностей поединично} k:=1; for i:=1 to ind do if i<>prov then begin kod[k,1]:=kod[i,2]; inc(k); end;
{Блок просмотра двух последних элементов} {if (ind+1<len_bukv) and ((ind2-1)>1) then} if vero[ind2-1,ind]>=vero[ind2-1,ind+1] then begin kod[ind,1]:=kod[prov,2]; kod[ind,1]:=kod[ind,1]+'0'; kod[ind+1,1]:=kod[prov,2]; kod[ind+1,1]:=kod[ind+1,1]+'1'; end else begin kod[1,ind]:=kod[prov,2]; kod[1,ind]:=kod[ind,1]+'1'; kod[1,ind+1]:=kod[prov,2]; kod[1,ind+1]:=kod[ind+1,1]+'0'; end;
for i:=1 to ind+1 do begin kod[i,2]:=kod[i,1]; kod[i,1]:=''; end;
dec(ind2); inc(ind); end;
for k:=1 to len_bukv do begin write(kod[k,2],' '); end;
{Кодировка} for k:=1 to length(stroka) do begin symb:=stroka[k]; for i:=1 to 50 do if bukv[i]=symb then begin stroka_z:=stroka_z+kod[i,2]; break; end; end;
writeln; writeln; write('Закодированная строка: ',stroka_z);
{Разбиение на байты} stroka_b:=stroka_z; i:=1; while stroka_b<>'' do begin bait[i]:=copy(stroka_b,1,8); delete(stroka_b,1,8); inc(i); end; dec(i);
if length(bait[i])<8 then begin dobav:=8-length(bait[i]); bait[i]:=bait[i]+copy('00000000',1,8-length(bait[i])); end;
writeln;
{Строка, разбитая на байты} write('Строка, разбитая на байты: ');
k:=1; stroka_z:=''; while k<=i do begin write(bait[k],' '); stroka_z:=stroka_z+bait[k]; inc(k); end;
writeln; {Кодирование по методу Хейминга} stroka_fc:=''; while stroka_z<>'' do begin stroka_fc:=stroka_fc+copy(stroka_z,1,4); {5-ый символ} l:=value(stroka_z[2])+value(stroka_z[3])+value(stroka_z[4]); if (l mod 2)<>0 then symb_5:='1' else symb_5:='0'; {6-ый символ} l:=value(stroka_z[1])+value(stroka_z[3])+value(stroka_z[4]); if (l mod 2)<>0 then symb_6:='1' else symb_6:='0'; {7-ый символ} l:=value(stroka_z[1])+value(stroka_z[2])+value(stroka_z[4]); if (l mod 2)<>0 then symb_7:='1' else symb_7:='0'; stroka_fc:=stroka_fc+symb_5+symb_6+symb_7+'0'; delete(stroka_z,1,4); end;
writeln('Строка, для пропускания в канал: ',stroka_fc); stroka_b:=stroka_fc; stroka_fc:=''; symb:=''; while stroka_b<>'' do begin symb:=copy(stroka_b,1,8); randomize; symb:=chanel(symb); stroka_fc:=stroka_fc+symb; delete(stroka_b,1,8); symb:=''; end;
writeln('Строка, после канала: ',stroka_fc);
stroka_ac:=''; {исправление ошибок по методу Хейминга} stroka_fc:=stroka_fc+'9999'; while stroka_fc<>'9999' do begin symb:=copy(stroka_fc,1,8); place:=''; {1-ая сумма} l:=value(symb[4])+value(symb[5])+value(symb[6])+value(symb[7]); if (l mod 2)<>0 then place:=place+'1' else place:=place+'0'; {2-ая сумма} l:=value(symb[2])+value(symb[3])+value(symb[6])+value(symb[7]); if (l mod 2)<>0 then place:=place+'1' else place:=place+'0'; {3-ья сумма} l:=value(symb[1])+value(symb[3])+value(symb[5])+value(symb[7]); if (l mod 2)<>0 then place:=place+'1' else place:=place+'0'; {place - позиция ошибки, записанная в двоичном виде} if bin2dec(place)<>0 then if symb[bin2dec(place)]='1' then symb[bin2dec(place)]:='0' else symb[bin2dec(place)]:='1'; delete(stroka_fc,1,8); stroka_ac:=stroka_ac+symb; symb:=''; end;
writeln('Исправленная строка: ',stroka_ac);
stroka_r:=''; while stroka_ac<>'' do begin stroka_r:=stroka_r+copy(stroka_ac,1,4); delete(stroka_ac,1,8); end;
writeln; writeln('Полученная строка: ',stroka_r); delete(stroka_r,length(stroka_r)-dobav+1,dobav); writeln('Строка для раскодировки: ',stroka_r);
symb:=''; stroka_rz:=''; for i:=1 to length(stroka_r) do begin symb:=symb+stroka_r[i]; for k:=1 to 50 do if kod[k,2]=symb then begin stroka_rz:=stroka_rz+bukv[k]; symb:=''; break; end; end;
writeln('Полученная строка: ',stroka_rz); readln;
END.
|
|