Домой / Социальные сети / Процесс циклического кодирования. Циклические коды Определяющим свойством циклического кода является

Процесс циклического кодирования. Циклические коды Определяющим свойством циклического кода является

Циклическим кодом называется линейный код, который представляет собой конечное множество, замкнутое относительно операции циклического сдвига кодовых векторов, образующих его. Пусть дан n -мерный вектор v = a 0 a 1 …a n -1 с координатами из конечного поля F . Его циклическим сдвигом называется вектор v" = a n ­ -1 a 0 a 1 …a n -2 .

Рассмотрим n -мерное арифметическое пространство над полем Галуа GF (2). Каждому вектору a 0 a 1 …a n -1 из GF (2) можно сопоставить взаимно однозначно многочлен a 0 +a 1 x +…+a n -1 x n -1 с коэффициентами из GF (2). Сумме двух векторов a 0 a 1 …a n -1 и b 0 b 1 …b n -1 ставится в соответствие сумма соответствующих им многочленов, произведению элементов поля на вектор - произведение многочлена, соответствующего этому вектору, на элемент.

Рассмотрим некоторый многочлен g (x ) из описанного линейного пространства. Множество всех многочленов из этого подпространства, которые делятся без остатка на g (x ), образует линейное подпространство. Линейное подпространство определяет некоторый линейный код.

Линейный код, образованный классом многочленов C (g (x )), кратных некоторому полиному g (x ), называемому порождающим многочленом, называется полиномиальным.

Покажем, как связаны полиномиальные коды C (g (x )) и циклические коды. Пусть a = a 0 …a n -1 – некоторое кодовое слово, а соответствующий кодовый многочлен a (x ) = a 0 +...+a n -1 x n -1 . Циклическому сдвигу a " соответствует кодовый многочлен a "(x ) = a n -1 +a 0 x +…+a n -2 x n -1 , который можно выразить через первоначальный:

Поскольку полиномиальный код должен делиться на g (x ), то для того, чтобы он был циклическим, многочлен a "(x ) должен делиться на g (x ). Из этого соображения можно сформулировать следующую теорему. Полиномиальный код является циклическим тогда и только тогда, когда многочлен g (x ) является делителем многочлена x n –1. В этом случае многочлен g (x ) называется порождающим многочленом циклического кода.

В теории кодирования доказывается следующая теорема: если многочлен g (x ) имеет степень n k и является делителем x n –1, то C (g (x )) является линейным циклическим (n , k )-кодом.

Многочлен x n –1 разложим на множители x n –1 = (x –1)(x n -1 +x n -1 +…+1). Следовательно, циклические коды существуют при любом n . Число циклических n -разрядных кодов равно числу делителей многочлена x n –1. Для построения циклических кодов разработаны таблицы разложения многочленов x n –1 на неприводимые многочлены, то есть на такие, которые делятся только на единицу и на самого себя.

Рассмотрим, например, какие коды можно построить на основе многочлена x 7 –1 над полем GF (2). Разложение многочлена на неприводимые множители имеет вид

Поскольку можно образовать шесть делителей многочлена x 7 –1, комбинируя неприводимые делители, существует шесть двоичных циклических кодов. (n , k )-код определяется, во-первых, значением n , а во-вторых, значением k = n s , s – степень многочлена-делителя x n –1, определяющего код. Ниже приведены делители полинома и соответствующие им значения k :

x – 1, s =1, k =6;

x 3 +x 2 +1, s =3, k =4;

x 3 +x +1, s =3, k =4;

(x –1)(x 3 +x 2 +1)=x 4 +x 2 +x+1, s =4, k =3;

(x –1)(x 3 +x +1)=x 4 +x 3 +x 2 +1, s =4, k =3;

(x 3 +x 2 +1)( x 3 +x +1)=x 6 + x 5 + x 4 + x 3 + x 2 + x , s =6, k =1.

(7, 6)-код имеет лишь один проверочный символ, а (7, 1)-код – лишь один информационный. Они являются соответственно кодом с проверкой на чётность и кодом с повторением.

Как и обычный линейный код, циклический код может быть задан порождающей матрицей. Следовательно, задача состоит в том, чтобы найти такую матрицу, то есть найти k линейно независимых кодовых комбинаций, образующих её. Воспользуемся для этого свойством замкнутости циклического кода относительно операции циклического сдвига. Заметим, что циклический сдвиг вправо на один разряд эквивалентен умножению многочлена g (x ) на x . Тогда порождающую матрицу можно построить, взяв в качестве строк порождающий многочлен и k его циклических сдвигов:

Рассмотрим теперь, как с помощью порождающего многочлена g (x ) = 1+x +x 3 осуществляется кодирование (7, 4)-кодом. Возьмём, например, 4-разрядное слово (0101), которому соответствует многочлен f (x ) = x + x 3 . Перемножив эти два многочлена.

Циклические коды являются разновидностью линейных групповых кодов и относятся к систематическим кодам. Первоначально были созданы для упрощения процедуры декодирования. Однако высокая эффективность к обнаружению ошибок таких кодов обеспечила их широкое применение на практике. Двоичный вектор циклического кода удобно рассматривать не как комбинацию нулей и единиц, а в виде полинома некоторой степени

где х - основание системы счисления, коэффициенты, принадлежащие множеству в случае двоичной системы счисления.

Пример. Двоичный вектор может быть представлен в виде полинома следующим образом:

Представление двоичных векторов в виде полиномов позволяет свести действие над векторами к действиям над многочленами. При этом:

сложение многочленов сводится к сумме по модулю 2 коэффициентов при равных степенях переменной

умножение производится по обычному правилу умножения степенных функций, однако полученные коэффициенты при данной степени складываются по модулю 2;

деление осуществляется по правилам деления степенных функций, при этом операция вычитания заменяется суммированием по модулю 2.

Пример. Найти сумму многочленов

Найти произведение многочленов

Выполнить деление многочленов

Основным свойством циклических кодов является следующее: если вектор принадлежит циклическому коду, то любой вектор, полученный из рассматриваемого с помощью циклических сдвигов, также принадлежит циклическому коду.

Идея построения циклических кодов базируется на понятии неприводимого многочлена. Многочлен называется неприводимым, если он делится только на самого себя и на единицу, и не делится ни на какой другой многочлен. Иными словами, неприводимый многочлен нельзя представить в виде произведения многочленов низших степеней. На неприводимый многочлен без остатка делится многочлен . Неприводимые многочлены играют в теории циклических кодов роль образующих полиномов. Виды неприводимых многочленов различных степеней приведены в

Примеры неприводимых многочленов:

Векторы циклического кода строятся в соответствий со следующими правилами. Пусть - любой двоичный вектор некоторого натурального кода; - одночлен степени неприводимый полином степени Тогда любой вектор циклического кода образуется с помощью соотношения

где остаток от деления

Таким образом, любой вектор циклического кода может быть образован умножением некоторого вектора натурального двоичного кода на одночлен степени с добавлением к полученному произведению остатка от деления При построении циклических кодов указанным способом расположение информационных разрядов в каждом векторе кода строго упорядочено - они занимают старших разрядов вектора кода, а остальные разрядов являются проверочными.

Пример. Вектор натурального двоичного кода имеет вид Образовать из негр вектор циклического кода при условии, что образующий полином имеет вид

Представим вектор в виде полинома

В результате деления полинома на полином получаем остаток . Поэтому

Циклический код, как и всякий систематический код, удобно задавать в матричном виде с помощью порождающей матрицы имеющей вид

где - транспонированная единичная йатрица формата - матрица проверочных разрядов, образованная остатком от деления

Зададим порождающую матрицу циклического кода длиной информационными разрядами и порождающим полиномом .

Очевидно, заготовка для порождающей матрицы имеет вид

Для нахождения строк проверочных разрядов матрицы вычислим и запишем в виде полинома каждый вектор единичной матрицы

Длина вектора циклического кода поэтому

(см. скан)

В результате получаем порождающую матрицу С:

Любой вектрр циклического кода получается как сумма по моду векторов его порождающей матрицы. Так как циклический код является групповым, то нулевой вектор всегда приписывается циклическому коду как единичный элемент группы»

Таблица 13.5

Пример. Построить все векторы циклического кода, заданного порождающей матрицей

Код представлен в табл. 13.5.

Необходимо отметить, что каждый циклический код, заданный некоторой порождающей матрицей, можно представить в нескольких вариантах, отличающихся друг от друга длиной и количеством информационных разрядов (при одинаковых обнаруживающих способностях). Эти варианты так называемых укороченных циклических кодов получаются вычеркиванием последних строк и такого же количества столбцов слева в порождающей матрице циклического кода. При этом число проверочных разрядов остается неизменным, а длина кода и число его информационных разрядов уменьшаются соответственно на величину, равную числу вычеркнутых строк и столбцов порождающей матрицы.

Пример, Циклический код задан своей порождающей матрицей

Вычеркнем из шесть последних строк и шесть первых слева столбцов. Получим порождающую матрицу

Характеристики (в смысле обнаружения ошибок) полученного кода такие же, как и циклического кода, представленного порождающей матрицей

Построение циклических кодов с заданными параметрами связано с выбором образующего неприводимого полинома. Образующий полином выбирается исходя из следующего условия: степень полинома должна быть равна числу проверочных разрядов циклического кода.

На практике часто возникает задача построения циклического кода заданной мощности и заданной обнаруживающей и корректирующей способностей.

1. Так как мощность циклического кода задана, то число его информационных разрядов определяется в соответствии с формулой

2. Оптимальное число проверочных разрядов циклического кода определяется по специальным таблицам .

3. По справочникам находятся все неприводимые полиномы степени

4. Для одного из непроводимых многочленов (следует выбирать многочлен с максимальным числом членов) степени строится порождающая матрица циклического кода. Каждый вектор кода вычисляется по формуле

где - полином информационного вектора порождающей матрицы; - одночлен степени - остаток от деления

5. Построенная порождающая матрица проверяется на выполнение следующих условий:

а) вес в смысле Хэмминга любого вектора порождающей матрицы должен удовлетворять соотношению где - минимальное расстояние, в смысле Хэмминга рассматриваемого циклического кода;

б) вес в смысле Хэмминга проверочного вектора, являющегося суммой по модулю 2 любых двух проверочных векторов порождающей матрицы, должен удовлетворять соотношению

6. Если порождающая матрица циклического кода удовлетворяет всем приведенным условиям, то выписываются все векторы циклического кода и определяется в соответствии с известными правилами для линейных групповых кодов. Если код не соответствует требованиям, то выбирается другой порождающий полином той же степени и процедура образования циклического кода повторяется для нового полинома.

Построим циклический код мощностью 16 и корректирующей с по собностью

Для определяем значение по

3» По справочникам находим все неприводимые полиномы степени Таких полиномов два:

4. Выбираем в качестве образующего полином Заготовка порождающей матрицы циклического кода имеет вид

Каждый информационный вектор из матрицы представляем полиномом

Определяем полностью все векторы порождающей матрицы, используя формулу

Так как длина вектора циклического кода (см. формат порождающей матрицы то

Аналогично находим все остальные векторы порождающей мат рицы

Таблица 13.6

В результате получена порождающая матрица С? циклического кода

5. Полученная порождающая матрица удовлетворяет всем необходимым условиям. Поэтому строим циклический код полностью (табл. 13.6). Как следует из таблицы, код имеет т. е. удовлетворяет требованиям задачи.

Замечания. При использовании неприводимого полинома в качестве порождающего получаем код, также удовлетворяющий требованиям задачи. Его порождающая матрица имеет вид

Обнаружение ошибок с помощью циклических кодов производится следующим образом. Любой вектор циклического кода делится на образующий полином без остатка. Поэтому критерием наличия ошибки в векторе циклического кода является появление ненулевого остатка от деления вектора циклического кода на образующий полином. Ненулевой остаток является опознавателем ошибки в векторе циклического кода, однако его вид не указывает на место расположения ошибки в кодовом векторе. Исправление ошибок базируется на следующем алгоритме:

1. Принятый кодовый вектор разделить на образующий полином.

Если число единиц не превышает корректирующей способности кода, то принятый вектор сложить по модулю 2 с полученным остатком. Результат суммирования даст исправленный кодовый вектор. Если число единиц остатка больше корректирующей способности кода, то осуществить циклический сдвиг искаженного вектора влево на один разряд, а затем произвести деление на образующий полином. Если полученный остаток содержит единиц не больше корректирующей способности циклического кода, то произвести суммирование сдвинутого циклически вектора с остатком. Результат суммирования сдвинуть циклически на один разряд вправо. Полученный вектор уже не содержит ошибок и является вектором циклического кода.

3. Если после первого циклического сдвига и последующего деления остаток содержит единиц больше, чем корректирующая способность кода, то повторять процедуру алгоритма до тех пор, пока не будет получен остаток с числом единиц, не превышающим корректирующей способности кода. В этом случае результат последнего циклического сдвига суммируется с остатком и полученный вектор циклически сдвигается на столько разрядов вправо, на сколько был сдвинут влево исходный принятый вектор с ошибкой. В итоге получается исправленный кодовый вектор.

Пусть циклический код задан своей порождающей матрицей С и образующим полиномом , где

Код имеет в 3, т. е. корректирует ошибки кратности Пусть вместо вектора 0001101 принят вектор 0011101. Для исправления ошибки осуществляем следующие действия. Принятый вектор записываем в виде полинома: затем делим на

Полученный в результате деления остаток содержит три единицы, что больше, чем корректирующая способность кода. Поэтому делаем циклический сдвиг влево на один разряд принятого кодового вектора. В результате имеем

Осуществляем деление на

Полученный остаток содержит две единицы, что больше, чем корректирующая способность кода. Поэтому делаем еще один циклический сдвиг влево на один разряд принятого кодового вектора. В результате имеем

Осуществляем деление на

Полученный остаток снова содержит две единицы, поэтому делаем еще один циклический сдвиг влево на один разряд и получаем Делим на

Широкое распространение на практике получил класс линейных кодов, которые называются цшаическими кодами . Название происходит от основного свойства этих кодов: если некоторая кодовая комбинация принадлежит циклическому коду, то комбинация, полученная циклической перестановкой исходной комбинации (циклическим сдвигом), также принадлежит данному коду:

Вторым свойством всех разрешенных комбинаций циклических кодов является их делимость без остатка на некоторый выбранный полином, называемый производящим.

Эти свойства используются при построении кодов кодирующих и декодирующих устройств, а также при обнаружении и исправлении ошибок.

Циклические коды - это целое семейство помехоустойчивых кодов (одной из разновидностей которых являются коды Хэмминга), обеспечивающее большую гибкость с точки зрения возможности реализации кодов с необходимой способностью обнаружения и исправления ошибок, возникающих при передаче кодовых комбинаций по каналу связи. Циклический код относится к систематическим блочным (л, &)-кодам, в которых к первых разрядов представляют собой комбинацию первичного кода, а последующие (л - к) разрядов являются проверочными.

В основе построения циклических кодов лежит операция деления передаваемой кодовой комбинации на порождающий неприводимый полином степени г. Остаток от деления используется при формировании проверочных разрядов. При этом операции деления предшествует операция умножения, осуществляющая сдвиг влево ^-разрядной информационной кодовой комбинации на г разрядов.

При декодировании принятой л-разрядной кодовой комбинации опять производится деление на порождающий (производящий, образующий) полином.

Синдромом ошибки в этих кодах является наличие остатка от деления принятой кодовой комбинации на порождающий полином. Если синдром равен нулю, то считается, что ошибок нет. В противном случае с помощью полученного синдрома можно определить номер разряда принятой кодовой комбинации, в котором произошла ошибка, и исправить ее.

Однако не исключается возможность возникновения в кодовых комбинациях многократных ошибок, что может привести к ложным исправлениям и (или) необнаружению ошибок при трансформации одной разрешенной комбинации в другую.

Пусть общее число битов в блоке равно я, из них полезную информацию несут в себе т битов, тогда в случае ошибки имеется возможность исправить j битов. Зависимость 5 от п и т для кодов можно определить по табл. 2.6.

Таблица 2.6

Зависимость общего числа разрядов комбинаций от количества информационных и исправляемых разрядов

Увеличивая разность (п - т), можно не только нарастить число исправляемых бит s, но и обнаружить множественные ошибки. Проценты обнаруживаемых множественных ошибок приведены в табл. 2.7.

Таблица 2.7

Проценты обнаруживаемых множественных ошибок

Описание циклических кодов и их построение удобно проводить с помощью многочленов (или полиномов). Запись комбинации в виде полинома используется для того, чтобы отобразить формализованным способом операцию циклического сдвига исходной кодовой комбинации. Так, «-элементную кодовую комбинацию можно описать полиномом (п - 1) степени:

где a„_j = {0, 1}, причем а„_, = 0 соответствуют нулевым элементам комбинации, д„_, = 1 - ненулевым; i - номер разряда кодовой комбинации.

Представим полиномы для конкретных 4-элементных комбинаций:

Операции сложения и вычитания являются эквивалентными и ассоциативными и выполняются по модулю 2:

Примеры выполнения операций:

Операция деления является обычным делением многочленов, только вместо вычитания используется сложение по модулю 2:

Циклический сдвиг кодовой комбинации - перемещение ее элементов справа налево без нарушения порядка их следования, так что крайний левый элемент занимает место крайнего правого.

Основные свойства и название циклических кодов связаны с тем, что все разрешенные комбинации битов в передаваемом сообщении (кодовые слова) могут быть получены путем операции циклического сдвига некоторого исходного кодового слова.

Допустим, задана исходная кодовая комбинация и соответствующий ей полином:

Умножим а(х) на х:

Так как максимальная степень х в кодовой комбинации длиной п не превышает (л - 1), то из правой части полученного выражения для получения исходного полинома необходимо вычесть а„(х" - 1). Вычитание а„(х" - 1) называется взятием остатка по модулю (х п - 1).

Сдвиг исходной комбинации на / тактов можно представить следующим образом: а(х) ? У - а„(х" - 1), т.е. умножением а(х) нах" и взятием остатка по модулю (х" - 1). Взятие остатка необходимо при получении многочлена степени, большей или равной п.

Идея построения циклических кодов базируется на использовании неприводимых многочленов. Неприводимым называется многочлен, который не может быть представлен в виде произведения многочленов низших степеней, т.е. делиться только на самого себя или на единицу и не делиться ни на какой другой многочлен. На такой многочлен делится без остатка двучлен (х" + 1). Неприводимые многочлены в теории циклических кодов играют роль порождающих полиномов.

Возвращаясь к определению циклического кода и учитывая запись операций циклического сдвига кодовых комбинаций, можно записать порождающую матрицу циклического кода в следующем виде:

где Р(х) - исходная кодовая комбинация, на базе которой получены все остальные - 1) базовые комбинации;

С, = 0 или Cj = 1 («О», если результирующая степень полинома Р(х)-х‘ не превосходит (л - 1), или «1» - если превосходит).

Комбинация Р(х) называется порождающей (генераторной) комбинацией. Для построения циклического кода достаточно верно выбрать Р(х). Затем все остальные кодовые комбинации получаются такими же, как и в групповом коде.

Порождающий полином должен удовлетворять следующим требованиям:

  • Р(х) должен быть ненулевым;
  • вес Р(х ) не должен быть меньше минимального кодового расстояния: V(P(x)) > d mm ;
  • Р(х) должен иметь максимальную степень к (к - число избыточных элементов в коде);
  • Р(х) должен быть делителем полинома (х" - 1).

Выполнение последнего условия приводит к тому, что все рабочие кодовые комбинации циклического кода приобретают свойство делимости на Р(х) без остатка. Учитывая это, можно дать другое определение циклического кода: циклический код - это код, все рабочие комбинации которого делятся на порождающий полином без остатка.

Для определения степени порождающего полинома можно воспользоваться выражением г > log 2 (и + 1), где п - размер передаваемого пакета за один раз, т.е. длина строящегося циклического кода.

Примеры порождающих полиномов приведены в табл. 2.8.

Таблица 2.8

Примеры порождающих полиномов

Алгоритм получения разрешенной кодовой комбинации циклического кода из комбинации простого кода следующий.

Пусть заданы полином Р(х) = а г _ { х г + а г _ 2 х г ~ 1 + ... + 1, определяющий корректирующую способность кода, и число проверочных разрядов к, а также исходная комбинация простого от-элементного кода и информационные разряды в виде многочлена А т (х).

Требуется определить разрешенную кодовую комбинацию циклического кода (и, к).

  • 1. Представляем исходную кодовую комбинацию в виде многочлена А т (х). Умножаем многочлен исходной кодовой комбинации на х г: А т (х ) х г. Степень порождающего полинома г равна значению старшего разряда исходной кодовой комбинации.
  • 2. Определяем проверочные разряды, дополняющие исходную информационную комбинацию до разрешенной, как остаток от деления полученного в предыдущем пункте произведения на порождающий

полином:

Остаток деления обозначим как R(x).

3. Окончательно разрешенная кодовая комбинация циклического

кода определится как = А т (х) ? x r + R(x).

Для определения ошибок в принятой кодовой комбинации достаточно разделить ее на порождающий полином. Если принятая комбинация - разрешенная, то остаток от деления будет нулевым. Ненулевой остаток свидетельствует о том, что принятая комбинация содержит ошибки. По виду остатка (синдрома) можно в некоторых случаях также сделать вывод о характере ошибки и ее местоположении и исправить ошибку.

Алгоритм определения ошибки следующий.

Пусть заданы «-элементные комбинации (п = к + т).

  • 1. Выявляем факт наличия ошибки. Получаем остаток от деления принятой комбинации А п -(х) на порождающий полином Р(х): А (х)
  • --- = Rq(x). Наличие остатка R 0 (x) при (Л 0 (х) ф 0) свидетельствует Р(х)

об ошибке.

2. Делим полученный полином #(х) = Л„_, (х) 0 Rq (х) на образующий Р г (х): Ш-1 = R(x), где R(x) - текущий остаток.

3. Сравниваем ЛДх) и R(x). Если они равны, то ошибка произошла в старшем разряде. Если нет, то увеличиваем степень принятого полинома на х и снова делим:

4. Сравниваем полученный остаток с Rq(x). Если они равны, то ошибка произошла во втором разряде. Если они не равны, то умножаем Щх) х 2 и повторяем эти операции до тех пор, пока не получим

R(x) = ад.

Ошибка будет в разряде, соответствующем числу, на которое повышена степень Щх), плюс 1. Например, в случае равенства R(x) и ЛДх)

Простейший циклический код с позволяет обнаруживать одиночные ошибки и ошибки нечетной кратности. Образующий полином этого кода имеет вид Среди неприводимых многочленов, входящих в разложение данный полином является многочленом наименьшей степени Таким образом, при любом числе информационных разрядов необходим только один проверочный разряд. Значение символа этого разряда обеспечивает четность числа единиц в любой разрешенной кодовой комбинации. Полученный циклический код с проверкой на четность способен обнаруживать не только одиночные ошибки в отдельных разрядах, но и ошибки в любом нечетном числе разрядов.

Пример. Построить циклический код для Поскольку образующий полином является полиномом 1-й степени, число проверочных разрядов Следовательно, Для построения циклического кода строим производящую матрицу

Для построения дополнительной матрицы находим остатки от деления поаледней строки единичной транспонированной матрицы, дополненной нулями, на выбранный полином:

Таким образом, дополнительная матрица С, к имеет вид

Теперь строим производящую матрицу

Строки данной матрицы являются тремя первыми комбинациями кода. Остальные из разрешенных комбинаций могут быть получены суммированием по модулю два всевозможных сочетаний строк матрицы Полученные разрушенные кодовые комбинации приведены в табл. 39.

Таблица 39 (см. скан)

Известный интерес представляет рассмотрение следующего простейшего кода с образованного с помощью неприводимого полинома второй степени

Общий вид производящей матрицы циклического кода, образованного полиномом отличается структурой дополнительной матрицы имеющей два столбца.

Легко убедиться, что при делении на данный образующий многочлен одночленов, выражающих строки

единичной матрицы (для нахождения дополнительной матрицы образуется. три вида остатков: 11, 01 и 10. Следовательно, вес каждой комбинации полученного -кода будет не менее двух. Минимальное кодовое расстояние между двумя любыми комбинациями также равно двум. Но такими же величинами характеризуется и простейший код с одной проверкой на четность, образованный двучленом первой степени Однако корректирующая способность обоих кодов неодинакова. Рассматриваемый код имеет большую избыточность и позволяет обнаруживать не только любые ошибки нечетной кратности, но и любые парные смежные ошибки, а также все ошибки, разделенные одним неискаженным элементом .

6. Исправление ошибок с помощью циклических кодов

В разделе 3 было показано, что для декодирования правильно принятого кодового слова, т. е. нахождения соответствующего информационного слова, достаточно многочлен, соответствующий принятому кодовому слову, разделить на порождающий многочлен кода. Однако если при передаче произошли ошибки, то в процессе декодирования необходимо эти ошибки исправить.

Поскольку циклические коды являются линейными, то процесс обнаружения и исправления ошибок связан с нахождением синдрома принятого вектора. Напомним, что синдром вектора u вычисляется как произведение вектора на транспонированную проверочную матрицу кода, т. е. s u = uH T . В случае циклического кода синдром равен остатку от деления соответствующего многочлена на порождающий многочлен кода, если проверочная матрица строится определенным образом. Иными словами, если g (x ) - порождающий многочлен кода, то синдром вектора u равен остатку от деления u (x ) на g (x ). Если ошибок не было, то остаток, а следовательно, и синдром принятого вектора, равен 0.

Для того чтобы произвести исправление ошибок нам необходимо построить таблицу, в которой в одном столбце будут все возможные векторы ошибок, которые данный код может исправить, а во втором столбце - соответствующие им синдромы. Исправление ошибок, общее для всех линейных кодов, будет следующим:

1. Для принятого слова находим синдром многочлена, соответствующего принятому слову.

2. Если синдром не равен 0, то по полученному синдрому (остатку от деления) находим в таблице соответствующий ему вектор ошибок.

3. Исправляем принятое слово путем сложения по модулю 2 с вычисленным вектором ошибок.

Первый шаг, который выполняется умножением принятого слова на транспонированную проверочную матрицу, для циклических кодов очень простой, если матрица H является проверочной матрицей систематического кода. В этом случае, j -я строка транспонированной матрицы H T соответствует остатку от деления многочлена x n -1- j на порождающий многочлен кода, и синдром равен остатку от деления многочлена, соответствующего принятому слову, на порождающий многочлен кода.

Пример: Рассмотрим циклический (7,1)-код, порожденный многочленом g (x ) = x 6 + x 5 + x 4 + x 3 + x 2 + x +1. Код состоит из двух слов 0000000 и 1111111 и исправляет все комбинации из 3 или менее ошибок. Образующими являются все булевы векторы длины 7 веса 0, 1, 2 и 3. Проверочная матрица строится по частному (x +1) от деления x 7 +1 на x 6 + x 5 + x 4 + x 3 + x 2 + x +1 и имеет вид

Пусть принято слово 11101101, которое соответствует многочлену x 6 + x 5 + x 4 + x 2 + 1. Остаток от деления этого многочлена на порождающий многочлен кода равен x 3 + x . Непосредственной проверкой можно убедиться, что при умножении вектора u = 1110101 на транспонированную матрицу H T , так же как и при умножении вектора 0001010 на H T получается вектор 0001010, который соответствует многочлену x 3 + x . Вектор, соответствующий многочлену x 3 + x , имеет вес 2, т. е. является образующим смежного класса. Сложив принятый вектор 11101101 с образующим 0001010, мы получим кодовое слово 1111111, т. е. ошибка будет исправлена.

Для линейных кодов число различных синдромов равно 2 n - k , где n -k - число проверочных символов. Поэтому для кодов с большой длиной кодового слова, т. е. с достаточно большим числом проверочных символов, таблица синдромов получается очень большая, и потребуется много времени на поиск вектора ошибок. Для уменьшения количества строк в этой таблице для циклических кодов можно воспользоваться строгой математической структурой таких кодов. Основной теоремой является теорема Мегитта, которая устанавливает связь между циклическими сдвигами вектора и их остатками от деления на порождающий многочлен кода.

Теорема 6.1 . (Меггит). Пусть s - синдром вектора u длины n . Синдром циклического сдвига вектора u совпадает с синдромом вектора, соответствующего полиному xs (x ).

Пример: Рассмотрим (7,4)-код Хэмминга, который является циклическим кодом, порожденным многочленом g (x ) = x 3 + x + 1. двоичный вектор 1011000 является кодовым словом, так как соответствующий многочлен x 6 + x 4 + x 3 делится на g (x ). Предположим, что при передаче этого кодового слова произошла одна ошибка в разряде, соответствующем x 4 , и принято слово u = 1001000. Синдром s принятого вектора равен 110, что соответствует многочлену x 2 + x .

Рассмотрим циклический сдвиг 0010001 вектора u . Ему соответствует многочлен x 4 + 1. Непосредственной проверкой можно убедиться, что остаток от деления многочлена x 4 + 1 на многочлен x 3 + x + 1 равен x 2 + x + 1, т. е. синдром вектора 0010001 равен 111. Остаток от деления полинома xs (x ) = x 3 + x 2 на x 3 + x + 1 также равен x 2 + x + 1.

Используя теорему Мегитта, в таблице синдромов можно хранить только синдромы векторов ошибок, соответствующие ошибкам в старшем разряде. Процедура исправления ошибок содержит следующие шаги:

1. Находим синдром принятого вектора, разделив соответствующий многочлен на порождающий многочлен кода. Если остаток от деления, содержащийся в регистре равен 0, то ошибок не было, и частное от деления есть искомое информационное слово. Иначе сравниваем остаток от деления со всеми синдромами, содержащимися в таблице.

2. Если остаток совпал с одним из синдромов таблицы, то прибавляем соответствующий вектор ошибок к принятому слову, делим полученное слово на порождающий многочлен кода; частное от деления есть искомое информационное слово. Если остаток xs (x ) не совпадает ни с одним из синдромов таблицы, умножаем s (x ) на x и делим многочлен xs (x ) на порождающий многочлен кода.

3. Выполняем Шаг 2 до тех пор, пока после p шагов остаток не совпадет с одним из синдромов таблицы. После этого циклически сдвигаем соответствующий вектор ошибок p раз, прибавляем полученный вектор к принятому слову, делим полученное слово на порождающий многочлен кода; частное от деления есть искомое информационное слово.

Пример: Рассмотрим циклический (7,4)-код Хэмминга, порожденным многочленом g (x ) = x 3 + x + 1. Соответствующая таблица декодирования с синдромами имеет следующий вид.

и предположим, что в переданном кодовом слове 0001011 произошла одна ошибка, т. е. принято, например, слово 0101011, которому соответствует многочлен x 5 + x 3 + x + 1. Остаток от деления многочлена x 5 + x 3 + x + 1 на порождающий многочлен кода g (x ) = x 3 + x + 1 равен x 2 + x + 1, т. е. синдром принятого вектора отличен от 0 и равен 111. Такого синдрома в таблице нет, и следовательно, в старшем разряде ошибок нет. Умножаем многочлен x 2 + x + 1, соответствующий синдрому 111, на x и делим полученный многочлен x 3 + x 2 + x на g (x ). Остаток от деления многочлена x 3 + x 2 + x на x 3 + x + 1 равен x 2 + 1, т. е. синдром 101, соответствующий остатку, совпадает с синдромом в сокращенной таблице декодирования. Соответственно, образующий 100000 смежного класса сдвигается на один разряд влево, и полученный вектор 0100000 складывается с принятым вектором 0101011. В результате получается слово 0001011, которое и является переданным кодовым словом, т. е. ошибка будет исправлена.

Можно упростить этот декодер. В частности, при циклическом сдвиге принятого слова многие из исправляемых конфигураций ошибок могут появиться несколько раз. Если удалить один из этих синдромов, то при соответствующем циклическом сдвиге ошибка все-таки будет найдена. Следовательно, для каждой такой пары достаточно запоминать только один синдром.