Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
СДЭС_Уч_метод_пос_кодирование2.doc
Скачиваний:
93
Добавлен:
03.12.2018
Размер:
1.89 Mб
Скачать

2.2. Двоичный код Голея

Голей обнаружил, что

Это равенство позволяет предположить возможность существования совершенного двоичного (23,12, 7) кода с t = 3, т.е. кода, способного исправлять до трех ошибок в словах длиной 23 символа. В своей статье Голей привел порождающую матрицу такого двоичного кода, исправляющего до трех ошибок.

Из-за относительно небольшой длины (23) и размерности (12), а также небольшого числа проверок (11), кодирование и декодирование двоичного (23,12,7) кода Голея может быть выполнено табличным методом.

2.2.1 Кодирование

Табличное (LUT, look-up-table) кодирование реализуется с помощью просмотра таблицы, содержащей список всех 212 = 4096 кодовых слов, которые пронумерованы непосредственно информационными символами. Обозначим и информационный вектор размерности 12 бит и v соответствующее кодовое слово (23 бита). Табличный кодер использует таблицу, в которой для каждого информационного вектора (12 бит) вычислен и записан синдром (11 бит). Синдром берется из таблицы и приписывается справа к информационному вектору.

Операция LUT является взаимно однозначным отображением из множества векторов u на множество векторов v, которое может быть записано в виде

(2.3)

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

или в шестнадцатиричной счисления системе С75. Этот полином используется в процедуре "get_syndrome", заданной уравнением (2.3).

2.2.2. Декодирование

Напомним, что задачей декодера (Часть 1, Рисунок 14) является оценка наиболее вероятного (т.е. обладающего минимальным Хемминговым весом) вектора ошибок е по принятому вектору r.

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

Выписать все возможные вектора ошибок е, вес Хемминга которых не превышает трех;

Для каждого вектора ошибок вычислить соответствующий синдром s=get_syndrome(e);

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

Исправление до трех ошибок в принятом искаженном слове r с помощью LUT-декодера может быть представлено следующим образом:

где v" — исправленное кодовое слово.

2.2.3. Арифметическое декодирование расширенного (24,12,8) кода Голея.

В этом разделе рассматривается процедура декодирования расширенного (24,12,8) кода Голея С24, реализующая арифметический алгоритм декодирования. Этот алгоритм использует строки и столбцы подматрицы В проверочной матрицы Н=(В, I12). Заметим, что (24,12,8) код Голея, эквивалентный с точностью до перестановки отдельных позиций коду С24, может быть построен добавлением общей проверки на четность к кодовым словам (23,11,7) кода Голея.

Двенадцать строк подматрицы В, обозначенные как rowi, 1 ≤ i < 12, имеют следующий вид в шестнадцатеричной системе:

Важно отметить, что подматрица В проверочной матрицы кода С24 удовлетворяет равенству В = Вт, т.е. транспонированная и исходная матрицы совпадают. Это означает, что код С24 является самодуальным кодом. Дуальным кодом называют код, использующий проверочную матрицу исходного кода в качестве порождающей.

В программе golay24.c кодирование реализуется рекуррентно, по правилу (1.18). Как и раньше, через wtH(x) обозначен вес Хемминга вектора х. Процедура декодирования состоит в выполнении следующей последовательности шагов:

  1. Вычислить синдром s = rНT.

  2. Если wtH(s) ≤ 3, то исправляющий вектор равен е = (s, 0), перейти к шагу 8.

  3. Если wtH(s + rowi) ≤ 2, для 1 ≤ i≤ 12, то исправляющий вектор равен е = (s + rowi, хi), где хi вектор длины 12, содержащий 1 в i-ой координате и нули в остальных. Перейти к шагу 8.

  4. Вычислить sB.

  5. Если wtH(sB) ≤ 3, то исправляющий вектор равен е = (0, sB), перейти к шагу 8.

  6. Если wtH(sB + rowi) ≤ 2, для некоторого i, 1 ≤i ≤12, то исправляющий вектор равен е = (хi, sB + rowi), где хi вектор длины 12, содержащий 1 в i-ой координате и нули в остальных. Перейти к шагу 8.

  7. Если ни одно из условий шагов 2 - 6 не было удовлетворено, то вектор r содержит неисправимое сочетание ошибок и устанавливается флаг «отказ от декодирования». Конец процедуры.

  8. Вычислить с = r + е. Конец процедуры.

Примичание. Эта процедура имеет очень простое объяснение. Кодовое слово длиной 24 символа состоит из информационной части (12) бит и проверочной части (12) бит. Если все ошибки находятся только в проверочной части, то вес синдрома равен числу ошибок. Если этот вес не превышает трех, то декодер принимает на шаге 2 процедуры декодирования однозначное решение о том, что вектор ошибок совпадает с синдромом.

На шаге 3 проверяется предположение о том, что одна (именно одна) ошибка находится на i-ой позиции в информационной части принятого слова. Для правильного выбора i прибавление rowi к синдрому компенсирует вклад этой ошибки в синдром, после чего вес измененного синдрома будет равен 2 или 1. На основании этого декодер принимает однозначное решение о том, что исправляющий вектор равен конкатенации (соединению) вектора xi с измененным синдромом. В противном случае, число ошибок возрастет, вес синдрома не удовлетворит условию. Разумеется, может оказаться, что какое-то другое слово расположено на расстоянии не более 2 от измененного слова при условии, что в принятом слове больше трех ошибок.

На шагах 4—6 процедуры выполняются такие же проверки в предположении, что, либо все ошибки, либо все кроме одной, находятся в информационной части принятого слова. Для этого используется следующее линейное преобразование проверочной матрицы:

которому соответствует преобразование синдрома, равное sB.

Справедливость этого преобразования следует из равенства ВВ = I12, которое легко можно проверить. Другими словами, с помощью этого преобразования, с точки зрения декодера, меняются местами информационные и проверочные позиции кодового слова, хотя никакие изменения с самим кодом не происходят.

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