Код Боуза — Чоудхури — Хоквингема

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

Коды Боуза — Чоудхури — Хоквингема, сокращённо БЧХ-коды (Шаблон:Lang-en) — в теории кодирования это широкий класс циклических кодов, применяемых для защиты информации от ошибок. Отличается возможностью построения кода с заранее определёнными корректирующими свойствами, а именно, минимальным кодовым расстоянием. Частным случаем БЧХ-кодов является код Рида — Соломона.

Код был разработан Шаблон:Нп5 в 1959 году и независимо от него Шаблон:Нп5 и Шаблон:Нп5 в 1960 годуШаблон:SfnШаблон:SfnШаблон:Sfn.

Формальное описание

БЧХ-код является циклическим кодом, который можно задать порождающим полиномом. Для его нахождения в случае БЧХ-кода необходимо заранее определить длину кода n (она не может быть произвольной) и требуемое минимальное расстояние dn. Найти порождающий полином можно следующим образом.

Пусть α — примитивный элемент поля GF(qm) (то есть αqm1=1, αi1, i<qm1), пусть β=αs, — элемент поля GF(qm) порядка n, s=(qm1)/n. Тогда нормированный полином g(x) минимальной степени над полем GF(q), корнями которого являются d1 подряд идущих степеней βl0,βl0+1,,βl0+d2 элемента β для некоторого целого l0 (в том числе 0 и 1), является порождающим полиномом БЧХ-кода над полем GF(q) с длиной n и минимальный расстоянием d0d.

Поясним, почему у получившегося кода будут именно такие характеристики (длина кода n, минимальное расстояние d0). Действительно, как показано у СагаловичаШаблон:Sfn, длина БЧХ-кода равна порядку элемента β, если d>2, и равна порядку элемента βl0, если d=2. Так как случай d=2 нам не интересен (такой код не может исправлять ошибки, только обнаруживать), то длина кода будет равна порядку элемента β, то есть равна n. Минимальное расстояние d0 может быть больше d, когда корнями минимальных функцийШаблон:Sfn от элементов βl0,βl0+1,,βl0+d2 будут элементы, расширяющие последовательность, то есть элементы βl0+d1,βl0+d,,βl0+d02.

Число проверочных символов r равно степени g(x), число информационных символов k=nr, величина d называется конструктивным расстоянием БЧХ-кода. Если n=qm1, то код называется примитивным, иначе — непримитивным.

Так же, как и для циклического кода, кодовый полином c(x) может быть получен из информационного полинома m(x) степени не больше k1, путём перемножения m(x) и g(x):

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

Построение

Для нахождения порождающего полинома необходимо выполнить несколько этаповШаблон:Sfn:

  • выбрать q, то есть поле GF(q), над которым будет построен код;
  • выбрать длину n кода из условия n=(qm1)/s, где m,s — целые положительные числа;
  • задать величину d конструктивного расстояния;
  • построить циклотомические классы элемента β=αs поля GF(qm) над полем GF(q), где α — примитивный элемент GF(qm);
  • поскольку каждому такому циклотомическому классу соответствует неприводимый полином над GF(q), корнями которого являются элементы этого и только этого класса, со степенью равной количеству элементов в классе, то выбрать βl0,βl0+1,,βl0+d2 таким образом, чтобы суммарная длина циклотомических классов была минимальна; это делается для того, чтобы при заданных характеристиках кода n и d минимизировать количество проверочных символов k;
  • вычислить порождающий полином g(x)=f1(x)f2(x)fh(x), где fi(x) — полином, соответствующий i-му циклотомическому классу; или вычислить g(x), как НОК минимальных функций от элементов βl0,βl0+1,,βl0+d2.

Примеры кодов

Примитивный двоичный (15, 7, 5) код

Пусть q=2, требуемая длина кода n=241=15, и минимальное расстояние d0d=5. Возьмем α — примитивный элемент поля GF(16), и α,α2,α3,α4 — четыре подряд идущих степеней элемента α. Они принадлежат двум циклотомическим классам над полем GF(2), которым соответствуют неприводимые полиномы f1(x)=x4+x+1 и f2(x)=x4+x3+x2+x+1. Тогда полином

g(x)=f1(x)f2(x)=x8+x7+x6+x4+1

имеет в качестве корней элементы α,α2,α3,α4 и является порождающим полиномом БЧХ-кода с параметрами (15,7,5).

16-ричный (15, 11, 5) код (код Рида — Соломона)

Пусть n=q1=15, и α — примитивный элемент GF(16). Тогда

g(x)=(xα)(xα2)(xα3)(xα4)=x4+α13x3+α6x2+α3x+α10.

Каждый элемент поля GF(16) можно сопоставить 4 битам, поэтому одно кодовое слово эквивалентно 60 = 15 × 4 битам, таким образом набору из 44 битов ставится в соответствие набор из 60 битов. Можно сказать, что такой код работает с полубайтами информации.

Кодирование

Для кодирования кодами БЧХ применяются те же методы, что и для кодирования циклическими кодами.

Методы декодирования

Коды БЧХ являются циклическими кодами, поэтому к ним применимы все методы, используемые для декодирования циклических кодов. Однако существуют гораздо лучшие алгоритмы, разработанные именно для БЧХ-кодов[1].

Главной идеей в декодировании БЧХ-кодов является использование элементов конечного поля для нумерации позиций кодового слова (или, эквивалентно, в порядке коэффициентов ассоциированного многочлена). Ниже приведена такая нумерация для вектора r=(r0,r1,,rn1), соответствующего многочлену r(x).

значения r0 r1 rn1
локаторы позиций 1 α αn1

Пусть принятое слово ассоциировано с полиномом r(x)=ν(x)+e(x), где многочлен ошибок определён как: e(x)=eJ1xJ1+eJ2xJ2++eJνxJν, где νtd — число ошибок в принятом слове. Множества {eJ1,eJ2,,eJν} и {αJ1,αJ2,,αJν} называют значениями ошибок и локаторами ошибок соответственно, где eJGF(q), и αGF(qm).

Синдромы определены как значения принятого полинома r(x) в нулях порождающего многочлена кода:

S1=r(αb)=eJ1αbJ1+eJ2αbJ2++eJναbJν,
S2=r(αb+1)=eJ1α(b+1)J1+eJ2α(b+1)J2++eJνα(b+1)Jν,
S2td=r(αb+2td1)=eJ1α(b+2td1)J1+eJ2α(b+2td1)J2++eJνα(b+2td1)Jν,

где 2td=d1.

Для нахождения множества локаторов ошибок введём в рассмотрение многочлен локаторов ошибок

σ(x)=l=1ν(1+αJlx)=1+σ1x+σ2x2++σνxν,

корни которого равны обратным величинам локаторов ошибок. Тогда справедливо следующее соотношение между коэффициентами многочлена локаторов ошибок и синдромамиШаблон:Sfn:

σ1St+σ2St1++σtS1=St+1,
σ1St+1+σ2St++σtS2=St+2,
σ1S2t1+σ2S2t2++σtSt=S2t.

Известны следующие методы для решения этой системы уравнений относительно коэффициентов многочлена локаторов ошибок σi, i=1,2,,ν (ключевая система уравнений).

  • Алгоритм Берлекемпа — Мэсси (BMA)Шаблон:Переход. По числу операций в конечном поле этот алгоритм обладает высокой эффективностью. BMA обычно используется для программной реализации или моделирования кодов БЧХ и кодов Рида — Соломона.
  • Евклидов алгоритм (ЕА)Шаблон:Переход. Из-за высокой регулярности структуры этого алгоритма его широко используют для аппаратной реализации декодеров БЧХ и кодов Рида — Соломона.
  • Прямое решение (алгоритм Питерсона — Горенстейна — Цирлера, ПГЦ). Исторически это первый метод декодирования, найденный Питерсоном для двоичного случая (q=2), затем Горенстейном и Цирлером для общего случая. Этот алгоритм находит коэффициенты многочлена локаторов ошибок прямым решением соответствующей системы линейных уравнений. В действительности, так как сложность этого алгоритма растет как куб минимального расстояния d, прямой алгоритм может быть использован только для малых значений d, однако именно этот алгоритм лучше всего проясняет алгебраическую идею процесса декодирования.

Алгоритм Берлекэмпа — Мэсси

Шаблон:Main Этот алгоритм лучше всего рассматривать как итеративный процесс построения минимального регистра (сдвига) с обратной связью, генерирующего известную последовательность синдромов S1,S2,,S2td. Его фактическая цель — построить полином σi+1(x) наименьшей степени, удовлетворяющему уравнению

j=0li+1Skjσji+1=0,li<k<i+1.

Решение этого уравнения эквивалентно условию

σi+1(x)=1+σ1i+1x++σli+1i+1xli+1.

Итеративный процесс построения такого многочлена и есть Алгоритм Берлекемпа — Мэсси.

Евклидов алгоритм

В основе этого метода лежит широко известный алгоритм Евклида по нахождению наибольшего общего делителя двух чисел (НОД), только в данном случае ищем НОД не двух чисел, а двух полиномов. Обозначим полином значений ошибок как Λ=σ(x)S(x), где синдромный полином равен S(x)=1+S1x++S2tdx2td. Из системы уравнений следует, что Λ(x)=σ(x)S(x)modx2td+1. Задача по сути сводится к тому чтобы определить Λ(x), удовлетворяющий последнему уравнению и при этом степени не выше td. По сути такое решение и будет давать расширенный алгоритм Евклида, примененный к многочленам r0(x)=xd и r1(x)=S(x), где d=2td+1. Если на j-м шаге расширенный алгоритм Евклида выдает решение rj=aj(x)x2td+1+bj(x)S(x), такое что deg[rj(x)]td, то Λ(x)=rj(x), и σi(x)=bj(x). При этом найденный полином aj(x) дальше не принимает участия в декодировании (он ищется только как вспомогательный). Таким образом будет найден полином локаторов ошибок σ(x).

Прямое решение (алгоритм Питерсона — Горенстейна — Цирлера, ПГЦ)

Пусть БЧХ-код над полем GF(q) длины n и с конструктивным расстоянием d задаётся порождающим полиномом g(x), который имеет среди своих корней элементы βl0,βl0+1,,βl0+d2, βGF(qm), βn=1, l0 — целое число (например, 0 или 1). Тогда каждое кодовое слово обладает тем свойством, что c(βl01+j)=0, j=1,2,,d1. Принятое слово r(x) можно записать как r(x)=c(x)+e(x), где e(x) — полином ошибок. Пусть произошло ut=(d1)/2 ошибок на позициях i1,i2,,iu (t — максимальное число исправляемых ошибок), значит e(x)=ei1xi1+ei2xi2++eiuxiu, а ei1,ei2,,eiu — величины ошибок.

Можно составить jсиндром Sj принятого слова r(x):

Sj=r(βl01+j)=e(βl01+j),j=1,,d1.

Задача состоит в нахождении числа ошибок u, их позиций i1,i2,,iu и их значений ei1,ei2,,eiu при известных синдромах Sj.

Предположим для начала, что u в точности равно t. Запишем синдромы в виде системы нелинейных уравнений в явном виде:

{S1=ei1βl0i1+ei2βl0i2++eitβl0it,S2=ei1β(l0+1)i1+ei2β(l0+1)i2++eitβ(l0+1)it,Sd1=ei1β(l0+d2)i1+ei2β(l0+d2)i2++eitβ(l0+d2)it.

Обозначим через Xk=βik локатор k-й ошибки, а через Yk=eik — величину ошибки, k=1,,t. При этом все Xk различны, так как порядок элемента β равен n, и поэтому при известном Xk можно определить ik как ik=logβXk.

{S1=Y1X1l0+Y2X2l0++YtXtl0,S2=Y1X1l0+1+Y2X2l0+1++YtXtl0+1,Sd1=Y1X1l0+d2+Y2X2l0+d2++YtXtl0+d2.

Составим полином локаторов ошибок:

Λ(x)=(1xX1)(1xX2)(1xXt)=Λtxt+Λt1xt1++Λ1x+1.

Корнями этого полинома являются элементы, обратные локаторам ошибок. Помножим обе части этого полинома на YlXlϑ+t. Полученное равенство будет справедливо для ϑ=l0,l0+1,,l0+d1, l=1,,t:

Λ(x)YlXlϑ+t=ΛtxtYlXlϑ+t+Λt1xt1YlXlϑ+t++Λ1xYlXlϑ+t+YlXlϑ+t.

Если подставить сюда x=Xl1, то получится равенство, справедливое для каждого l{1,2,,t} и при всех ϑ{l0,l0+1,,l0+d1}:

0=ΛtYlXlϑ+Λt1YlXlϑ+1++Λ1YlXlϑ+t1+YlXlϑ+t.

Таким образом для каждого l можно записать своё равенство. Если их просуммировать по l, то получится равенство, справедливое для каждого ϑ{l0,l0+1,,l0+d1}:

0=Λtl=1tYlXlϑ+Λt1l=1tYlXlϑ+1++Λ1l=1tYlXlϑ+t1+l=1tYlXlϑ+t.

Поскольку Sj+p=l=1tYlXll0+j+p1=l=1tYlXlϑ+p, j=1,,d1, ϑ=l0+j1 (то есть, ϑ меняется в тех же пределах, что и ранее), система уравнений для синдромов преобразуется в систему линейных уравнений:

{S1Λt+S2Λt1++StΛ1=St+1,S2Λt+S3Λt1++St+1Λ1=St+2,StΛt+St+1Λt1++S2t1Λ1=S2t,

или, в матричной форме,

S(t)Λ¯(t)=s¯(t),

где

S(t)=(S1S2StS2S3St+1StSt+1S2t1),Λ¯(t)=(ΛtΛt1Λ1),s¯(t)=(St+1St+2S2t).

Если число ошибок и в самом деле равно t, то эта система разрешима, и можно найти значения коэффициентов Λ1,,Λt. Если же число u<t, то определитель матрицы S(t) будет равен 0. Это есть признак того, что количество ошибок меньше t. Поэтому необходимо составить систему, предполагая число ошибок равным t1, вычислить определитель новой матрицы S(t1) и т. д. до тех пор, пока не установим истинное число ошибок.

Поиск Ченя

После того как ключевая система уравнений решена, получаются коэффициенты полинома локаторов ошибок. Его корни (элементы, обратные локаторам ошибок) можно найти простым перебором по всем элементам поля GF(qm). К ним найти элементы, обратные по умножению, — это локаторы ошибок Xk, k=1,,u. Этот процесс легко реализовать аппаратно.

Алгоритм Форни

Общая схема декодирования БХЧ кодов (алгоритм Форни)

По локаторам можно найти позиции ошибок (ik=logβXk), а значения Yk ошибок из системы для синдромов, приняв t=u. Декодирование завершено.

См. также

Примечания

Шаблон:Примечания

Литература

На русском

На других языках