- •I. Алгебраические основы теории циклических кодов
- •1.2. Поля Галуа и их свойства
- •1.3. Основные действия над многочленами в поле двоичных чисел и их реализация
- •1. Сложение многочленов
- •2. Умножение многочленов
- •3. Деление многочленов
- •4. Реализация операций умножения и деления многочленов в поле двоичных чисел
- •4. Циклические коды, исправляющие пачки ошибок (коды файра)
- •5. Циклические коды бчх
- •6. Циклические коды рида—соломона
- •6.2 Построение кодов Рида-Соломона
- •6.3. Использование кодов Рида—Соломона для исправления стираний
- •6.4. Реализация действий над элементами поля
- •7. Мажоритарное декодирование циклических кодов
- •1.Алгебраические основы теории циклических кодов 2
- •Определение группы, кольца, поля
4. Реализация операций умножения и деления многочленов в поле двоичных чисел
Операции умножения и деления многочленов реализуются с помощью регистров сдвига, состоящих из сумматоров, запоминающих устройств и устройств умножения. Сумматор (рис. 1.1, а) представляет собой устройство, осуществляющее сложение по модулю 2 величин на входах 1 и 2. Запоминающее устройство (рис. 1.1,6) служит для хранения в течение определенного времени постоянной величины а.
Рис. 1.1. Функциональное обозначение сумматора по модулю два (а), запоминающего устройства (б) и устройства умножения (в)
Устройство умножения (рис. 1.1, в) осуществляет умножение некоторой входной величины с на постоянный множитель а.
Умножение многочленов
Умножение некоторого произвольного многочлена f1 (х) = = а0 +a1x+…+an-1xn-1+anxn на фиксированный многочлен f2(х)=b0+b1x+…+bk-1xk-1+bkxk осуществляется с помощью регистров сдвига, изображенных на рис. 1.2. Эти регистры строятся по виду многочлена f2 (x) и отличаются лишь расположением сумматоров. Предполагается, что регистр первоначально находится в нулевом состоянии. На вход регистра поступают коэффициенты многочлена f1 (x). начиная со старшей степени, а затем следуют k нулей.
Схема, изображенная на рис. 1.2, а и представляющая собой регистр с вынесенными сумматорами, работает следующим образом. Когда на входе имеет место первый коэффициент ап, то на выходе появляется первый коэффициент произведения f1(x)f2(x), равный anbk. Кроме того, коэффициент аn запоминается в первой ячейке памяти регистра. Со вторым тактом на входе появляется коэффициент an-1 и записывается в первую ячейку памяти, а коэффициент аn этим же тактом переписывается из первой во вторую ячейку регистра. При этом на выходе схемы появляется значение второго коэффициента произведения f1(x) f2 (x), равное (ап-1 bk+ an bк-1 ) и так далее.
Таким образом, схема работает в соответствии с таблицей.
выход
Рис. 1.2. Реализация умножения многочленов с помощью регистров сдвига с вынесенными (а) и встроенными (б) сумматорами
Рассмотрим некоторые характерные особенности построения этих схем для многочленов с двоичными коэффициентами, а именно с коэффициентами 0 и 1.
Умножение на величину bi производим по правилу:
Для bi= 0 :ajbi=aj0=0,
и для bi=1:ajbi=aj*1=aj,
Таким образом, умножение на 0 соответствует разорванной цепи, а умножение на 1 — короткому замыканию.
Пусть, например, f2 (X) = 1 + х+ х3 +x5, т. е. b0= 1, b1= 1,
b2=0,b3=1,b4=0,b5=1.
Схема умножения на многочлен реализуется с помощью регистра с встроенными сумматорами, имеющего вид, представленный на рис. 1.3. Как видно из рис. 1.3, сумматор, на который подан только один вход, может быть устранен.
Аналогично строится регистр с вынесенными сумматорами.
Деление многочленов
Операция деления многочленов может быть реализована с помощью регистра сдвига с обратными связями. Схема деления произвольного многочлена f1(х) = a0+a1x+…+an-1xn-1+anxn на постоянный многочлен f2 (х)= b0+b1x+…+bk-1xk-1+bkxk представлена на рис. 1.4.
Рис. 1.4. Реализация деления на многочлен с помощью регистра сдвига c обратными связями
До поступления многочлена f1 (x) на вход схемы, запоминающие элементы должны находиться в нулевом состоянии. На выходе схемы будет 0 до тех пор, пока первый элемент аn многочлена f1(x) не достигнет конца регистра, т. е. в течение первых k сдвигов. После этого на выходе в соответствии с (1.3) появится первый элемент частного, а именно an/bk или an*bk-1, получаемый умножением элемента аn, следующего из последней ячейки памяти, на величину bk-1. Как видно из (1.3), для каждого ненулевого коэффициента частного с, из делимого необходимо вычесть многочлен cif2(x). Вычитание осуществляется в сумматорах по модулю два после умножения коэффициента частного, например anbk-1 , на множители —bо, b1,…,bk-1.
Поскольку мы рассматриваем двоичное поле, то коэффициенты b0,b1,…,bk-1 могут принимать значения 0 или 1, а значение bк —только 1. Учитывая также, что при сложении по модулю 2 знак минус может быть заменен плюсом, схема на рис. 1.4 значительно упростится, если устройства умножения заменить, как и в регистрах умножения, короткими замыканиями для bi = 1 и обрывом цепи для bi = 0. При этом число встроенных в регистр сумматоров уменьшится и будет равно числу единичных коэффициентов bi= 1 (i =0, 1, .,., k—1).
Пример. Пусть f2 (х) = 1 +x2 + х4 + х5 т. е. bо =1, b1=0,b2=1,b3=0,b4=1,b5=1.
Рис. 1.5. Схема деления на многочлен f(x)= 1 +x2+ х4+x5
Рис.
1.6. Схема, реализующая одновременное
умножение на много член
f2(x)=b0+b1x+…+bkxk
и деление на многочлен f3(x)=c0+c1x+…+ck
bв0
-I-
п.х
+ ...
+ ekxk
и
деление на многочлен /s(*)
=
На основе регистра с встроенными сумматорами может быть построена схема (рис. 1.6), реализующая одновременное умножение на многочлен f2(x)=b0+b1x+b2x2+…+bkxk и деление на многочлен f3(x)=c0+c1x+c2x2+…+ckxk.
2. ОБЩИЕ ПРИНЦИПЫ ПОСТРОЕНИЯ ЦИКЛИЧЕСКИХ КОДОВ
Характерной особенностью циклических кодов является представление кодовых комбинаций длины п многочленами степени п— 1 вида
Вследствие этого циклические коды называют часто полиномиальными кодами. Такое представление циклических кодов позволяет распространить на них приведенные выше свойства полей Галуа.
Другой распространенной формой представления комбинаций циклического кода является векторная форма (coc1c2 ... сn-1), где элементы кода с1- являются коэффициентами многочлена f(x), принадлежащими простому полю GF (р). Для двоичных циклических кодов коэффициенты сi принадлежат полю GF (2), т. е. принимают значения 0 и 1.
Таким образом, обе формы представления комбинаций связаны между собой тем, что одна вытекает из другой. Например, комбинации (1010001) соответствует многочлен f (x)= 1+x2+ х6.
Приведем основные свойства циклических кодов, которые определяют их построение.
Свойство 2.1. Циклический код в полиномиальном его представлении можно определить как множество многочленов степени п—1 и меньше, каждый из которых делится без остатка на некоторый многочлен Р (х), называемый образующим или порождающим многочленом кода.
Из этого свойства вытекает, что для каждой комбинации циклического кода, представленной многочленом f(x), справедливо сравнение
f(x)=[mod Р(х)]. (2.2)
Свойство 2.2. Если некоторая комбинация (c0c1c2…cn-1) принадлежит какому-либо циклическому коду, то и комбинация, полученная из предыдущей в результате циклического сдвига ее элементов, например (сn-1 c0c1 … cn-2), также принадлежит этому циклическому коду.
Это свойство основывается на свойстве 1.3 полей Галуа, согласно которому любой неприводимый в поле двоичных чисел многочлен Р (х) степени т является делителем двулена (x2^m-1-1), т. е.
x2^m-1-1≡0[modP(x)]. (2.3)
Таким образом, выбрав длину комбинации п, удовлетворяющую равенству п = 2т — 1, получим
xn-1≡0[modP(x)]. (2.4)
При таком значении п, умножив на х многочлен комбинации циклического кода f(х), представленного в виде (2.1), получим: x*f(x) =сох + с]х2+ ... + сn-2хn-1 + сn-1хn. В силу (2.4) можно записать: сn-1xn≡сn-1[mod Р (х)]. Тогда
x*f(x)≡сп-1 + сох+с1х2 + ... +сn-2хп-1 (2.5)
Но так как согласно свойству 2.1 многочлен f (x) делится на Р (х) без остатка, то и многочлен xf (x), представленный многочленом (2.5), также делится на Р(х). Отсюда вектор (сn-1сос1 ... сn-2 ), полученный из исходной комбинации циклического кода (c0c1c2…сn-1) путем циклического сдвига, будет принадлежать также циклическому коду. Из доказательства свойства 2.2 вытекает следствие, которое заключается в том. что для большинства циклических кодов п = 2т—1, где т — степень образующего неприводимого многочлена Р (х). Но на практике иногда выбирают длину комбинации n1меньше 2m-1. Такой циклический код называют укороченным.
Рассмотрим теперь общие принципы построения циклического кода. Задачей кодирующего устройства является преобразование k-элементной комбинации (aoa1 ... аk-1 ) исходного безызбыточного кода в n-элементную комбинацию (c0c1c2 ... cn-1 ) избыточного циклического (п,k)-кода. Таким образом, каждая комбинация циклического кода содержит п—k избыточных элементов.
Задачей декодера является обратное преобразование принятой n-элементной комбинации циклического кода в исходную k-элементную комбинацию. При этом эффективность циклического кода оценивается его способностью корректировать возникающие при передаче по каналу ошибки.
Существует несколько способов кодирования. Наиболее простой из них заключается в том, что многочлен (2.1), соответствующий комбинации циклического кода, получают путем умножения многочлена φ(х) = aо + а1x+ ... ak-1 xk-1, соответствующего исходной комбинации, на образующий многочлен Р(х) степени т, т. е.
f(x) = φ(x)P(x). (2.6)
Отсюда видно, что для циклического (п, k)-кода степень образующего многочлена m = п— k, т. е. равна числу избыточных элементов комбинации.
Циклический код, построенный в соответствии с (2.6), называют несистематическим, так как среди элементов комбинации (c0c1c2 ... cn-1) нельзя выделить информационные и избыточные или проверочные.
Другой способ кодирования соответствует систематическому циклическому (п, k)-коду. Построение систематического циклического кода сводится к тому, чтобы к информационным элементам a0, a1, … ak-1 исходного k-элементного кода добавить (п—k) полученных определенным образом избыточных элементов. Причем в каждой комбинации n-элементного циклического кода информационные и избыточные элементы будут занимать определенные позиции. Значения добавленных избыточных элементов должны определяться таким образом, чтобы выполнялось свойство 2.1 циклических кодов, т. е. деление без остатка на образующий многочлен Р (х).
Чтобы построить систематический циклический код, комбинацию исходного k-элементного кода, принадлежащую группе порядка 2к, записывают в виде многочлена φ(х) степени к—1. Затем многочлен φ(х) умножается на хn-k, что равносильно приписыванию к исходной k-элементной комбинации n — k нулей со стороны младшего разряда.
Например, необходимо умножить многочлен φ(х) = 1 +x+x2 на хn-k = х3. Тогда имеем хn-kφ(х) = х3 + х4 + х5. Если записать многочлен φ(х) и результат умножения в виде двоичных комбинаций, то получим
Для φ(х) — 111,
для x3 φ(х) —000111.
Полученное таким образом произведение хn-kφ(х) делим на производящий многочлен Р (х) степени n — k. При делении на производящий многочлен Р (х) образуется частное Q(х) той же степени, что и φ(х) и, кроме того, возможно появление остатка R (х), т.е.
Видоизменяя уравнение, получим
Очевидно, что многочлен (2.8) соответствует комбинации циклического кода, так как он удовлетворяет основному требованию циклических кодов, а именно, делится без остатка на производящий многочлен Р(х).
В дальнейшем будем рассматривать только двоичные коды, поэтому знаки «+» и «—» равноценны.
Если многочлен хn-kφ(х)+R(х) записать в виде комбинации, то легко заметить, что систематический циклический (n1k)- код можно построить, приписав к каждой кодовой комбинации исходного k-элементного кода остаток от деления многочлена хn-kφ(х) на производящий многочлен Р(х).
Рассмотрим пример построения систематического циклического (n, k)-кода, для которого n=15, k=11 и n-k=4.
В качестве производящего выбран многочлен P(x)=1+x+x4.
Для кодирования комбинации 10100100001, которой соответствует многочлен φ(х)=1+x2+x5+x10, разделим x4φ(х) на производящий многочлен Р(х) и найдем остаток R(х). В результате находим, что R(х)=1+x. Кодовый многочлен образуется путем сложения x4φ(х) и R(х) согласно (2.8):
Этому многочлену соответствует комбинация циклического кода
1100 10100100001
проверочные информационные
элементы элементы
Матричное представление циклических кодов
Систематический циклический код может быть полностью определен своей производящей матрицей, которая строится по следующему правилу. Сначала записывается единичная матрица Еk для исходного k-элементного кода. Далее одночлен, соответствующей каждой из строк Еk, умножается на хn-k и делится на производящий многочлен Р(х). В результате деления получим остатки, каждый из которых соответствует определенной строке матрицы Еk. Из этих остатков составляется дополнительная матрица R, которая приписывается к матрице Еk. Таким образом, производящая матрица для циклического (n, k)-кода будет иметь вид G=[RЕk], где R-приписанная к Еk проверочная матрица размерности k * (n-k).
Все остальные комбинации циклического кода получаются путем сложения по модулю 2 строк матрицы G в различных сочетаниях.
П ример. Пусть необходимо построить циклический код, для которого n=7, k=4, n-k=3, а P(x)=1+x+x3. Прежде всего запишем единичную матрицу Еk:
строкам которой соответствуют одночлены 1, х, х2, х3.
Каждая строка умножается на хn-k = х3 тогда получим новую матрицу, в которой каждая строка будет сдвинута на n— k нулей.
Каждый из полученных многочленов делится на производящий многочлен Р(х) и находится соответствующий остаток степени n-k, который и записывается на месте первых нулей в новой матрице.
Найденные остатки многочленов x3, x4, x5, x6 на P(x)=1+x+x3 будут соответственно равны R1(x)=1+x; R2(x)=x+x2; R3(x)=1+x+x2; R4(x)=1+x2.
Теперь составляем проверочную матрицу R, элементами которой являются остатки в двоичной форме записи:
Приписывая эту матрицу к единичной матриц Еk, получим производящую матрицу для циклического кода
Образующая матрица G позволяет преобразовывать комбинацию исходного кода (a0, a1, … ak-1) в комбинацию циклического кода путем ее умножения на матрицу G. Пусть для рассматриваемого примера кода исходная комбинация равна (1110), т.е. φ(х)=1+x+x2. Умножив ее на матрицу G, т.е. [1110]* G, получим циклическую комбинацию (0101110).
В [7] доказана следующая теорема:
Если V-пространство строк матрицы G=[RЕk], где Еk-единичная матрица размерности k*k, а R-матрица размерности k*(n-k), то V-является нулевым пространством матрицы H=[En-kRT], где En-k- единичная матрица размерности (n-k)*(n-k), а RT-транспорированная матрица R.
По этой теореме двоичный систематический циклический (n,k)-код, производящая матрица которого имеет вид G=[R Еk], является нулевым пространством проверочной матрицы H=[En- kRT] и, следовательно, G*HT=0.
Так, для нашего примера матрица H с учетом найденного ранее матрицы R будет иметь вид:
Легко проверить, что G*HT=0.
Для несистематического кода образующая матрица G строится в соответствии с правилом построения кода, а именно, путем умножения многочлена исходной комбинации φ(x) на порождающий многочлен Р(x). Для получения матрицы G составляют единичную матрицу Ek и каждую ее строку, представленную одночленом xi , умножают на многочлен Р(x). Из коэффициентов полученных многочленов xi* Р(x) составляют образующую матрицу G несистематического кода. Для рассматриваемого выше примера кода (7,4) с Р(x)=1+x+x3, записав произведения xi* Р(x), где i=0,1,2,3, получим следующую матрицу G:
Также, как и для систематического кода, несистематический циклический код должен представлять собой нулевое пространство по отношению к некоторой проверочной матрице H, которая может быть построена по проверочному полиному
Выражение (2.9) следует из свойства 2.2 циклических кодов и сравнения (2.4), согласно которому многочлен Р (х) является делителем двучлена хn + 1, где п = 2n-k — 1. Тогда строки проверочной матрицы Н будут состоять из коэффициентов многочленов хiН(х), где i = 0,1, ..., (п — k—1). Так, для рассматриваемого примера кода (7, 4) имеем Н(х)= =(x7+1)/P(x)=1+x+x2+x4.
Записав многочлены Н(х), xH(x), x2H(x), составим проверочную матрицу H:
в которой строки записаны начиная со старшей степени.
Легко проверить, что G*HT =0.
Следует отметить, что может быть построена проверочная матрица H, единая как для систематического, так и для несистематического кода, исходя из свойства 2.1 циклических кодов. Из этого свойства следует, что, если некоторый элемент а поля GF(2n) является корнем многочлена Р (х), то он является также и корнем многочлена f (х). Отсюда любая комбинация циклического кода, представленная многочленом (2.1), удовлетворяет равенству
f(α)≡0, (2.10)
которое может быть получено как произведение [сос1c2 ... cп-1]НТ, где H-проверочная матрица вида:
H=[1αα2….αn-1]. (2.11)
Учитывая, что для рассматриваемого примера кода (7, 4) порождающий многочлен Р(х) = 1+х+x3 является примитивным и а — его корень, матрица Н будет состоять из ненулевых элементов поля GF (23), т. е.
H=[1αα2α3α4α5α6].
Заменив элементы αi их двоичными векторами и записав их в виде столбцов получим следующую проверочную матрицу:
Легко проверить, что полученная проверочная матрица Н удовлетворяет равенству G*HT=0 как для систематического, так и для несистематического циклических кодов (7,4), построенных по многочлену Р(х)=1+х+х3.
Принципы обнаружения и исправления ошибок циклическими кодами
Один из принципов обнаружения ошибок основывается на делении принятой кодовой комбинации на производящий многочлен Р(х).
В общем виде принятая комбинация h(x) в полиномиальном представлении равна сумме h(x)=f(x)+e(x),
где f(x)-многочлен, соответствующий переданной кодовой комбинации,
e(x)-многочлен, соответствующий вектору ошибок.
Ошибки обнаруживаются, если остаток от деления h(x) на Р(х) не равен нулю. Если же остаток равен нулю, то ошибка или отсутствует, или не обнаруживается кодом.
Исправление ошибок является гораздо более трудной задачей, чем обнаружение. Реализация такой операции возможна,
если каждый многочлен исправляемых ошибок будет давать отличный от других ненулевой остаток после деления на Р (х). Поэтому исправление ошибки на приеме может быть осуществлено с помощью следующих операций:
Принятое сообщение делится на Р(х) и вычисляется остаток.
Из таблиц пли путем некоторых вычислений находится многочлен ошибок е (х), соответствующий остатку.
Найденный многочлен е (х) вычитается из h (х), в результате получается f (x), т. е. переданное сообщение.
Другая, применяемая на практике процедура обнаружения и исправления ошибок циклическими кодами, основывается на том, что комбинации циклического кода являются нулевым пространством по отношению к его проверочной матрице Н. Из этого свойства следует, что произведение вектора любой комбинации, принадлежащей циклическому коду, на матрицу Нт равно нулю. Если же в принятой комбинации содержатся ошибки и эта комбинация попадает в число запрещенных, то результат умножения, называемый синдромом, не будет равен нулю. Обозначив синдром через S = (s0, s1 ...sn-k-1) будем иметь
где вектор (h0h1h2…hn-1) соответствует многочлену принятой комбинации h(x), равному h (х) = f (x) -f e (х). Таким образом, ошибки обнаруживаются, если синдром S не равен нулю.
Исправить можно только те конфигурации ошибок в комбинации, которые дают различные ненулевые синдромы.
В дальнейшем операции обнаружения и исправления ошибок циклическими кодами будут рассмотрены на конкретных примерах.
3. ЦИКЛИЧЕСКИЕ КОДЫ, ИСПРАВЛЯЮЩИЕ ОДНОКРАТНЫЕ ОШИБКИ
Устройство, позволяющее преобразовать комбинации исходного k-элементного кода в комбинации циклического кода, называют кодирующим.
Согласно описанному ранее принципу построения систематического циклического (п,k)-кода, каждый многочлен φ (х), соответствующий определенной комбинации исходного кода, должен быть умножен на одночлен хn-k затем хп-кφ(х) делится на производящий многочлен Р (х). Обе эти операции реализуются с помощью регистра, включенного по виду многочлена Р(х). В результате деления многочлена хп-kφ (х) на производящий многочлен Р (х) в регистре сдвига будет получен остаток R (х) степени, меньшей степени многочлена Р (х). Как было показано, комбинация циклического кода будет выражена в виде многочлена φ(х) с дописанным к нему остатком R (х).
Рассмотрим пример построения и принцип работы кодирующего устройства кода (15.11) для производящего многочлена Р(х) = 1 + х +x4 (рис. 3.1). Элементы комбинации, соответствующей многочлену φ(х), поступают на выходной сумматор, что реализует умножение хn-kφ (х) = х4φ (х).
Pиc. 3.1. Кодирующее устройство систематического кода (15, 11) с образующим многочленом р(х) = 1 + x+x4
В течение k тактов, пока на вход поступают информационные элементы, ключ Кл. находится в положении 1, при этом информационные элементы без всякой задержки поступают на выход кодирующего устройства. С приходом последнего информационного элемента в регистре сдвига определяется остаток от деления хn-kφ (х) на Р (х), после чего ключ Кл. переключается в положение 2 и на выход вслед за информационными элементами считывается остаток R(x), т. е. проверочные элементы. Таким образом, с выхода кодирующего устройства поступает комбинация циклического кода.
Кодирующее устройство несистематического (п,k)-кода реализует умножение φ(х)Р(х). Схема построения КУ для кода (15, 11) с образующим полиномом Р (х) = 1 + х + x4 представлена на рис. 3.2.
Рис. 3.2. Кодирующее устройство несистематического циклического (15, 11)-кода с образующим многочленом р (х)= 1 + х + х4
Выше было показано, что в основе декодирования лежит признак делимости принятой последовательности на производящий многочлен Р (х). Для обнаружения ошибок достаточно убедиться, что остаток от деления не равен нулю, Отсюда ясно, что для построения декодирующего устройства циклического кода, позволяющего только обнаруживать ошибки, можно использовать регистр сдвига с обратными связями, который реализует деление на производящий многочлен Р (х).
Любой систематический (п,k)-код, исправляющий однократные ошибки, должен иметь такое число п — k проверочных разрядов в комбинации, чтобы удовлетворялось неравенство 2n-k≥n+1 . Код, построенный таким образом, обеспечивает минимальное кодовое расстояние между любыми разрешенными комбинациями, равное трем.
Как было показано, любая одиночная ошибка может обнаруживаться по ненулевому остатку от деления многочлена h(x), соответствующего принятой комбинации, на производящий многочлен Р (х). Однако для исправления однократных ошибок требуется, чтобы любой ошибке соответствовал определенный отличный от нуля остаток и, во-вторых, чтобы все эти остатки были различны между собой, т. е., чтобы выполнялось взаимооднозначное соответствие между местоположением ошибки и ее остатком. Эти требования выполняются, если остатки в случае одиночных ошибок будут представлять собой степени первообразного элемента, являющегося корнем примитивного многочлена Р(х), и, следовательно, будут ненулевыми элементами поля Галуа GF(2n). Таких различных ненулевых элементов поля GF(2т) будет 2m—1. Пусть на i-й позиции комбинации длины n = 2т—I произошла ошибка, которой соответствует одночлен е (х) = хi. В результате деления принятой комбинации на производящий многочлен Р(х) образуется остаток R(x), представляющий собой элемент а1 поля GF(2m), где а — первообразный элемент поля и корень многочлена Р (х). Этот остаток будет содержаться в регистре сдвига, который реализует операцию деления на многочлен Р (х). При этом сдвиг содержимого регистра на один шаг соответствует умножению на х с последующим приведением результата по модулю Р (х). Следовательно, произведя (п — i) сдвигов остатка R (х), мы тем самым как бы умножили принятую комбинацию h (х) на хn-1 и разделили результат на Р (х). В регистре при этом останется некоторый новый остаток Ri (х) = xn-iR (x) [modP(x)]. Состояние регистра определим из преобразования:
где f(х) — разрешенная кодовая комбинация, выраженная в виде многочлена, делящегося на Р (х) без остатка. Следовательно, состояние регистра после (n — i) сдвигов будет соответствовать элементу поля а°= 1. Обнаружив это состояние, можно легко исправить одиночную ошибку.
Рассмотрим процесс исправления одиночных ошибок декодирующим устройством (рис. 3.3) циклического (15,11)кода, производящий многочлен которого имеет вид Р (х)=1+ х+x4 Комбинация циклического кода поступает на вход буферного накопителя емкостью п=15 и одновременно с этим на вход регистра сдвига с обратными связями. Когда элементы комбинации циклического кода заполнят буфер, в регистре сдвига с обратными связями будет содержаться остаток от деления принятой комбинации на производящий многочлен Р (х).
Рис. 3.3. Декодирующее устройство циклического кода (15, 11), исправляющего однократные ошибки
Как было показано, определение ошибочной i-й позиции для рассматриваемого кода осуществляется путем обнаружения состояния (1000) через (п—i) сдвигов, т. е. тогда, когда ошибочный элемент уже покинет буфер. Следовательно, после буферного накопителя необходимо поставить задержку на один элемент, что позволит исправить эту ошибку со следующим тактом (сдвигом). Чтобы предотвратить ложную работу декодирующего устройства во время заполнения комбинацией буфера, а также при наличии в принятой комбинации одиночной ошибки на нулевой позиции, соответствующей коэффициенту при х°, поставлен ключ Кл. Этот ключ замыкается в момент поступления на выходной сумматор 111 первого информационного элемента, соответствующего коэффициенту при х14в принятой комбинации, а размыкается в момент сброса регистра сдвига с обратными связями, т. е. в момент установления состояния 0000. Сброс можно осуществить, например, из блока обнаружения в момент исправления ошибки подачей единицы в сумматор 11.
Недостатком подобных схем декодирования является то, что после заполнения буферного накопителя в течение следующих п тактов информация на вход декодирующего устройства не должна поступать. В некоторых случаях в зависимости от требований к системе передачи данных это время простоя можно сократить до k сдвигов, если производить исправление одиночных ошибок только среди k информационных элементов принятой комбинации.