В силу избыточности не все
комбинаций возможны. Зная алгоритм установки контрольных разрядов, мы можем вычислить минимальное расстояние по Хеммингу между допустимыми кодословами. Способен код исправлять ошибки или только обнаруживать зависит от расстояния между его кодословами по Хеммингу. Если мы хоти обнаруживать ошибок, то надо чтобы кодослова отстояли друг от друга на расстояние . Тогда если принятый код отстоит на расстояние , то принятое кодослово содержит k ошибок. Если мы хотим исправлять ошибки, то надо чтобы кодослова отстояли друг от друга на . Поэтому даже если переданное кодослово содержит ошибок, оно все равно ближе к правильному кодослову, чем к какому-либо еще, и следовательно можно определить, исходное слово.Простым примеров кода с обнаружением одной ошибки является код с битом четности. Конструкция его такова: к исходному кодослову добавляется бит четности. Если число 1 в исходном кодослове четно, то значение этого бита 0. Если нечетно, то 0. Кодослова с битом четности имеют расстояние хемминга 2.
Для примера кода с исправлением ошибки рассмотрим код, у которого есть только четыре правильных кодослова: 0000000000, 0000011111, 11111100000, 11111111111. Расстояние по хеммингу у этого кода 5, следовательно он может исправлять двойные ошибки. Если получатель получит слово 0000000111, то ясно, что исходное слово имело вид 0000011111.
Оценим минимальное количество контрольных разрядов, необходимое для исправления одиночных ошибок. Пусть у нас есть код из
бит сообщения и контрольных бит. Каждое из правильных кодослов имеет неправильных кодослов на расстоянии 1. Такими образом, с каждым из кодослов связано кодослов. Так как общее число кодослов , то , учитывая что получаемЭтот теоретический предел достижим при использовании метода, предложенного Хеммингом. Идея его в следующем: все биты, номера которых есть степень 2 (1,2,4,8,16 и т.д.) - контрольные, остальные - биты сообщения. Каждый контрольный бит отвечает за четность группы битов, включая себя. Один и тот же бит может относиться к разным группам. Значение бита сообщения определяется по значениям контрольных битов. Чтобы определить какие контрольные биты контролируют бит в позиции k надо представить значение k по степеням двойки. Например,
, а .Получив кодослово, получатель устанавливает специальный счетчик в ноль. Затем он проверят каждый контрольный бит на предмет правильности четности. Если четность нарушена, то порядковый номер этого бита заноситься в счетчик. Если после этой проверки счетчик ноль, то все в порядке. Если нет, то он содержит номер неправильного разряда. Например, 1, 2, 8 - ошибочные контрольные разряды, то ошибка в 11 разряде, так как только он связан одновременно с этими контрольными разрядами.
Код хемминга может исправлять только единичные ошибки. Однако, есть прием, который позволяет распространить идеи Хемминга на случай групповых ошибок. Пусть нам надо передать k кодослов. Расположим их в виде матрицы одно слово - строка. Обычно, передают слово за словом. Но мы поступим иначе, передадим слово длины
, из 1-ых разрядов всех слов, затем - вторых и т.д. По приеме всех слов матрица восстанавливается. Если мы хотим обнаруживать групповые ошибки размера , то в каждой строке восстановленной матрицы будет не более одной ошибки. А с одиночными ошибками код хемминга справиться.Начнем а небольшого примера. Пусть у нас есть канал с единичными ошибкой с частотой 10-6 на бит. Если мы хотим исправлять единичные ошибки при передаче блока в 1000 бит, то нам потребуется 10 контрольных бит. При передаче 1 Мбит данных, потребуется 10 000 контрольных бит. В тоже время для обнаружения единичной ошибки достаточно одного бита четности. Поэтому, если мы применим технику повторной передачи, то на передачу 1000 блоков надо будет потратить 1001 бит дополнительно или с повторной передачей 2002 бит, вместо 10,000 бит в случае кода с исправлением ошибки.
Применение техники четности "в лоб" в случае групповых ошибок не даст нужного результата. Однако, ее можно скорректировать. Пусть нам надо передать
слов по бит. Расположим их в виде матрицы . Для каждого столбца вычислим бит четности и разместим его в дополнительной строке. Матрица затем передается по строкам. По получению матрица восстанавливается и если хоть один бит нарушен, то весь блок передается повторно.Этот метод позволяет обнаружить групповые ошибки длины
. Против групповых ошибок длины он бессилен. В общем случае вероятность правильной передачи при длине групповой ошибке , равна .Поэтому на практике применяют другую технику, которая называется полиномиальными кодами или циклическим избыточным кодом (Cyclic Redundancy Code) или CRC кодом.
CRC коды построены на рассмотрении битовой строки как строки коэффициентов полинома.
битовая строка - коэффициенты полинома степени . Самый левый бит строки - коэффициент при старшей степени. Например, строка 110001 представляет полином .Полиномиальная арифметика выполняется по модулю 2. Сложение и вычитание происходит без переноса разрядов. Так, что обе это операции эквивалентны EXCLUSIVE OR. Например,
Деление выполняется как обычно в двоичной системе с той лишь разницей, что вычитание выполняется по модулю два.
Использование полиномиальных кодов при передаче заключается в следующем. Отправитель и получатель заранее договариваются о конкретном генераторе полиномов
, у него коэффициенты при старшем члене и при младшем члене должны быть равны 1. Пусть степень равна r. Для вычисления контрольной суммы блока из m бит надо чтобы обязательно . Идея состоит в том, чтобы добавить контрольную сумму к передаваемому блоку, рассматриваемому как полином так, чтобы передаваемый блок с контрольной суммой был кратен . Когда получатель получает блок с контрольной суммой, он делит его на . Если есть остаток, то были ошибки при передаче.