Как исправить сообщение с помощью кода Хемминга - PullRequest
1 голос
/ 16 апреля 2009

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

Спасибо.

Ответы [ 3 ]

9 голосов
/ 16 апреля 2009

Это все о расстоянии Хэмминга .

Расстояние Хэмминга между двумя значениями base-2 - это количество битов, на которых они различаются. Поэтому, если вы передаете A, а я - B, то число битов, которые должны были быть переключены при передаче, - это расстояние Хэмминга между A и B.

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

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

Таким образом, код Хэмминга обычно стремится исправить 1-битные ошибки и / или обнаружить 2-битные ошибки (подробности двух основных типов см. В статье Википедии). Коды, которые исправляют / обнаруживают большие ошибки, могут быть созданы, но AFAIK используется не так часто.

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

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

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

Очевидно, что 3-битные ошибки не исправляются SECDED кодом Хэмминга. Полученное значение находится дальше от фактически отправленного вами значения, чем до некоторой другой кодовой точки, и я ошибочно «исправляю» его до неверного значения. Таким образом, вам либо нужна передача, достаточно надежная, чтобы их не волновать, либо вам также необходимо обнаружение ошибок более высокого уровня (например, CRC для всего сообщения).

2 голосов
/ 16 апреля 2009

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

  1. Нумерация битов начиная с 1: биты 1, 2, 3, 4, 5 и т. Д.
  2. Запишите битовые числа в двоичном виде. 1, 10, 11, 100, 101 и т. Д.
  3. Все позиции битов, которые являются степенями двух (имеют только один 1 бит в двоичной форме их позиции), являются битами четности.
  4. Все остальные битовые позиции с двумя или более 1 битами в двоичной форме их позиции являются битами данных.
  5. Каждый бит данных включен в уникальный набор из 2 или более битов четности, что определяется двоичной формой его позиции бита.
    1. Бит четности 1 охватывает все позиции битов, для которых установлен младший значащий бит: бит 1 (сам бит четности), 3, 5, 7, 9 и т. Д.
    2. Бит четности 2 охватывает все позиции битов, для которых установлен второй младший значащий бит: бит 2 (сам бит четности), 3, 6, 7, 10, 11 и т. Д.
    3. Бит четности 4 охватывает все позиции битов, для которых установлен третий младший значащий бит: биты 4–7, 12–15, 20–23 и т. Д.
    4. Бит четности 8 охватывает все позиции битов, для которых установлен четвертый младший значащий бит: биты 8–15, 24–31, 40–47 и т. Д.
    5. Как правило, каждый бит четности охватывает все биты, в которых двоичное И позиции положения четности и позиции бита не равно нулю.
0 голосов
/ 16 апреля 2009

Статья в Википедии объясняет это довольно хорошо.

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

...