Код Хэмминга: различия между версиями
[непроверенная версия] | [отпатрулированная версия] |
Содержимое удалено Содержимое добавлено
→Самокорректирующиеся коды: стилевые правки |
Д.Ильин (обсуждение | вклад) оформление, стилевые правки |
||
Строка 14:
| обозначение = <math>[2^r-1, 2^r-r-1, 3]_2</math>
}}
'''Код Хэ́мминга''' —
Позволяет исправлять одиночную ошибку (ошибка в одном бите слова) и находить двойную<ref>{{Cite web|accessdate = 2016-01-20|title = Коды Хемминга — "Все о Hi-Tech"|url = http://all-ht.ru/inf/systems/p_0_14.html|publisher = all-ht.ru}}</ref>. == История ==
В середине 1940-х годов в лаборатории фирмы Белл ([[Bell Labs]]) была создана счётная машина ''Bell Model V''. Это была электромеханическая машина, использующая релейные блоки, скорость которых была очень низка:
Хэмминг часто работал в выходные дни, и все больше и больше раздражался, потому что часто должен был перезагружать свою программу из-за ненадежности считывателя перфокарт. На протяжении нескольких лет он
== Систематические коды ==
Систематические коды образуют большую группу из блочных, разделимых кодов (в которых все символы слова можно разделить на проверочные и информационные). Особенностью систематических кодов является то, что проверочные символы образуются в результате [[Линейный код|линейных логических операций]] над информационными символами. Кроме того, любая разрешенная кодовая комбинация может быть получена в результате линейных операций над набором линейно независимых кодовых комбинаций.
== Самоконтролирующиеся коды ==
Коды Хэмминга являются самоконтролирующимися кодами, то есть кодами, позволяющими автоматически обнаруживать ошибки при передаче данных. Для их построения достаточно приписать к каждому слову один добавочный (контрольный) двоичный разряд и выбрать цифру этого разряда так, чтобы общее количество единиц в изображении любого числа было, например, нечетным. Одиночная ошибка в каком-либо разряде передаваемого слова (в том числе, может быть, и в контрольном разряде) изменит четность общего количества единиц. Счетчики по модулю 2, подсчитывающие количество единиц, которые содержатся среди двоичных цифр числа,
При проверочном бите этом невозможно узнать, в
== Самокорректирующиеся коды ==
Коды, в которых возможно автоматическое исправление ошибок, называются самокорректирующимися. Для построения самокорректирующегося кода, рассчитанного на исправление одиночных ошибок, одного контрольного разряда недостаточно. Как видно из дальнейшего, количество контрольных разрядов <math>k</math> должно быть выбрано так, чтобы удовлетворялось неравенство <math>2^k \geq k+m+1</math> или <math> k \geq \log_2(k+m+1)</math>, где <math>m</math> — количество
{| class="wikitable" style="float:left; margin-right:1em; clear:left"
Минимальные значения k при заданных значениях m, найденные в соответствии с этим неравенством, приведены в таблице.▼
|+
! Диапазон m
Строка 56:
| 6
|}
▲Минимальные значения k при заданных значениях m, найденные в соответствии с этим неравенством, приведены в таблице.
Основными характеристиками самокорректирующихся кодов являются:
# Число разрешенных и запрещенных комбинаций. Если <math>n</math> — число символов в блоке, <math>r</math> — число проверочных символов в блоке, <math>k</math> — число информационных символов, то '''<math>2^n</math>''' — число возможных кодовых комбинаций, '''<math>2^k</math>''' — число разрешенных кодовых комбинаций, '''<math>2^n - 2^k</math>''' — число запрещенных комбинаций.
# Избыточность кода. Величину '''<math>\tfrac{r}{n}</math>''' называют избыточностью корректирующего кода.
# Минимальное кодовое расстояние. Минимальным кодовым расстоянием <math>d</math> называется минимальное число искаженных символов, необходимое для перехода одной разрешенной комбинации в другую.
# Число обнаруживаемых и исправляемых ошибок. Если <math>g</math> — количество ошибок, которое код способен исправить, то необходимо и достаточно, чтобы '''<math>d \geq 2g+1</math>'''
# Корректирующие возможности кодов.
[[Граница Плоткина]] даёт верхнюю границу кодового расстояния:
: <math>d\leqslant \tfrac{n \cdot 2^{k-1}}{2^k-1}</math>▼
или▼
: <math>r \geq 2\cdot(d-1)-\log_2 d</math>▼
▲: <math>d\leqslant \tfrac{n \cdot 2^{k-1}}{2^k-1},</math>
[[Граница Хэмминга]] устанавливает максимально возможное число разрешенных кодовых комбинаций▼
: <math>2^k \leq {2^n} / \sum_{i=0}^{\tfrac{d-1}{2}} C_n^i </math>▼
где <math>C_n^i</math> — число сочетаний из <math>n</math> элементов по i элементам. Отсюда можно получить выражение для оценки числа проверочных символов: <math>r \geq \log_2\left( \sum_{i=0}^{(d-1)/2} C_n^i\right) </math>▼
▲или:
Для значений <math>(d/n) \leq 0.3 </math> разница между границей Хемминга и границей Плоткина невелика.▼
▲: <math>r \geq 2\cdot(d-1)-\log_2 d</math> при <math>n \geq 2 \cdot d-1.</math>
[[Неравенство Гильберта — Варшамова|Граница Варшамова — Гилберта]] для больших n определяет нижнюю границу числа проверочных символов▼
:<math>r \geq \log_2\left(\sum_{i=0}^{d-2} C_{n-1}^i\right) </math>▼
▲[[Граница Хэмминга]] устанавливает максимально возможное число разрешенных кодовых комбинаций:
Все вышеперечисленные оценки дают представление о '''верхней границе''' d при фиксированных n и k или '''оценку снизу''' числа проверочных символов▼
▲: где <math>C_n^i</math> — число сочетаний из <math>n</math> элементов по <math>i</math> элементам. Отсюда можно получить выражение для оценки числа проверочных символов:
: <math>r \geq \log_2\left( \sum_{i=0}^{(d-1)/2} C_n^i \right).</math>
▲Для значений <math>(d/n) \leq 0
▲[[Неравенство Гильберта — Варшамова|Граница Варшамова — Гилберта]] для больших n определяет нижнюю границу числа проверочных символов:
▲: <math>r \geq \log_2\left(\sum_{i=0}^{d-2} C_{n-1}^i\right) .</math>
▲Все вышеперечисленные оценки дают представление о '''верхней границе''' <math>d</math> при фиксированных <math>n</math> и <math>k</math> или '''оценку снизу''' числа проверочных символов.
== Код Хэмминга ==
Построение кодов Хэмминга основано на принципе проверки на четность числа единичных символов: к последовательности добавляется такой элемент, чтобы число единичных символов в получившейся последовательности было четным
: <math>r_1 = i_1 \oplus i_2 \oplus ... \oplus i_k.</math>
знак <math>\oplus </math> здесь означает [[сложение по модулю 2]]▼
: <math>S = i_1 \oplus i_2 \oplus ... \oplus i_n \oplus r_1 </math>.▼
<math>S = 0 </math> — ошибки нет, <math>S = 1 </math> однократная ошибка.▼
Такой код называется <math>(k+1,k) </math> или <math>(n,n-1) </math>. Первое число — количество элементов последовательности, второе — количество информационных символов.▼
Для каждого числа проверочных символов <math>r = 3,4,5.. </math> существует классический код Хэмминга с маркировкой▼
<math>(n,k)=(2^r-1,2^r-1-r)</math> то есть — <math>(7,4),(15,11),(31,26) </math>. При иных значениях k получается так называемый усеченный код, например международный телеграфный код МТК-2, у которого <math>k = 5 </math>. Для него необходим код Хэмминга <math>(9,5) </math>, который является усеченным от классического <math>(15,11) </math>.▼
▲Такой код называется <math>(k+1,\ k) </math> или <math>(n,\ n-1) </math>. Первое число — количество элементов последовательности, второе — количество информационных символов.
Для примера рассмотрим классический код Хемминга <math>(7,4) </math>. Сгруппируем проверочные символы следующим образом:▼
: <math>r_1 = i_1 \oplus i_2 \oplus i_3</math>▼
▲Для каждого числа проверочных символов <math>r = 3,\ 4,\ 5\ ...
: <math>r_2 = i_2 \oplus i_3 \oplus i_4</math>▼
: <math>r_3 = i_1 \oplus i_2 \oplus i_4</math>▼
: <math>(n,k)=(2^r-1,2^r-1-r),</math> то есть — <math>(7,4),(15,11),(31,26) </math>.
▲
▲Для примера рассмотрим классический код Хемминга <math>(7,\ 4)
▲: <math>r_1 = i_1 \oplus i_2 \oplus i_3,</math>
▲: <math>r_2 = i_2 \oplus i_3 \oplus i_4,</math>
▲: <math>r_3 = i_1 \oplus i_2 \oplus i_4.</math>
Получение кодового слова выглядит следующим образом:
Строка 111 ⟶ 126 :
\end{pmatrix} </math> = <math>\begin{pmatrix}
i_1 & i_2 & i_3 & i_4 & r_1 & r_2 & r_3 \\
\end{pmatrix} </math>.
На вход декодера поступает кодовое слово
<math>V = (i_1',\ i_2',\ i_3',\ i_4',\ r_1',\ r_2',\ r_3')</math> где штрихом помечены символы, которые могут исказиться в результате действия помехи. В декодере в режиме исправления ошибок строится последовательность синдромов:
: <math>S_1 = r_1 \oplus i_1 \oplus i_2 \oplus i_3</math>▼
: <math>
: <math>
<math>S = (S_1,\ S_2,\ S_3)
Получение синдрома выглядит следующим образом:
Строка 134 ⟶ 150 :
\end{pmatrix} </math> = <math>\begin{pmatrix}
S_1 & S_2 & S_3 \\
\end{pmatrix}
{| class="wikitable sortable" style="float:left; margin-right:1em; clear:left"
Кодовые слова <math>(7,4) </math> кода Хэмминга▼
|<math>i_1</math> || <math>i_2</math> || <math>i_3</math> || <math>i_4</math> || <math>r_1</math> || <math>r_2</math> || <math>r_3</math>
|-
Строка 262 ⟶ 277 :
|1
|}
Синдром <math>(0,0,0) </math> указывает на то, что в последовательности нет искажений. Каждому ненулевому синдрому соответствует
Для кода <math>(7,4) </math> в таблице ниже указаны ненулевые синдромы и соответствующие им конфигурации ошибок (для вида: <math>i_1</math> <math>i_2</math> <math>i_3</math> <math>i_4</math> <math>r_1</math> <math>r_2</math> <math>r_3</math>).
{| class="standard"
|Синдром
Строка 299 ⟶ 315 :
== Алгоритм кодирования ==
Предположим, что нужно сгенерировать код Хэмминга для некоторого информационного кодового слова. В качестве примера возьмём 15-битовое кодовое слово
{| class="wikitable"
|-
Строка 312 ⟶ 327 :
|}
Вставим в информационное слово контрольные биты
{| class="wikitable"
Строка 340 ⟶ 355 :
|- align="center"
| 1 || 0 || 1 || 0 || 1 || 0 || 1 || 0 || 1 || 0 || 1 || 0 || 1 || 0 || 1 || 0 || 1 || 0 || 1 || 0
| '''r'''<sub>0</sub> ||
|- align="center"
| 0 || 1 || 1 || 0 || 0 || 1 || 1 || 0 || 0 || 1 || 1 || 0 || 0 || 1 || 1 || 0 || 0 || 1 || 1 || 0
| '''r'''<sub>1</sub> ||
|- align="center"
| 0 || 0 || 0 || 1 || 1 || 1 || 1 || 0 || 0 || 0 || 0 || 1 || 1 || 1 || 1 || 0 || 0 || 0 || 0 || 1
| '''r'''<sub>2</sub> ||
|- align="center"
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || 1 || 1 || 1 || 1 || 1 || 1 || 1 || 0 || 0 || 0 || 0 || 0
| '''r'''<sub>3</sub> ||
|- align="center"
| 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 0 || 1 || 1 || 1 || 1 || 1
| '''r'''<sub>4</sub> ||
|}
В правой части таблицы мы оставили пустым один столбец, в который поместим результаты вычислений контрольных битов. Вычисление контрольных битов производим следующим образом. Берём одну из строк матрицы преобразования (например,
Если описывать этот процесс в терминах матричной алгебры, то операция представляет собой перемножение матрицы преобразования на матрицу-столбец кодового слова, в результате чего получается матрица-столбец контрольных разрядов, которые нужно взять по модулю 2.
Например, для строки
:
Полученные контрольные биты вставляем в кодовое слово вместо стоявших там ранее нулей. По аналогии находим проверочные биты в остальных строках. Кодирование по Хэммингу завершено. Полученное кодовое слово — 11110010001011110001.
|