Циклический код

Материал из testwiki
Перейти к навигации Перейти к поиску

Шаблон:Нет источников Циклический код — линейный, блочный код, обладающий свойством цикличности, то есть каждая циклическая перестановка кодового слова также является кодовым словом. Используется для преобразования информации для защиты её от ошибок (см. Обнаружение и исправление ошибок).

Введение

Пусть y=(y0,y1,,yn1)Ln — слово длины n над алфавитом из элементов конечного поля L=GF(q) и y(x)=y0+y1x+y2x2++yn1xn1 — полином, соответствующий этому слову, от формальной переменной x. Видно, что это соответствие является изоморфизмом линейных пространств. Так как «слова» состоят из букв из поля, то их можно складывать и умножать (поэлементно), причём результат будет в том же поле. Полином, соответствующий линейной комбинации y=m1y1+m2y2 пары слов y1=(y1,0,,y1,n1) и y2=(y2,0,,y2,n1), равен линейной комбинации полиномов этих слов y(x)=k=0n1(m1y1k+m2y2k)xk=m1y1(x)+m2y2(x).

Это позволяет рассматривать множество слов длины n над конечным полем как линейное пространство полиномов со степенью не выше n − 1 над полем GF(q).

Алгебраическое описание

Если c1 — кодовое слово, получающееся циклическим сдвигом на один разряд влево из слова c, то соответствующий ему полином c1(x) получается из предыдущего умножением на x:

c1(x)=xc(x)mod(xn1), пользуясь тем, что xn1mod(xn1).

Сдвиг вправо и влево соответственно на j разрядов:

cj(x)=xjc(x)mod(xn1),
cj(x)xj=c(x)mod(xn1).

Если m(x) — произвольный полином над полем GF(q), и c(x) — кодовое слово циклического (n,k) кода, то m(x)c(x)mod(xn1) — тоже кодовое слово этого кода.

Порождающий полином

Определение

Порождающим полиномом циклического (n,k) кода C называется такой ненулевой полином g(x)=i=0rgixi из C, степень которого наименьшая, и коэффициент при старшей степени gr=1.

Теорема 1

Если C — циклический (n,k) код, и g(x) — его порождающий полином, то степень g(x) равна r=nk, и каждое кодовое слово может быть единственным образом представлено в виде

c(x)=m(x)g(x),

где степень m(x) меньше или равна k1.

Теорема 2

g(x) — порождающий полином циклического (n,k) кода — является делителем двучлена xn1.

Следствия

Таким образом, в качестве порождающего полинома можно выбирать любой полином делитель xn1. Степень выбранного полинома будет определять количество проверочных символов r, число информационных символов k=nr.

Порождающая матрица

Полиномы g(x),xg(x),x2g(x),,xk1g(x) линейно независимы, иначе m(x)g(x)=0 при ненулевом m(x), что невозможно.

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

mG=(m0,m1,,mk1)[g(x)xg(x)xk1g(x)]=m(x)g(x),

где G является порождающей матрицей, m(x) — информационным полиномом.

Матрицу G можно записать в символьной форме:

G=[g0g1gr1gr000g0gr2gr1gr0000g0g1gr].

Проверочная матрица

Для каждого кодового слова циклического кода справедливо c(x)=0modg(x). Поэтому проверочную матрицу можно записать как

H=[1xx2xn2xn1]modg(x).

Тогда

cHT=i=0n1cixi=0modg(x).

Кодирование

Несистематическое

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

c(x)=m(x)g(x).

Оно может быть реализовано при помощи перемножения полиномов.

Систематическое

При систематическом кодировании кодовое слово формируется в виде информационного подблока и проверочного:

c(x)=[s(x)m(x)].

Пусть информационное слово образует старшие степени кодового слова, тогда

c(x)=xrm(x)+s(x),r=nk.

Тогда из условия c(x)=xrm(x)+s(x)=0modg(x) следует

s(x)=xrm(x)modg(x).

Это уравнение и задаёт правило систематического кодирования. Оно может быть реализовано при помощи многотактных линейных фильтров (МЛФ).

Примеры

Двоичный (7,4,3) код

В качестве делителя x71 выберем порождающий полином третьей степени g(x)=x3+x+1, тогда полученный код будет иметь длину n=7, число проверочных символов (степень порождающего полинома) r=3, число информационных символов k=4, минимальное расстояние d=3.

Порождающая матрица кода:

G=[1101000011010000110100001101],

где первая строка представляет собой запись полинома g(x) коэффициентами по возрастанию степени.

Остальные строки — циклические сдвиги первой строки.

Проверочная матрица:

H=[100101101011100010111],

где i-й столбец, начиная с 1-го, представляет собой остаток от деления xi1 на полином g(x), записанный по возрастанию степеней, начиная сверху.

Так, например, 4-й столбец получается h4(x)=x3modg(x)=x+1, или в векторной записи [110].

Легко убедиться, что GHT=0.

Двоичный (15,7,5) БЧХ код

В качестве порождающего полинома g(x) можно выбрать произведение двух делителей x151:

g(x)=g1(x)g2(x)=(x4+x+1)(x4+x3+x2+x+1)=x8+x7+x6+x4+1.

Тогда каждое кодовое слово можно получить с помощью произведения информационного полинома m(x) со степенью k1 таким образом:

c(x)=m(x)g(x).

Например, информационному слову m=[1000111] соответствует полином m(x)=x6+x5+x4+1, тогда кодовое слово c(x)=(x6+x5+x4+1)(x8+x7+x6+x4+1)=x14+x12+x9+x7+x5+1, или в векторном виде c=[100001010100101].

См. также

Ссылки