Код Хэмминга
Код Хэмминга (Ричард Хэмминг, 1950) добавляет к данным несколько проверочных битов так, что приёмник не только замечает одиночную ошибку, но и узнаёт её позицию — и исправляет её сам, без повторной передачи. Расширенный вариант кода Хэмминга до сих пор защищает серверную память (ECC).
Расстояние Хэмминга
Расстояние Хэмминга d(x, y) между двоичными словами одинаковой длины — число позиций, в которых они различаются. Минимальное расстояние кода d — наименьшее расстояние между двумя различными кодовыми словами.
Например, d(10110, 11100) = 2. Расстояние — настоящая метрика: оно неотрицательно, симметрично и удовлетворяет неравенству треугольника. Если в канале произошло t ошибок, принятое слово находится на расстоянии t от отправленного.
Код с минимальным расстоянием d
- обнаруживает любые d − 1 ошибок;
- исправляет любые t = ⌊(d − 1)/2⌋ ошибок, если декодировать в ближайшее кодовое слово.
Доказательство. Меньше чем d ошибок не могут превратить одно кодовое слово в другое — значит, принятое слово не кодовое и ошибка заметна. Для исправления: пусть отправлено c, принято r, d(c, r) ≤ t. Если бы для другого кодового слова c' было d(c', r) ≤ t, то по неравенству треугольника d(c, c') ≤ 2t ≤ d − 1 — противоречие. Значит, ближайшее к r кодовое слово — именно c.
Простейшие примеры: бит чётности (d = 2) обнаруживает одну ошибку, но не исправляет; тройное повторение 0 → 000, 1 → 111 (d = 3) исправляет одну ошибку, но втрое увеличивает объём. Код Хэмминга тоже имеет d = 3, но тратит гораздо меньше лишних битов.
Устройство кода Хэмминга (7,4)
Позиции кодового слова нумеруются с единицы: 1, 2, …, 7. На позициях — степенях двойки (1, 2, 4) стоят биты чётности, на остальных (3, 5, 6, 7) — 4 бита данных. Бит чётности на позиции 2^j проверяет все позиции, в двоичной записи номера которых установлен j-й бит, и делает сумму этих позиций по модулю 2 равной нулю:
| Бит чётности | Проверяет позиции | Двоичная запись позиций |
|---|---|---|
| p_1 | 1, 3, 5, 7 | ··1 |
| p_2 | 2, 3, 6, 7 | ·1· |
| p_4 | 4, 5, 6, 7 | 1·· |
Данные 1011 записываем в позиции 3, 5, 6, 7:
| Позиция | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| Назначение | p_1 | p_2 | d_1 | p_4 | d_2 | d_3 | d_4 |
| Бит | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
p_1 = d_1 ⊕ d_2 ⊕ d_4 = 1 ⊕ 0 ⊕ 1 = 0, p_2 = d_1 ⊕ d_3 ⊕ d_4 = 1 ⊕ 1 ⊕ 1 = 1, p_4 = d_2 ⊕ d_3 ⊕ d_4 = 0 ⊕ 1 ⊕ 1 = 0. Кодовое слово: 0110011.
Синдром: как найти ошибку
Приёмник заново вычисляет три проверки по принятому слову. Результаты проверок, записанные как двоичное число s = s_4 s_2 s_1, называются синдромом.
Если ошибок нет, синдром равен 0. Если ошибка одна, синдром равен номеру ошибочной позиции.
Почему. Ошибка в позиции i нарушает ровно те проверки, которые «видят» позицию i, — то есть проверки, соответствующие единицам в двоичной записи i. Поэтому набор нарушенных проверок и есть двоичная запись i.
Отправлено 0110011, в канале испортился бит 6, принято 0110001.
s_1 = биты 1, 3, 5, 7: 0 ⊕ 1 ⊕ 0 ⊕ 1 = 0; s_2 = биты 2, 3, 6, 7: 1 ⊕ 1 ⊕ 0 ⊕ 1 = 1; s_4 = биты 4, 5, 6, 7: 0 ⊕ 0 ⊕ 0 ⊕ 1 = 1.
Синдром s = 110₂ = 6: инвертируем бит 6 и получаем 0110011, данные из позиций 3, 5, 6, 7 — 1011.
Матричная запись
Код Хэмминга — линейный: сумма (XOR) двух кодовых слов — снова кодовое слово. Его задаёт проверочная матрица H размера 3 × 7, столбец i которой — двоичная запись числа i:
Слово c кодовое тогда и только тогда, когда H·cᵀ = 0. Если принято r = c ⊕ e, где e — вектор ошибки, то синдром H·rᵀ = H·cᵀ ⊕ H·eᵀ = H·eᵀ зависит только от ошибки. При одной ошибке в позиции i это i-й столбец H, то есть двоичная запись i. Все столбцы различны и ненулевые — поэтому d = 3.
Семейство кодов и граница Хэмминга
Для m проверочных битов получаем код длины n = 2^m − 1 с k = n − m битами данных: (3,1) — тройное повторение, (7,4), (15,11), (31,26), … Чем длиннее блок, тем меньше доля избыточности, но тем выше шанс, что в блок попадут две ошибки.
Вокруг каждого из 2^k кодовых слов «шар» радиуса 1 содержит само слово и n слов с одной ошибкой; шары не пересекаются и помещаются среди всех 2^n слов.
Для кода Хэмминга 2^(n−m)·2^m = 2^n — равенство: шары покрывают всё пространство без остатка. Такие коды называют совершенными. Любое принятое слово либо кодовое, либо на расстоянии 1 ровно от одного кодового.
При двух ошибках синдром ненулевой, но указывает на третью, ни в чём не виноватую позицию, — декодер «исправляет» её и вносит третью ошибку. Поэтому на практике используют расширенный код Хэмминга (8,4): к слову добавляют общий бит чётности. Он исправляет одну ошибку и обнаруживает две (SECDED — single error correction, double error detection); именно так устроена ECC-память.
Выберите вариант (7,4) или (15,11), включите «Смоделировать ошибку» и нажмите на блок с ошибкой — откроется разбор проверок, синдрома и исправления. Открыть код Хэмминга →
Вопросы для самопроверки
- Закодируйте данные 0110 кодом Хэмминга (7,4).
Ответ
d_1 d_2 d_3 d_4 = 0 1 1 0: p_1 = 0 ⊕ 1 ⊕ 0 = 1, p_2 = 0 ⊕ 1 ⊕ 0 = 1, p_4 = 1 ⊕ 1 ⊕ 0 = 0; слово 1100110. - Принято слово 1110110. Есть ли ошибка, и где?
Ответ
s_1 = 1 ⊕ 1 ⊕ 1 ⊕ 0 = 1, s_2 = 1 ⊕ 1 ⊕ 1 ⊕ 0 = 1, s_4 = 0 ⊕ 1 ⊕ 1 ⊕ 0 = 0; синдром 011₂ = 3 — ошибка в позиции 3, правильное слово 1100110. - Сколько проверочных битов нужно коду Хэмминга, чтобы защитить 26 бит данных?
Ответ
5: код (31,26), так как 2^5 − 1 = 31 = 26 + 5. - Почему код Хэмминга называют совершенным?
Ответ
Граница Хэмминга выполняется с равенством: каждое слово длины n находится на расстоянии не больше 1 ровно от одного кодового слова.