
8 семестр / Вспомогательный материал / Циклические коды Хэмминга
.doc
3.9 Циклические коды Хэмминга
Циклические коды Хэмминга, как и при групповом кодировании, ориентированы на одиночную ошибку.
Если F(x) - полином передаваемой (разрешенной) к.к. x*,
Ф(x) - полином принимаемой к.к. y*,
E(x) - полином ошибки x*, то
Ф(x) = F(x) Å Е(x).
Для одиночной ошибки ( | x*| = 1)
Е(x) = x i ,
где i - номер разряда с ошибкой (i = 0, 1, ... n - 1).
Так как остаток res F(x) = 0, то
res Ф(x)= res E(x) mod M(x),
или ( что то же самое)
Ф(x) º x i mod M(x).
Отсюда следует, что ошибка в определенном разряде любой к.к. дает один и тот же опознаватель независимо от передаваемого кода.
На приемной стороне выполняется деление Ф(x) на M(x), что эквивалентно делению Е(x) = x i на М(x), и находится остаток
res (Ф(x)) mod M(x), = res (x i) mod M(x).
Для однозначной расшифровки нужно, чтобы все остатки от деления
{x0, x1 , ... , xn - 1 } на М(x) были различными. Это требование эквивалентно условию:
деление xn 1 на М(x) должно давать не менее n промежуточных остатков и все остатки должны быть различными и не равными нулю.
Но x n- 1 в кодовом представлении есть x* = 1000 (n - 1 нулей).
Поэтому для проверки выполнения указанного условия достаточно разделить бесконечную последовательность 1000 ... на код М.
При этом получается бесконечная периодически повторяющаяся последовательность промежуточных остатков. Если в периоде ³ n различных остатков, то данное условие выполняется.
И М(x) всегда дает больше остатков, чем составной, а наибольшее число остатков дает примитивный полином.
Теорема.
Число различных промежуточных остатков при делении 100 ... на код М примитивного полинома М(x) степени deg M(x) =î максимально (по сравнению с любыми другими полиномами той же степени) и равно
Tmax = 2î -1,
при этом все промежуточные остатки - ненулевые.
Поэтому примитивный полином иногда называют полиномом максимального периода.
Пример
Если M(x) = x2 Å x Å 1 (примитивный полином), т.е. М = 111, то î = 2 и
Тmax = 22 -1 = 3. Разделив 1000 ... на 111, получим повторяющуюся последовательность, содержащую 3 различных ненулевых остатка: 11, 01, 10.
Таким образом, если М(x) - примитивный полином, то все остатки будут различными, а чтобы их число было не менее числа одиночных ошибок (т.е. n), должна быть выбрана соответствующая степень полинома M(x) î= n - k, т.е. нужно обеспечить достаточную избыточность кода (число проверочных разрядов).
Построение кода
1) По заданному числу разрешенных к.к. N определяется число информационных разрядов k = élog2 Nù .
2) Определяется Nmax = 2k .
3) Из выражения для хэмминговой границы Nmax £ 2 n / (1 + n) определяется минимально допустимое значение n (нижняя граница значения n ).
4) Определяется число проверочных разрядов î= n - k .
5) По таблицам неприводимых полиномов степени î выбирается M(x)
(примитивный или не примитивный, но примитивный обычно предпочтительнее).
6) Уточняется n, обеспечивающее число промежуточных остатков при делении 1000 ... на М, не меньшее, чем n. Если число остатков оказывается меньше n , то разрядность n кода увеличивается и, соответственно, увеличивается степень î полинома M(x). Отметим, что если М – примитивный полином степени î , то число остатков всегда равно числу одиночных ошибок.
7) По найденным на шагах 1 и 2 значениям k и Nmax составляются различные комбинации информационных символов (по k символов в каждой комбинации).Число таких комбинаций Nmax = 2k :
0000
0001
:::::::
1111
Справа от каждой комбинации приписывается по î = n - k нулей ( n найдено на
шаге 3, î - на шаге 4):
B0 = 0000 000
B1= 0001 000
B2 = 0010 000
::::::::::::::
B15 = 1111 000
В полиномиальной форме полученные векторы имеют вид:
Bi(x)= ai(x) · xî ,
где ai(x) - полином блока информационных символов, а xl отображает код 1000 (î нулей).
Но это еще не циклический код, т.к. комбинации не делятся на М без остатка.
8) Выполняется деление каждой полученной комбинации на М (М найдено на шаге 5) и находятся остатки R. Затем каждая комбинация складывается с R, т.е. R заменяет правые нули и формирует код x*. Но любой полином B , сложенный со своим остатком R, делится на М, поскольку
F = B Å R = (QM Å R) Å R = QM ( делится на М).
Следовательно, полученный набор {Fi } или {x*i} представляет собой множество разрешенных к.к., так как
а) каждая к.к. делится на М,
б) циклическая перестановка к.к. также делится на М, поскольку
F2(x) = xF1(x) Å С(xn Å 1)
и (xn Å 1) делится на М (как результат выбора n и M на шагах 3 и 5 алгоритма).
Пример.
Рассмотрим информационный блок 0111. Добавим три нуля и разделим на
М = 1101:
0111000
1101
0000 0101
1110
1101
0110
0000
1100
1101
001
Тогда сумма 0111 000 Å 001 = 0111 001 = x*7 является разрешенной к.к. циклического кода (индекс при x*i совпадает с индексом кода информационного блока Bi).
После выполнения восьми шагов описанной процедуры построения будут получены все Nmax = 2k разрешенных к.к. циклического кода. Блок из k информационных символов в циклических кодах принято располагать в начале каждой кодовой последовательности, то есть в старших разрядах. Второй блок из символов составляют проверочные разряды кода
Пример
Пусть требуется сформировать циклический код Хэмминга, содержащий
N = 10 разрешенных к.к.
Находим k = élog2 Nù = 4, при этом Nmax = 2k = 16.
Из выражения для хэмминговой границы Nmax £ 2n / (1 + n) находим минимальное значение n = 7.
Находим значение î = n - k = 3.
По таблицам неприводимых полиномов выбираем примитивный полином степени
î = 3 :
M(x) = x3 Å x2 Å 1, или М = 1101.
Для него число остатков равно
Тmax = 2 î -1 = 23-1 = 7 = n,
т.е. не требуется добавлять новые разряды для построения циклического кода. Если бы был выбран непримитивный (но обязательно простой) полином, то остатков могло оказаться меньше, и для проверки необходимого их числа нужно было бы разделить 1000 ... на код выбранного полинома, подсчитать число различных промежуточных остатков и, при необходимости, увеличить разрядность n кода.
После выполнения шагов 7 и 8 процедуры получим все Nmax = 2k = 2 4 =16 разрешенных к.к. из которых выбираются любые N =10 7-разрядных комбинаций.
Исправление ошибки
Выполняется деление принятого из канала сигнала y*j на М. Если R = 0, то ошибки нет. Если же R¹0, то R сопоставляется коду помехи и определяется искаженный разряд в y*j , после чего этот разряд инвертируется.
Приложение:
Для построения и расшифровки циклического кода используется сдвиговый регистр с обратными связями, рассматриваемый в следующем параграфе 3.10. Регистр осуществляет деление кода полинома, поступающего на вход регистра, на код характеристического полинома M(x). Число обратных связей в регистре равно числу ненулевых коэффициентов в полиноме M(x). Поэтому для упрощения аппаратной реализации обычно выбирают полиномы с минимальны числом таких коэффициентов (то есть с минимальным числом единиц в кодовом представлении M).
В таблице приведены примитивные полиномы степени l для l = от 1 до 7.
Некоторые примитивные полиномы с минимальным числом ненулевых
коэффициентов
î |
M(x) |
î = 1 |
x Å 1 |
î = 2 |
x2 Å x Å 1 |
î = 3 |
x3 Å x Å 1 ; x3 Å x2 Å 1 |
î = 4 |
x4 Å x Å 1 ; x4 Å x3 Å 1 |
î = 5 |
x5 Å x3 Å 1 ; x5 Å x2 Å 1 |
î = 6 |
x6 Å x Å 1 ; x6 Å x5 Å 1 ; x6 Å x3 Å 1 |
î = 7 |
x7 Å x Å 1 ; x7 Å x3 Å 1 ; x7 Å x2 Å 1 |
3.10 Устройства кодирования и декодирования циклических кодов
Основой кодера и декодера является сдвиговый регистр с обратными связями, реализующий деление F на M, рис. 3.10.
Рис. 3.10 (Разд.)
Он строится на характеристическом полиноме
M(x) =
ai
x i , ai
Î {0,1}.
Число разрядов регистра равно степени î полинома M(x) (т.е. на один разряд меньше делителя M, представленного в кодовой форме); старший разряд î регистра, соответствующий переменной xî , находится справа, а разряд, соответствующий x0, отсутствует. Коэффициенты a0, a1, ... , aî - 1 определяют наличие или отсутствие соответствующей обратной связи: ai = 1 - связь есть, ai = 0 - обратная связь отсутствует (и отсутствует соответствующий сумматор по модулю 2). Поэтому M(x) иногда называют полиномом обратной связи. Поскольку M(x) - неприводимый полином, то всегда a0 = 1, т.е обратная связь (и сумматор) на входе регистра присутствует всегда, а сумматора, соответствующего aî , в схеме нет.
Такая схема относится к классу линейных последовательностных машин (ЛПМ). Она называется иногда кодовым фильтром Хаффмена. На вход регистра поступает кодовая последовательность делимого F, соответствующая полиному F(x), старшим (левым) разрядом вперед, Делителем является сам регистр. Частное Q появляется на выходе регистра и в дальнейшем не используется, а содержимое ячеек регистра на любом такте от 1 до n отображает промежуточные или конечный (на последнем такте) остатки R при делении F на M. Отметим, что старший (первый) разряд остатка находится в последней (старшей) ячейке î регистра.
Пример
Пусть требуется построить сдвиговый регистр для характеристического полинома
M(x) = x3 Å x2 Å 1 .
Степень полинома î = 3 ( в кодовой форме 1101), поэтому регистр содержит ячейки 1, 2, ... , î = 3 и обратные связи a0, a1, и a l - 1 = a2 (рис. 3.11).
Рис. 3.11 (Разд.)
В работе регистра выделим 3 этапа:
-
на нулевом такте регистр обнуляется;
-
на тактах 1 ... î происходит заполнение регистра;
-
на тактах (î + 1) ... n выполняется деление и выделение остатка.
Декодер
Основой декодера является описанный регистр с обратными связями, построенный на полиноме M(x). . На вход регистра из канала поступает к.к. y*j (возможно с ошибкой), полином этой к.к. Фj (x). После n тактов деления снимается остаток R, который затем подается в дешифратор ошибок, выявляющий искаженный разряд. Инвертирование содержимого этого разряда исправляет ошибку.
Кодер
На вход кодера поступает пакет информационных разрядов кода a(x)
(k разрядов), который дополняется î нулями:
x1 ... xk 000 = B.
Эта комбинация поступает на сдвиговый регистр, выполняющий деление и выделяющий остаток R, затем нули заменяются остатком.
Таким образом, для получения разрешенной к.к. нужно:
-
выполнить умножение a(x)x î = B(x)
-
разделить B(x) = a(x)x î на M(x) и выделить R(x),
-
сложить a(x)x î Å R(x) = F(x)
Эти 3 операции можно совместить, несколько изменив схему. Для этого цепь обратной связи заводится не с выхода î - го разряда, а с выхода сумматора, на который поступает информационная последовательность a(x) старшим разрядом вперед; кроме того, в схему вводятся два ключа К1 и К2 , рис. 3.12.
Рис. 3.12 (Разд.)
Процесс кодирования проходит 2 этапа.
-
Ключи К1 и К2 переводятся в положение “вниз”. Информационные символы,
соответствующие a(x), поступают в канал через ключ К1 старшим разрядом вперед и одновременно по цепи обратной связи - во все ячейки регистра. При этом фаза заполнения ячеек регистра отсутствует, т.к. обратная связь начинает работать сразу при поступлении 1-го информационного разряда и сразу начинается процесс деления, продолжающийся k тактов. Проследив содержимое ячеек по тактам при подаче k информационных символов, можно убедиться, что на последнем (k-м) такте оно всегда совпадает с остатком R(x) от деления вектора полинома B(x) = a(x)· xl на M(x), т.е. с конечным остатком от непосредственного деления вектора (x1 ... xk 000) на M. Отметим, что содержимое ячеек на промежуточных тактах и промежуточные остатки при делении могут не совпадать между собой.
-
К1 и К2 переводятся в положение “вверх”, при этом обратная связь обрывается, на
вход ничего не поступает и за оставшиеся l тактов остаток, записанный в регистре,
сдвигается в канал.
Результат: За n тактов в канал поступает к.к. x* = (x1 ... xkxk+1 ...xn), соответствующая полиному F(x) = a(x) Å R(x), старшим разрядом вперед.
Пример
Для кода (7,4) используем характеристический полином î-й степени (î =n-k=3)
M(x) = x3 Å x2 Å 1,
т.е. M = 1101.
Пусть требуется закодировать информационный блок a = 1110. Разрешенная комбинация кода содержит k = 4 информационных символов и î = 7 - 4 = 3 проверочных (регистр при этом имеет 3 ячейки) .
-
На первом этапе в канал поступают информационные символы 1110 и на
k = 4-м такте формируется остаток от деления a(x)xî на M:
1110
000 1101
1101 1010
0110 (1 такт)
0000
1100 (2 такт)
1101
0010 (3 такт)
0000
010 = R (4 такт)
2) После этого на втором этапе в канал поступает содержимое регистра
R = 010.
Результат: F 14 = x*14 = 1110 010.
Отметим, что кодер и декодер циклического кода имеют более простую аппаратную реализацию, чем для группового кода, что обеспечило его широкое применение.