Код Хэмминга добавляет к k битам данных r проверочных бит так, что приёмник находит и исправляет любую одиночную ошибку в слове. Его описал Р. Хэмминг в 1950 году в журнале Bell System Technical Journal: каждый проверочный бит — это чётность своей группы позиций, а группы подобраны так, что номер ошибочной позиции складывается из сработавших проверок. С ещё одним битом общей чётности код становится SECDED — исправляет одну ошибку и обнаруживает две. Для 64 бит данных это 72-битное слово; на 72-битные модули памяти DDR рассчитан эталонный проект AMD (Xilinx) XAPP645, правда восьмой бит там — чётность только бит данных, а калькулятор, как Хэмминг, считает общий бит по всему слову.
Как пользоваться
В режиме «Кодировать» выберите код или задайте своё число бит данных k (до 247) и введите данные. Биты вводятся по порядку: первый — d1, он попадает в позицию 3. В шестнадцатеричном виде младший бит числа D0 — это тот же d1, поэтому биты 1100 по порядку — это 0x3. Калькулятор покажет кодовое слово (позиция 1 — первая), расчёт каждого проверочного бита и таблицу покрытия. Щелчок по биту слова или номер в поле «Инвертировать позиции» вносит ошибку — тут же видно синдром и что сделает декодер.
В режиме «Декодировать» введите принятое слово целиком, начиная с позиции 1: калькулятор посчитает синдром, найдёт ошибочную позицию и вернёт исправленные данные, а с битом общей чётности отличит двойную ошибку. Режим «Чётность» считает обычный бит чётности слова — чётный (even) или нечётный (odd).
Как считается
Позиции слова нумеруют с единицы. Проверочные биты стоят в позициях, равных степеням двойки, — 1, 2, 4, 8, …, данные занимают остальные: 3, 5, 6, 7, 9, … Проверочный бит в позиции 2j охватывает все позиции, в двоичном номере которых есть разряд 2j, и делает чётным число единиц в своей группе. Число проверочных бит r — наименьшее, при котором синдром может назвать любую из k + r позиций или сказать «ошибок нет»:
Для кода (7,4) группы такие: p1 охватывает позиции 1, 3, 5, 7, p2 — 2, 3, 6, 7, p4 — 4, 5, 6, 7. Данные d1, d2, d3, d4 стоят в позициях 3, 5, 6, 7, откуда
| Позиция | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| В двоичном | 001 | 010 | 011 | 100 | 101 | 110 | 111 |
| Бит | p1 | p2 | d1 | p4 | d2 | d3 | d4 |
| Проверка p1 | ● | ● | ● | ● | |||
| Проверка p2 | ● | ● | ● | ● | |||
| Проверка p4 | ● | ● | ● | ● |
Приёмник пересчитывает каждую проверку по принятому слову c вместе с проверочным битом. Сработавшие проверки, записанные двоичным числом, — синдром S — и есть номер ошибочной позиции:
где — поразрядное И номера позиции и веса проверки: XOR берётся по всем позициям, в номере которых есть этот разряд. Если S = 0, все проверки сошлись.
Для SECDED в конец слова дописывают бит общей чётности P — XOR всех n позиций. После приёма его проверяют вместе с синдромом:
| Синдром S | Общая чётность | Вывод |
|---|---|---|
| 0 | сходится | ошибок нет |
| не 0 | нарушена | одна ошибка в позиции S — исправить |
| 0 | нарушена | ошибся сам бит P, данные верны |
| не 0 | сходится | две ошибки — обнаружены, исправить нельзя |
Пример: код (7,4)
Данные 1100: d1 = 1, d2 = 1, d3 = 0, d4 = 0. Проверочные биты: p1 = 1 ⊕ 1 ⊕ 0 = 0, p2 = 1 ⊕ 0 ⊕ 0 = 1, p4 = 1 ⊕ 0 ⊕ 0 = 1. Слово по позициям 1–7 — 0111100; в таблице III статьи Хэмминга это слово под номером 12.
Пусть в канале исказилась позиция 5 и пришло 0111000. Проверка p1 по позициям 1, 3, 5, 7 даёт 0 ⊕ 1 ⊕ 0 ⊕ 0 = 1, p2 по позициям 2, 3, 6, 7 — 1 ⊕ 1 ⊕ 0 ⊕ 0 = 0, p4 по позициям 4, 5, 6, 7 — 1 ⊕ 0 ⊕ 0 ⊕ 0 = 1. Синдром s4 s2 s1 = 101₂ = 5: инвертируем пятый бит и получаем исходное 0111100 — тот же разбор приводит Хэмминг.
С битом общей чётности слово становится 01111000: в 0111100 четыре единицы, P = 0. Если исказить позиции 3 и 5, синдром будет 3 ⊕ 5 = 6, но общая чётность сойдётся — декодер SECDED сообщит о двойной ошибке, а простой код (7,4) «исправил» бы позицию 6 и испортил данные. Этот пример открыт в калькуляторе по умолчанию: щёлкните по биту 3 — код (7,4) «исправит» позицию 6, а после включения SECDED сообщит о двойной ошибке.
Сколько нужно проверочных бит
| Бит данных k | Проверочных r | Код | Доля данных | SECDED | Доля данных |
|---|---|---|---|---|---|
| 1 | 2 | (3,1) | 33,3 % | (4,1) | 25,0 % |
| 4 | 3 | (7,4) | 57,1 % | (8,4) | 50,0 % |
| 8 | 4 | (12,8) | 66,7 % | (13,8) | 61,5 % |
| 11 | 4 | (15,11) | 73,3 % | (16,11) | 68,8 % |
| 16 | 5 | (21,16) | 76,2 % | (22,16) | 72,7 % |
| 26 | 5 | (31,26) | 83,9 % | (32,26) | 81,3 % |
| 32 | 6 | (38,32) | 84,2 % | (39,32) | 82,1 % |
| 57 | 6 | (63,57) | 90,5 % | (64,57) | 89,1 % |
| 64 | 7 | (71,64) | 90,1 % | (72,64) | 88,9 % |
| 120 | 7 | (127,120) | 94,5 % | (128,120) | 93,8 % |
| 247 | 8 | (255,247) | 96,9 % | (256,247) | 96,5 % |
Полные коды длиной 2r − 1 — (7,4), (15,11), (31,26), (63,57) — используют все синдромы. Привычные ширины 8, 16, 32 и 64 бита дают укороченные коды: старших позиций просто нет. Поэтому в укороченном коде синдром больше n — числа позиций без бита общей чётности P — не может появиться от одной ошибки, и калькулятор помечает такой случай как неисправимый.
Порядок бит и совместимость
Калькулятор пишет слово с позиции 1 слева, как Хэмминг в таблице III. Данные D0, D1, … занимают позиции 3, 5, 6, 7, 9, … — так же их располагают таблица 1 XAPP383 и таблица синдромов на рис. 1 XAPP645 (бит D60 — в позиции 1000100₂ = 68). Бит общей чётности стоит последним и охватывает всё слово вместе с проверочными битами — так у Хэмминга в §4 и в XAPP383, где P5 занимает позицию 22. Хэмминг в таблице III читал информационные позиции 3, 5, 6, 7 как двоичное число с позицией 3 в старшем разряде, поэтому его «12» — это наши биты 1100, а в шестнадцатеричном виде с D0 в младшем разряде — 0x3.
Чужие таблицы часто пишут слово от старшей позиции к младшей: в таблице 1 XAPP383 позиция 1 стоит справа. Бывает различие и в том, что охватывает общий бит. В XAPP645 восьмой бит CB8 — чётность только 64 бит данных (у него в таблице 1 отмечены все биты D0–D63, а проверочные — нет). Это меняет не только само слово, но и выводы декодера: одиночная ошибка в проверочном бите даёт ненулевой синдром при сошедшейся CB8, и по правилу заметки такое слово считается двойной ошибкой, а калькулятор с общим битом по всему слову её исправит. Перед сравнением с чужой реализацией сверьте порядок бит и состав общего бита — иначе при тех же данных слова и решения декодера не совпадут. Перевести данные между двоичной и шестнадцатеричной записью поможет конвертер систем счисления.
Ограничения и типичные ошибки
- Две ошибки без SECDED. В полных кодах (7,4), (15,11), (31,26), (63,57) любая двойная ошибка выглядит одиночной: декодер «исправляет» не ту позицию и портит третий бит. В укороченном коде бывает так же, а бывает, что синдром указывает за конец слова, — тогда ошибка видна, но не исправима. Если в канале возможны две ошибки на слово, нужен SECDED.
- Три ошибки и больше. SECDED гарантирует только исправление одной и обнаружение двух ошибок; три ошибки могут выглядеть как одна и быть «исправлены» неверно, а некоторые сочетания превращают слово в другое кодовое слово с нулевым синдромом.
- Пакеты ошибок. Код рассчитан на независимые одиночные ошибки в слове — сбой ячейки памяти, помеху в одном разряде. Для проверки целостности длинного блока данных применяют CRC: он не исправляет, но надёжно обнаруживает пакеты ошибок.
- Бит чётности вместо кода. Один бит чётности — как в кадре UART формата 8E1 — замечает нечётное число ошибок, но не говорит, где ошибка, и пропускает две. Как он ставится в кадр, показывает калькулятор кадра UART.
Исключающее ИЛИ, из которого собраны кодер и декодер, и другие логические элементы разобраны в статье «Цифровая логика».
Частые вопросы
Сколько проверочных бит нужно для 64 бит данных?
Семь: условие Хэмминга 2^r ≥ k + r + 1 при k = 64 выполняется с r = 7, потому что 128 ≥ 72, а при r = 6 — нет: 64 < 71. Получается код (71,64). Чтобы ещё и обнаруживать двойные ошибки, добавляют восьмой бит — выходит 72-битное слово (72,64); на 72-битные модули памяти DDR рассчитан эталонный проект AMD XAPP645. Там восьмой бит CB8 — чётность только 64 бит данных, а калькулятор, как Хэмминг, считает бит общей чётности по всем 71 позициям.
Как по синдрому найти ошибочный бит?
Пересчитайте каждую проверку по принятому слову вместе с её проверочным битом: 0 — проверка сошлась, 1 — нет. Запишите результаты справа налево — s1 младшим разрядом, затем s2, s4, — и прочитайте как двоичное число: это номер позиции с ошибкой. Для слова 0111000 проверки дают 1, 0 и 1, синдром 101 — ошибка в пятой позиции, исправленное слово 0111100. Синдром 0 означает, что ошибок нет.
Чем SECDED отличается от обычного кода Хэмминга?
К слову добавляют ещё один бит — общую чётность всех позиций. Минимальное расстояние кода растёт с 3 до 4: одиночная ошибка по-прежнему исправляется, а двойная обнаруживается — синдром не 0, а общая чётность сходится. Если синдром 0, а чётность нарушена, ошибся сам общий бит. Так устроены код (8,4) из статьи Хэмминга и код (22,16) из заметки AMD XAPP383 для 16-битной памяти.
Почему код (7,4) не может исправить две ошибки?
Любые два его слова отличаются минимум в трёх битах, поэтому одна ошибка оставляет принятое слово ближе всего к исходному, а две — уже к другому слову кода. Ошибки в позициях 3 и 5 дают синдром 3 ⊕ 5 = 6, декодер инвертирует бит 6 — и в слове становится три неверных бита. Без бита общей чётности двойную ошибку не отличить от одиночной.
Чем бит чётности отличается от кода Хэмминга?
Один бит чётности замечает любое нечётное число ошибок, но не говорит, где ошибка, и пропускает любые две. Код Хэмминга ставит r проверок чётности по перекрывающимся группам позиций, и набор сработавших проверок — синдром — указывает номер ошибочной позиции. За это платят битами: для 8 бит данных нужен 1 бит чётности или 4 проверочных бита Хэмминга.
Источники
- R. W. Hamming. Error Detecting and Error Correcting Codes. The Bell System Technical Journal, 1950, vol. 29, no. 2, pp. 147–160 — §2 — чётная и нечётная проверка чётности, двойная ошибка ей не видна; §3 — условие 2^k ≥ m + k + 1 (m — информационных позиций, k — проверочных) и табл. I, проверочные позиции 1, 2, 4, 8 и табл. II — какие позиции охватывает каждая проверка; табл. III — 16 слов кода из семи позиций; пример: слово 0111100 с ошибкой в пятой позиции даёт проверочное число 101; §4 и табл. IV — восьмая позиция общей чётности, три случая: нет ошибок, одна ошибка (нулевое проверочное число — ошибка в самой восьмой позиции), две ошибки; §5, табл. V — минимальное расстояние 3 и 4
- AMD (Xilinx). XAPP645 v2.2. Single Error Correction and Double Error Detection, 2006 — код (72,64): 64 бита данных, семь проверочных бит и восьмой, CB8, — чётность всех бит данных для обнаружения двойной ошибки; для 32 бит — (39,32); условие D + P + 1 ≤ 2^P; рис. 1 — таблица синдромов, бит D60 в позиции 1000100; уравнение CB1; табл. 1 и 2 — какие биты данных входят в каждый проверочный бит; рис. 3 и 4 — ошибка в D28 нарушает CB1, CB2 и CB6, двойная ошибка в D28 и D22 даёт синдром 0111111; эталонный проект рассчитан на 72-битную память DDR
- AMD (Xilinx). XAPP383 v1.1. Single Error Correction and Double Error Detection (SECDED) with CoolRunner-II CPLDs, 2003 — табл. 1 — 22-битное слово для 16 бит данных: P0–P4 в позициях 1, 2, 4, 8, 16, D0 в позиции 3, общий бит P5 в позиции 22; уравнения P0–P4; P5 — XOR всех бит данных и P0–P4; табл. 2 — как синдром и общая чётность различают отсутствие ошибки, одиночную, двойную и ошибку в самом P5
- Microchip. ATmega48A/PA/88A/PA/168A/PA/328/P Data Sheet (DS40002061B) — 20.4.1 — бит чётности: исключающее ИЛИ всех бит данных, для нечётной чётности — инверсия
Встроить калькулятор на свой сайт
Скопируйте код и вставьте его в HTML страницы, статьи или вики. Виджет бесплатный, без рекламы, счётчиков и cookie. Условие одно — ссылка на GAW под рамкой остаётся на месте. Подробнее о виджетах
<iframe src="https://gaw.ru/embed/hamming/" title="Калькулятор кода Хэмминга" width="100%" height="640" style="border:1px solid #e3e5e9;border-radius:8px" loading="lazy" allow="clipboard-write"></iframe>
<p style="margin:6px 0 0;font-size:14px">Калькулятор: <a href="https://gaw.ru/tools/hamming/">Калькулятор кода Хэмминга</a> — GAW.ru</p>Автоподстройка высоты рамки
Если сайт разрешает скрипты, добавьте этот код один раз в любом месте страницы: рамка будет менять высоту вместе с результатом расчёта.
<script>window.addEventListener("message",function(e){if(e.origin!=="https://gaw.ru"||!e.data||e.data.type!=="gaw:embed-height")return;var f=document.querySelectorAll('iframe[src^="https://gaw.ru/embed/"]');for(var i=0;i<f.length;i++)if(f[i].contentWindow===e.source)f[i].style.height=e.data.height+"px"})</script>Обновлено .
Нашли ошибку в расчёте?