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

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

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

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

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

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

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

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

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

Подготовка

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэммингаи обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

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

Было:
обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

Стало:
обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

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

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

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

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

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

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

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

Заключение.

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

Примечание.

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

Источник

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

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

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

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

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

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

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

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

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

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

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

Но из картинки справа, видно, что второй символ (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. Затем для каждой строки и столбца посчитаем бит четности.

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

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

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

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

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

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

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

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

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

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

Код Хэмминга

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

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

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

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

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

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

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

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

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

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

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

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

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

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

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

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

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

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

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

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

Источник

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

Это продолженеие статьи о помехоустойчивом кодировании, которая очень долго лежала в черновиках. В прошлой части нет ничего интересного с практической точки зрения — лишь общие сведения о том, зачем это нужно, где применяется и т.п. В данной части будут рассматриваться некоторые (самые простые) коды для обнаружения и/или исправления ошибок. Итак, поехали.

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

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

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

k/(i+k), где
k — количество проверочных бит,
i — количество информационных бит.

Например, мы передаем 3 бита и к ним добавляем 1 проверочный бит — избыточность составит 1/(3+1) = 1/4 (25%).

Код с проверкой на четность

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

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга

Начальные данные: 1111
Данные после кодирования: 11110 ( 1 + 1 + 1 + 1 = 0 (mod 2) )
Принятые данные: 10110 (изменился второй бит)
Как мы видим, количество единиц в принятом пакете нечетно, следовательно, при передаче произошла ошибка.

Начальные данные: 1111
Данные после кодирования: 11110 ( 1 + 1 + 1 + 1 = 0 (mod 2) )
Принятые данные: 10010 (изменились 2 и 3 биты)
В принятых данных число единиц четно, и, следовательно, декодер не обнаружит ошибку.

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

Код Хэмминга

первый проверочный бит на 2 0 = 1;
второй проверочный бит на 2 1 = 2;
третий проверочный бит на 2 2 = 4;

r1 = i1 + i2 + i4
r2 = i1 + i3 + i4
r3 = i2 + i3 + i4

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

e0,e1,e2 опрделяются как функции, зависящие от принятых декодером бит k1 — k7:

e0 = k1 + k3 + k5 + k7 mod 2
e1 = k2 + k3 + k6 + k7 mod 2
e2 = k4 + k5 + k6 + k7 mod 2

Набор этих значений e2e1e0 есть двоичная запись позиции, где произошла ошибка при передаче данных. Декодер эти значения вычисляет, и если они все не равны 0 (то есть не получится 000), то исправляет ошибку.

Коды-произведения

В канале связи кроме одиночных ошибок, вызванных шумами, часто встречаются пакетные ошибки, вызванные импульсными помехами, замираниями или выпадениями (при цифровой видеозаписи). При этом пораженными оказываются сотни, а то и тысячи бит информации подряд. Ясно, что ни один помехоустойчивый код не сможет справиться с такой ошибкой. Для возможности борьбы с такими ошибками используются коды-произведения. Принцип действия такого кода изображён на рисунке:
обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга
Передаваемая информация кодируется дважды: во внешнем и внутреннем кодерах. Между ними устанавливается буфер, работа которого показана на рисунке:
обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга
Информационные слова проходят через первый помехоустойчивый кодер, называемый внешним, т.к. он и соответствующий ему декодер находятся по краям системы помехоустойчивого кодирования. Здесь к ним добавляются проверочные символы, а они, в свою очередь, заносятся в буфер по столбцам, а выводятся построчно. Этот процесс называется перемешиванием или перемежением.

При выводе строк из буфера к ним добавляются проверочные символы внутреннего кода. В таком порядке информация передается по каналу связи или записывается куда-нибудь. Условимся, что и внутренний, и внешний коды – коды Хэмминга, с тремя проверочными символами, то есть и тот, и другой могут исправить по одной ошибке в кодовом слове (количество «кубиков» на рисунке не критично — это просто схема). На приемном конце расположен точно такой же массив памяти (буфер), в который информация заносится построчно, а выводится по столбцам. При возникновении пакетной ошибки (крестики на рисунке в третьей и четвертой строках), она малыми порциями распределяется в кодовых словах внешнего кода и может быть исправлена.
обнаружение и исправление ошибок в коде хэмминга. Смотреть фото обнаружение и исправление ошибок в коде хэмминга. Смотреть картинку обнаружение и исправление ошибок в коде хэмминга. Картинка про обнаружение и исправление ошибок в коде хэмминга. Фото обнаружение и исправление ошибок в коде хэмминга
Назначение внешнего кода понятно – исправление пакетных ошибок. Зачем же нужен внутренний код? На рисунке, кроме пакетной, показана одиночная ошибка (четвертый столбец, верхняя строка). В кодовом слове, расположенном в четвертом столбце — две ошибки, и они не могут быть исправлены, т.к. внешний код рассчитан на исправление одной ошибки. Для выхода из этой ситуации как раз и нужен внутренний код, который исправит эту одиночную ошибку. Принимаемые данные сначала проходят внутренний декодер, где исправляются одиночные ошибки, затем записываются в буфер построчно, выводятся по столбцам и подаются на внешний декодер, где происходит исправление пакетной ошибки.

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

Источник

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

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