Модераторы: volvo877, Snowy, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Моделирование системы передачи сигналов. 
:(
    Опции темы
Fredy
  Дата 8.6.2005, 20:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 1.6.2005

Репутация: нет
Всего: 1



Ребята помогите кто нибудь написать комментарии к проге ... в универе достал готовую прогу
и никак немогу в ней разобраться ... если кому не сложно помогите ... завтра вечером сдавать
а как не знаю smile

В общем прога по предмету "Теория информации и кодирования"
<<

Цель работы : Моделирование системы передачи сигналов.

Задание. Написать программу, моделирующую работу системы передачи сигналов. Сообщения источни-ка кодируются (сжимается) кодером источника (кодирование Хаффмена), затем кодером канала добавля-ется избыточность, необходимая для обнаружения и исправления независимой одиночной ошибки (ко-дирование по Хеммингу), которая вносится в сообщение при прохождении через канал ( белый шум). Декодер канала исправляет ошибки и декодирует сообщение (удаляет проверочные символы). Декодер приемника восстанавливает принятое сообщение.

>>

Код

{Лабораторная работа №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.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi"
THandle
Rrader
volvo877

Запрещается!

1. Обсуждать и делится взломанными компонентами или программным обеспечением

2. Публиковать ссылки на варез

3. Оффтопить

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема »


 




[ Время генерации скрипта: 0.0810 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.