МІНІСТЕРСТВО ОСВІТИ І НАУКИ УКРАЇНИ
НАЦІОНАЛЬНИЙ УНІВЕРСИТЕТ
“ЛЬВІВСЬКА ПОЛІТЕХНІКА”
Кафедра САПР
Звіт
до лабораторної роботи №4
з курсу :
“ Методи та засоби комп’ютерних інформаційних технологій ”
на тему :
“ Коди Хемінга”
МЕТА РОБОТИ
Мета роботи - вивчення методiв побудови кодiв Хемiнга та їх програмна реалiзацiя для практичного використання.
КОРОТКІ ТЕОРЕТИЧНІ ВІДОМОСТІ
2.1. Завадостійке кодування.
Завадостійкі коди – це один із найефективніших засобів забезпечення високої достовірності передачі інформації. Розвиток цього напрямку зумовлений використанням мікропроцесорної техніки у системах зв’язку.
Завадостійке кодування базується на теоремі Шеннона для передачі дискретної інформації по каналу із завадами: “Імовірністть помилкового декодування може бути як завгодно малою при виборі відповідного способу кодування”. Теорема вказує на принципову можливість, але не визначає спосіб кодування. Це обумовило інтерес до розробки завадостійких кодів.
Під завадостійкими розуміють коди, які дозволяють виявляти чи виявляти і виправляти помилки, які виникли через вплив завад.
Завадостійкість кодування забезпечується за рахунок внесення надлишковості в кодові комбінації, тобто крім інформаційних є і надлишкові (додаткові) розряди.
Всі завадостійкі коди поділяються на два класи:блочні та неперервні [1].
В блочних кодах кожному повідомленню (або елементу повідомлення) відповідає кодова комбінація (блок) із певної кількості сигналів. Блоки кодуються і декодуються окремо один від одного. Блочні коди можуть бути рівномірними (довжина кодових комбінацій n – постійна), або нерівномірними (n – міняється). Нерівномірні практично не використовуються через складність їх технічної реалізації.
В неперервних кодах внесення надлишковості в послідовність вхідних символів здійснюється без розбивки на окремі блоки. Для неперервних кодів процеси кодування та декодування мають теж неперервний характер. Цей напрям тільки розвивається.
Блочні і неперервні коди в залежності від методів внесення надлишковості поділяють на роздільні та нероздільні.
В роздільних чітко визначена роль окремих символів. Одні символи є інформаційні, інші є перевірочними і забезпечують виявлення і виправлення помилок.
Роздільні блочні коди називають ще n, k – кодами, де n – довжина кодових комбінацій, k – кількість інформаційних символів в комбінаціях.
У нероздільних кодах немає чіткого поділу символів кодової комбінації на інформаційні та перевірочні. Таких кодів мало.
Роздільні блочні коди поділяються на систематичні і несистематичні. Несистематичні будуються таким чином, що перевірочні символи визначаються як сума підблоків, на які поділяється блок інформаційних символів.
Більшість відомих роздільних кодів є систематичними кодами. Для цих кодів перевірочні символи визначаються в результаті проведення лінійних операцій над певними інформаційними символами.
Декодування зводиться до перевірки на парність певних груп символів. В результаті цих перевірок отримується інформація про наявність помилок, а при потребі і про позицію помилкових символів.
2.2. Основні принципи завадостійкого кодування.
Будемо розглядати блочні рівномірні двійкові завадостійкі коди. Кількість розрядів n в кодовій комбінації називається довжиною коду. Символи коду – 0,1. Кількість одиниць в кодовій комбінації називається її вагою w.
Наприклад: 100101100 – n=9, w=4.
Кодова віддаль d визначається кількістю позицій чи символів, в яких кодові комбінації відрізняються одна від одної і рівна вазі суми (по модулю 2) цих кодових комбінацій
100101100
+ 110110101
_________
010011001 w=4, d=4.
За рахунок впливу завад в одному чи кількох рядках кодової комбінації можуть з’являтися помилки (0 ( 1, 1(0).
По кількості помилкових розрядів помилки бувають одно, двох і більше кратними.
Експериментальні дослідження показали, що помилки символів при передачі по каналу зв’язку групуються у пачки різної тривалості. Пачка – це участок послідовності символів, які починаються і закінчується помилковими символами. В середині пачки можуть бути і окремі правильні символи.
Для визначення місця помилкових символів у кодовій комбінації використовується вектор помилки е (n – розрядна комбінація, одиниці якої вказують місце помилкових символів). Наприклад, е = 01100 – третій і четвертий символи справа – помилкові.
Сума по модулю 2 спотвореної кодової комбінації і вектора помилки дає правильну комбінацію.
Звадостійкість кодування забезпечується надлишковістю (k<n). Тобто із загальної кількості No = 2n можливих кодових комбінацій для передачі інформації використовується тільки N = 2k комбінацій, тобто множина No ділиться на дві групи N=2k – множина дозволених і (No-N)=2n-2k множина заборонених комбінацій. Якщо прийнята комбінація заборонена, то це означає, що сигнал створений в каналі. Якщо дозволена – то або комбінація без спотворень, або був перехід з однієї дозволеної в іншу.
У загальному випадку кожна із N дозволених комбінацій може перетворитись у будь-яку із No можливих, тобто можливі N* No варіантів передачі, з них N варіантів безпомилкові, N*(N-1) - перехід із одних дозволених у інші дозволені, N*(No-N) – перехіід із дозволених у заборонені.
Таким чином не всі спотворення можуть бути виявлені. Частка помилкових комбінацій, що можуть бути виявлені визначається як
;
Для використання коду як коректуючого, множина заборонених кодових комбінацій розбивається на N підмножин Mі , що не перетинаються. Кожна їз цих підмножин відповідає одній із дозволених комбінацій Аі . Якщо прийнята заборонена комбінація належить підмножині Mі , то вважається, що передана комбінація Аі. Помилка буде виправлена лише тоді, коли заборонена комбінація утворилася із Аі . Таким чином, помилка виправляється в (N0-N) випадках (тільки для заборонених комбінацій). Частка виправлених помилкових комбінацій із загальної кількості виявлених помилкових рівна
;
Спосіб розбиття на підмножини залежить від того які помилки повинні виправлятися даним кодом.
2.3. Зв’язок коректуючої здатності коду і кодової віддалі.
Кодова віддаль характеризує ступінь відмінності між двома довільними кодовими комбінаціями. Найменша віддаль між дозволеними кодовими комбінаціями dmin - важлива характеристика коду, яка визначає його виявляючу і коректуючу здатність. Якщо необхідно побудувати код, який виявляє всі помилки кратністю t і нижче – це значить із множини N0 можливих вибрати N дозволених комбінацій так, щоб будь-яка з них в сумі по модулю 2 із будь-яким вектором помилок з вагою Wі не більшою t, не дала б в результаті іншої дозволеної комбінації. Для цього необхідно, щоб кодова віддаль dmin була не меншою t+1. Для виправлення виявленої помилки необхідно щоб кодова віддаль між двома дозволеними комбінаціями була не меншою ніж t+2. Це забезпечує утворення для кожної із дозволениих комбінацій множини заборонених, яка, при заданій кратності помилки, не перетинається із множинами заборонених для інших дозволених, що дає можливість однозначно виправити помилку. Очевидно, що виправлення помилок зведенням до дозволеної будь-якої комбінації із її множини заборонених базується на гіпотезі, що мала місце помилка з кратністю не більше t. Однак на практиці не виключена можливіть виникнення помилки з більшою кратністю і тоді помилкова кодова комбінація буде неправильно виправлена до найближчої дозволеної. Таким чином методи виправлення помилок мають імовірнісний характер.
2.4. Код Хемінга.
Код Хемiнга належить до найважливiших лiнiйних кодiв, якi широко використовуються на практицi i мають зручний для технiчноi реалiзацii алгоритм виявлення та виправлення однiєї помилки.
Код складаеться з k iнформацiйних двійкових розрядів та n-k контрольних. Загальна кількість розрядів у кодi n. Нумерація розрядів здійснюється справа наліво від 1 до n.
Число n повинно задoвiльняти нерiвнiсть 2n-k не менше n+1. Для визначення основних параметрiв коду Хемiнга задається кiлькiсть iнформацiйних розрядів k, по яких обчислюється n та n-k. Кiлькiсть iнформацiйних k та контрольних n-k розрядів коду, який виявляє та коректує одну помилку приведена в таблиці.
k
1…4
5…11
12…26
27…57
58…120
121…247
n-k
3
4
5
6
7
8
n
7
15
31
63
127
255
На основi основних параметрiв коректуючого коду визначають позицii інформаційних та контрольних розрядів. Позиції контрольних розрядів вибираються по значенню степенi 2і, де i=0,1,2,3... Тобто номери контрольних розрядів будуть рiвнi 1,2,4,16... Між контрольними розрядами справа наліво вписуються інформаційні. Потiм визначають значення контрольних розрядів по такому правилу: сума одиниць на перевiрочних позицiях для даного контрольного розряду повинна бути непарною. Якщо ця сума непарна, то контрольний розряд встановлюється рiвним нулю, якщо парна – одиницi (доповнення до непарності).
Перевiрочнi позицii вибирають таким чином. Cкладають таблицю для ряду натуральних чисел у двiйковому кодi. Кiлькiсть чисел - n. Потiм визначають перевiрочнi позицii по такому правилу: в першу перевiрку входять розряди, якi мiстять одиницю в першому розрядi справа (1,3,5,7 і т.д.), в другу - в другому (2,3,6,7…) і т.д.
8 7 6 5 4 3 2 1
1
0
0
1
1
0
1
0
12 11 10 9 8 7 6 5 4 3 2 1
1
0
0
1
0
1
0
1
0
0
0
0
1
0
0
0
1100 1011 1010 1001 1000 0111 0110 0101 0100 0011 0010 0001
Рис.1. Формування коду Хемінга.
Для виявлення і виправлення одиночноi помилки в прийнятій кодовій комбінації проводять перевiрку на непарнiсть. Для першоi перевiрки сумують розряди для позицiй, що мiстять одиницю в молодшому розрядi (1,3,5,7...). Якщо кількість одиниць парна, то перший розряд справа для двійкового значення номера помилкової позиції (синдрома) встановлюється рівним одиниці. Потім сумуючи розряди для позицій, що містять одиницю у другому двійковому розряді, і перевіряючи суму на непарність визначають значення другого розряду синдрома. Процес повторюється для позицiй, що містять одиниці у розрядах 3,4,5 i т.д. В результатi формується номер помилкової позицiї коду. Для виправлення помилки символ у цiй позицii необхiдно замiнити на протилежний. Якщо синдром рівний нулю, то прийнята комбінація не містить одиночних помилок. Наприклад, при помилці в шостому розряді визначене значення синдрому буде рівне 0110.
4. Код програми
#include<math.h>
#include<stdlib.h>
#include<stdio.h>
#include<iostream.h>
#include<conio.h>
main()
{
pochatok:
clrscr();
textcolor(15);
int inf_b[8],ker_b[4]={0,0,0,0},kod[12],j=1,i,b1,b2,b3,b4,vubir,l,k=3,sum=0;
cprintf("Vvedit 8 informatciinux bitu cherez probil\r\n");
cprintf("nomera bitiv: 8 7 6 5 4 3 2 1\n");
cprintf("\rinform. bitu: ");
for (i=8;i>0;i--)
cscanf("%d",&inf_b[i]);
for (i=1;i<=12;i++)
{
if (i==1) kod[i]=ker_b[3];
else if (i==2) kod[i]=ker_b[2];
else if (i==4) kod[i]=ker_b[1];
else if (i==8) kod[i]=ker_b[0];
else
{
kod[i]=inf_b[j];
j++;
}
}
int a1=0,a2=0,a3=0,a4=0;
for (i=1;i<=12;i++)
{
if ((i==1)||(i==3)||(i==5)||(i==7)||(i==9)||(i==11)) a1=a1+kod[i];
if ((i==2)||(i==3)||(i==6)||(i==7)||(i==10)||(i==11)) a2=a2+kod[i];
if ((i==4)||(i==5)||(i==6)||(i==7)||(i==12)) a3=a3+kod[i];
if ((i==8)||(i==9)||(i==10)||(i==11)||(i==12)) a4=a4+kod[i];
}
b1=(a1/2)*2;
if (b1==a1) ker_b[3]=1;
else ker_b[3]=0;
b2=(a2/2)*2;
if (b2==a2) ker_b[2]=1;
else ker_b[2]=0;
b3=(a3/2)*2;
if (b3==a3) ker_b[1]=1;
else ker_b[1]=0;
b4=(a4/2)*2;
if (b4==a4) ker_b[0]=1;
else ker_b[0]=0;
cprintf("\r\nkontrolni bitu:");
for (i=0;i<=3;i++)
{
textcolor(2);
cprintf("%2d ",ker_b[i]);
}
textcolor(15);
for (i=1;i<=12;i++)
if (i==1) kod[i]=ker_b[3];
else if (i==2) kod[i]=ker_b[2];
else if (i==4) kod[i]=ker_b[1];
else if (i==8) kod[i]=ker_b[0];
cprintf("\r\nnomera bitiv: ");
for (i=12;i>0;i--)
cprintf("%2d ",i);
cprintf("\r\nKod Xeminga: ");
for (i=12;i>0;i--)
{
if ((i==1)||(i==2)||(i==4)||(i==8))
{
textcolor(2);
cprintf("%2d ",kod[i]);
}
else
{
textcolor(15);
cprintf("%2d ",kod[i]);
}
}
vubir_dii:
textcolor(15);
cprintf("\r\nDlia zminu bity natucnit 1");
cprintf("\r\nDlia vvody novux informatciinux bitiv natucnit 2");
cprintf("\r\nDlia vuxody natucnit 3\n\r");
vub:
cscanf("\r\n%d",&vubir);
if (vubir==1) goto zmina;
if (vubir==2) goto pochatok;
if (vubir==3) goto exit;
else goto vub;
zmina:
cprintf("\r\nVvedit nomer bita dlia zminu(vid 1 do 12): ");
int bit;
cscanf("\r\n%d",&bit);
if (kod[bit]==1) kod[bit]=0;
else kod[bit]=1;
cprintf("\r\nnomera bitiv: ");
for (i=12;i>0;i--)
cprintf("%2d ",i);
cprintf("\r\nKod Xeminga: ");
for (i=12;i>0;i--)
{
if (i==bit) textbackground(4);
if ((i==1)||(i==2)||(i==4)||(i==8))
{
textcolor(2);
cprintf("%2d ",kod[i]);
}
else
{
textcolor(15);
cprintf("%2d ",kod[i]);
}
textbackground(0);
}
textcolor(15);
a1=0,a2=0,a3=0,a4=0;
for (i=1;i<=12;i++)
{
if ((i==1)||(i==3)||(i==5)||(i==7)||(i==9)||(i==11)) a1=a1+kod[i];
if ((i==2)||(i==3)||(i==6)||(i==7)||(i==10)||(i==11)) a2=a2+kod[i];
if ((i==4)||(i==5)||(i==6)||(i==7)||(i==12)) a3=a3+kod[i];
if ((i==8)||(i==9)||(i==10)||(i==11)||(i==12)) a4=a4+kod[i];
}
b1=(a1/2)*2;
if (b1==a1) ker_b[3]=1;
else ker_b[3]=0;
b2=(a2/2)*2;
if (b2==a2) ker_b[2]=1;
else ker_b[2]=0;
b3=(a3/2)*2;
if (b3==a3) ker_b[1]=1;
else ker_b[1]=0;
b4=(a4/2)*2;
if (b4==a4) ker_b[0]=1;
else ker_b[0]=0;
cprintf("\r\nsundrom: ");
for (i=0;i<=3;i++)
{
textcolor(4);
cprintf("%2d ",ker_b[i]);
}
for (l=0;l<4;l++,k--)
if (ker_b[l]==1) sum+=pow(2,k);
textcolor(15);
cprintf("\r\npomulka v biti nomer %d",sum);
cprintf("\r\nnomera bitiv: ");
for (i=12;i>0;i--)
cprintf("%2d ",i);
cprintf("\r\nKod Xeminga: ");
if (kod[sum]==1) kod[sum]=0;
else kod[sum]=1;
for (i=12;i>0;i--)
{
if (i==bit) textbackground(4);
if ((i==1)||(i==2)||(i==4)||(i==8))
{
textcolor(2);
cprintf("%2d ",kod[i]);
}
else
{
textcolor(15);
cprintf("%2d ",kod[i]);
}
textbackground(0);
}
goto vubir_dii;
exit:;
}
Результат програми:
Vvedit 8 informatciinux bitu cherez probil
nomera bitiv: 8 7 6 5 4 3 2 1
inform. bitu: 1 0 1 1 0 1 1 0
kontrolni bitu: 0 0 1 1
nomera bitiv: 12 11 10 9 8 7 6 5 4 3 2 1
Kod Xeminga: 1 0 1 1 0 0 1 1 0 0 1 1
6. Висновки
В даній лабораторній роботі отримано практичні навики використання кодів Хемінга. Для заданого варіанту вручну побудовано код Хемінга, внесено і виявлено помилку. Розроблено алгоритм та реалізовано програму побудови коду Хемiнга. Реалізовано програму перевiрки та виправлення кодових послiдовностей. Перевiрено працездатнiсть програми на тестових прикладах.