Циклические коды
Код называется циклическим, если из того, что кодовое слово
U={ un-1, … , u1, u0}Mразр
принадлежит множеству разрешенных слов следует, что слово
={ un-2, … , u0, un-1,}Mразр,
, полученное сдвигом cлова U влево по кругу тоже принадлежит множеству разрешенных слов.
Циклический код является частным случаем полиномиальных кодов, в которых кодовое слово U={u0, u1, … ,un-1} представляется в виде полинома от фиктивной переменной x с коэффициентами, равными числам кода. Если код построен над полем GF(2)={0,1}, то коэффициенты многочлена - числа 0 или 1:
.
Замечание. Степени фиктивной переменной x используются только для обозначения места соответствующей компоненты кодового вектора в регистре сдвига и никакой иной смысловой нагрузки не несут.
Например для кодового слова U=[1010101] значности n=7 полином имеет вид
.
Над полиномами определены все арифметические операции по обычным правилам, в том числе и умножение в столбик и деление углом. При этом сложение и вычитание коэффициентов выполняется как суммирование по модулю два. Если степень результата превышает (n-1), то результат приводится по модулю полинома (хn+1).
Замечание. Результатом приведения одного полинома по модулю другого полинома является полином, являющийся остатком от деления первого на второй (модуль).
Циклическая перестановка соответствует умножению u(x) на x. В нашем случае:
,
п
x7+
x5+
x3+
x
x7+1 x7+1
. x5+
x3+
x+1=u`(x)
u` (x) =x5+ x3+ x+1 и u`=[0101011],
что соответствует сдвигу битов кодового слова влево по кругу на один разряд.
Таким образом, умножение на любой полином соответствует определенной последовательности циклических сдвигов кода и да дает полином, также соответствующий разрешенному кодовому слову. То есть множество разрешенных слов образует группу и циклический код является групповым.
Если не приводить полином, то при умножении полинома степени k на полином степени m степени полиномов складываются, и полином-результат имеет степень n=k+m. Исходное кодовое слово длины k при этом приобретает m новых разрядов, которые могут играть роль проверочных символов.
Циклический код это также блочный (n, k)-код, с длиной блока n, содержащий k информационных символов и m = n – k проверочных символов.
Операция кодирования для циклического кода состоит в умножении любого полинома p(x) степени k-1, соответствующего информационному подблоку на один и тот же полином g(x) степени (n-k), называемый образующим или порождающим или кодирующим полиномом (многочленом).
При этом число разрешенных кодовых слов остается прежним 2k, а общее число возможных кодовых слов становится равным 2n.
При декодировании выполняется деление на тот же образующий полином. При этом разрешенные кодовые слова делятся без остатка, а появление ненулевого остатка – это признак ошибки.
Ненулевой остаток от деления s(x) называется синдромным многочленом. Пусть вместо кодового слова U получено слово , которому соответствует многочлен. При этом вектор ошибки e, содержащий единицы в ошибочных позициях может быть получен как e= U .
Синдромный многочлен, определяемый как остаток от деления на порождающий многочлен g(x) зависит только от вектора ошибок:
, так как .
Этот факт используется при построении таблицы синдромов, применяемой при декодировании. Для всех возможных значений вектора ошибки e(x) вычисляются синдромы s(x) и записываются в таблицу. В процессе декодирования по синдрому s(x) находится соответствующий вектор ошибки e(x) и восстанавливается переданное слово как
u(x) =+ e(x).
Ошибка останется необнаруженной в том и только в том случае, если многочлен, соответствующий вектору ошибки делится на g(x) без остатка, то есть если вектор ошибки совпадет с разрешенным кодовым словом.
Таким образом, процесс декодирования циклических кодов (как и всех линейных блочных кодов) можно разбить на три этапа:
Вычисление синдрома
Определение ошибочных компонент принятого слова (вектора ошибки)
Исправление ошибки или выдача сообщения о наличии неисправимой ошибки