
Групповые коды
Групповые коды составляют очень малую часть всех блоковых кодов. Однако, за редкими исключениями, именно групповые коды являются блоковыми кодами, имеющими практическое значение. Групповые коды часто называются также линейными или кодами с обобщенными проверками на четность. В классе всех групповых кодов можно выделить важный большой подкласс, состоящий из так называемых полиномиальных кодов. Примерами полиномиальных кодов являются коды Боузе-Чоудхури-Хэквингема (БЧХ), коды Рида-Соломона, обобщенные коды Рида-Мюллера, проективно-геометрические, евклидово-геометрические и квадратичновычетные коды. Описание каждого из этих семейств кодов задается указанием алгоритма для его построения. Указанные семейства кодов, вообще говоря, пересекаются, так что некоторый конкретный код может быть одновременно кодом БЧХ и вычетным кодом или обобщенным кодом Рида-Мюллера и т. д. Важность полиномиальных кодов обусловлена несколькими причинами. Во-первых, аппаратная реализация кодеров для таких кодов требует лишь сравнительно простых регистров сдвига с обратными связями. Во-вторых, это семейство содержит много кодов, кодовое расстояние которых близко к наилучшему, в особенности при длине блока около 100 или менее. В-третьих, существует несколько алгоритмов декодирования, позволяющих декодировать некоторые из этих кодов с помощью сравнительно несложных устройств.
Будем предполагать, что каждое кодовое слово группового кода разбито на две части. Первая часть, состоящая из k символов, всегда совпадает с передаваемой информационной последовательностью. Каждый из п–k символов второй части вычисляется как линейная комбинация фиксированного подмножества информационных символов. Поэтому эти символы называются символами обобщенных проверок на четность или просто символами четности. Коды такого типа, в которых информационные символы при кодировании не изменяются, называются систематическими. Можно показать, что любой групповой код можно сделать систематическим на некотором множестве из k позиций, выбрав подходящее соответствие между входными последовательностями и кодовыми словами. Это утверждение станет более ясным в дальнейшем. Его значение состоит в том, что, ограничиваясь лишь рассмотрением систематических кодов, мы не исключаем никаких важных групповых кодов. Однако средняя вероятность ошибки при использовании систематического и эквивалентного ему несистематического кодов не должна быть одной и той же. Это станет более ясным при дальнейшем рассмотрении.
Коды с обобщенными проверками на четность
Очень простым двоичным групповым кодом является (п, п – 1)-код, построенный с помощью одной общей проверки на четность. Например, кодовое слово (4,3)-кода может быть записано в виде вектора-столбца
аТ = (а 1, а 2, а 3, а 1 + а2 + а3),
где at принимают значения 0 или 1, а + означает сложение по модулю 2. Отметим, что если посимвольно прибавить к первому кодовому слову второе кодовое слово
bT = (b1, b2, b3, b1 + b2 + b3),
то получим
cT=аT + bT = (а 1 + b1, а 2 + b2, а 3 + b3, а 1 + b1 + а 2 + b2 + а 3 + b3) = (c1, c2, c3, c1 + c2 + c3)
Таким образом, проверочный символ в слове с получается точно такой же процедурой, как проверочные символы в словах а и b. Поэтому с также является кодовым словом. Этот пример показывает наиболее важное свойство групповых кодов, которое называется замкнутостью: сумма двух кодовых слов также является кодовым словом. Этот результат очевидным образом обобщается на любой групповой код.
В качестве второго примера определим кодовое слово (6,3)-кода равенством
аТ = (а 1, а 2, а 3, а 1 + а2, а2 + а3, а 1 + а2 + а3).
Если посимвольно прибавить к а второе кодовое слово b, то получим слово с, в котором
c1 = а 1 + b1,
c2 = а 2 + b2,
c3 = а 3 + b3,
c4 = а 1 + b1 + а 2 + b2 = c1 + c2,
c5 = а 2 + b2 + а 3 + b3 = c2 + c3,
c6 = а 1 + b1 + а 2 + b2 + а 3 + b3 = c1 + c2 + c3
Таким образом, три проверочных символа в слове с определяются точно так же, как в а и в b, поэтому с также является кодовым словом.
Из указанного свойства вытекают два важных следствия. Одно из них – существование простой процедуры для построения групповых кодов. Второе состоит в существовании связи между расстояниями в групповом коде и его весовым спектром. Этот факт позволяет значительно упростить задачу построения хороших групповых кодов. Временно отложим задачу построения групповых кодов и рассмотрим свойства расстояния между кодовыми словами.
Расстояние d (a, b) между двумя кодовыми словами а и b определяется как число позиций, в которых эти слова различаются. Вес w(c) кодового слова определяется как число ненулевых элементов этого слова. Легко видеть, что если рассмотреть посимвольную сумму по модулю 2 двух кодовых слов, то ее ненулевые символы соответствуют несовпадающим символам двух кодовых слов. Поэтому для любых двух кодовых слов а и b имеем
d (a, b) = w (a+b).
Отсюда вытекает, что множество расстояний от фиксированного кодового слова до всех других кодовых слов совпадает с множеством всех весов этого кода. Другая формулировка этого свойства состоит в том, что расстояние между двумя кодовыми словами совпадает с расстоянием от нулевого кодового слова до некоторого кодового слова. Таким образом, при построении группового кода с хорошим набором расстояний нужно стремиться к тому, чтобы веса ненулевых кодовых слов были возможно большими. Кроме того, при вычислении характеристик группового кода достаточно рассматривать лишь передачу нулевого кодового слова, поскольку расстояния между любыми другими кодовыми словами будут такими же.
Своим названием групповые коды обязаны тому, что множество кодовых слов вместе с нулевым словом, снабженное операцией посимвольного сложения по модулю 2, образует математическую структуру, называемую группой. Основные свойства группы таковы:
1) сумма двух элементов группы всегда лежит в группе (замкнутость);
2) выполняется закон ассоциативности, так что (а + b) +с = а + (b + с);
3) группа всегда содержит единичный элемент (нулевое слово);
4) каждый элемент группы обладает обратным (в случае двоичного кода каждое слово совпадает со своим обратным), для которого а + ( – а) =0.
Ясно, что коды с обобщенными проверками на четность, определенные в этом подразделе, характеризуются всеми четырьмя указанными свойствами. Примеры кодов, обсуждаемые здесь, были определены над «полем» из двух элементов {0, 1} с помощью арифметики по модулю 2. Можно, однако, определить недвоичные коды, используя конечное поле из q элементов (q ≠ 2). Все утверждения, сформулированные для двоичных кодов, справедливы и для недвоичных кодов. Арифметические операции в недвоичных полях будут рассмотрены ниже.
Вместо того чтобы явно выписывать уравнения для проверок на четность, как мы это делали в примере (6,3)-кода, часто оказывается более удобным использовать матричные обозначения. Например, проверочная матрица Н содержит ту же информацию о коде, что и выписанное в общем виде кодовое слово а:
, (1)
аТ
=
.
Каждый столбец матрицы Н соответствует некоторому символу кодового слова: первые три столбца – информационным символам, а последние три – проверочным. Соотношение, выражаемое первой строкой, состоит в том, что четвертый символ является суммой а1 и а2. Аналогично вторая строка указывает, что пятый символ является суммой а2 и а3 и т. д. Эта матрица записана в канонической форме. Это значит, что первые k столбцов задают информационные символы, которые входят во все уравнения, в то время как последние п – k столбцов образуют единичную матрицу. Позднее будет показано, что проверочную матрицу можно записывать и различными другими способами, а такая возможность часто оказывается полезной.
Приведенные рассуждения можно формализовать, сказав, что последовательность а является кодовым словом в том, и только в том случае, если
На = 0. (2)
В этом уравнении матричное умножение выполняется обычным образом, с тем единственным исключением, что в случае двоичных кодов используется сложение по модулю 2.