Код Хэмминга с d_min=3 и d_min=4
Практическое освоение кода Хэмминга с минимальным кодовым расстоянием 3 и 4. Разработка программы, реализующей код Хэмминга, способной закодировать и декодировать входное слово. Определение наличия ошибки при передаче и оценка возможности ее исправления.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 26.01.2014 |
Размер файла | 58,3 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
Размещено на http://www.allbest.ru/
Министерство образования Российской Федерации
Московский государственный институт электроники и математики
Факультет автоматики и вычислительной техники
Кафедра
Электронно-вычислительная аппаратура
Курсовая работа
по дисциплине: Теория информации и кодирование
Код Хэмминга с и
Выполнил:
студент 4го курса группы С-75
Дубровин Н. А.
Проверила:
Гоманилова Н.Б.
Оглавление
- Введение
- Алгоритм кодирования
- Алгоритм декодирования
- Код Хэмминга
- Код Хэмминга
- Установка и использование программы
- Требования к программному обеспечению
- Порядок установки
- Использование программы
- Ограничения
- Пример работы
- Приложение. Исходный код программы
Введение
Код Хэмминга - простейший линейный код, способный обнаружить ошибки кратности и исправить ошибки кратности , где - минимальное кодовое расстояние. В работе использовался код Хэмминга с и .
Целью данной работы является практическое освоение кода Хэмминга с минимальным кодовым расстоянием 3 и 4. Для этого требуется разработать программу, реализующую код Хэмминга; способную закодировать входное слово, декодировать его, определить наличие ошибки при передаче и, если возможно, исправить ее.
В качестве языка программирования был выбран Си++, поскольку он обладает удобными средствами работы с наборами битов и манипуляции со строками.
Алгоритм кодирования
хэмминг кодовый слово программа
При получении входного слова необходимо записать его в двоичном виде. На основании полученного числа требуется определить количество информационных и контрольных разрядов, а также длину закодированного слова.
Информационные разряды - разряды, содержащие входное слово в двоичном виде. Для определения их количества нужно посчитать количество разрядов входного слова в двоичном виде.
Контрольные разряды - избыточные разряды, необходимые для обнаружения и корректирования ошибок при передаче. Такие разряды рассчитываются определенным образом в зависимости от используемого кода. Для кода Хэмминга количество контрольных разрядов рассчитывается исходя из неравенства:
,
Где m - число информационных разрядов, k - число контрольных разрядов.
Длина кодового слова - сумма количества информационных и контрольных разрядов. Для кода Хэмминга с минимальным кодовым расстоянием 4 длина кодового слова увеличивается за счет дополнительного контрольного разряда.
Следующий шаг - расчет значений контрольных разрядов. Алгоритм расчета таков:
· Расчет 1го контрольного разряда (1й разряд слова):
o пропустить 0 разрядов;
o добавить в расчет дополнения до четности 1 разряд;
o пропустить 1 разряд;
o добавить в расчет дополнения до четности 1 разряд;
o пропустить 1 разряд;
o и так далее.
· Расчет 2го контрольного разряда (2й разряд слова):
o пропустить 1 разрядов;
o добавить в расчет дополнения до четности 2 разряда;
o пропустить 2 разряда;
o добавить в расчет дополнения до четности 2 разряда;
o пропустить 2 разряд;
o и так далее.
· Расчет 3го контрольного разряда (4й разряд слова):
o пропустить 3 разрядов;
o добавить в расчет дополнения до четности 4 разряда;
o пропустить 4 разряда;
o добавить в расчет дополнения до четности 4 разряда;
o пропустить 4 разряд;
o и так далее.
Таким образом, контрольный разряд рассчитывается по формуле:
Для кода Хэмминга после расчета контрольных разрядов необходимо получить дополнительный контрольный разряд, представляющий собой дополнение до четности по всему кодовому слову:
Алгоритм декодирования
После приема кодового слова его необходимо декодировать, чтобы определить, произошли ли ошибки при передаче и можно ли их скорректировать.
Сначала декодер заново рассчитывает каждый контрольный разряд кодового слова по вышеописанному алгоритму и сравнивает полученный результат с соответствующим контрольным разрядом, записанным в кодовом слове.
В случае несовпадения пришедшего и рассчитанного контрольного разряда в регистр ошибок записывается 1, в противном случае - 0.
После расчета всех контрольных разрядов необходимо интерпретировать значение регистра ошибок. Для кодов Хэмминга с минимальным кодовым расстоянием 3 существует 2 возможных варианта, в то время как для вариантов - 4.
Код Хэмминга
1. Ошибок нет.
Доп. КР |
k - 1 |
… |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
0 |
0 |
… |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
В дополнительном контрольном разряде - 0.
В основных контрольных разрядах - 0.
2. Одиночная ошибка.
Доп. КР |
k - 1 |
… |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
1 |
0 |
… |
0 |
0 |
1 |
1 |
0 |
1 |
0 |
В дополнительном контрольном разряде - 1.
В основных контрольных разрядах - не 0 (номер ошибочного разряда в двоичном виде).
3. Двоичная ошибка (не корректируется).
Доп. КР |
k - 1 |
… |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
0 |
1 |
… |
0 |
0 |
1 |
1 |
1 |
0 |
0 |
В дополнительном контрольном разряде - 0.
В основных контрольных разрядах - не 0.
4. Ошибка в дополнительном контрольном разряде.
Доп. КР |
k - 1 |
… |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
1 |
0 |
… |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
В дополнительном контрольном разряде - 1.
В основных контрольных разрядах - 0.
Код Хэмминга
1. Ошибок нет.
k - 1 |
… |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
0 |
… |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
В основных контрольных разрядах - 0.
2. Одиночная ошибка.
k - 1 |
… |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
|
0 |
… |
0 |
1 |
0 |
1 |
1 |
0 |
1 |
В основных контрольных разрядах - не 0 (номер ошибочного разряда в двоичном виде).
Установка и использование программы. Требования к программному обеспечению
Для установки программы требуется:
· ОС GNU/Linux или BSD;
· Компилятор g++ языка Си++;
· Библиотека STL языка Си++.
Порядок установки
1. Распаковать архив hamming.tar.gz. Для этого в консоли необходимо выполнить команду:
nikitad@sotona:~$ tar -zxvf ./hamming.tar.gz
Архив будет распакован в текущий каталог.
2. Перейти в директорию, содержащую исходные тексты программы:
nikitad@sotona~$ cd hamming/
3. Выполнить конфигурирование компилятора:
nikitad@sotona~/hamming$ ./configure
4. Скомпилировать и установить от имени привилегированного пользователя:
nikitad@sotona~/hamming$ make
nikitad@sotona~/hamming$ sudo make install
Перед выполнением последней команды будет запрошен пароль пользователя root.
Использование программы
Для начала работы программы нужно набрать в командной строке:
nikitad@sotona~$ hamming
Кроме того, программа позволяет задавать некоторые параметры в качестве аргументов. Синтаксис в таком случае будет следующий:
hamming [-i|--interactive] [input_num]
hamming [-d|--dmin=3] [-e|--error=err_bits] [input_num]
В данном случае input_num - десятичное число, которое требуется закодировать. Если его не указать в качестве аргумента программы, то оно будет запрошено после запуска.
При вызове программы можно указать следующие параметры:
· -i, --interactive - запуск программы в интерактивном режиме. В этом режиме программа будет запрашивать требуемые ей параметры по мере необходимости. Любые другие указанные аргументы игнорируются.
· -d, --dmin - указывает минимальное кодовое расстояние, которое будет использоваться при кодировании/декодировании. Если этот параметр не указан, то используется значение 3.
· -e, --error - указывает номера разрядов, которые требуется обратить (искусственно создать ошибку). Разряды нумеруются, начиная с нуля. Для указания нескольких (не более двух при и не более одного при ) разрядов следует разделить их запятой (без пробела). Для отмены создания ошибки нужно ввести два одинаковых номера.
Ограничения
· Длина кодового слова должна быть не более 32 бит, считая дополнительный контрольный разряд.
· Программа не проверяет соответствие количества ошибок значению минимального кодового расстояния, то есть создание двоичной ошибки при не вызовет вывода предупреждающего сообщения.
· Программу рекомендуется запускать на экране с разрешением не менее 1024х768, в противном случае нарушается требуемый вид вывода на экран.
Пример работы
nikitad@sotona:~$ hamming --dmin=4 --error=3 4376
hamming
--dmin=4
--error=3
4376
==================================================
Знак = найден на позиции 6
Обработка аргумента --dmin
--dmin = 4
Переменная 'dmin' установлена на 4
=================================================
Знак = найден на позиции 7
Обработка аргумента --error
--error = 3
Переменная 'error_bits' установлена на 3 =====================================================
Входное слово 4376
=================================================
Имеется дополнительный контрольный разряд.
Входное слово: 00000000000000000001000100011000
Информационные разряды: 13
Контрольные разряды (исключая дополнительный): 5
Длина закодированного слова: 19
1: 0 0 1 1 0 1 0 0 Контрольный разряд №0: 1
2: 0 01 00 00 1 Контрольный разряд №1: 0
3: 001 0100 Контрольный разряд №3: 0
4: 1000100 Контрольный разряд №7: 0
5: 01 Контрольный разряд №15: 1
Дополнительный контрольный разряд равен 0
Закодированное слово (dmin=4): 00000000000000101001000101000001
Изменение разряда #3
Закодированное слово с ошибкой: 00000000000000101001000101001001
1: 0 0 1 1 0 1 0 0 Рассчитанный КР 0 = 1 Пришедший КР 0 = 1 Совпадение: 0
2: 0 01 00 00 1 Рассчитанный КР 1 = 0 Пришедший КР 1 = 0 Совпадение: 0
3: 001 0100 Рассчитанный КР 3 = 0 Пришедший КР 3 = 1 Несовпадение: 1
4: 1000100 Рассчитанный КР 7 = 0 Пришедший КР 7 = 0 Совпадение: 0
5: 01 Рассчитанный КР 15 = 1 Пришедший КР 15 = 1 Совпадение: 0
Проверка дополнительного контрольного разряда.
Вычисленный КР: 1 Пришедший контрольный разряд: 0 Несовпадение: 1
Регистр ошибок: 00000000000000000000000000100100
Ошибка в разряде #3
nikitad@sotona:~$
Приложение. Исходный код программы
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
#include <list>
#include <bitset>
#include <cmath>
using namespace std;
int decodeErrorRegister(bitset<32>, int);
bool strtoint (string, int*);
bool isParityBit (int, int);
bitset<32> encode (bitset<32>, int, int, int, int);
bitset<32> decode (bitset<32>, int, int, int, int);
int main(int argc, char** argv[])
{
// Переменные-счетчики
int i = 0, j = 0, l = 0;
// Dmin
int dmin = 3;
// Используется при разборе аргументов программы для временного хранения
// номера ошибочного разряда
int TempErrorBit = -1;
// Входное число
int input = -1;
// Делимое, используется при подсчете числа контрольных разрядов
int Dividual = -1;
// Остаток от деления, используется при подсчете числа контрольных разрядов
int Remainder = -1;
// Количество информационных разрядов, длина закодированного слова,
// количество контрольных разрядов
int m = 0, n = 0, k = 0;
// Результат сложения разрядов регистра ошибок, исключая дополнительный
// контрольный разряд
int ErrorRegisterSum = 0;
// Интерактивный режим
bool interactive = false;
// Позиция некоторого символа, используется для разбора аргументов
// программы
size_t fnd, oldfnd;
// Длина некоторой строки, используется для разбора аргументов
// программы
size_t len;
// Переменная для хранения имени аргумента, используется для разбора аргументов
// аргументов программы
string ArgTemp = "";
// Переменная для хранения значения аргумента, используется для разбора аргументов
// аргументов программы
string ValTemp = "";
// Буфер обработки, используется для разбора аргументов программы
string ParseBuffer = "";
// Используется для хранения введенных номеров ошибочных разрядов в
// интерактивном режиме
string ErrorBitString = "";
// Список ошибочных разрядов
list <int> error_bits;
// Итератор для списка ошибочных разрядов
list <int>::iterator it;
// Закодированное слово
bitset<32> encoded_word;
// Регистр ошибок
bitset<32> error_register;
// Аргументы порграммы
vector <string> Arguments(argc);
// Заполнение вектора аргументов
for (i = 0; i < argc; i++) {
Arguments[i].assign ((const char*)argv[i], strlen((const char *)argv[i]));;
cout << Arguments[i] << endl;
}
// Обработка аргументов
for (i = 0; i < argc; i++) {
// Если указан интерактивный режим работы программы.
if ((Arguments[i] == "--interactive") || (Arguments[i] == "-i")) {
interactive = true;
cout << "Программа запущена в интерактивном режиме, аргументы игнорируются." << endl;
}
// Поиск знака =
if ((fnd = Arguments[i].find("=")) != string::npos) {
cout << "Знак = найден на позиции " << fnd << endl;
len = Arguments[i].length();
ArgTemp = Arguments[i].substr(0,(int)fnd);
ValTemp = Arguments[i].substr((int)fnd + 1,len - (int)fnd);
cout << "Обработка аргумента " << ArgTemp << endl;
// Если указан dmin в качетсве аргумента программы
if ((ArgTemp == "--dmin") || (ArgTemp == "-d")) {
cout << ArgTemp << " = " << ValTemp << endl;
strtoint (ValTemp, &dmin);
cout << "Переменная 'dmin' установлена на " << dmin << endl;
}
// Если указан(ы) номер(а) ошибочных разрядов в аргументе программы
if ((ArgTemp == "--error") || (ArgTemp == "-e")) {
cout << ArgTemp << " = " << ValTemp << endl;
ParseBuffer = "";
for (j = 0; j <= ValTemp.length(); j++) {
ParseBuffer += ValTemp.substr(j,1);
if ((ValTemp.compare((size_t)j, 1, ",") == 0) || (j == ValTemp.length())) {
strtoint (ParseBuffer, &TempErrorBit);
// Добавление номера разряда в список ошибочных
error_bits.push_back (TempErrorBit);
ParseBuffer = "";
continue;
}
}
list<int>::iterator it;
cout << "Переменная 'error_bits' установлена на ";
for (it = error_bits.begin(); it != error_bits.end(); it++) {
cout << " " << *it;
}
cout << endl;
}
}
if (strtoint (Arguments[i], &input) == true) {
cout << "Входное слово " << input << endl;
}
cout << "=================================" << endl;
}
// В интерактивном режиме параметры кодирования запрашиваются в процессе
// работы прогаммы
if (interactive == true) {
cout << "Введите dmin: " << endl;
cin >> dmin;
}
if ((input == -1) || (interactive == true)) {
cout << "Введите десятичное число: " << endl;
cin >> input;
}
// Инициализация набора битов входным десятичным числом
bitset<32> input_seq(input);
// Подсчет количества информационных разрядов
Dividual = input;
while (Dividual > 0) {
Remainder = Dividual % 2;
Dividual = Dividual / 2;
m++;
}
// Подсчет количества контрольных разрядов (2^k = m + k + 1).
while (pow(2.0,k) < m + k + 1) {
k++;
}
// Длина закодированного слова
n = m + k;
// Если dmin = 4, то увеличить длину закодированного слова на единицу
if (dmin == 4) {
cout << "Имеется дополнительный контрольный разряд." << endl;
n += 1;
}
cout << "Входное слово:\t\t\t\t" << input_seq << endl;
cout << "Информационные разряды:\t\t\t" << m << endl;
cout << "Контрольные разряды (исключая дополнительный):\t" << k << endl;
cout << "Длина закодированного слова:\t\t\t" << n << endl;
// Вызов процедуры кодирования
encoded_word = encode (input, dmin, m, n, k);
// Ввод номеров ошибочных разрядов для интерактивного режима или случая,
// когда список номеров ошибочных разрядов пуст
if ((error_bits.empty() == true) || (interactive == true)) {
cout << "Введите номера ошибочных разрядов через запятую (для отмены ошибки введите номер разряда 2 раза): " << endl;
cin >> ErrorBitString;
ParseBuffer = "";
for (j = 0; j <= ErrorBitString.length(); j++) {
ParseBuffer += ErrorBitString.substr(j,1);
if ((ErrorBitString.compare((size_t)j, 1, ",") == 0) || (j == ErrorBitString.length())) {
strtoint (ParseBuffer, &TempErrorBit);
error_bits.push_back (TempErrorBit);
ParseBuffer = "";
continue;
}
}
cout << "Переменная 'error_bits' установлена на ";
for (it = error_bits.begin(); it != error_bits.end(); it++) {
cout << " " << *it;
}
cout << endl;
}
// Создание ошибки
for (it = error_bits.begin(); it != error_bits.end(); it++) {
cout << "Изменение разряда #" << *it << endl;
encoded_word.flip(*it);
}
cout << "Закодированное слово с ошибкой:\t" << encoded_word << endl;
// Вызов процедуры декодирования
error_register = decode (encoded_word, dmin, m, n, k);
cout << "Регистр ошибок:\t" << error_register << endl;
// Рассчет суммы разрядов регистра ошибок (исключая дополнительный
// контрольный)
for (i = 0; i < k; i++) {
if (error_register[i] == 1) {
ErrorRegisterSum++;
}
}
// Интерпретация результата декодирования для dmin = 4
if (dmin == 4) {
// Если дополнительный контрольный разряд равен 0
if (error_register[k] == 0) {
// Если сумма остальных разрядов 0 (все нули), то ошибок нет.
if (ErrorRegisterSum == 0) {
cout << "Ошибок нет." << endl;
// В противном случае - некорректируемая двойная ошибка.
} else {
cout << "Двойная ошибка (не корректируется)." << endl;
}
// Если дополнительный контрольный разряд равен 1
} else {
// Если сумма остальных разрядов 0 (все нули), то ошибка в
// дополнительном контрольном разряде
if (ErrorRegisterSum == 0) {
cout << "Ошибка в дополнительном контрольном разряде." << endl;
// В противном случае - одиночная корректируемая ошибка: дешифруем
// регистр ошибок и получаем номер ошибочного разряда в десятичной
// системе счисления
} else {
int decbitnum = decodeErrorRegister(error_register, k);
cout << "Ошибка в разряде #" << decbitnum << endl;
}
}
// Интерпретация результата декодирования для dmin = 3
} else {
// Если сумма разрядов 0 (все нули), то ошибок нет.
if (ErrorRegisterSum == 0) {
cout << "Ошибок нет." << cout;
// В противном случае - одиночная корректируемая ошибка: дешифруем
// регистр ошибок и получаем номер ошибочного разряда в десятичной
// системе счисления
} else {
int decbitnum = decodeErrorRegister(error_register, k);
cout << "Ошибка в разряде #" << decbitnum << endl;
}
}
exit (0);
}
bool strtoint(string Convstr, int* result) {
int i;
istringstream cnvStream(Convstr);
if (cnvStream >> i) {
*(result) = i;
return true;
} else {
return false;
}
}
bitset<32> encode (bitset<32> input_seq, int dmin, int m, int n, int k) {
// Переменные-счетчики
int i = 0, j = 0, l = 0;
// Номер текущего разряда
int CurrentBit = 0;
// Число пропускаемых разрядов
int Skip = 0;
// Дополнительный контрольных разряд не участвует в рассчете
int nact = 0;
// Флаг проверки разрядов
bool check = true;
// Переменная для временного хранения дополнения до четности по
//подмножеству
bool ParityTemp = false;
// Закодированное слово
bitset<32> encoded_word;
// Добавление контрольных разрядов во входное слово
for (i = 0; i <= n; i++) {
if (i == ((int) pow (2.0, l) - 1)) {
l++;
continue;
}
encoded_word.set(i, input_seq[j]);
j++;
}
dmin == 4 ? nact = n - 1 : nact = n;
// Рассчет каждого контрольного разряда (кроме дополнительного)
for (i = 0; i < k; i++) {
cout << i + 1 << ": ";
// Установка флага проверки
check = true;
// Обнуление переменной хранения дополнения до четности
ParityTemp = false;
// Рассчет номера текущего контрольного разряда
CurrentBit = (int) pow (2.0, i) - 1;
// Рассчет числа разрядов, которые нужно пропустить
Skip = (int) pow (2.0, i);
for (j = 0; j <= CurrentBit; j++) {
cout << " ";
}
// Просмотр разрядов начиная с CurrentBit до конца слова с шагом Skip
for (j = CurrentBit; j <= nact; j = j + Skip) {
// Считаем Skip разрядов
for (l = 0; l < Skip; l++) {
// Если текущий разряд - контрольный, то пропуск
if ((isParityBit(j + l, k) == true) || (j + l >= nact)) {
cout << " ";
continue;
}
// Если установлен флаг проверки разрядов, то j + l разряд
// складываем по модулю 2 с временной переменной дополнения
// до четности.
// В противном случае вывод пробела.
if (check == true) {
cout << encoded_word[j + l];
ParityTemp ^= encoded_word[j + l];
//cout << i << "\t" << j << "\t" << l << "\t" << j + l << endl;
} else {
cout << " ";
}
}
// Обращение флага проверки разрядов
check = ! check;
}
// Сохранение временной переменной хранения дополнения до четности
cout << "\t\tКонтрольный разряд №" << (int) pow (2.0, i) - 1 << ": " << ParityTemp;
cout << endl;
encoded_word.set(CurrentBit, ParityTemp);
}
// Сброс временной переменной хранения дополнения до четности
ParityTemp = false;
// Рассчет дополнительного контрольного разряда
if (dmin == 4) {
for (i = 0; i <= nact; i++) {
ParityTemp ^= encoded_word[i];
}
cout << "Дополнительый контрольный разряд равен " << ParityTemp << endl;
encoded_word.set(nact, ParityTemp);
}
cout << "Закодированное слово (dmin=" << dmin << "):\t" << encoded_word << endl;
return encoded_word;
}
bitset<32> decode(bitset<32> damaged_word, int dmin, int m, int n, int k) {
// См. соответствующие переменные процедуры кодирования
bool check = false;
bool ParityTemp = false;
int CurrentBit = -1;
int Skip = -1;
int nact = -1;
int i = 0, j = 0, l = 0;
// Регистр ошибок
bitset<32> error_register(0);
dmin == 4 ? nact = n - 1 : nact = n;
// Рассчет контрольных разрядов заново. Если рассчитаный и пришедший
// контрольные разряды совпали, то в регистр ошибок идет 0, иначе - 1
for (i = 0; i < k; i++) {
cout << i + 1 << ": ";
check = true;
ParityTemp = false;
CurrentBit = (int) pow (2.0, i) - 1;
Skip = (int) pow (2.0, i);
for (j = 0; j <= CurrentBit; j++) {
cout << " ";
}
for (j = CurrentBit; j <= nact; j = j + Skip) {
for (l = 0; l < Skip; l++) {
if ((isParityBit(j + l, k) == true) || (j + l >= nact)) {
cout << " ";
continue;
}
if (check == true) {
cout << damaged_word[j + l];
ParityTemp ^= damaged_word[j + l];
//cout << i << "\t" << j << "\t" << l << "\t" << j + l << endl;
} else {
cout << " ";
}
}
check = ! check;
}
cout << "\t\tРассчитаный КР " << (int) pow (2.0, i) - 1 << " = " << ParityTemp;
cout << "\tПришедший КР " << (int) pow (2.0, i) - 1 << " = " << damaged_word[(int) pow (2.0, i) - 1];
if (damaged_word[(int) pow (2.0, i) - 1] != ParityTemp) {
error_register[i] = 1;
cout << "\tНесовпадение: " << error_register[i] << endl;
} else {
error_register[i] = 0;
cout << "\tСовпадение: " << error_register[i] << endl;
}
}
// Рассчет дополнительного контрольного разряда. Если рассчитаный и
// пришедший дополнительные контрольные разряды совпали, то в регистр
// ошибок идет 0, иначе - 1
if (dmin == 4) {
ParityTemp = false;
cout << "Проверка дополнительного контрольного разряда." << endl;
for (i = 0; i < nact; i++) {
ParityTemp ^= damaged_word[i];
}
cout << "Вычисленный КР: " << ParityTemp << "\t";
cout << "Пришедший контрольный разряд: " << damaged_word[nact] << "\t";
if (damaged_word[nact] != ParityTemp) {
error_register[k] = 1;
cout << "Несовпадение: " << error_register[k] << endl;
} else {
error_register[k] = 0;
cout << "Совпадение: " << error_register[k] << endl;
}
}
return error_register;
}
bool isParityBit (int bitnum, int pb_number) {
int i = 0;
for (i = 0; i <= pb_number; i++) {
if (bitnum == (int) pow (2.0, i) - 1) {
return true;
}
}
return false;
}
int decodeErrorRegister (bitset<32> error_register, int k) {
int i = 0;
int value = 0;
for (i = 0; i < k; i++) {
if (error_register[i] == true) {
value += (int) pow (2.0, i) - 1;
}
}
return value;
}
Размещено на Allbest.ru
Подобные документы
Использование принципа формирования кода Хэмминга в процессе отладки ошибки. Сложение двоичного числа по модулю в программе и получение кода ошибки для определения разряда, в котором она содержится. Соответствие ошибки определенному разряду операнда.
лабораторная работа [8,0 K], добавлен 29.06.2011Выбор и обоснование параметров входа, разработка кодека. Исследование кодов, исправляющих ошибки, которые могут возникать при передаче, хранении или обработке информации по разным причинам. Синтез принципиальной схемы парафазного буфера и декодера.
курсовая работа [582,8 K], добавлен 24.03.2013Обеспечение достоверности передаваемой информации применением корректирующих кодов. Код Хэмминга - алгоритм обнаружения и исправления одиночной ошибки. Использование циклических кодов при последовательной передачей между ЭВМ и внешними устройствами.
дипломная работа [123,7 K], добавлен 02.08.2009Написание программы, реализующей алгоритм RLE, позволяющий кодировать, декодировать файлы любого формата и размера, предоставлять пользователю информацию о степени их сжатия. Анализ эффективности кода. Экспериментальная оценка алгоритма программы.
контрольная работа [151,7 K], добавлен 29.05.2013Изучение сущности циклических кодов - семейства помехоустойчивых кодов, включающих в себя одну из разновидностей кодов Хэмминга. Основные понятия и определения. Методы построения порождающей матрицы циклического кода. Понятие открытой системы. Модель OSI.
контрольная работа [99,5 K], добавлен 25.01.2011Целесообразность выбора языка программирования. Основные структуры языка программирования. Кодирование по методу четности/нечетности, по методу Хэмминга. Машина Поста. Инструкция программиста и пользователя. Использование программы StudyProgram.
курсовая работа [294,7 K], добавлен 27.02.2009Характеристика моделей обучения. Общие сведения о нейроне. Искусственные нейронные сети, персептрон. Проблема XOR и пути ее решения. Нейронные сети обратного распространения. Подготовка входных и выходных данных. Нейронные сети Хопфилда и Хэмминга.
контрольная работа [1,4 M], добавлен 28.01.2011Описание принципа развивающей игры в слова "Виселица". Разработка программы, реализующей задачу данной игры на языке Delphi. Обоснование выбора среды программирования, листинг файла, результаты отладки и тестирования, руководство для пользователя.
курсовая работа [572,7 K], добавлен 14.07.2012Основы нейрокомпьютерных систем. Искусственные нейронные сети, их применение в системах управления. Алгоритм обратного распространения. Нейронные сети Хопфилда, Хэмминга. Современные направления развития нейрокомпьютерных технологий в России и за рубежом.
дипломная работа [962,4 K], добавлен 23.06.2012Процесс создания программы, разработка проекта программы и программирование. Лексическая обработка, синтаксический анализ, поэтапная генерация кода, использование библиотечного файла и кода. Стандартные функции библиотечного кода, математические ошибки.
курсовая работа [26,4 K], добавлен 01.12.2009