Главная    ВС и сети    Надежность ВС: Коды Хемминга

Коды Хемминга

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

В то время он работал в лаборатории Белла на электромеханической счетной машине Bell Model V. Ввод данных в эту машину осуществлялся с помощью перфокарт. Это была самая ненадежная часть вычислительной машины. Перфокарты часто считывались неправильно. Исправление и обнаружение ошибок ввода данных отнимало огромное количество времени, а пропущенные ошибки могли привести к неверным результатам работы.

Желая застраховаться от возможных сбоев и ускорить процесс обработки данных, Хемминг много работал над построением эффективных алгоритмов, позволяющих быстро обнаруживать и исправлять ошибки, и в 1950 году опубликовал способ кодирования, являющийся одним из самых известных на сегодняшний день.

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

Ричард Хемминг рассчитал минимальное количество проверочных бит, позволяющих однозначно исправлять однократные ошибки.

Если длина информационного блока, который требуется закодировать - m бит. Количество контрольных бит, используемых для его кодирования, – k, то закодированный блок будет иметь длину: n = m+k бит. Для каждого блока такой длины возможны n различных комбинаций, содержащих ошибку.

Таким образом, для каждого передаваемого информационного блока может существовать n–блоков, содержащих однократную ошибку, и один блок - без ошибок. Следовательно, максимальное количество различных закодированных блоков, содержащих не больше одной ошибки, будет: 2m(n+1), где n = m+k.

Максимально возможное количество различных закодированных блоков с однократными ошибками

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

Следовательно, минимальное количество контрольных бит, необходимых для исправления однократной ошибки, определяется из равенства:

2m * (n+1)=2n

Учитывая, что n = m + k, получаем:

k=2k – m – 1

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

Например, для информационных данных длиной 7 необходимо 4 контрольных бита, чтобы обеспечить исправление однократных ошибок, а для данных длинной 128 бит необходимо 8 контрольных бит.

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

Все биты, порядковые номера которых являются степенью двойки, – это контрольные разряды. То есть если порядковый номер бита обозначить символом ‘n’, то для контрольных бит должно быть справедливо равенство: n=2k , где к – любое положительное целое число.

Например, для закодированной последовательности длиной 13 бит проверочными будут: 1, 2, 4 и 8 биты, так как 20 = 1, 21 = 2, 22 = 4, 23 = 8.

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

Для того, чтобы определить какими контрольными битами контролируют бит, необходимо разложить его порядковый номер по степени 2. Таким образом, девятый бит будет контролироваться битами 1 и 8, так как 9 = 20 + 23 = 1 + 8.

Рассмотрим пример кодирования бинарной последовательности данных, состоящей из семи элементов: 1001101.

1. Определим необходимое количество контрольных разрядов. Расчет будем вести по формуле: k = 2k – m – 1, где k – количество контрольных разрядов, m – количество информационных разрядов. Так как количество бит должно быть целым числом, то k, вычисленное с помощью этого уравнения, необходимо округлить до ближайшего большего целого числа.

Результат расчета приведен ниже:

Расчет минимального количества контрольных бит кода Хемминга

Таким образом, число контрольных бит - 4.

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

Контрольные биты будут занимать четыре позиции с порядковыми номерами, равными степени двойки: 20, 21, 22, 23 => 1,2,4,8.

Размещение информационных и контрольных бит в результирующей последовательности будет следующим:

Размещение информационных бит в закодированной последовательности

Осталось определить значения проверочных бит.

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

И3: 3 = 20 + 21 = 1 + 2 => Информационный бит И3 проверяется контрольными битами П1 и П2.

И5: 5 = 20 + 22 = 1 + 4 => Информационный бит И5 проверяется контрольными битами П1 и П4.

И6: 6 = 21 + 22 = 2 + 4 => Информационный бит И6 проверяется контрольными битами П2 и П4.

И7: 7 = 20 + 21 + 22 = 1 + 2 + 4 => Информационный бит И7 проверяется контрольными битами П1, П2 и П4.

И9: 9 = 20 + 23 = 1 + 8 => Информационный бит И9 проверяется контрольными битами П1 и П8.

И10: 10 = 21 + 23 = 2 + 8 => Информационный бит И10 проверяется контрольными битами П2 и П8.

И11: 11 = 20 + 21 + 23 = 1 + 2 + 8 => Информационный бит И11 проверяется контрольными битами П1, П2 и П8.

4. Рассчитаем значения контрольных бит. Для этого определим группы для всех контрольных бит, просуммируем их по модулю два, а результат запишем в соответствующие контрольные биты (дополним группы до четности единиц):

П1 = И3 + И5 + И7 + И9 + И11 = 1 + 0 + 1 + 1 + 1 = 0

П2 = И3 + И6 + И7 + И10 + И11= 1 + 0 + 1 + 0 + 1 = 1

П4 = И5 + И6 + И7 = 0 + 0 + 1 = 1

П8 = И9 + И10 + И11 = 1 + 0 + 1 = 0

Таким образом, закодированная последовательность будет иметь следующий вид:

Закодированная последовательность данных

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

П1: П1 + И3 + И5 + И7 + И9 + И11 = 0 + 1 + 0 + 1 + 1 + 1 = 0 0

П2: П2 + И3 + И6 + И7 + И10 + И11 = 1 + 1 + 1 + 1 + 0 + 1 = 1 0

П4: П4 + И5 + И6 + И7 = 1 + 0 + 1 + 1 = 1 0

П8: П8 + И9 + И10 + И11 = 0 + 1 + 0 + 1 = 0 0

Так как проверка четности единиц не прошла для групп контрольных битов П2 и П4, то ошибка содержится в битах, принадлежащих этим группам. Алгоритм Хемминга позволяет исправлять только одну ошибку, поэтому будем искать неисправность, исходя из предположения, что могла произойти только одна ошибка. Если это предположение - неверно, то все попытки исправить данные только привнесут дополнительные искажения информации.

Итак, если ошибка была только одна, то она должна быть в одном из битов, принадлежащих обеим группам. Это биты И6 и И7.

Для того, чтобы уточнить, в каком именно бите произошла ошибка, обратимся к группам, в которых проверка на четность прошла успешно, а, следовательно, в этих группах все биты - корректны. Как видите, к одной из исправных групп принадлежит бит И7, а, следовательно, он верен.

Таким образом, очевидно, что ошибка произошла в бите И6, и, инвертировав его значение, мы восстановим принятые данные.

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

Если предположить, что количество ошибок - не более двух, то:

- Данные верны, если во всех контрольных группах количество единиц - четное, и общее количество единиц - тоже четное.

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

- Ошибка в дополнительном контрольном разряде, если во всех контрольных группах количество единиц - четное, а общее количество единиц - нечетное.

- Двойная ошибка, если в некоторых контрольных группах количество единиц - нечетное, а общее количество единиц - четное.

Как видите, алгоритм коррекции ошибок Хемминга - достаточно прост и надежен. При этом эффективность кода растет при увеличении информационных блоков. Так, для кодирования 7 бит данных избыточность составляет чуть больше 57%, для кодирования 256 бит избыточность будет 3.5%, а для 1024 – 1%.

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


Яндекс.Метрика

Рейтинг@Mail.ru