код хемминга где используется

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

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

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

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

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

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

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

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

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

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

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

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

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

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

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

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

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

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

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

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

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

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

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

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

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

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

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

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

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

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

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

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

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

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

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

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

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

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

Источник

Код Хемминга

Код Хемминга

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

Содержание

История

В середине 40-х годов Ричард Хемминг работал в знаменитых Лабораториях Белла на счётной машине Bell Model V. Это была электромеханическая машина, использующая релейные блоки,скорость которых была очень низка: один оборот за несколько секунд. Данные вводились в машине с помощью перфокарт, и поэтому в процессе чтения часто происходили ошибки. В рабочие дни использовались специальные коды, чтобы обнаруживать и исправлять найденные ошибки, при этом оператор узнавал об ошибке по свечению лампочек, исправлял и запускал машину. В выходные дни, когда не было операторов, при возникновении ошибки машина автоматически выходила из программы и запускала другую.

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

Самоконтролирующиеся коды

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

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

Самокорректирующиеся коды

Диапазон mkmin
12
2-43
5-114
12-265
27-576

Имея m+k разрядов, самокорректирующийся код можно построить следующим образом.

Среди m+k разрядов кода при этом имеется k разрядов, каждый из которых принадлежит только к одной контрольной группе:

Разряд № 1: 110 = …0000012 принадлежит только к 1-й контрольной группе.

Разряд № 2: 210 = …0000102 принадлежит только к 2-й контрольной группе.

Разряд № 4: 410 = …0001002 принадлежит только к 3-й контрольной группе.

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

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

Например, довольно распространен код Хеминга с m=7 и k=4.

№ разряда:00010010001101000101011001111000100110101011
Распределение контрольных и информационных разрядовp1p2d1p3d2d3d4p4d5d6d7
Информационное кодовое слово :0110101
p1101011
p2001001
p30110
p40101
Кодовое слово с контрольными разрядами:10001100101

Интересно посмотреть, как перекрываются контрольные группы в данном случае (Рис №1). Первая группа контролирует разряды № 3,7,5 исходного кода, вторая — 3,7,6… (№ группы = № контрольного разряда). Очевидно, что они частично перекрываются.

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

№ разряда:00010010001101000101011001111000100110101011
Распределение контрольных и информационных разрядовp1p2d1p3d2d3d4p4d5d6d7Контроль по четности в группеКонтрольный бит
Переданное кодовое слово:10001100101
Принятое кодовое слово:10001100100
p1101010Fail1
p2001000Fail1
p30110Pass0
p40100Fail1
p4p3p2p1
В двоичном представлении1011
В десятичном представлении821Σ = 11

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

Например (Рис №2), когда ошибки одновременно прошли в 3-м и 7-м разрядах исходного кода, первый и второй контрольные биты даже не замечают подмены.

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

код хемминга где используется. Смотреть фото код хемминга где используется. Смотреть картинку код хемминга где используется. Картинка про код хемминга где используется. Фото код хемминга где используется

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

Например, предположим теперь, что при передаче данного кодового слова 10001100101 произошли ошибки в 3-м и 6-м разрядах, так, что принято кодовое слово 10101000101.

№ разряда:00010010001101000101011001111000100110101011
Распределение контрольных и информационных разрядовp1p2d1p3d2d3d4p4d5d6d7Контроль по четности в группеКонтрольный бит
Переданное кодовое слово:10001100101
Принятое кодовое слово:10101000101
p1111011Fail1
p2010001Pass0
p30100Fail1
p40101Pass0
p4p3p2p1
В двоичном представлении0101
В десятичном представлении41Σ = 5

Вывод: ошибка произошла в 5-м разряде Истинное кодовое слово : 1 0 0 0 1 1 0 0 1 0 1 Ошибочное кодовое слово : 1 0 1 0 1 0 0 0 1 0 1 Исправленное кодовое слово : 1 0 1 0 0 0 0 0 1 0 1 Результат получается ещё более отдаленным от правильного, чем принятый код. Исправление кода по общему правилу не только не улучшило, но даже ухудшило бы дело.

Код Хемминга

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

№ разряда:00010010001101000101011001111000100110101011Second Parity
Распределение контрольных и информационных разрядовp1p2d1p3d2d3d4p4d5d6d7
Информационное кодовое слово:0110101
p1101011
p2001001
p30110
p40101
Кодовое слово с контрольными разрядами:100011001011

При этом могут быть следующие случаи.

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

№ разряда:00010010001101000101011001111000100110101011Контроль по четности в группеКонтрольный битКонтроль по четности в целомКонтрольный бит в целом
Распределение контрольных и информационных разрядовp1p2d1p3d2d3d4p4d5d6d7
Переданное кодовое слово:10001100101
Принятое кодовое слово:10001100101
p1101011Pass0
p2001001Pass0
p30110Pass0
p40101Pass01Pass
p4p3p2p1
В двоичном представлении0000
В десятичном представленииΣ = 0
№ разряда:00010010001101000101011001111000100110101011Контроль по четности в группеКонтрольный битКонтроль по четности в целомКонтрольный бит в целом
Распределение контрольных и информационных разрядовp1p2d1p3d2d3d4p4d5d6d7
Переданное кодовое слово:10001100101
Принятое кодовое слово:10001100101
p1101011Pass0
p2001001Pass0
p30110Pass0
p40101Pass00Fail
p4p3p2p1
В двоичном представлении0000
В десятичном представленииΣ = 0

3. В принятом коде в целом и в некоторых из контрольных групп количество единиц нечетно. Третий случай — одиночной ошибки в каком-либо из остальных разрядов (можно исправить в соответствии с приведенными выше правилами)

№ разряда:00010010001101000101011001111000100110101011Контроль по четности в группеКонтрольный битКонтроль по четности в целомКонтрольный бит в целом
Распределение контрольных и информационных разрядовp1p2d1p3d2d3d4p4d5d6d7
Переданное кодовое слово :10001100101
Принятое кодовое слово:10001100100
p1101010Fail1
p2001000Fail1
p30110Pass0
p40100Fail11Fail
p4p3p2p1
В двоичном представлении1011
В десятичном представлении821Σ = 11

Из таблицы следует, что ошибка произошла в 11-м разряде и что её можно исправить.

№ разряда:00010010001101000101011001111000100110101011Контроль по четности в группеКонтрольный битКонтроль по четности в целомКонтрольный бит в целом
Распределение контрольных и информационных разрядовp1p2d1p3d2d3d4p4d5d6d7
Переданное кодовое слово:10001100101
Принятое кодовое слово:10101000101
p1111011Fail1
p2010001Pass0
p30100Fail1
p40101Pass01Pass
p4p3p2p1
В двоичном представлении0101
В десятичном представлении421Σ = 5

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

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

Применение

Код Хэмминга используется в некоторых прикладных программах в области хранения данных, особенно в RAID 2; кроме того, метод Хемминга давно применяется в памяти типа ECC и позволяет «на лету» исправлять однократные и обнаруживать двукратные ошибки.

Источник

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

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