код хемминга обнаружение двойной ошибки

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

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

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

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

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

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

код хемминга обнаружение двойной ошибки. 00 27. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-00 27. картинка код хемминга обнаружение двойной ошибки. картинка 00 27. Коды Хемминга

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

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

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

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

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

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

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

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

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

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

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

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

код хемминга обнаружение двойной ошибки. 00 28. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-00 28. картинка код хемминга обнаружение двойной ошибки. картинка 00 28. Коды Хемминга

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

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

код хемминга обнаружение двойной ошибки. 00 29. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-00 29. картинка код хемминга обнаружение двойной ошибки. картинка 00 29. Коды Хемминга

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

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

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

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

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

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

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

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

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

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

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

код хемминга обнаружение двойной ошибки. 00 30. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-00 30. картинка код хемминга обнаружение двойной ошибки. картинка 00 30. Коды Хемминга

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

П1: П1 + И3 + И5 + И7 + И9 + И11 = 0 + 1 + 0 + 1 + 1 + 1 = 0 код хемминга обнаружение двойной ошибки. 00 31. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-00 31. картинка код хемминга обнаружение двойной ошибки. картинка 00 31. Коды Хемминга0

П2: П2 + И3 + И6 + И7 + И10 + И11 = 1 + 1 + 1 + 1 + 0 + 1 = 1 код хемминга обнаружение двойной ошибки. 00 22. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-00 22. картинка код хемминга обнаружение двойной ошибки. картинка 00 22. Коды Хемминга0

П4: П4 + И5 + И6 + И7 = 1 + 0 + 1 + 1 = 1 код хемминга обнаружение двойной ошибки. 00 22. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-00 22. картинка код хемминга обнаружение двойной ошибки. картинка 00 22. Коды Хемминга0

П8: П8 + И9 + И10 + И11 = 0 + 1 + 0 + 1 = 0 код хемминга обнаружение двойной ошибки. 00 31. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-00 31. картинка код хемминга обнаружение двойной ошибки. картинка 00 31. Коды Хемминга0

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

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

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

Источник

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

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

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

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

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

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

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

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

Подготовка

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

код хемминга обнаружение двойной ошибки. image loader. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image loader. картинка код хемминга обнаружение двойной ошибки. картинка image loader. Коды Хемминга

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

код хемминга обнаружение двойной ошибки. image loader. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image loader. картинка код хемминга обнаружение двойной ошибки. картинка image loader. Коды Хеммингаи код хемминга обнаружение двойной ошибки. image loader. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image loader. картинка код хемминга обнаружение двойной ошибки. картинка image loader. Коды Хемминга

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

Было:
код хемминга обнаружение двойной ошибки. image loader. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image loader. картинка код хемминга обнаружение двойной ошибки. картинка image loader. Коды Хемминга

Стало:
код хемминга обнаружение двойной ошибки. image loader. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image loader. картинка код хемминга обнаружение двойной ошибки. картинка image loader. Коды Хемминга

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

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

Теперь необходимо вычислить значение каждого контрольного бита. Значение каждого контрольного бита зависит от значений информационных бит (как неожиданно), но не от всех, а только от тех, которые этот контрольных бит контролирует. Для того, чтобы понять, за какие биты отвечает каждых контрольный бит необходимо понять очень простую закономерность: контрольный бит с номером N контролирует все последующие N бит через каждые N бит, начиная с позиции N. Не очень понятно, но по картинке, думаю, станет яснее:
код хемминга обнаружение двойной ошибки. image loader. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image loader. картинка код хемминга обнаружение двойной ошибки. картинка image loader. Коды Хемминга
Здесь знаком «X» обозначены те биты, которые контролирует контрольный бит, номер которого справа. То есть, к примеру, бит номер 12 контролируется битами с номерами 4 и 8. Ясно, что чтобы узнать какими битами контролируется бит с номером N надо просто разложить N по степеням двойки.

Но как же вычислить значение каждого контрольного бита? Делается это очень просто: берём каждый контрольный бит и смотрим сколько среди контролируемых им битов единиц, получаем некоторое целое число и, если оно чётное, то ставим ноль, в противном случае ставим единицу. Вот и всё! Можно конечно и наоборот, если число чётное, то ставим единицу, в противном случае, ставим 0. Главное, чтобы в «кодирующей» и «декодирующей» частях алгоритм был одинаков. (Мы будем применять первый вариант).
Высчитав контрольные биты для нашего информационного слова получаем следующее:
код хемминга обнаружение двойной ошибки. image loader. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image loader. картинка код хемминга обнаружение двойной ошибки. картинка image loader. Коды Хемминга
и для второй части:
код хемминга обнаружение двойной ошибки. image loader. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image loader. картинка код хемминга обнаружение двойной ошибки. картинка image loader. Коды Хемминга

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

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

Теперь, допустим, мы получили закодированное первой частью алгоритма сообщение, но оно пришло к нас с ошибкой. К примеру мы получили такое (11-ый бит передался неправильно):
код хемминга обнаружение двойной ошибки. image loader. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image loader. картинка код хемминга обнаружение двойной ошибки. картинка image loader. Коды Хемминга
Вся вторая часть алгоритма заключается в том, что необходимо заново вычислить все контрольные биты (так же как и в первой части) и сравнить их с контрольными битами, которые мы получили. Так, посчитав контрольные биты с неправильным 11-ым битом мы получим такую картину:
код хемминга обнаружение двойной ошибки. image loader. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image loader. картинка код хемминга обнаружение двойной ошибки. картинка image loader. Коды Хемминга
Как мы видим, контрольные биты под номерами: 1, 2, 8 не совпадают с такими же контрольными битами, которые мы получили. Теперь просто сложив номера позиций неправильных контрольных бит (1 + 2 + 8 = 11) мы получаем позицию ошибочного бита. Теперь просто инвертировав его и отбросив контрольные биты, мы получим исходное сообщение в первозданном виде! Абсолютно аналогично поступаем со второй частью сообщения.

Заключение.

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

Примечание.

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

Источник

Обнаружение ошибок в кодах Хемминга

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

где Si определяется по формулам (4) для элементарного кода, полученного на выходе канала связи. Если ошибки нет, то Si = 0 и общий результат S = 0.

Пример 1: Пусть на вход канала связи поступил элементарный код 0110011 (т.е закодировано **1*011 (поз. 3,5,6,7– информационные, а контрольные члены заменены * )). На выходе получено 0110001 (искажен 6–й член элементарного кода). Вычислим S.

S= 1 1 0 = 6 (в десятичной системе).

Пример 2:Пусть на выходе получено 0111011 (искажен 4–й (контрольный) член элементарного кода).

Тогда восстановленное сообщение имеет вид: 0110011, а исходное сообщение – 1011(удалены контрольные члены, выделенные цветом)

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

После получения закодированного сообщения происходит его разбивка на элементарные коды, вычисление для каждого кода Sи в случае его неравенства 0 – корректировка соответствующего информационного члена (если S указывает на контрольный член, то корректировка не нужна). После удаления всех контрольных членов получаем исходное сообщение.

Примечание: Рассмотрено построение кодов Хемминга для бинарного кодирования и допустимом числе ошибок в элементарных кодах не более одной. Существует теория для построения таких кодов для равномерного кодирования любой арности и числе ошибок не более 2, 3,… и. д.

Алфавитное кодирование с минимальной избыточностью

Пусть задано алфавитное кодирование со схемой å

Теорема 1 Если алфавитное кодирование со схемой å обладает свойством взаимной однозначности, то выполняется следующее неравенство (неравенство Макмиллана):

код хемминга обнаружение двойной ошибки. image002. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image002. картинка код хемминга обнаружение двойной ошибки. картинка image002. Коды Хемминга

Пояснения.

2. Нельзя построить схему алфавитного кодирования, обладающую свойством взаимной однозначности, если неравенство (3.5) нарушено.

3 Теоремы 1 и 3 не дают полного алгоритма построения схемы алфавитного кодирования, обладающей свойством взаимной однозначности (если выполняется неравенство 5 – такая схема существует и можно продолжать ее построение, используя другие свойства и теоремы).

l = ]logq r [ (наименьшее целое число не меньшее логарифма r по основанию q). Если схема кодирования такова, что элементарные коды имеют различную длину, то можно говорить о величине среднего превышения длины кода над длиной самого сообщения:

код хемминга обнаружение двойной ошибки. image004. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image004. картинка код хемминга обнаружение двойной ошибки. картинка image004. Коды Хеммингагде li = l (Bi) (6)

Если имеется статистика о вероятности появления символов входного алфавита

код хемминга обнаружение двойной ошибки. image006. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image006. картинка код хемминга обнаружение двойной ошибки. картинка image006. Коды Хемминга(7)

l * = код хемминга обнаружение двойной ошибки. image008. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image008. картинка код хемминга обнаружение двойной ошибки. картинка image008. Коды Хемминга(8)

В формуле (8) минимум берется по всем схемам кодирования å, обеспечивающим свойство взаимной однозначности.

Оценим интервал значений lср для схем кодирования å, обеспечивающих свойство взаимной однозначности.

код хемминга обнаружение двойной ошибки. image010. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image010. картинка код хемминга обнаружение двойной ошибки. картинка image010. Коды Хемминга(10)

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

Построение кодов Хаффмана

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

Ø выбирается начальная вершина (нулевой ярус дерева m = 0 );

Ø из этой вершины выходит пучок ребер, количество которых равно q (мощность алфавита O ), и каждому из них приписано значение элементов алфавита O=<b1,b2…> (первый ярус дерева m = 1 );

Ø из каждой вершины первого яруса снова выходит пучок ребер, количество которых равно q, и которые обозначены элементами алфавита O (второй ярус дерева m = 2 );

Ø аналогично строятся третий, четвертый и т.д. ярусы;

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

код хемминга обнаружение двойной ошибки. image011. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image011. картинка код хемминга обнаружение двойной ошибки. картинка image011. Коды Хемминга

На рисунке 1 показано обобщенное кодовое дерево для q = 3. Количество вершин на каждом ярусе равно q m (на первом – 3, на втором – 9, на третьем – 27 и т.д.). При равномерном алфавитном кодировании все элементарные коды имеют одинаковую длину.

Более сложный случай, когда

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

Общие принципы поиска кода (схемы кодирования) с минимальной избыточностью:

§ для построения элементарных кодов использовать только m и m+1 ярусы кодового дерева;

§ переходить на m+1 ярус можно только после исчерпания всех возможностей m– го яруса.

Для реализации этого алгоритма необходимо представить r в виде:

t число вершин m+1 яруса, не задействованных при построении схемы кодирования ( t * будет иметь следующий вид:

Если имеется информация о вероятности появления символов входного алфавита

Лемма 1 Для кода с минимальной избыточностью из условия pj * = код хемминга обнаружение двойной ошибки. image019. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image019. картинка код хемминга обнаружение двойной ошибки. картинка image019. Коды Хемминга= 0,26 + (0,28+0,46)х2 = 1,74.

Пример2: Построить код с минимальной избыточностью (код Хаффмана) для следующих исходных данных:

Решение

q =3; r = 7 в соответствии с формулой (12) m = 1. Для кодирования будет достаточно 1–го и 2–го ярусов обобщенного кодового дерева (см. рис. 3).

Равенство выполняется для n = 2 и t= 0.

код хемминга обнаружение двойной ошибки. image020. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image020. картинка код хемминга обнаружение двойной ошибки. картинка image020. Коды Хемминга

Определим l * для полученной схемы по формуле (13)

l * = (( 3-2) х1 + (3х2 – 0) (1+1)) / 7 = 13/7 = 1,86.

Источник

Обнаружение и исправление ошибок в коде Хэмминга

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

Пример: Построить макет кода Хемминга и определить значения корректирующих разрядов для кодовой комбинации k=4, X=0101.

код хемминга обнаружение двойной ошибки. image229. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image229. картинка код хемминга обнаружение двойной ошибки. картинка image229. Коды Хемминга

Решение:

Согласно таблице минимальное число контрольных символов r=3, при этом n = 7. Контрольный коэффициенты будут расположены на позициях 1, 2, 4. Составим макет корректирующего кода и запишем его во вторую колонку таблицы. Пользуясь таблицей для номеров проверочных коэффициентов, определим значения коэффициентов К1 К2 и К3.

Первая проверка: сумма П1+П3+П5+П7 должна быть четной, а сумма К1+0+1+1 будет четной при К =0.

Вторая проверка: сумма П2+П3+П6+П7 должна быть четной, а сумма К2+0+0+1 будет четной при К2=1.

Третья проверка: сумма П4+П5+П6+П7 должна быть четной, а сумма К3+1+0+1 будет четной при К3=0.

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

Решение: Для обнаружения ошибки производят уже знакомые нам проверки на четность.

Первая проверка: сумма П1+П3+П5+П7 = 0+0+1+1 четна. В младший разряд номера ошибочной позиции запишем 0.

Вторая проверка: сумма П2+П3+П6+П7 = 1+0+1+1 нечетна. Во второй разряд номера ошибочной позиции запишем 1

Третья проверка: сумма П4+П5+П6+П7 = 0+1+1+1 нечетна. В третий разряд номера ошибочной позиции запишем 1. Номер ошибочной позиции 110= 6. Следовательно, символ шестой позиции следует изменить на обратный, и получим правильную кодовую комбинацию.

Код, исправляющий одиночную и обнаруживающий двойную ошибки

код хемминга обнаружение двойной ошибки. image231. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-image231. картинка код хемминга обнаружение двойной ошибки. картинка image231. Коды Хемминга

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

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Источник

Помехоустойчивое кодирование. Коды Хэмминга

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

код хемминга обнаружение двойной ошибки. lazy placeholder. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-lazy placeholder. картинка код хемминга обнаружение двойной ошибки. картинка lazy placeholder. Коды Хемминга

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

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

код хемминга обнаружение двойной ошибки. lazy placeholder. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-lazy placeholder. картинка код хемминга обнаружение двойной ошибки. картинка lazy placeholder. Коды Хемминга

Использование кодирования позволяет извлекать информацию без потерь даже с поврежденного CD/DVD диска, когда какая либо область становится недоступной для считывания.

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

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

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

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

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

Допустим есть 4 символа информации, А, B, С,D, и эту информацию повторяем несколько раз. В процессе передачи информации по каналу связи, где-то возникла ошибка. Есть три пакета (A1B1C1D1|A2B2C2D2|A3B3C3D3), которые должны нести одну и ту же информацию.

код хемминга обнаружение двойной ошибки. lazy placeholder. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-lazy placeholder. картинка код хемминга обнаружение двойной ошибки. картинка lazy placeholder. Коды Хемминга

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

Необходимо найти ошибку с помощью голосования, каких символов больше, символов В или символов С? Явно символов В больше, чем символов С, соответственно принимаем решение, что передавался символ В, а символ С ошибочный.

Для исправления ошибок нужно, как минимум 3 пакета информации, для обнаружения, как минимум 2 пакета информации.

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

Первый параметр, скорость кода R характеризует долю информационных («полезных») данных в сообщении и определяется выражением: R=k/n=k/m+k

Параметры n и k часто приводят вместе с наименованием кода для его однозначной идентификации. Например, код Хэмминга (7,4) значит, что на вход кодера приходит 4 символа, на выходе 7 символов, Рида-Соломона (15, 11) и т.д.

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

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

Контроль чётности

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

Если нечетное количество единиц, добавляем 0.

1 0 1 0 0 1 0 0 | 0

Если четное количество единиц, добавляем 1.

1 1 0 1 0 1 0 0 | 1

Если принятый бит чётности не совпадает с рассчитанным битом чётности, то считается, что произошла ошибка.

1 1 0 0 0 1 0 0 | 1

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

Есть последовательность 0 и 1, и из этой последовательности составим прямоугольную матрицу размера 4 на 4. Затем для каждой строки и столбца посчитаем бит четности.

Прямоугольный код – код с контролем четности, позволяющий исправить одну ошибку:

код хемминга обнаружение двойной ошибки. lazy placeholder. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-lazy placeholder. картинка код хемминга обнаружение двойной ошибки. картинка lazy placeholder. Коды Хемминга

И если в процессе передачи информации допустим ошибку (ошибка нолик вместо единицы, желтым цветом), начинаем делать проверку. Нашли ошибку во втором столбце, третьей строке по координатам. Чтобы исправить ошибку, просто инвертируем 1 в 0, тем самым ошибка исправляется.

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

Рассчитаем скорость кода для:

Здесь R=16/24=0,66 (картинка выше, двадцать пятую единичку (бит четности) не учитываем)

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

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

По используемому алфавиту:

Блочные коды делятся на

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

код хемминга обнаружение двойной ошибки. lazy placeholder. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-lazy placeholder. картинка код хемминга обнаружение двойной ошибки. картинка lazy placeholder. Коды Хемминга

Смотря на картинку выше, код 1 1 0 0 0 1 0 0 | 1 является систематическим, на вход поступило 8 бит, а на выходе кодера 9 бит, которые в явном виде содержат в себе 8 бит информационных и один проверочный.

код хемминга обнаружение двойной ошибки. lazy placeholder. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-lazy placeholder. картинка код хемминга обнаружение двойной ошибки. картинка lazy placeholder. Коды Хемминга

Код Хэмминга

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

код хемминга обнаружение двойной ошибки. lazy placeholder. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-lazy placeholder. картинка код хемминга обнаружение двойной ошибки. картинка lazy placeholder. Коды Хемминга

Код Хэмминга (7,4) — 4 бита на входе кодера и 7 на выходе, следовательно 3 проверочных бита. С 1 по 4 информационные биты, с 6 по 7 проверочные (см. табл. выше). Пятый проверочный бит y5, это сумма по модулю два 1-3 информационных бит. Сумма по модулю 2 это вычисление бита чётности.

Декодирование кода Хэмминга

Декодирование происходит через вычисление синдрома по выражениям:

код хемминга обнаружение двойной ошибки. lazy placeholder. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-lazy placeholder. картинка код хемминга обнаружение двойной ошибки. картинка lazy placeholder. Коды Хемминга

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

код хемминга обнаружение двойной ошибки. lazy placeholder. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-lazy placeholder. картинка код хемминга обнаружение двойной ошибки. картинка lazy placeholder. Коды Хемминга

Расстояние Хэмминга

Расстояние Хэмминга — число позиций, в которых соответствующие символы двух кодовых слов одинаковой длины различны. Если рассматривать два кодовых слова, (пример на картинке ниже, 1 0 1 1 0 0 1 и 1 0 0 1 1 0 1) видно что они отличаются друг от друга на два символа, соответственно расстояние Хэмминга равно 2.

код хемминга обнаружение двойной ошибки. lazy placeholder. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-lazy placeholder. картинка код хемминга обнаружение двойной ошибки. картинка lazy placeholder. Коды Хемминга

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

Помехоустойчивые коды

Современные коды более эффективны по сравнению с рассматриваемыми примерами. В таблице ниже приведены Коды Боуза-Чоудхури-Хоквингема (БЧХ)

код хемминга обнаружение двойной ошибки. lazy placeholder. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-lazy placeholder. картинка код хемминга обнаружение двойной ошибки. картинка lazy placeholder. Коды Хемминга

Из таблицы видим, что там один класс кода БЧХ, но разные параметры n и k.

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

Пример: помехоустойчивые коды и двоичная фазовая манипуляция (2-ФМн). На графике зависимость отношения сигнал шум (Eb/No) от вероятности ошибки. За счет применения помехоустойчивых кодов улучшается помехоустойчивость.

код хемминга обнаружение двойной ошибки. lazy placeholder. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-lazy placeholder. картинка код хемминга обнаружение двойной ошибки. картинка lazy placeholder. Коды Хемминга

Из графика видим, код Хэмминга (7,4) на сколько увеличилась помехоустойчивость? Всего на пол Дб это мало, если применить код БЧХ (127, 64) выиграем порядка 4 дБ, это хороший показатель.

Компромиссы при использовании помехоустойчивых кодов

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

код хемминга обнаружение двойной ошибки. lazy placeholder. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-lazy placeholder. картинка код хемминга обнаружение двойной ошибки. картинка lazy placeholder. Коды Хемминга

Необходимость чередования (перемежения)

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

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

Пример блочного перемежения:

код хемминга обнаружение двойной ошибки. lazy placeholder. код хемминга обнаружение двойной ошибки фото. код хемминга обнаружение двойной ошибки-lazy placeholder. картинка код хемминга обнаружение двойной ошибки. картинка lazy placeholder. Коды Хемминга

На картинке, всего 5 блоков (с 1 по 25). Код работает исправляя ошибки в рамках одного блока (если в одном блоке 1 ошибка, код его исправит, а если две то нет). В канал связи отдается информация не последовательно, а в перемешку. На выходе кодера сформировались 5 блоков и эти 5 блоков будем отдавать не по очереди а в перемешку. Записали всё по строкам, но считывать будем, чтобы отправлять в канал связи, по столбцам. Информация в блоках перемешалась. В канале связи возникла ошибка и мы потеряли большой кусок. В процессе приема, мы опять составляем таблицу, записываем по столбцам, но считываем по строкам. За счет того, что мы перемешали большое количество блоков между собой, групповая ошибка равномерно распределится по блокам.

Источник

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

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