Код Хэмминга
Код Хэмминга — это семейство линейных корректирующих кодов, способных обнаруживать и исправлять однократные ошибки, а также обнаруживать двукратные ошибки (в расширенной версии). Относится к классу блоковых систематических кодов, в которых к информационным битам добавляются проверочные (избыточные) биты, формируемые по определённому правилу. Код назван в честь американского математика Ричарда Хэмминга, предложившего его в 1950 году.
История
Разработка кодов Хэмминга была вызвана практическими проблемами, возникавшими при работе ранних электромеханических вычислительных машин. В 1940-х годах в Bell Labs Ричард Хэмминг столкнулся с тем, что ошибки при считывании данных с перфокарт приводили к аварийным остановкам вычислений. Существовавшие методы контроля чётности позволяли только обнаружить факт ошибки, но не указывали её местоположение. Хэмминг поставил задачу создать код, который не только выявлял бы ошибку, но и позволял бы её автоматически исправить.
В 1950 году Хэмминг опубликовал статью «Error detecting and error correcting codes», в которой описал метод построения кодов с минимальным расстоянием 3 (коды Хэмминга), способных исправлять любую одиночную ошибку. Позднее были разработаны расширенные версии (с дополнительным битом общей чётности), позволяющие также обнаруживать двойные ошибки. Коды Хэмминга стали первыми практически применимыми помехоустойчивыми кодами и заложили основы теории кодирования.
Принцип работы
Код Хэмминга строится на основе двоичного представления позиций битов в кодовом слове. Каждый проверочный бит отвечает за определённую группу информационных битов, номера которых в двоичной записи содержат единицу в соответствующем разряде. Проверочные биты располагаются на позициях, номера которых являются степенями двойки (1, 2, 4, 8, ...). Остальные позиции занимают информационные биты.
Алгоритм кодирования
- Определяется количество проверочных битов \(r\), необходимое для кодирования \(k\) информационных битов. Условие: \(2^r \ge k + r + 1\).
- Строится кодовое слово длиной \(n = k + r\).
- На позиции, являющиеся степенями двойки, записываются проверочные биты. На остальные — информационные.
- Значение каждого проверочного бита \(p_i\) вычисляется как сумма по модулю 2 (XOR) всех битов кодового слова, номера которых в двоичной записи содержат единицу в \(i\)-м разряде (включая сам проверочный бит). Таким образом, каждый проверочный бит обеспечивает чётность для своей группы.
Алгоритм декодирования и исправления ошибок
- Получатель вычисляет синдром ошибки — набор из \(r\) битов, каждый из которых равен сумме по модулю 2 всех битов кодового слова, входящих в соответствующую группу (включая проверочный бит).
- Если синдром равен нулю, ошибок нет.
- Если синдром не равен нулю, его двоичное значение указывает номер позиции бита, в котором произошла ошибка.
- Бит на указанной позиции инвертируется.
Пример
Для кодирования 4 информационных битов (\(k=4\)) требуется 3 проверочных бита (\(r=3\)), так как \(2^3 = 8 \ge 4 + 3 + 1 = 8\). Длина кодового слова \(n = 7\). Проверочные биты располагаются на позициях 1, 2, 4. Информационные — на позициях 3, 5, 6, 7.
Пусть информационные биты: \(d_1=1, d_2=0, d_3=1, d_4=0\). Кодовое слово: \(p_1, p_2, d_1, p_3, d_2, d_3, d_4\).
- \(p_1\) (позиция 1) контролирует биты 1, 3, 5, 7: \(p_1 = d_1 \oplus d_2 \oplus d_4 = 1 \oplus 0 \oplus 0 = 1\).
- \(p_2\) (позиция 2) контролирует биты 2, 3, 6, 7: \(p_2 = d_1 \oplus d_3 \oplus d_4 = 1 \oplus 1 \oplus 0 = 0\).
- \(p_3\) (позиция 4) контролирует биты 4, 5, 6, 7: \(p_3 = d_2 \oplus d_3 \oplus d_4 = 0 \oplus 1 \oplus 0 = 1\).
Итоговое кодовое слово: 1 0 1 1 0 1 0.
Классификация
Коды Хэмминга классифицируются по нескольким параметрам.
По длине кодового слова
- Совершенные коды Хэмминга: коды, для которых выполняется равенство \(2^r = k + r + 1\). Они имеют длину \(n = 2^r - 1\) и содержат \(k = 2^r - r - 1\) информационных битов. Примеры: (7,4), (15,11), (31,26).
- Укороченные коды Хэмминга: получаются из совершенных кодов путём удаления части информационных битов. Используются, когда требуемая длина кодового слова меньше длины совершенного кода. Например, код (12,8) — укороченный вариант кода (15,11).
По наличию дополнительной проверки
- Обычный код Хэмминга: исправляет одиночные ошибки, но не обнаруживает двойные (при двукратной ошибке синдром может указать на неверную позицию).
- Расширенный код Хэмминга: добавляется один дополнительный бит общей чётности для всего кодового слова. Это позволяет обнаруживать двойные ошибки, но не исправлять их. Пример: расширенный код (8,4) на основе (7,4).
Характеристики
- Минимальное кодовое расстояние: для обычного кода Хэмминга равно 3, для расширенного — 4.
- Корректирующая способность: исправляет одну ошибку в кодовом слове.
- Обнаруживающая способность: расширенный код обнаруживает до двух ошибок.
- Кодовая скорость: \(R = k/n\). Для совершенных кодов \(R = 1 - \frac{r}{2^r - 1}\). С ростом \(r\) скорость стремится к 1, но уменьшается относительная избыточность.
- Линейность: код является линейным, то есть сумма по модулю 2 любых двух кодовых слов также является кодовым словом.
Применение
Коды Хэмминга широко применяются в системах, где вероятность одиночных ошибок значительно выше, чем многократных, и где важна простота реализации.
- Память компьютеров: используются в модулях оперативной памяти (DRAM) с коррекцией ошибок (ECC). Например, код (72,64) — расширенный код Хэмминга, применяемый в серверных модулях памяти для исправления одиночных и обнаружения двойных ошибок.
- Телекоммуникации: применяются в системах передачи данных, где канал связи характеризуется низким уровнем помех (например, в некоторых стандартах цифрового телевидения и радиосвязи).
- Хранение данных: используются в некоторых RAID-системах (например, RAID 2) и в системах хранения на магнитных носителях.
- Космическая связь: применялись в ранних космических аппаратах (например, в программе «Вояджер») для защиты телеметрии от помех.
- Криптография: коды Хэмминга используются в стеганографии для встраивания скрытых сообщений в изображения (метод LSB с коррекцией ошибок).
Интересные факты
- Код Хэмминга (7,4) является одним из немногих совершенных кодов, исправляющих ошибки. Другие известные совершенные коды — коды Голея (23,12) и тривиальные коды (повторения и проверки чётности).
- Ричард Хэмминг изобрёл свой код, размышляя над задачей, поставленной перед ним Клодом Шенноном. Хэмминг также известен как создатель «окна Хэмминга», используемого в цифровой обработке сигналов.
- В 1970-х годах коды Хэмминга были вытеснены более эффективными кодами Рида — Соломона и свёрточными кодами, но остаются популярными в приложениях, где требуется минимальная задержка и простота декодирования.
Критика
Основным недостатком кодов Хэмминга является их неспособность исправлять многократные ошибки. В каналах с высокой вероятностью групповых ошибок (например, в радиоканалах с замираниями) они малоэффективны. Кроме того, кодовая скорость совершенных кодов Хэмминга снижается с уменьшением длины кодового слова, что делает их неоптимальными для коротких сообщений.
Источники
- Hamming R. W. Error detecting and error correcting codes // Bell System Technical Journal. — 1950. — Vol. 29, No. 2. — P. 147–160.
- Питерсон У., Уэлдон Э. Коды, исправляющие ошибки. — М.: Мир, 1976.
- Блейхут Р. Теория и практика кодов, контролирующих ошибки. — М.: Мир, 1986.
- Мак-Вильямс Ф. Дж., Слоэн Н. Дж. А. Теория кодов, исправляющих ошибки. — М.: Связь, 1979.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →