код хэмминга 7 4 пример для чайников

Кодирование с помощью кода Хэмминга

Теоретическая часть

Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1)
Таким образом мы можем найти минимальные значения k для заданных m:
код хэмминга 7 4 пример для чайников. 9836a62ff13a. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-9836a62ff13a. картинка код хэмминга 7 4 пример для чайников. картинка 9836a62ff13a. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.
Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим.
Запишем эти разряды и пронумеруем в двоичной системе.

код хэмминга 7 4 пример для чайников. b15905296896. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-b15905296896. картинка код хэмминга 7 4 пример для чайников. картинка b15905296896. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Будем считать, что разряд принадлежит n-той контрольной группе, если в двоичном представлении эго номера стоит единица в n-том разряде.

Среди m+k разрядов мы будем иметь k разрядов, которые принадлежат только одной группе (степени двойки, так как они в двоичном представлении имеют только одну единицу).

Эти k разрядов мы будем считать контрольными. Остальные m разрядов будут информационными разрядами.

код хэмминга 7 4 пример для чайников. 53fbe881dcbe. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-53fbe881dcbe. картинка код хэмминга 7 4 пример для чайников. картинка 53fbe881dcbe. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

В информационные разряды переписываем наши исходные m разрядов.

В каждый из контрольных разрядов запишем такую цифру (0 или 1), чтоб общее количество единиц в его контрольной группе была парной. Для этого нам надо просто просуммировать по модулю два двоичных представления тех информационных разрядов, в которых стоит единица. Таким образом, мы узнаем контрольные разряды, ну и соответственно все m+k закодированных разрядов.

Пример

Давайте рассмотрим пример.

Например, нам дана последовательность 1001000. В данном случае m = 7, значит k = 4.

Запишем наши m + k разряды.

код хэмминга 7 4 пример для чайников. 19396cddd5bc. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-19396cddd5bc. картинка код хэмминга 7 4 пример для чайников. картинка 19396cddd5bc. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.
Узнаем теперь контрольные разряды:

код хэмминга 7 4 пример для чайников. 3052646ab0d7. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-3052646ab0d7. картинка код хэмминга 7 4 пример для чайников. картинка 3052646ab0d7. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.
Запишем контрольные разряды.
код хэмминга 7 4 пример для чайников. ea388e14e038. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-ea388e14e038. картинка код хэмминга 7 4 пример для чайников. картинка ea388e14e038. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.
Таким образом получаем закодированную последовательность 01100010000

Реализация

$input = «1001000» ; // задаем последовательость
$m = strlen($input); // узнаем длину

$result = Array(); // заводим массив разрядов

Источник

Код Хэмминга. Пример работы алгоритма

Прежде всего стоит сказать, что такое Код Хэмминга и для чего он, собственно, нужен. На Википедии даётся следующее определение:

Коды Хэмминга — наиболее известные и, вероятно, первые из самоконтролирующихся и самокорректирующихся кодов. Построены они применительно к двоичной системе счисления.

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

Также стоит отметить, что существуют более совершенные модификации данного алгоритма, которые позволяют обнаруживать (и если возможно исправлять) большее количество ошибок.

Сразу стоит сказать, что Код Хэмминга состоит из двух частей. Первая часть кодирует исходное сообщение, вставляя в него в определённых местах контрольные биты (вычисленные особым образом). Вторая часть получает входящее сообщение и заново вычисляет контрольные биты (по тому же алгоритму, что и первая часть). Если все вновь вычисленные контрольные биты совпадают с полученными, то сообщение получено без ошибок. В противном случае, выводится сообщение об ошибке и при возможности ошибка исправляется.

Как это работает.

Для того, чтобы понять работу данного алгоритма, рассмотрим пример.

Подготовка

Допустим, у нас есть сообщение «habr», которое необходимо передать без ошибок. Для этого сначала нужно наше сообщение закодировать при помощи Кода Хэмминга. Нам необходимо представить его в бинарном виде.

код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

На этом этапе стоит определиться с, так называемой, длиной информационного слова, то есть длиной строки из нулей и единиц, которые мы будем кодировать. Допустим, у нас длина слова будет равна 16. Таким образом, нам необходимо разделить наше исходное сообщение («habr») на блоки по 16 бит, которые мы будем потом кодировать отдельно друг от друга. Так как один символ занимает в памяти 8 бит, то в одно кодируемое слово помещается ровно два ASCII символа. Итак, мы получили две бинарные строки по 16 бит:

код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.и код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

После этого процесс кодирования распараллеливается, и две части сообщения («ha» и «br») кодируются независимо друг от друга. Рассмотрим, как это делается на примере первой части.
Прежде всего, необходимо вставить контрольные биты. Они вставляются в строго определённых местах — это позиции с номерами, равными степеням двойки. В нашем случае (при длине информационного слова в 16 бит) это будут позиции 1, 2, 4, 8, 16. Соответственно, у нас получилось 5 контрольных бит (выделены красным цветом):

Было:
код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Стало:
код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Таким образом, длина всего сообщения увеличилась на 5 бит. До вычисления самих контрольных бит, мы присвоили им значение «0».

Вычисление контрольных бит.

Теперь необходимо вычислить значение каждого контрольного бита. Значение каждого контрольного бита зависит от значений информационных бит (как неожиданно), но не от всех, а только от тех, которые этот контрольных бит контролирует. Для того, чтобы понять, за какие биты отвечает каждых контрольный бит необходимо понять очень простую закономерность: контрольный бит с номером N контролирует все последующие N бит через каждые N бит, начиная с позиции N. Не очень понятно, но по картинке, думаю, станет яснее:
код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.
Здесь знаком «X» обозначены те биты, которые контролирует контрольный бит, номер которого справа. То есть, к примеру, бит номер 12 контролируется битами с номерами 4 и 8. Ясно, что чтобы узнать какими битами контролируется бит с номером N надо просто разложить N по степеням двойки.

Но как же вычислить значение каждого контрольного бита? Делается это очень просто: берём каждый контрольный бит и смотрим сколько среди контролируемых им битов единиц, получаем некоторое целое число и, если оно чётное, то ставим ноль, в противном случае ставим единицу. Вот и всё! Можно конечно и наоборот, если число чётное, то ставим единицу, в противном случае, ставим 0. Главное, чтобы в «кодирующей» и «декодирующей» частях алгоритм был одинаков. (Мы будем применять первый вариант).
Высчитав контрольные биты для нашего информационного слова получаем следующее:
код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.
и для второй части:
код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Вот и всё! Первая часть алгоритма завершена.

Декодирование и исправление ошибок.

Теперь, допустим, мы получили закодированное первой частью алгоритма сообщение, но оно пришло к нас с ошибкой. К примеру мы получили такое (11-ый бит передался неправильно):
код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.
Вся вторая часть алгоритма заключается в том, что необходимо заново вычислить все контрольные биты (так же как и в первой части) и сравнить их с контрольными битами, которые мы получили. Так, посчитав контрольные биты с неправильным 11-ым битом мы получим такую картину:
код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.
Как мы видим, контрольные биты под номерами: 1, 2, 8 не совпадают с такими же контрольными битами, которые мы получили. Теперь просто сложив номера позиций неправильных контрольных бит (1 + 2 + 8 = 11) мы получаем позицию ошибочного бита. Теперь просто инвертировав его и отбросив контрольные биты, мы получим исходное сообщение в первозданном виде! Абсолютно аналогично поступаем со второй частью сообщения.

Заключение.

В данном примере, я взял длину информационного сообщения именно 16 бит, так как мне кажется, что она наиболее оптимальная для рассмотрения примера (не слишком длинная и не слишком короткая), но конечно же длину можно взять любую. Только стоит учитывать, что в данной простой версии алгоритма на одно информационное слово можно исправить только одну ошибку.

Примечание.

На написание этого топика меня подвигло то, что в поиске я не нашёл на Хабре статей на эту тему (чему я был крайне удивлён). Поэтому я решил отчасти исправить эту ситуацию и максимально подробно показать как этот алгоритм работает. Я намеренно не приводил ни одной формулы, дабы попытаться своими словами донести процесс работы алгоритма на примере.

Источник

Light

ВНИМАНИЕ! Это разжёванная версия замечательной статьи, которая есть на хабре!
Если вам нужно лаконичное объяснение, то вам туда! Если же вы в этом ничего не понимаете и требуется пошаговое разбирательство, то милости прошу читать дальше. То есть, где вам понятнее — там и читайте. Статья на хабре не моя, но я считаю, что она шикарна!

Итак. Задача. Использовать код Хэмминга для двоичного сообщения, длина слова у которого составляет 16 бит. Исходное сообщение возьмём такое «0100010000111101». То есть в слове 16 «букв», каждая из которых может принимать значение либо «0», либо «1».

код хэмминга 7 4 пример для чайников. 023. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-023. картинка код хэмминга 7 4 пример для чайников. картинка 023. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Кодирование

Сначала в исходное сообщение добавляем контрольные биты и устанавливаем их в нуль.
Контрольные биты располагаются в тех номерах битов, которые равны степеням двойки (ибо алфавит двоичный).
То есть. Два в степени нуль — это единица, два в степени 1 = два, два в степени 2 = четыре, а два в степени 3 = восемь, два в степени 4 = 16
Значит контрольные биты будут находиться в «буквах»(битах) под номерами 1, 2, 4, 8 и 16.

код хэмминга 7 4 пример для чайников. 024. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-024. картинка код хэмминга 7 4 пример для чайников. картинка 024. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

В остальные номера бит переписываем исходное сообщение.

код хэмминга 7 4 пример для чайников. 025. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-025. картинка код хэмминга 7 4 пример для чайников. картинка 025. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Видно, что длина «слова» из-за такой избыточности увеличилась на пять «букв». В данном случае, конечно. У вас количество дополнительных бит будет зависеть от длины исходного «слова».

Теперь нужно вычислить эти контрольные биты.
Каждый контрольный бит с номером N «контролирует» непрерывную последовательность из N битов, через каждые N битов.

Вот на картинке отмечено иксами (X), какие биты нужно использовать для вычисления первого контрольного бита (с номером «1»)

код хэмминга 7 4 пример для чайников. 027. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-027. картинка код хэмминга 7 4 пример для чайников. картинка 027. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Для вычисления контрольно бита нужно просто сложить все «буквы» нашего «слова», которые он контролирует, а затем принять нелёгкое решение: если сумма получилась чётная, то пишем в результате нуль, а если нечётная — единицу.

Вычисляем первый бит.
Складываем биты под номерами 3,5,7,9,11,13,15,17,19,21
Это будет 0 + 1 + 0 + 0 + 0 + 0 + 1 + 1 + 1 + 1 = 1 + 1 + 1 + 1 + 1 = 5
Получилось 5 (пять). Сумма нечётная (на два нацело не делится). Значит пишем в первый бит единицу:

код хэмминга 7 4 пример для чайников. 028. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-028. картинка код хэмминга 7 4 пример для чайников. картинка 028. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Теперь вычислим контрольный бит номер 2. Для него нужно будет найти сумму каждых двух бит следующих друг за другом непрерывно, через каждые два бита. Такие биты я тоже отметил на картинке.

код хэмминга 7 4 пример для чайников. 029. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-029. картинка код хэмминга 7 4 пример для чайников. картинка 029. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

То есть будем теперь суммировать биты, начитая с третьего по номеру, и далее те, которые отмечены иксом (X).
Их номера 3, 6, 7, 10, 11, 14, 15, 18, 19.
Это будет 0 + 0 + 0 + 1 + 0 + 0 + 1 + 1 + 1 = 4
Четыре — число чётное, значит оставляем в нашем втором бите нуль.

код хэмминга 7 4 пример для чайников. 030. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-030. картинка код хэмминга 7 4 пример для чайников. картинка 030. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Переходим к вычислению третьего контрольного бита. Но это у нас он контрольный — третий. А в сообщении этот бит записан под номером 4 — четыре.

код хэмминга 7 4 пример для чайников. 031. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-031. картинка код хэмминга 7 4 пример для чайников. картинка 031. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Значит и использовать будем все попадающие под наше правило биты, начиная с пятого.
А это биты под номерами 5, 6, 7, 12, 13, 14, 15, 20, 21.
Складываем их: 1 + 0 + 0 + 0 + 0 + 0 + 1 + 0 + 1 = 3
В итоге у нас нечётное число, значит пишем в наш контрольный бит единицу.

код хэмминга 7 4 пример для чайников. 032. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-032. картинка код хэмминга 7 4 пример для чайников. картинка 032. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Осталось всего ничего — вычислить два оставшихся контрольных бита, которые под номерами 8 и 16.

В восьмом оставляем нуль потому, что в той последовательности, которую мы используем для вычисления присутствуют две единицы, дающие в сумме чётное число.

код хэмминга 7 4 пример для чайников. 033. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-033. картинка код хэмминга 7 4 пример для чайников. картинка 033. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

А в 16-м тоже сумма бит получается чётной — оставляем нуль:

код хэмминга 7 4 пример для чайников. 035. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-035. картинка код хэмминга 7 4 пример для чайников. картинка 035. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

В итоге мы получили слово с кодом Хэмминга, которое содержит избыточные биты (в сумме 21): «100110000100001011101».

Декодирование

А теперь представим, что к нам пришло сообщение с ошибкой. Вот оно «100110001100001011101».
Мы знаем, что в него добавлены избыточные биты по алгоритму Хемминга, и нам надо проверить, есть в нём ошибка или нет.

Для этого нужно поступить следующим образом. Сначала вычисляем заново все контрольные биты по предыдущему алгоритму.
Для этого сначала обнуляем все биты, находящиеся на номерах степеней двойки:

код хэмминга 7 4 пример для чайников. 036. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-036. картинка код хэмминга 7 4 пример для чайников. картинка 036. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

В первом оставляем нуль, ибо в подконтрольных битах чётное число единиц.

код хэмминга 7 4 пример для чайников. 038. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-038. картинка код хэмминга 7 4 пример для чайников. картинка 038. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Вычисляем все остальные контрольные биты по описанному выше алгоритму (мне лень заново его описывать тут), и получаем, что не совпадают контрольные биты под номерами 1 и 8:

код хэмминга 7 4 пример для чайников. 039. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-039. картинка код хэмминга 7 4 пример для чайников. картинка 039. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Теперь складываем номера этих контрольных бит: 1 + 8, и получаем 9 — номер бита, в котором закралась ошибка! Ура! Теперь просто меняем девятый бит на обратный — с единицы на нуль, — и получаем исходное сообщение!

Отметим, что это самый простейший алгоритм Хемминга, который может исправить только одну ошибку в слове. Об остальных алгоритмах данная статья умалчивает. 🙂

Источник

Помехоустойчивое кодирование. Часть 1: код Хэмминга

код хэмминга 7 4 пример для чайников. 5ddaf1f1a57a4ee29f801cff39e0fcb5. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-5ddaf1f1a57a4ee29f801cff39e0fcb5. картинка код хэмминга 7 4 пример для чайников. картинка 5ddaf1f1a57a4ee29f801cff39e0fcb5. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Код Хэмминга – не цель этой статьи. Я лишь хочу на его примере познакомить вас с самими принципами кодирования. Но здесь не будет строгих определений, математических формулировок и т.д. Эта просто неплохой трамплин для понимания более сложных блочных кодов.

Самый, пожалуй, известный код Хэмминга (7,4). Что значат эти цифры? Вторая – число бит информационного слова — то, что мы хотим передать в целости и сохранности. А первое – размер кодового слова: информация удобренная избыточностью. Кстати термины «информационное слово» и «кодовое слово», употребляются во всех 7-ми книгах по теории помехоустойчивого кодирования, которые мне довелось бегло пролистать.

код хэмминга 7 4 пример для чайников. a97c291ec2eb44cda3d8fc5f59561130. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-a97c291ec2eb44cda3d8fc5f59561130. картинка код хэмминга 7 4 пример для чайников. картинка a97c291ec2eb44cda3d8fc5f59561130. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Такой код исправляет 1 ошибку. И не важно где она возникла. Избыточность несёт в себе 3 бита информации, этого достаточно, чтобы указать на одно из 7 положений ошибки или показать, что её нет. То есть ровно 8 вариантов ответов мы ждём. А 8 = 2^3, вот как всё совпало.

Чтобы получить кодовое слово, нужно информационное слово представить в виде полинома и умножить его на порождающий полином g(x). Любое число, переведя в двоичный вид, можно представить в виде полинома. Это может показаться странным и у не подготовленного читателя сразу встаёт только один вопрос «да зачем же так усложнять?». Уверяю вас, он отпадёт сам собой, когда мы получим первые результаты.

К примеру информационное слово 1010, значение каждого его разряда это коэффициент в полиноме:

код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Во многих книгах пишут наоборот x+x^3. Не поддавайтесь на провокацию, это вносит только путаницу, ведь в записи числа 2-ичного, 16-ричного, младшие разряды идут справа, и сдвиги мы делаем влево/вправо ориентируясь на это. А теперь давайте умножим этот полином на порождающий полином. Порождающий полином специально для Хэмминга (7,4), встречайте: g(x)=x^3+x+1. Откуда он взялся? Ну пока считайте что он дан человечеству свыше, богами (объясню позже).

код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Если нужно складывать коэффициенты, то делаем по модулю 2: операция сложения заменяется на логическое исключающее или (XOR), то есть x^4+x^4=0. И в конечном итоге результат перемножения как видите из 4х членов. В двоичном виде это 1001110. Итак, получили кодовое слово, которое будем передавать на сторону по зашумлённому каналу. Замете, что перемножив информационное слово (1010) на порождающий полином (1011) как обычные числа – получим другой результат 1101110. Этого нам не надо, требуется именно «полиномиальное» перемножение. Программная реализация такого умножения очень простая. Нам потребуется 2 операции XOR и 2 сдвига влево (1й из которых на один разряд, второй на два, в соответствии с g(x)=1011):

код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Давайте теперь специально внесём ошибку в полученное кодовое слово. Например в 3-й разряд. Получиться повреждённое слово: 1000110.

Как расшифровать сообщение и исправить ошибку? Разумеется надо «полиномиально» разделить кодовое слово на g(x). Тут я уже не буду писать иксы. Помните что вычитание по модулю 2 — это то же самое что сложение, что в свою очередь, тоже самое что исключающее или. Поехали:

код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Нацело разделить не получилось, значит у нас есть ошибка (ну конечно же). Результат деления в таком случае нам без надобности. Остаток от деления является синдром, его размер равен размеру избыточности, поэтому мы дописали там ноль. В данном случае содержание синдрома нам никак не помогает найти местоположение повреждения. А жаль. Но если мы возьмём любое другое информационное слово, к примеру 1100. Точно так же перемножим его на g(x), получим 1110100, внесём ошибку в тот же самый разряд 1111100. Разделим на g(x) и получим в остатке тот же самый синдром 011. И я гарантирую вам, что к такому синдрому мы придём в обще для всех кодовых слов с ошибкой в 3-м разряде. Вывод напрашивается сам собой: можно составить таблицу синдромов для всех 7 ошибок, делая каждую из них специально и считая синдром.

код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

В результате собираем список синдромов, и то на какую болезнь он указывает:

код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Теперь у нас всё есть. Нашли синдром, исправили ошибку, ещё раз поделили в данном случае 1001110 на 1011 и получили в частном наше долгожданное информационное слово 1010. В остатке после исправления уже будет 000. Таблица синдромов имеет право на жизнь в случае маленьких кодов. Но для кодов, исправляющих несколько ошибок – там список синдромов разрастается как чума. Поэтому рассмотрим метод «вылавливания ошибок» не имея на руках таблицы.

Внимательный читатель заметит, что первые 3 синдрома вполне однозначно указывают на положение ошибки. Это касается только тех синдромов, где одна единица. Кол-во единиц в синдроме называют его «весом». Опять вернёмся к злосчастной ошибке в 3м разряде. Там, как вы помните был синдром 011, его вес 2, нам не повезло. Сделаем финт ушами — циклический сдвиг кодового слова вправо. Остаток от деления 0100011 / 1011 будет равен 100, это «хороший синдром», указывает что ошибка во втором разряде. Но поскольку мы сделали один сдвиг, значит и ошибка сдвинулась на 1. Вот собственно и вся хитрость. Даже в случае жуткого невезения, когда ошибка в 6м разряде, вы, обливаясь потом, после 3 мучительных делений, но всё таки находите ошибку – это победа, лишь потому, что вы не использовали таблицу синдромов.

А как насчёт других кодов Хэмминга? Я бы сказал кодов Хэмминга бесконечное множество: (7,4), (15,11), (31,26),… (2^m-1, 2^m-1-m). Размер избыточности – m. Все они исправляют 1 ошибку, с ростом информационного слова растёт избыточность. Помехоустойчивость слабеет, но в случае слабых помех код весьма экономный. Ну ладно, а как мне найти порождающую функцию например для (15,11)? Резонный вопрос. Есть теорема, гласящая: порождающий многочлен циклического кода g(x) делит (x^n+1) без остатка. Где n – нашем случае размер кодового слова. Кроме того порождающий полином должен быть простым (делиться только на 1 и на самого себя без остатка), а его степень равна размеру избыточности. Можно показать, что для Хэмминга (7,4):

код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Этот код имеет целых 2 порождающих полинома. Не будет ошибкой использовать любой из них. Для остальных «хэммингов» используйте вот эту таблицу примитивных полиномов:

код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Соответственно для (15,11) порождающий многочлен g(x)=x^4+x+1. Ну а теперь переходим к десерту – к матрицам. С этого обычно начинают, но мы этим закончим. Для начала преобразую g(x) в матрицу, на которую можно умножить информационное слово, получив кодовое слово. Если g = 1011, то:

код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Называют её «порождающей матрицей». Дадим обозначение информационному слову d = 1010, а кодовое обозначим k, тогда:

код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Это довольно изящная формулировка. По быстродействию ещё быстрее, чем перемножение полиномов. Там нужно было делать сдвиги, а тут уже всё сдвинуто. Вектор d указывает нам: какие строки брать в расчёт. Самая нижняя строка матрицы – нулевая, строки нумеруются снизу вверх. Да, да, всё потому что младшие разряды располагаются справа и от этого никуда не деться. Так как d=1010, то я беру 1ю и 3ю строки, произвожу над ними операцию XOR и вуаля. Но это ещё не всё, приготовьтесь удивляться, существует ещё проверочная матрица H. Теперь перемножением вектора на матрицу мы можем получить синдром и никаких делений полиномов делать не надо.

код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Посмотрите на проверочную матрицу и на список синдромов, который получили выше. Это ответ на вопрос откуда берётся эта матрица. Здесь я как обычно подпортил кодовое слово в 3м разряде, и получил тот самый синдром. Поскольку сама матрица – это и есть список синдромов, то мы тут же находим положение ошибки. Но в кодах, исправляющие несколько ошибок, такой метод не прокатит. Придётся вылавливать ошибки по методу, описанному выше.

Чтобы лучше понять саму природу исправления ошибок, сгенерируем в обще все 16 кодовых слов, ведь информационное слово состоит всего из 4х бит:

код хэмминга 7 4 пример для чайников. image loader. код хэмминга 7 4 пример для чайников фото. код хэмминга 7 4 пример для чайников-image loader. картинка код хэмминга 7 4 пример для чайников. картинка image loader. Для этого используются k – контрольных розрядов. И так если у нас задача закодировать m двоичных разрядов, то k должно удовлетворять неравенство 2k ≥ k+m+1 или k ≥ log2(k+m+1) Таким образом мы можем найти минимальные значения k для заданных m: Теперь, мы можем построить самокорректирующийся код m+k разрядов. Приступим. Запишем эти разряды и пронумеруем в двоичной системе.

Посмотрите внимательно на кодовые слова, все они, отличаются друг от друга хотя бы на 3 бита. К примеру возьмёте слово 1011000, измените в нём любой бит, скажем первый, получиться 1011010. Вы не найдёте более на него похожего слова, чем 1011000. Как видите для формирования кодового слова не обязательно производить вычисления, достаточно иметь эту таблицу в памяти, если она мала. Показанное различие в 3 бита — называется минимальное «хэммингово расстояние», оно является характеристикой блокового кода, по нему судят сколько ошибок можно исправить, а именно (d-1)/2. В более общем виде код Хэмминга можно записать так (7,4,3). Отмечу только, что Хэммингово расстояние не является разностью между размерами кодового и информационного слов. Код Голея (23,12,7) исправляет 3 ошибки. Код (48, 36, 5) использовался в сотовой связи с временным разделением каналов (стандарт IS-54). Для кодов Рида-Соломона применима та же запись, но это уже недвоичные коды.

Список используемой литературы:

1. М. Вернер. Основы кодирования (Мир программирования) — 2004
2. Р. Морелос-Сарагоса. Искусство помехоустойчивого кодирования (Мир связи) — 2006
3. Р. Блейхут. Теория и практика кодов, контролирующих ошибки — 1986

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *