Министерство образования и науки Российской Федерации
Новосибирский государственный технический университет
Кафедра вычислительной техники
Отчет по дисциплине «Кодирование»
Лабораторная работа №2
Кодирование по кодам Хемминга.
Факультет: АВТ Преподаватель:
Группа: АМ-610 Титов Г. И.
Студенты: Королевская В.Е.
Таратухин И.И.
Новосибирск, 2009
Изучение и сравнение результатов кодирования по кодам Хемминга.
Изучить защитный код, используемый в лабораторной работе. Составить программу кодирования и декодирования передаваемого числа. Выбрать номер выполняемой лабораторной работы, вывести число для передачи, выбрать требуемый режим передачи. Проанализировать полученные результаты, сравнить их с эталонной функцией.
В приложении «Стенд» во вкладке «Code» составляем программу кодирования исходного числа (листинг. 1).
Функция encode принимает в качестве входного параметра исходное число valueтипа char(так как используется 8-разрядное число для передачи). Результат выполнения функции – закодированное число.
Листинг 1. Программа кодирования исходного числа.
#define EXPORT extern "C" __declspec (dllexport)
EXPORT char encode(char value)
{
char bits[8];
int i = 0;
for ( i = 0; i < 8; i++ )
bits[i] = (value >> i) & 0x1;
bits[0]=bits[2] ^ bits[4] ^ bits[6];
value = value | bits[0];
bits[1]=bits[2] ^ bits[5] ^ bits[6];
value = value | ((bits[1])*2);
bits[3]=bits[4] ^ bits[5] ^ bits[6];
value = value | ((bits[2])*8);
for( i = 0; i < 7; i++)
bits[7] ^= bits[i];
value = value | (bits[7])*128;
return value;
}
Составляем программу декодирования принятого числа (рис.2). Функция decode принимает в качестве входного параметра принятое число value. Результат выполнения функции – раскодированное число.
Листинг 2. Программа декодирования принятого числа.
#define EXPORT extern "C" __declspec (dllexport)
EXPORT char decode(char value)
{
char bits[8];
char contBits = 0;
char contParitBit = 0;
int i = 0;
for ( i = 0; i < 8; i++ )
bits[i] = (value >> i) & 1;
contBits = contBits | (bits[0] ^ bits[2] ^ bits[4] ^ bits[6])*1;
contBits = contBits | (bits[1] ^ bits[2] ^ bits[5] ^ bits[6])*2;
contBits = contBits | (bits[3] ^ bits[4] ^ bits[5] ^ bits[6])*4;
for( i = 0; i < 8; i++)
contParitBit ^= bits[i];
if ( contBits && contParitBit )
{
char temp = 1;
for ( i = 1; i < ((int)contBits)&255; i++ )
temp = temp << 1;
if ( bits[((int)contBits)&255 - 1] ) { temp = ~temp; value &= temp; }
else value |= temp;
value = value & 116;
}
if ( !contBits ) value = value & 116;
return value;
}
Примеры обнаружения двойной ошибки
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
128 |
64 |
32 |
16 |
8 |
4 |
2 |
1 |
1 |
1 |
1 |
1 |
0 |
1 |
1 |
0 |
Сумма первой контрольной группы
0111=1
Сумма второй контрольной группы
1111=0
Сумма третей контрольной группы
0111=1
Соответственно ContBits=101
Контроль по паритету
ContParitBit=01101111=0
Получили двойную ошибку, должны вернуть полученное число без изменений!
В ходе работы были построены кодер и декодер по модифицированному коду Хемминга, которые, в отличие от контроля по паритету, позволяет исправлять одиночную ошибку и детектировать двойную ошибку.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.