RSS    

   Реферат: Помехоустойчивое кодирование, распознавание символов

    Распознавание по корреляции оформлено в основном блоке программы. В процессе распознавания происходит поочерёдное выделение минимально описанных прямоугольников вокруг “испорченных” помехами символов. Затем идет цикл сравнения очередного символа со всеми шаблонами. После  проверки того, что символ по размерам не меньше очередного шаблона, идет вычисление корреляционной функции. Если символ больше шаблона, то вычисляется несколько значений со смещениями по x и y, а затем из них берётся максимальное. Полученные значения сравниваются между собой. Номер шаблона, с которым получено наибольшее сходство, и будет распознанным символом.

ЗАКЛЮЧЕНИЕ

   

    В работе были разработаны модели канала связи и системы распознавания. Моделирование было произведено с учётом возможного наличия помех. Моделирование показало работоспособность построенных моделей при достаточно высоком уровне помех.

                                    

ЛИТЕРАТУРА

1. Теоретические основы информационной техники/Темников Ф.Е.и др.- М.:Энергия, 1971

    2. Орлов В.А., Филлипов Л.И. Теория информации в упражнениях и задачах. - М.:Высш.шк., 1976

    3. Сигорский В.П. Математический аппарат инженера - Киев:Техника, 1975

    4. Солодов А.В. Теория информации и её

применение к задачам автоматического управления и контроля - М.: Наука, 1967.

2.3  ВЫВОД

    Во второй части была рассмотрена модель распознавания, основанная на шаблонной классификации. Программное моделирование показало неплохие результаты. Модель распознаёт строку практически в 100% случаев при уровне помех до 40%. Однако данный подход может использоваться только в том случае, если заранее известно, что распознаваемые символы будут одинакового шрифта.    

ПРИЛОЖЕНИЕ А

    

     Текст программы моделирования канала связи.

Program final_of_work;

uses  crt,graph;

const a=5;

      b=0;

      m=10+(a mod 6);         {15}

      r=trunc((m+a-b)/2);     {10}

var

   n,                                   {n для (n,1) - кода}

   temp,ent,out,symb,decode:byte;   {буферы для кодирования}

   p:array[1..m] of real;                      {вероятности}

   p01,p10:real;                        {p единичной ошибки}

   z,dl:array[1..m] of byte;               {код, длина кода}

   mask: array[1..8] of byte;      {маски для декодирования}

   data_n,data_p

       :array[1..100] of integer;       {данные для графика}

   i,j,                                           {счетчики}

   count_of_errors,          {счетчик ошибок восстановления}

   dlina,sh,                       {длина массива сообщений}

   count:integer;           {счетчик для построения графика}

   range,c,s,l:byte;

          fl:boolean;

function flag(px:real):boolean;

               {---осуществляет событие с вероятностью p---}

  var ww,wq : word;

  begin

    ww := round(px * 100);

    wq := random(100);

    if ww > wq then flag := true else flag := false;

  end;

procedure ver;    {------------расчет вероятностей---------}

var s,i3,j3: integer;

    tmp,s1:real;

begin

 s:=0;tmp:=0;                        {вычисляем вероятности}

  for j3:=1 to m do

   s:=s+sqr(j3-r);

   s:=s+m;

   for i3:=1 to m do

      p[i3]:=(1+sqr(i3-r))/s;

                  {-------упорядочиваем вероятности--------}

   for i3:=1 to m-1 do                        {внешний цикл}

    begin

      tmp := p[i3];                     {локальный максимум}

      for j3:=i3 to m do

        if p[j3] >= tmp then

          begin

             tmp := p[j3];              {максимум на i шаге}

             s:=j3                               {его номер}

          end;

      p[s] := p[i3];                                 {обмен}

      p[i3] := tmp

    end;

end;

procedure deranges;   {----------внесение помех------------}

  var tmp : byte;

    c0,c1 : integer;      {счетчики 0 и 1 для декодирования}

  begin

    out := 0;                     {выходной код после помех}

    for i := 0 to 7 do                    {цикл по разрядам}

    begin

      c0 := 0;                             {сброс счетчиков}

      c1 := 0;

      tmp := (z[ent] shr i) and 1;         {выделяем разряд}

      for j := 1 to n do       {цикл по разрядам (n,1)-кода}

        case tmp of                     {определяемм помеху}

          0 : if flag(p01) then inc(c1) else inc(c0);

          1 : if flag(p10) then inc(c0) else inc(c1)

        end;

      if c1 > c0 then out := out or (1 shl i)

    end;                      {вносим помеху в выходной код}

  end;

procedure set_codes; {-----по алгоритму Шеннона - Фэно-----}

 var i3,j2 : byte;

 function numb(v:real):byte;{номер вероятности, находящейся}

 var i2 : byte;       {"" той, что передается как параметр}

 begin

    for i2 := 1 to m do               {цикл по вероятностям}

     if(v >= p[i2 + 1]) and (v <= p[i2]){если нашли границы}

     then

       numb := i2;            {присваиваем номер "верхнего"}

 end;

 begin               {-------------of procedure------------}

   for i := 1 to m do                {обнуляем коды и длины}

     begin

       z[i] := 0;

       dl[i] := 0

     end;

   range := 8;            {разряд - в максимальное значение}

   c := 0;              {счетчик по "вертикали" - на начало}

   repeat                      {внешний цикл по кодам......}

     if c = 0                             {если в начале...}

       then

         dec(range);          {... уменьшаем текущий разряд}

     inc(c);                {увеличиваем внутренний счетчик}

     if (z[c] = z[c + 1]) and (c <= m)

                                    {если два кода равны...}

       then

         begin                          {...то цикл деления}

             fl := false;         {флаг дальнейшего деления}

             i := c;                     {"верхняя" граница}

             j := c + 1;                  {"нижняя" граница}

             if (z[j] = z[j + 1]) or (j + 1 < m)

                                   {если ещё есть равные...}

               then

                 fl := true;               {...то ещё делим}

             while fl do              {пока можно делить...}

               begin

                 inc(j);     {...увеличиваем нижнюю границу}

                 if (z[j] <> z[j - 1]) or (j > m - 1) then

                   fl := false

               end;

             if((j - i) > 1) and (j < m)

                                     {если > 2 элементов...}

               then

                 dec(j);    {...корректируем нижнюю границу}

             s := numb((p[i] + p[j])/2);             {делим}

             if p[i] = p[j]           {если два элемента...}

               then

                 s := i;           {середину - на "верхний"}

             if j <= m       {если не за пределами кодов...}

               then

                 for l := i to j do      {...цикл по группе}

                 if l <= s then {устанавливаем коды и длины}

                     begin

                       z[l] := z[l] or (1 shl range);

                       dl[l] := dl[l] + 1

                     end

                   else

                     dl[l] := dl[l] + 1;

               if j < m then {устанавливаем текущий счетчик}

                 c := j

               else

                 c := 0

         end

            else if c = m then c := 0;

   until range = 0;{...пока не дойдем до последнего разряда}

           {--------------инициализация масок--------------}

   temp := 0;

   for i := 1 to 8 do

     begin

       temp := temp or (1 shl (7 - (i - 1)));

       mask[i] := temp

     end

end;

function sourse:byte;  {-----генерирует число из 1..15-----}

  var cou : byte;

   tu,ttu : real;

  begin

    cou := 1;                           {начальное значение}

    ttu := p[cou];                 {случайное число из 0..1}

    tu := random;

    while ttu < tu do begin    {пока не превысили random...}

      inc(cou);

      ttu := ttu + p[cou];             {увеличиваем счетчик}

    end;

    sourse := cou;              {присваиваем число из 1..15}

  end;

procedure decoder;           {---для неравномерного кода---}

  var

     code:byte;

  begin

        code:=out;

          for i:=1 to 8 do        {цикл со старшего разряда}

           begin

            temp:=code and mask[i];           {выделяем код}

              for j:=1 to m do

                if (temp=z[j]) and (i=dl[j]){если совпадает}

                  then

                    decode:=j;               {...декодируем}

           end;

   end;

procedure graphiki; {-----------построение графика----------}

 const x0=250;                            {начало координат}

       y0=400;

 var nn,ss,ii:integer;

Страницы: 1, 2, 3, 4, 5, 6, 7


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

© 2010.