- •Корректирующие коды Хэмминга
- •Коды Хэмминга. Алгоритм кодирования
- •Коды Хэмминга. Алгоритм декодирования
- •Разработанный проект
- •Проект, разработанный на wpf
- •Режим работы с одним символом
- •Пример кодирования с исправлениями ошибок
- •Пример кодирования сообщения
- •Пример кодирования
- •Параметры кода
- •Исходный код программы
- •Класс, реализующий хранение и вывод информации на форму
- •Главный класс логики
Коды Хэмминга. Алгоритм декодирования
Алгоритм декодирования по Хэммингу абсолютно идентичен алгоритму кодирования. Матрица преобразования соответствующей размерности умножается на матрицу-столбец кодового слова и каждый элемент полученной матрицы-столбца берётся по модулю 2. Полученная матрица-столбец получила название «матрица синдромов». Легко проверить, что кодовое слово, сформированное в соответствии с алгоритмом, описанным в предыдущем разделе, всегда даёт нулевую матрицу синдромов.
Матрица синдромов становится ненулевой, если в результате ошибки (например, при передаче слова по линии связи с шумами) один из битов исходного слова изменил своё значение. Предположим для примера, что в кодовом слове, полученном в предыдущем разделе, шестой бит изменил своё значение с нуля на единицу (на рисунке обозначено красным цветом). Тогда получим следующую матрицу синдромов.
Заметим, что при однократной ошибке матрица синдромов всегда представляет собой двоичную запись (младший разряд в верхней строке) номера позиции, в которой произошла ошибка. В приведённом примере матрица синдромов (01100) соответствует двоичному числу 00110 или десятичному 6, откуда следует, что ошибка произошла в шестом бите.
Разработанный проект
Проект, разработанный на wpf
Рисунок 1 представляет работу программы в режиме кодирования всего алфавита. На рисунке 2 продемонстрирован режим работы с одним символом.
Режим работы с одним символом
Пример кодирования с исправлениями ошибок
Выберем английский алфавит от 'o' до 'z':
Теперь внесем в каждую строку одиночную ошибку (колонка Hamming Code (Editable)):
В две последние строки было внесено по две ошибки.
Как видим, код Хэмминга отлично справляется с одиночными ошибками. С двойными же есть проблема. Мы можем фиксировать наличие ошибки, но мы не знаем была ли она одиночная или двойная. Но алгоритм всегда пытается исправить одиночные ошибки. Поэтому мы и видим, что буква 'z' декодировалась как 'q'. Такое бывает не всегда. В последней строке при исправлении мы вообще попали на запрещенную комбинацию.
Делаем вывод, что код Хэмминга с определенной вероятностью может диагностировать множественные ошибки, и не умеет их исправлять.
Пример кодирования сообщения
Возьмем алфавит английских символов от 'a' до 'n'. Получили следующие коды Хэмминга:
Пример кодирования
Пусть нам нужно закодировать сообщение "galamaga". Тогда код будем следующим:
Символ |
g |
a |
l |
a |
m |
a |
g |
a |
Код |
1100110 |
0000000 |
0110011 |
0000000 |
0111100 |
0000000 |
1100110 |
0000000 |
В каждом из передаваемых блоков код Хэмминга допускает одну ошибку, которую он может исправить.
Параметры кода
Для примера, изображенного на рисунке 3, найдем ряд параметров.
Контрольные биты находятся на позициях {1, 2, 4} (нумерация начинается с 1). Всего их 3.
Минимальное кодовое расстояние для полученного кода равняется трем.
Избыточность кода - это отношение числа контрольных битов к числу информационных. В нашем случае она равна 3/7 = 0.43.
