Опубликован: 11.04.2007 | Доступ: свободный | Студентов: 5905 / 2148 | Оценка: 4.37 / 4.24 | Длительность: 11:19:00
Лекция 10:

Групповые коды

< Лекция 9 || Лекция 10: 123 || Лекция 11 >

Совершенные и квазисовершенные коды

Групповой (m,n) -код, исправляющий все ошибки веса, не большего k, и никаких других, называется совершенным.

Свойства совершенного кода21 :

  1. Для совершенного (m,n) -кода, исправляющего все ошибки веса, не большего k, выполняется соотношение \sum^k_{i=0}C^i_n=2^{n-m}. Верно и обратное утверждение;
  2. Совершенный код, исправляющий все ошибки веса, не большего k, в столбцах таблицы декодирования содержит все слова, отстоящие от кодовых на расстоянии, не большем k. Верно и обратное утверждение;
  3. Таблица декодирования совершенного кода, исправляющего все ошибки в не более чем k позициях, имеет в качестве лидеров все строки, содержащие не более k единиц. Верно и обратное утверждение.

Совершенный код - это лучший код, обеспечивающий максимум минимального расстояния между кодовыми словами при минимуме длины кодовых слов. Совершенный код легко декодировать: каждому полученному слову однозначно ставится в соответствие ближайшее кодовое. Чисел m, n и k (1<k<{n-1\over2}), удовлетворяющих условию совершенности кода очень мало. Но и при подобранных m, n и k совершенный код можно построить только в исключительных случаях.

Если m, n и k не удовлетворяют условию совершенности, то лучший групповой код, который им соответствует называется квазисовершенным, если он исправляет все ошибки кратности, не большей k, и некоторые ошибки кратности k+1. Квазисовершенных кодов также очень мало.

Двоичный блочный (m,n) -код называется оптимальным, если он минимизирует вероятность ошибочного декодирования. Совершенный или квазисовершенный код - оптимален. Общий способ построения оптимальных кодов пока неизвестен.

Для любого целого положительного числа r существует совершенный (m,n) -код, исправляющий одну ошибку, называемый кодом Хэмминга (Hamming), в котором m=2^r-r-1 и n=2^r-1.

Действительно, \sum^1_{i=0}C^i_n=1+2^r-1=2^r=2^{n-m}.

Порядок построения кода Хэмминга следующий:

  1. Выбираем целое положительное число r. Сообщения будут словами длины m=2^r-r-1, а кодовые слова - длины n=2^r-1 ;
  2. В каждом кодовом слове b=b_1b_2\ldots b_n r бит с индексами-степенями двойки (2^0, 2^1, \ldots, 2^{r-1}) - являются контрольными, остальные - в естественном порядке - битами сообщения. Например, если r=4, то биты b_1, b_2, b_4, b_8 - контрольные, а b_3, b_5, b_6, b_7, b_9, b_{10}, b_{11}, b_{12}, b_{13}, b_{14},
b_{15} - из исходного сообщения;
  3. Строится матрица M из 2^r-1 строк и r столбцов. В i -ой строке стоят цифры двоичного представления числа i. Матрицы для r=2, 3 и 4 таковы: M_{3\times2}=\left\lbrack\matrix{01\cr
                                      10\cr
                                      11\cr}\right\rbrack\qquad
M_{7\times3}=\left\lbrack\matrix{001\cr
                            010\cr
                            011\cr
                            100\cr
                            101\cr
                            110\cr
                            111\cr}\right\rbrack\qquad
M_{15\times4}=\left\lbrack\matrix{0001\cr
                             0010\cr
                             0011\cr
                             0100\cr
                             0101\cr
                             0110\cr
                             0111\cr
                             1000\cr
                             1001\cr
                             1010\cr
                             1011\cr
                             1100\cr
                             1101\cr
                             1110\cr
                             1111\cr}\right\rbrack;
  4. Записывается система уравнений bM=0, где M - матрица из предыдущего пункта. Система состоит из r уравнений. Например, для r=3:
    \left\lbrace\matrix{
   b_4+b_5+b_6+b_7=0\cr
   b_2+b_3+b_6+b_7=0\cr
   b_1+b_3+b_5+b_7=0\cr}\right.;
  5. Чтобы закодировать сообщение a, берутся в качестве b_j, j не равно степени двойки, соответствующие биты сообщения и отыскиваются, используя полученную систему уравнений, те b_j, для которых j - степень двойки. В каждое уравнение входит только одно b_j, j=2^i. В выписанной системе b_4 входит в 1-е уравнение, b_2 - во второе и b_1 - в третье. В рассмотренном примере сообщение a=0111 будет закодировано кодовым словом b=0001111.

Декодирование кода Хэмминга проходит по следующей схеме. Пусть принято слово b+e, где b - переданное кодовое слово, а e - строка ошибок. Так как bM=0, то (b+e)M=bM+eM=eM. Если результат нулевой, как происходит при правильной передаче, считается, что ошибок не было. Если строка ошибок имеет единицу в i -й позиции, то результатом произведения eM будет i -я строка матрицы M или двоичное представление числа i. В этом случае следует изменить символ в i -й позиции слова b+e, считая позиции слева, с единицы.

Пример. (4,7) -код Хэмминга имеет в качестве одного из кодовых слов b=0001111. Матрица M_{7\times3} приведена на шаге 3 хода построения кода Хэмминга. Ясно, что bM=0. Добавим к b строку ошибок e=0010000. Тогда b+e=0011111 и (b+e)M=011=3_{10}, т.е. ошибка находится в третьей позиции. Если e=0000001, то b+e=0001110 и позиция ошибки - (b+e)M=111=7_{10} и т.п. Если ошибка допущена в более чем в одной позиции, то декодирование даст неверный результат.

Код Хэмминга - это групповой код.

Это следует из того, что (m,n) -код Хэмминга можно получить матричным кодированием, при помощи m\times n -матрицы, в которой столбцы с номерами не степенями 2 образуют единичную подматрицу. Остальные столбцы соответствуют уравнениям шага 4 построения кода Хэмминга, т.е. 1-му столбцу соответствует уравнение для вычисления 1-го контрольного разряда, 2-му - для 2-го, 4-му - для 4-го и т.д. Такая матрица будет при кодировании копировать биты сообщения в позиции не степени 2 кода и заполнять другие позиции кода согласно схеме кодирования Хэмминга.

Пример. Кодирующая матрица для (4,7) -кода Хэмминга -

E=\left\lbrack\matrix{1110000\cr
                        1001100\cr
                        0101010\cr
                        1101001\cr}\right\rbrack.
Ее столбцы с номерами 3, 5, 6 и 7 образуют единичную подматрицу. Столбцы с номерами 1, 2 и 4 соответствуют уравнениям для вычисления контрольных бит, например, уравнению b_1=b_3+b_5+b_7 соответствует столбец 1101, т.е. для вычисления первого контрольного разряда берутся 1, 2 и 4 биты исходного сообщения или биты 3, 5 и 7 кода.

К (m,n) -коду Хэмминга можно добавить проверку четности. Получится (m,n+1) -код с наименьшим весом ненулевого кодового слова 4, способный исправлять одну и обнаруживать две ошибки.

Коды Хэмминга накладывают ограничения на длину слов сообщения: эта длина может быть только числами вида 2^r-r-1: 1, 4, 11, 26, 57, \ldots Но в реальных системах информация передается байтам или машинными словами, т.е. порциями по 8, 16, 32 или 64 бита, что делает использование совершенных кодов не всегда подходящим. Поэтому в таких случаях часто используются квазисовершенные коды.

Квазисовершенные (m,n) -коды, исправляющие одну ошибку, строятся следующим образом. Выбирается минимальное n так, чтобы

{2^n\over n+1}\ge2^m.
Каждое кодовое слово такого кода будет содержать k=n-m контрольных разрядов. Из предыдущих соотношений следует, что
2^k=2^{n-m}\ge
n+1=C^1_n+C^0_n=m+k+1.
Каждому из n разрядов присваивается слева-направо номер от 1 до n. Для заданного слова сообщения составляются k контрольных сумм S_1, \ldots,
S_k по модулю 2 значений специально выбранных разрядов кодового слова, которые помещаются в позиции-степени 2 в нем: для S_i (1\le i\le k) выбираются разряды, содержащие биты исходного сообщения, двоичные числа-номера которых имеют в i -м разряде единицу. Для суммы S_1 это будут, например, разряды 3, 5, 7 и т.д., для суммы S_2 - 3, 6, 7 и т.д. Таким образом, для слова сообщения a=a_1\ldots a_m будет построено кодовое слово b=S_1S_2a_1S_3a_2a_3a_4S_4a_5\ldots a_m. Обозначим S^*_i сумму по модулю 2 разрядов полученного слова, соответствующих контрольной сумме S_i и самой этой контрольной суммы. Если S^*_k\ldots S^*_1=0, то считается, что передача прошла без ошибок. В случае одинарной ошибки S^*_k\ldots
S^*_1 будет равно двоичному числу-номеру сбойного бита. В случае ошибки, кратности большей 1, когда S^*_k\ldots S^*_1>n, ее можно обнаружить. Подобная схема декодирования не позволяет исправлять некоторые двойные ошибки, чего можно было бы достичь, используя схему декодирования с лидерами, но последняя значительно сложнее в реализации и дает незначительное улучшение качества кода.

Пример построения кодового слова квазисовершенного (9,n) -кода, исправляющего все однократные ошибки, для сообщения 100011010.

{2^{12}\over13}={4096\over13}<2^9=512\quad\hbox{и}\quad
{2^{13}\over14}={4096\over7}>512,\hbox{ т.е. }n=13.
Искомое кодовое слово имеет вид \lower.1ex\hbox{\vbox{\halign{&\hbox to 1.1em{\hfil # \hfil}\cr
_1& _2& _3& _4&_5&_6&_7& _8&_9&_{10}&_{11}&_{12}&_{13}\cr
S_1&S_2& 1&S_3& 0& 0& 0&S_4& 1&    1&    0&    1&    0\cr}}}. Далее нужно вычислить контрольные суммы.
\matrix{\hfill1_{10}=0001_2\cr
\hfill2_{10}=0010_2\cr
\hfill3_{10}=0011_2\cr
\hfill4_{10}=0100_2\cr
\hfill5_{10}=0101_2\cr
\hfill6_{10}=0110_2\cr
\hfill7_{10}=0111_2\cr
\hfill8_{10}=1000_2\cr
\hfill9_{10}=1001_2\cr
\hfill10_{10}=1010_2\cr
\hfill11_{10}=1011_2\cr
\hfill12_{10}=1100_2\cr
\hfill13_{10}=1101_2\cr}\qquad
\matrix{S_1=b_3+b_5+b_7+b_9+b_{11}+b_{13}=0\hfill\cr
S_2=b_3+b_6+b_7+b_{10}+b_{11}=0\hfill\cr
S_3=b_5+b_6+b_7+b_{12}+b_{13}=1\hfill\cr
S_4=b_9+b_{10}+b_{11}+b_{12}+b_{13}=1\hfill\cr}
Таким образом, искомый код - 0011000111010. Если в процессе передачи этого кода будет испорчен его пятый бит, то приемник получит код 0011100111010. Для его декодирования опять вычисляются контрольные суммы:
$$\matrix S_1^*=b_1+b_3+b_5+b_7+b_9+b_{11}+b_{13}=1\hfill\cr\\
S_2^*=b_2+b_3+b_6+b_7+b_{10}+b_{11}=0\hfill\cr\\
S_3^*=b_4+b_5+b_6+b_7+b_{12}+b_{13}=1\hfill\cr\\
S_4^*=b_8+b_9+b_{10}+b_{11}+b_{12}+b_{13}=0\hfill\cr}\\
\ifdim\hsize>155mm\qquad\else$${}$$\fi S_4^*S_3^*S_2^*S_1^*=0101_2=5_{10}.$$
Приемник преобразует изменением пятого бита полученное сообщение в отправленное передатчиком, из которого затем отбрасыванием контрольных разрядов восстанавливает исходное сообщение.

Совершенный код Хэмминга также можно строить по рассмотренной схеме, т.к. для него 2^n/(n+1)=2^m.

Для исправление одинарной ошибки к 8-разрядному коду достаточно приписать 4 разряда ( 2^{12}/13>2^8 ), к 16-разрядному - 5, к 32-разрядному - 6, к 64-разрядному - 7.

Упражнение 41 Может ли (6,14) -код, минимальное расстояние между кодовыми словами которого 5, быть совершенным?

Упражнение 42 Построить кодовые слова квазисовершенного (9,n) -кода, исправляющего однократные ошибки, для тех сообщений, которые соответствуют числам 55, 200 и декодировать слова 1000001000001, 1100010111100, полученные по каналу связи, использующему этот код.

< Лекция 9 || Лекция 10: 123 || Лекция 11 >