
13.4 Код Хэмминга
В качестве примера (n,k)-кода, при задании которого используется матричное представление, рассмотрим код Хэмминга – код с кодовым расстоянием d=3, позволяющий исправлять все одиночные ошибки. Для кода Хэмминга число разрешённых кодовых комбинаций равно верхней границе – 2n/(n+ 1). Первые k разрядов кодовых комбинация используются в качестве информационных, их число равно:
|
|
Данное уравнение имеет целочисленные решения k=0,1,4,11,26,…, которые и определяют соответствующие коды Хэмминга: (3, 1), (7, 4), (15,11) и т.д. Рассмотрим построение (7, 4)-кода. Для этого воспользуемся каноническим представлением порождающей матрицы. Одним из свойств порождающей матрицы является то, что для различных кодовых комбинаций, составленных из информационных разрядов, должны быть различными и проверочные разряды. Так как все вектор-строки единичной подматрицы матрицы Gn,k различны, то и подматрица проверочных разрядов должна состоять из различных ненулевых строк (общее число ненулевых строк должно быть равно 2r–1).
Вычтем
из возможного числа ненулевых строк r
строк, образующих единичную матрицу ,
которую следует добавить к транспонированной
подматрице проверочных разрядов при
определении проверочной матрицы. Тогда
останется 2r–1–r
r-разрядных строк с
числом единиц не меньше двух. Для кода
Хэмминга это число как раз равно числу
информационных разрядов. Для (n,
k)-кода число различных
r-разрядных строк с
числом единиц не меньше двух равно числу
строк в порождающей матрице. Это свойство
позволяет составить непосредственно
один из вариантов порождающей матрицы
(7, 4)-кода, например, такой:
|
|
Учитывая связь элементов порождающей и проверочной матриц, представленных в канонической форме, имеем:
|
|
Проверим способность разработанного (7, 4) кода исправлять одиночные ошибки. Пусть передаваемая кодовая комбинация v (7,4)-кода образована путём сложения первой, второй и четвёртой строк матрицы G7,4, тогда v=1101001.
Предположим, что при передаче по каналу произошла ошибка в третьем разряде кодовой комбинации v. В этом случае на приёмной стороне канала будет получена кодовая комбинация v'=1111001. Умножим принятую кодовую комбинацию на транспонированную проверочную матрицу H7,4:
|
|
Отличие от нуля синдрома говорит о том, что произошла ошибка. Чтобы определить, в каком разряде кодовой комбинации произошла ошибка, проверим, с какой строкой матрицы транспонированной матрицы H7,4 совпадает синдром. Как видно, он совпадает с третьей строкой. Следовательно, ошибка произошла в третьем разряде кодовой комбинации. В декодирующих устройствах систем передачи информации результат перемножения принятой кодовой комбинации на проверочную матрицу (синдром ошибки) используется для автоматического исправления соответствующего разряда.
13.5 Циклические коды
Циклическим кодом называется линейный код, который представляет собой конечное множество, замкнутое относительно операции циклического сдвига кодовых векторов, образующих его. Пусть дан n-мерный вектор v=a0a1…an-1 с координатами из конечного поля F. Его циклическим сдвигом называется вектор v'=an-1a0a1…an-2.
Рассмотрим n-мерное арифметическое пространство над полем Галуа GF(2). Каждому вектору a0a1…an-1 из GF(2) можно сопоставить взаимно однозначно многочлен a0+a1x+…+an-1xn-1 с коэффициентами из GF(2). Сумме двух векторов a0a1…an-1 и b0b1…bn-1 ставится в соответствие сумма соответствующих им многочленов, произведению элементов поля на вектор - произведение многочлена, соответствующего этому вектору, на элемент.
Рассмотрим некоторый многочлен g(x) из описанного линейного пространства. Множество всех многочленов из этого подпространства, которые делятся без остатка на g(x), образует линейное подпространство. Линейное подпространство определяет некоторый линейный код.
Линейный код, образованный классом многочленов C(g(x)), кратных некоторому полиному g(x), называемому порождающим многочленом, называется полиномиальным.
Покажем, как связаны полиномиальные коды C(g(x)) и циклические коды. Пусть a=a0…an-1 – некоторое кодовое слово, а соответствующий кодовый многочлен a(x)=a0+...+an-1xn-1. Циклическому сдвигу a' соответствует кодовый многочлен a'(x)=an-1+a0x+…+an-2xn-1, который можно выразить через первоначальный:
|
|
Поскольку полиномиальный код должен делиться на g(x), то для того, чтобы он был циклическим, многочлен a'(x) должен делиться на g(x). Из этого соображения можно сформулировать следующую теорему. Полиномиальный код является циклическим тогда и только тогда, когда многочлен g(x) является делителем многочлена xn–1. В этом случае многочлен g(x) называется порождающим многочленом циклического кода.
В теории кодирования доказывается следующая теорема: если многочлен g(x) имеет степень n–k и является делителем xn–1, то C(g(x)) является линейным циклическим (n,k)-кодом.
Многочлен xn–1 разложим на множители xn–1 = (x–1)(xn-1+xn-1+…+1). Следовательно, циклические коды существуют при любом n. Число циклических n-разрядных кодов равно числу делителей многочлена xn–1. Для построения циклических кодов разработаны таблицы разложения многочленов xn–1 на неприводимые многочлены, то есть на такие, которые делятся только на единицу и на самого себя.
Рассмотрим, например, какие коды можно построить на основе многочлена x7–1 над полем GF(2). Разложение многочлена на неприводимые множители имеет вид
|
|
Поскольку можно образовать шесть делителей многочлена x7–1, комбинируя неприводимые делители, существует шесть двоичных циклических кодов. (n,k)-код определяется, во-первых, значением n, а во-вторых, значением k=n–s, s – степень многочлена-делителя xn–1, определяющего код. Ниже приведены делители полинома и соответствующие им значения k:
x– 1,s=1,k=6;
x3+x2+1,s=3,k=4;
x3+x+1,s=3,k=4;
(x–1)(x3+x2+1)=x4+x2+x+1,s=4,k=3;
(x–1)(x3+x+1)=x4+x3+x2+1,s=4,k=3;
(x3+x2+1)( x3+x+1)=x6+ x5+ x4+ x3+ x2+ x,s=6,k=1.
(7, 6)-код имеет лишь один проверочный символ, а (7, 1)-код – лишь один информационный. Они являются соответственно кодом с проверкой на чётность и кодом с повторением.
Как и обычный линейный код, циклический код может быть задан порождающей матрицей. Следовательно, задача состоит в том, чтобы найти такую матрицу, то есть найти k линейно независимых кодовых комбинаций, образующих её. Воспользуемся для этого свойством замкнутости циклического кода относительно операции циклического сдвига. Заметим, что циклический сдвиг вправо на один разряд эквивалентен умножению многочлена g(x) на x. Тогда порождающую матрицу можно построить, взяв в качестве строк порождающий многочлен и k его циклических сдвигов:
|
|
Например, рассмотрим один из делителей многочлена x7–1, а именно полином g(x)=1+x+x3. Ему соответствует кодовая комбинация 1101000 (выписаны коэффициенты при степенях 0, 1, …, 6 порождающего многочлена, так как кодовая комбинация содержит 7 символов). Тогда порождающая матрица (7,4) имеет вид
|
|
Рассмотрим теперь, как с помощью порождающего многочлена g(x)=1+x+x3 осуществляется кодирование (7, 4)-кодом. Возьмём, например, 4-разрядное слово (0101), которому соответствует многочлен f(x)=x+x3. Перемножив эти два многочлена:
f(x)g(x) = (x+x3)(1+x+x3) =x+x2+x3+x6,
получим кодовую комбинацию 0111001. Аналогично можно получить кодовые слова для всех 4-разрядных двоичных слов. Однако получившийся код, как видно, не является разделимым, что неудобно для практических нужд.
Чтобы закодировать сообщение h(x) циклическим кодом C(g(x)), который является разделимым, нужно разделить многочлен xn-kh(x) на g(x) и прибавит остаток от деления к многочлену xn-kh(x).
Для примера рассмотрим кодовую комбинацию 1101. Этому вектору соответствует полином h(x)=1+x+x3. Тогда xn-k h(x)=x3+x4+x6. Разделим получившийся многочлен на g(x)=1+x+x3, получим остаток, равный 0. Тогда кодовый вектор равен 0001101.