Код Хемминга

Код Хэмминга

Код Хемминга

Определение 1

Код Хэмминга — это самый популярный первый самокорректирующийся код.

Целью помехоустойчивой системы кодирования является обеспечение защиты информации от вероятных ошибок помех при информационных обменах и сохранении данных. Помехоустойчивая система кодирования позволяет ликвидировать возникающие при информационном обмене ошибки, а также ошибки при хранении информации.

При трансляции информационных данных по каналам связи, возможно появление помех и ошибок. При этом какая-то часть информации может быть утеряна.

Без применения помехоустойчивого кодирования нет возможности передачи значительных информационных объёмов, поскольку практически во всех системах трансляции информации и её сохранения всегда возможно появление ошибок.

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

  1. Запрашивается повторная передача информации. При помощи помехоустойчивого кода осуществляется лишь нахождение ошибок, а затем запрашивается повторная передача информационного пакета.
  2. Выполняется непосредственная коррекция ошибок. То есть, выполняется декодирование помехоустойчивого кода и при этом ликвидируются ошибки.
  3. Гибрид первых двух вариантов. То есть при обнаружении ошибки делается попытка исправления ошибки, и если попытка оказалась неудачной, то выполняется запрос повторной передачи данных.

Исправление ошибок при помехоустойчивом кодировании

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

При эффективном кодировании убирается избыточность кода, а при помехоустойчивом кодировании формируется избыточность, величина которой контролируется.

Простейшим примером может служить мажоритарная методика кодирования, при которой выполняется многократная передача одного символа, а при его получении оставляется тот символ, число опознаний которого максимально.

Существует некоторый набор параметров помехоустойчивого кодирования:

  1. Кодовая скорость R, характеризующая долю полезных (несущих информацию) данных в сообщениях. Вычисляется по следующей формуле: $R = k / n = k / m+k$, где:

    • $n$ является числом символов кодового сообщения.
    • $m$ является числом символов, предназначенных для проверки.
    • $k$ число символов информации.

    Величины $n$ и $k$ иногда приводятся совместно с именем кода, чтобы можно было его однозначно идентифицировать. К примеру, код Хэмминга (7, 4).

  2. Величина кратности обнаруженных ошибок. То есть число символов с ошибками, которое код способен определить.

  3. Величина кратности исправленных ошибок. То есть число символов с ошибками, которые код способен скорректировать (обозначим символом t).Контроль чётности

Наиболее простым способом помехоустойчивого кодирования является прибавление одного бита чётности. Предположим, имеется какое-то сообщение, которое состоит из восьми бит. Нужно к нему прибавить ещё один бит, девятый.

При нечётном количестве единиц прибавляем нуль:

1 0 1 0 0 1 0 0 | 0

При чётном количестве единиц прибавляем единицу:

1 1 0 1 0 1 0 0 | 1

Когда при приёме информации полученный бит чётности не соответствует рассчитанному биту чётности, то фиксируется ошибка.

Классификация помехоустойчивых кодов

Существует следующая классификация помехоустойчивых кодов:

  1. Непрерывный код. Процедура формирования кодов и их декодирования происходит в непрерывном режиме. Свёрточный код считается частным случаем непрерывных кодов. На вход кодирующего устройства приходит код одного символа, на его выходе появляется несколько символьных кодов, то есть каждому входящему символу соответствует формирование нескольких выходных символов, поскольку добавлены избыточные коды.
  2. Блочный код. Процедура формирования кодов и их декодирования выполняется по блочно. Блочная система кодирования считается более простой, то есть всё пересылаемое сообщение разбивается на ряд блоков и выполняется поочерёдная кодировка каждого.

По применяемому символьному набору помехоустойчивые системы кодирования делятся на:

  • Двоичное кодирование. Используется битовая система.
  • Не двоичное кодирование. Используется преобразование исходных двоичных кодов в различные символы.

В свою очередь блочные коды подразделяются на:

  1. Систематический код. Выполняется разделение на собственно не изменяемые символы, несущие нужную информацию, и на символы, по которым выполняется проверка отсутствия ошибок.
  2. Несистематический код. В этом коде исходное сообщение не присутствует явно. На вход поступает блок, размером в k, на выходе формируется блок, равный n. Выходной блок кодирующего устройства не содержит в явном виде начальной информации.

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

Замечание 1

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

Ниже приведена методика кодирования по Хэммингу:

Рисунок 1. Методика кодирования по Хэммингу. Автор24 — интернет-биржа студенческих работ

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

Биты с первого по четвёртый являются информационными битами, шестой и седьмой — это проверочные биты, а пятый проверочный бит является суммой по модулю два с первого по третий информационные биты.

Сумма по модулю два считается вычислением бита чётности.

Декодирование кодировки Хэмминга выполняется посредством определения синдрома по выражениям:

Рисунок 2. Декодирование кодировки Хэмминга. Автор24 — интернет-биржа студенческих работ

Синдромом является сложение битов по модулю два. Если синдром не равняется нулю, то коррекция ошибки выполняется согласно таблице декодирования:

Рисунок 3. Таблица декодирования. Автор24 — интернет-биржа студенческих работ

Источник: https://spravochnick.ru/informatika/kod_hemminga/

Простой код Хэмминга. Практика

Код Хемминга

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

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

Кодирование

Сначала в исходное сообщение добавляем контрольные биты и устанавливаем их в нуль.Контрольные биты располагаются в тех номерах битов, которые равны степеням двойки (ибо алфавит двоичный).То есть.

Два в степени нуль — это единица, два в степени 1 = два, два в степени 2 = четыре, а два в степени 3 = восемь, два в степени 4 = 16

Значит контрольные биты будут находиться в «буквах»(битах) под номерами 1, 2, 4, 8 и 16.

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

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

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

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

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

Вычисляем первый бит.Складываем биты под номерами 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 (пять). Сумма нечётная (на два нацело не делится). Значит пишем в первый бит единицу:

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

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

Четыре — число чётное, значит оставляем в нашем втором бите нуль.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник: https://boyarkirk.ru/all/prostoy-kod-hemminga-praktika/

b0006/Hamming-code

Код Хемминга

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

Алгоритм кодирования

Предположим, что нужно сгенерировать код Хемминга для некоторого информационного кодового слова. В качестве примера возьмём 15-битовое кодовое слово x1…x15, хотя алгоритм пригоден для кодовых слов любой длины. В приведённой ниже таблице в первой строке даны номера позиций в кодовом слове, во второй — условное обозначение битов, в третьей — значения битов.

123456789101112131415
x1x2x3x4x5x6x7x8x9x10x11x12x13x14x15
100100101110001

Вставим в информационное слово контрольные биты r0…r4 таким образом, чтобы номера их позиций представляли собой целые степени двойки: 1, 2, 4, 8, 16… Получим 20-разрядное слово с 15 информационными и 5 контрольными битами. Первоначально контрольные биты устанавливаем равными нулю. На рисунке контрольные биты выделены розовым цветом.

1234567891011121314151617181920
r0r1x1r2x2x3x4r3x5x6x7x8x9x10x11r4x12x13x14x15
00100010001011100001

В общем случае количество контрольных бит в кодовом слове равно двоичному логарифму числа, на единицу большего, чем количество бит кодового слова (включая контрольные биты); логарифм округляется в большую сторону. Например, информационное слово длиной 1 бит требует двух контрольных разрядов, 2-, 3- или 4-битовое информационное слово — трёх, 5…11-битовое — четырёх, 12…26-битовое — пяти и т. д.

Добавим к таблице 5 строк (по количеству контрольных битов), в которые поместим матрицу преобразования. Каждая строка будет соответствовать одному контрольному биту (нулевой контрольный бит — верхняя строка, четвёртый — нижняя), каждый столбец — одному биту кодируемого слова.

В каждом столбце матрицы преобразования поместим двоичный номер этого столбца, причём порядок следования битов будет обратный — младший бит расположим в верхней строке, старший — в нижней.

Например, в третьем столбце матрицы будут стоять числа 11000, что соответствует двоичной записи числа три: 00011.

1234567891011121314151617181920
r0r1x1r2x2x3x4r3x5x6x7x8x9x10x11r4x12x13x14x15
00100010001011100001
10101010101010101010r0
01100110011001100110r1
00011110000111100001r2
00000001111111100000r3
00000000000000011111r4

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

Берём одну из строк матрицы преобразования (например, r0) и находим её скалярное произведение с кодовым словом, то есть перемножаем соответствующие биты обеих строк и находим сумму произведений. Если сумма получилась больше единицы, находим остаток от его деления на 2.

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

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

Например, для строки r0:

r0 = (1·0+0·0+1·1+0·0+1·0+0·0+1·1+0·0+1·0+0·0+1·1+0·0+1·1+0·1+1·1+0·0+1·0+0·0+1·0+0·1) mod 2 = 5 mod 2 = 1.

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

1234567891011121314151617181920
r0r1x1r2x2x3x4r3x5x6x7x8x9x10x11r4x12x13x14x15
00100010001011100001
10101010101010101010r01
01100110011001100110r11
00011110000111100001r21
00000001111111100000r30
00000000000000011111r41

Алгоритм декодирования

Алгоритм декодирования по Хэммингу абсолютно идентичен алгоритму кодирования.

Матрица преобразования соответствующей размерности умножается на матрицу-столбец кодового слова и каждый элемент полученной матрицы-столбца берётся по модулю 2. Полученная матрица-столбец получила название «матрица синдромов».

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

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20r0 r1 x1 r2 x2 x3 x4 r3 x5 x6 x7 x8 x9 x10 x11 r4 x12 x13 x14 x15
11110110001011110001
10101010101010101010s00
01100110011001100110s11
00011110000111100001s21
00000001111111100000s30
00000000000000011111s40

Заметим, что при однократной ошибке матрица синдромов всегда представляет собой двоичную запись (младший разряд в верхней строке) номера позиции, в которой произошла ошибка. В приведённом примере матрица синдромов (01100) соответствует двоичному числу 00110 или десятичному 6, откуда следует, что ошибка произошла в шестом бите.

Полученный мною опыт

  • Работа с C#;
  • Имею представление, что такое самокорректирующийся код;
  • Изучил алгоритм кодирования и декодирования кодом Хэмминга;
  • Работа с одномерными и двумерными массивами;
  • Научился обрабатывать исключения с помощью do…while или try…catch.

Источник: https://github.com/b0006/Hamming-code/blob/master/README.md

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

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: