Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
a4.doc
Скачиваний:
45
Добавлен:
19.12.2018
Размер:
11.89 Mб
Скачать

6.4.5. Полиномиальные коды

После того, как мы ознакомились с правилами образования корректирующих алгебраических кодов, можно рассматривать наиболее мощную группу корректирующих кодов, предложенную в свое время тем же Р.Хеммингом.

Для того чтобы получить представление о полиномиальных кодах, необходимо предварительно получить представление о математике в области полей Галуа.

В области высшей алгебры существует несколько понятий, определяемых рядом аксиом. Среди таких образований существуют, в частности, моноид, кольцо, полугруппа, поле, векторное пространство. Они различаются операциями, на которых они заданы, а также исходным множеством объектов. Наиболее употребимы двоичные коды в качестве базовой конструкции, а главной операцией представляется сложение по модулю 2. Если к ней добавить логическое умножение, получается поле Галуа .

В пределах поля Галуа заданы две процедуры: умножение и деление. Формально они могут представляться цифровыми аналогами арифметических умножения и деления. Отличие в том, что базовая операция – сложение по модулю 2, является самодвойственной (сложение и вычитание являются одной операцией). Продемонстрируем операции в поле Галуа на конкретных примерах.

Перемножим два двоичных кода в поле Галуа: множимое 110011, множитель 1011. Умножение представим в классическом арифметическом виде, т. е. столбиком (рис. 6.40).

Рис. 6.40. Умножение в поле Галуа GF(2)

При умножении на 1 код множимого просто повторяется; при умножении на 0 происходит простой сдвиг налево на один разряд. Суммирование частичных произведений производится по законам двоичной логики: если количество единиц четно, результат равен 0, если нечетно – 1. количество разряда результата равно сумме разрядов множимого и множителя без 1.

Деление в поле Галуа осуществляется еще «веселее», чем умножение. Оно, как в арифметике, производится углом, но с учетом того, что вычитание заменяется также сложением по модулю 2. Главный критерий деления – первая цифра делимого должна начинаться с 1 (в противном случае в частное заносится 0, а делитель сдвигается на один разряд вправо).

Приведем пример деления на тех же кодах (рис. 6.42). Пример не совсем удачный, так как каждый остаток начинался с 1, и дальнейшее деление оказывалось возможным. Если это выполняется, в частном 1, в противном случае – 0. В приведенном варианте деление произошло с остатком 010 (остаток всегда на разряд короче делителя).

Рис. 6.41. Деление в поле Галуа GF(2)

Гениальным решением Р. Хемминга, предложившего полиномиальные коды, является совершенно новый подход к кодированию/декодированию, не ограничивающий корректирующую способность кода. В первоначальном варианте полиномиальный код состоял из двух взаимодополняющих операций, умножения и деления. Выбирается некоторый код из разрядов, который называется образующим полиномом. Название вытекает из представления кода в виде полинома от х, в котором степень любого члена равна номеру разряда, а его коэффициент равен 0 или 1. Так, код 10011 эквивалентен полиному ; полином соответствует коду 1100011.

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

.

(6.38)

В приемной части производится деление принятого кода на образующий полином:

.

(6.39)

При этом, если ошибок не произошло, остаток от деления равен 0; ненулевой остаток или воспринимается как признак ошибки (код, обнаруживающий ошибки) или как синдром ошибки (код, исправляющий ошибки).

Приведем пример. Предположим, исходный код равен (или ), образующий полином (или ). При перемножении получаем код (рис. 6.42).

Рис. 6.42. Кодирование прямым методом

При декодировании (т. е. при делении на образующий полином) получим в остатке 0 (рис. 6.43).

Рис. 6.43. Декодирование прямым методом

Предположим, в коде 1011011 появилась ошибка. В результате деления на образующий полином получаем ненулевой остаток (рисунок 6.45).

Рис. 6.44. Декодирование при наличии ошибки

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

Для того, чтобы остатков было как можно больше, желательно, чтобы образующий полином был неприводимым. Неприводимым называется такой полином, который не может представляться в виде произведения полиномов низших степеней. Еще Л. Эйлером была доказана теорема, согласно которой количество различных остатков неприводимого полинома степени равно . Это значение полностью соответствует границе Хемминга в соответствии с (6.28).

Приведем пример. Известно, что полином вида (или в кодах 1011) является неприводимым. Докажем это тривиальным делением с приведением остатков. Для этого в качестве делимого всегда выбирается код вида: 10000…. . Результаты деления представлены на рис. 6.45.

а) б)

Рис. 6.45. К определению неприводимого полинома

Здесь поле а) представляет собственно механизм деления, б) – запись остатков. Как видим различных остатков ровно 7, что соответствует критерию неприводимости. Другой неприводимый полином этой же степени образуется при чтении предыдущего в обратном порядке, т. е. 1101.

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

1. Неприводимый полином в его кодовом эквиваленте начинается и заканчивается 1. Это легко интерпретируется: если код полинома заканчивается нулем, значит, в него входит множитель или его степени.

2. Неприводимый полином обязательно соответствует несимметричному коду, который слева направо и наоборот читается по-разному. Кроме того, код должен иметь свойства нерегулярного (как можно больше «кособокого»).

3. Практика показывает, что количество различных неприводимых полиномов для четных и нечетных степеней различно и для четных степеней всегда меньше.

4. Также из практики кодообразования наилучшими свойствами обладают полиномы, в которых вес (т. е. количество единиц) близок к половине их длины.

5. Если полином неприводим, то неприводимым будет полином с инверсией его разрядов. Так, если полином 1011 неприводим, то неприводимым будет и полином 1101.

Что характерно, возможностей для организации полиномиальных кодов гораздо больше, чем для алгебраических. Существует множество различных полиномиальных кодов, отличающихся способом получения образующих полиномов. Прежде, чем об этом говорить, рассмотрим три классических способа кодирования/декодирования.

1. Первый способ кодирования описан выражениями (6.38) и (6.39). С классических позиций, это не очень удачный вариант, так как корректирующий код является неразделимым: исходная комбинация не может быть выделена из кода и требует обязательного деления.

С другой стороны, такое кодирование может поддерживать режим шифрования: если при несанкционированном перехвате нарушителю неизвестен образующий полином, он вынужден подбирать, на что тратится время. Если при этом легальные клиенты связи в ходе взаимодействия меняют образующие полиномы, особенно по случайному закону, условия перехвата заметно усложняются. В качестве примера представим структуру следующего устройства (рисунок 6.46).

Рис. 6.46. Защищенный помехоустойчивый канал

Здесь обозначено: И/П – источник/приемник; К/Д – кодер/декодер; БП – блоки памяти, хранящие семейство образующих полиномов; ПСП – блок, реализующий одновременную выборку из БП нужных образующих полиномов. Не вдаваясь в подробности о способах выборки, отметим, что по структуре рисунка 3.36 возможно достаточно большое число сценариев работы информационной системы, обеспечивающих при этом требуемый уровень защиты и нужную помехоустойчивость. Собственно говоря, это может обеспечивать новое научное направление в области защиты информации.

2. Второй способ кодирования/декодирования является базовым и обеспечивает надежные технологии, реализованные как на аппаратном, так и на программном уровнях. Рассмотрим вначале передающую часть. Способ кодирования заключается трех этапах.

а) Исходный информационный код I(x) умножается на , где – степень образующего полинома:

.

(6.40)

б) Полученный код делится на образующий полином с получением остатка степени :

.

(6.41)

в) Остаток вписывается в смещенный код вместо присутствовавших там нулей:

.

(6.42)

Несмотря на кажущуюся сложность, алгоритм становится понятным на примере. Предположим, исходный код 5-разрядный и имеет вид 10101. Возьмем в качестве образующего полинома код 1011. Применив п. а), получаем код 10101000 (образующий полином третьей степени). Далее используем п. б) (рис. 6.47).

а) б)

Рис. 6.47. Применение второго алгоритма кодирования полиномиального кода

Это и есть необходимый корректирующий код.

Рассмотрим теперь процедуру декодирования. При правильном приеме кода и отсутствии ошибок в остатке получается 0. На том же примере приведем проверки, для чего разделим на образующий полином коды без ошибки и с одиночной ошибкой (рисунок 6.48)

а) б)

Рис. 6.48. Декодирование полиномиального кода

Из приведенного примера видно, что индикатор ошибки – ненулевой остаток. Методы декодирования и исправления ошибок – предмет особого анализа, не входящего в материал этого пособия.

4. Кодирование на основе генераторных многочленов. Генераторным называется многочлен , образующийся при делении полинома типа на образующий полином:

.

(6.43)

Предположим, для кода (7,4) и образующего полинома получим образующий полином вида:

а) б)

Рис. 6.49. К образованию генераторного многочлена

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

.

(6.44)

Декодирование полиномиальных кодов относится как к процедуре однозначного распознавания синдромов, так и к области более математизированных операций и алгоритмов.

Рассмотрим некоторые процедуры формирования образующих полиномов, от которых и зависят свойства кодов. Простейшая процедура – увеличение степени полинома. Алгоритм Хемминга – элементарное умножение на бином :

.

(6.45)

Приведем простой пример. Предположим, базовый полином (или в двоичном коде 1011). Для повышения степени образующего полинома применим правило (6.45):

(6.46)

Аналогично дальше:

(6.47)

Дальнейшая методика понятна, но она неэффективна.

Более продуктивными являются коды Файра. Для них образующие полиномы строятся по правилу:

(6.48)

Здесь – неприводимый полином степени ; – константа, не делящаяся нацело на .

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

(6.49)

Здесь НОК – наименьшее общее кратное; – примитивные многочлены степени (объяснение дадим позже).

Приведем методику получения образующих полиномов для кодов БЧХ. Главное – это то, что количество разрядов кода n не может быть произвольным, а удовлетворяет одному из двух правил:

(6.50)

где и – целые числа. Исходя из этого ограничения, можно составить числовые ряды из возможных значений . Например, для первого уравнения

Второй шаг – выбор корректирующей способности. Выбирается, исходя из требований. Обычно задаются количеством исправляемых ошибок (соответственно кодовое расстояние ). Значению соответствует количество примитивных многочленов . Образующий полином вычисляется как тривиальное произведение примитивных многочленов.

В качестве примера приведем достаточно упрощенный алгоритм вычисления образующего полинома для группы кодов БЧХ. В таблице .1 приведены примитивные многочлены степени L для нескольких возможных вариантов.

Таблица 6.1. Примитивные многочлены кодов БЧХ

2

3

4

5

6

7

8

9

М1

111

1011

10011

100101

1000011

10001001

100011101

1000010001

М3

1101

11111

111101

1010111

10001111

101110111

1001011001

М5

111

111101

1100111

10011101

11111011

1100110001

М7

11001

110111

1001001

11110111

101101001

1010011001

М9

101111

1101

10111111

110111101

1100010011

М11

110111

1101101

11010101

111100111

1000101101

М13

10000011

100101011

1001110111

Каждый из столбцов представляет множество примитивных многочленов степени L. Если вспомнить, что количество разрядов при этом определяется как , то таблица перекрывает все возможные коды БЧХ для n до разрядов. При этом количество строк в предполагаемом произведении равно количеству исправляемых ошибок. Например, первый элемент таблицы определяет 3-разрядный код, в котором существует единственная разрешенная ненулевая кодовая комбинация, а именно 111 (вторая разрешенная кодовая комбинация равна 000). Код имеет расстояние, равное 3, и исправляет одиночные ошибки.

Обратимся ко второму столбцу. Здесь общее количество разрядов и возможны два варианта: код, исправляющий одиночные ошибки и имеющий с полиномом , и код, исправляющий двойные ошибки, класса (7,1) с одним информационным разрядом. Вычислим последний полином:

Рис. 6.50. Вычисление полинома

В результате образуется полином 6-й степени с двумя разрешенными кодовыми комбинациями и с кодовым расстоянием .

Рассуждая аналогично, можно получить семейство кодов БЧХ с разной корректирующей способностью. Рассмотрим, в частности пример кода, исправляющего трехкратные ошибки () для (). Обнаруживается, что третий примитивный многочлен имеет степень 2, что приводит к тому, что результирующий полином на 2 разряда короче, т. е. получен код (15, 5), исправляющий трехкратные ошибки, что относит его к классу совершенных. Пройдемся по этому столбцу возможных кодов БЧХ:

– код (15, 11), исправляющий одиночные ошибки и имеет (совпадает с совершенным кодом Хемминга);

– код (15, 7), исправляющий двойные ошибки, ;

– код (15, 5), исправляющий тройные ошибки, и являющийся уникальным;

– код (15, 1) с единственной разрешенной кодовой комбинацией и исправляющий тройные ошибки.

Если рассмотреть таблицу полностью, то можно обнаружить еще одни уникальный код: в 6-м столбце с многочленом М9. Это код (63, 9), исправляющий 5-кратные ошибки (т. е. ).

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

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

Наиболее популярны коды Голея (23, 12) или (24,12). Базовый код Голея имеет кодовое расстояние , т. е. способен исправлять тройные ошибки. Он имеет уникальные образующие полиномы: или (в кодовом изображении они имеют вид 101011100011 или 110001110101, что полностью соответствует свойству 5) из перечисленных выше признаков неприведенности).

Код Голея (24, 12) имеет тот же образующий полином, но лишний информационный разряд, что дает приведение кода к 3-байтовой системе кодирования.

Одним из наиболее перспективных, но практически почти нереализованных корректирующих кодов являются коды Рида-Соломона (РС). Это недвоичные коды (т. е. коды с системой счисления, отличающейся от 2). Для их определения введем понятие примитивного элемента в кольце по модулю q. Примитивный элемент – это такое целое число, которое будучи возводимым в целые степени (в модулярной арифметике) дает последовательно все числа от 1 до . Это свойство лучше рассмотреть на конкретном примере. Предположим, . Докажем, что является примитивным элементом для . (это очевидно), , , Поясним в терминах модулярной арифметики. Результат любой операции должен находиться в числе разрешенных: 0, 1,2,…. Если он выходит «за габарит», из него вычитают число, кратное , после чего он подходит под определение кольца. Приведем пример для и проверим на «примитивность» числа и 3.

Рис. 6.51. К определению примитивного элемента

Из рисунка 6.51 видно, что не является примитивным элементом, а является.

Большой вклад в область теории чисел внес Л. Эйлер. Он доказал, что для любого существует хотя бы один примитивный элемент. Более того, он ввел специальную функцию, , определяющую количество таких примитивных элементов.

Коды РС имеют элегантный механизм вычисления образующего полинома для ошибок кратности :

(6.51)

Если выбирается первый сомножитель, исправляются одиночные ошибки, два первых – двойные и т.д.

Сконструируем код, исправляющий двойные ошибки для . Согласно (6.51), . Последнее означает, что все операции производятся в кольце. В данном случае при образующий полином второй степени обеспечивает исправление двойных ошибок. Основным недостатком кодов РС является трудная привязка к цифровым системам, поэтому их обычно привязывают к модулям, кратным степени двойки (7, 15,31, 63,…).

Рис. 6.52. Вычисление образующего многочлена

Большое значение имеют алгоритмы декодирования; для полиномиальных кодов они чрезвычайно развиты.

Существуют две большие группы, так называемое жесткое (синдромное) и мягкое декодирование. При жестком декодировании составляется перечень возможных синдромов, каждый из которых «отвечает» за конкретную ошибку или их комбинацию. Мягкое декодирование имеет много направлений и должно рассматриваться отдельно.

Рис. 6.53. Декодер полиномиального кода

Общая структура декодера полиномиального кода при жестком декодировании может быть представлена структурной схемой, приведенной на рис.6.53. Здесь обозначено: RG – буферный регистр на n разрядов; СД1 и СД2 – схемы деления на образующий полином; ДО – детектор ошибок; КО – корректор ошибок.

Принцип действия кодера рассмотрим на конкретном примере. Предположим, реализуется полиномиальный код (7, 4) с образующим полиномом 1101; на входе код 1001. Кодируем по второму способу (см. рисунок 6.55). Получили остаток, который приписываем к «сдвинутому» коду, т. е. 1001011.

Рис. 6.54. К образованию кода

При декодировании производится обратная операция, т. е. деление на образующий полином:

Рис. 6.55. Декодирование без ошибки

Рис. 6.56. Декодирование с одиночной ошибкой

Предположим, произошла одиночная ошибка в разряде : т. е. принят код 1001111. Тогда после деления на образующий полином появляется остаток 110, свидетельствующий о наличии ошибки. Для ее исправления существует алгебраический прием, основанный на том, что код с ошибкой может восприниматься как алгебраическая сумма кода без ошибки и собственно ошибки. Обозначим коды в виде векторного -мерного пространства. Допустим, исходный -разрядный код представлен в виде вектора в -мерном пространстве. Обозначим его в виде , к вектору добавляется вектор синдрома размерности :

(6.52)

На приемной части принят некоторый код той же размерности. На основе гипотезы независимости сигнала и ошибки можно рассматривать принятую КК как сумму векторов сигнала и ошибки:

(6.53)

Рассмотрим простейший вариант декодирования, когда принятый код делится на образующий полином:

(6.54)

Уравнение (6.54) можно переписать в виде:

(6.55)

Последний член выражения (6.55) можно рассматривать на основе гипотезы независимости как индикатор ошибки. Первый член в (6.55) дает в остатке 0 вследствие закона кодообразования. Второй полностью определяется конфигурацией вектора ошибки. На этом основана структура жесткого декодера, приведенная на рис. 6.53.

При использовании методики жесткого декодирования используется следующий прием. Предположим, появилась некоторая ошибка , не зависящая от кода . При ее делении на полином появляется характерный остаток, появление которого приводит к распознаванию ошибки в выявленном разряде.

Предположим, используется индикатор одиночных ошибок. Для его настройки необходимо и достаточно разделить вектор ошибки 100…..на образующий полином и получить остаток на такте n. Существуют две схемы деления, за и тактов.

Рассмотрим тот же пример деления за n тактов при образующем полиноме . При этом делится вектор ошибки 100….на образующий полином раз, и последний остаток служит декодером ошибки (см. рисунок 6.57).

Таким образом, детектор ошибки расстраивается на вектор типа 100….( разрядов), что соответствует ситуации, когда разряд с ошибкой находится на выходе дешифратора.

Рис. 6.57. К определению детектора ошибки

Обратимся к структуре дешифратора на рисунке 6.53. Поступающий код подается одновременно на регистр RG и на СД1. За первые n тактов код делится на образующий полином , после чего остаток (если он появляется при наличии ошибок) переписывается в СД2, после чего деление продолжается.

Независимо от кода, при наличии ошибок вектор ошибки не равен нулю, и остаток переписывается в схему деления СД2. Когда код на СД2 совпадает с кодом по рис. 6.57, срабатывает ДО, который отправляет импульс коррекции на разряд с ошибкой, который в это время присутствует на выходе RG.

При необходимости исправления большего числа ошибок схема дешифратора заметно усложняется. Обратная связь, показанная на рис. 6.53 от ДО к СД2 достаточно условна, так как ДО должен срабатывать на все конфигурации вектора ошибки (например, вектор 11000... или 10100…).

Приведем пример исправления двойной ошибки, взяв за основу . Подберем по неравенству Хемминга необходимое количество контрольных разрядов. По той же методике последовательно перебора определяем . В этом случае , , , а . Осталось подобрать образующий полином. Следуем алгоритму Хемминга повышения степени:

.

В качестве исходного полинома выберем . Вычислим : 1111. Тогда (см. рисунок 3.58) . Теперь определим синдромы одиночной и двойной ошибок по предыдущей методике (т. е. делением на образующий полином векторов 1000… и и11000… до 10-го такта). Не приводя собственно иллюстрацию вычисления делением на образующий полином, приводим результаты: в первом варианте остаток равен 100101, во втором – 000001. Вообще, список индикаторов (синдромов) необходимо продолжить, т.к. существуют векторы ошибок 1010000000, 1001000000, 1000100000 (дальнейшие векторы циклически повторяются и их можно не учитывать).

Рис. 6.58. Вычисление

Комбинационная схема только одного типа синдрома и исправления одиночной ошибки приведена на рис. 6.59. Логическая схема включает инверторы Д2, Д3, Д4 и схему логического умножения Д5. Собственно исправление происходит на вентиле Д1 (исключающее ИЛИ). Если учесть все возможные синдромы, аналогичные схемы подключаются дополнительно через схему ИЛИ.

Рис. 6.59. Детектор ошибки

Таким образом, жесткое декодирование полиномиальных кодов достаточно громоздко аппаратно. Практически ограничиваются обнаружением ошибок.

Мягкое декодирование полиномиальных кодов возможно в нескольких вариантах. Так как это очень большой и очень математизированный раздел, отметим только два способа.

1. Вместо конкретных значений 0 или 1 выбирается более тонкое, например, двоичный код амплитуды сигнала в момент отсчета. Если блочный код имеет n разрядов, получается отсчетов, которые впоследствии оптимизируются по одному из алгоритмов. В том числе возможны нечеткие решения, когда часть разрядов однозначно не идентифицируется. Это так называемые стирания. Такой алгоритм называется поэлементным приемом. После такого решения возможен так называемый прием в целом, когда на второй стадии анализируется весь код. При этом используются методы максимального правдоподобия или аналогичные методы оптимизации.

2. Второй способ трансформирует код в условную частотную область с помощью операции, косвенно трансформирующую код по подобию интеграла Фурье. Само выражение имеет вид:

(6.56)

где – примитивный элемент в кольце по модулю (n-1), – текущий разряд кода. Это – тоже -разрядный код, в котором суммирование осуществляется по циклическому принципу, но с особыми свойствами. Обратное преобразование выглядит так:

(6.57)

Здесь знак «–» означает обратный порядок счета примитивных элементов.

Кроме предложенных спектральных оценок Sj, используется также локаторный многочлен: код, определяемый соотношением:

(6.58)

Это также код (в частном случае двоичный) со специфическими свойствами, которые позволяют обнаружить как одиночные ошибки, так и их пачки (пачкой называется несколько ошибок подряд).