
1
4. ПРИНЦИПЫ ПОСТРОЕНИЯ И РЕАЛИЗАЦИЯ КОМБИНАТОРНЫХ КОДОВ
Внастоящем разделе рассматриваются первичные (неизбыточные)
иизбыточные коды, основанные на математическом аппарате комбинаторики. В частности, исследуются коды на все возможные сочетания (первичные, неизбыточные коды), коды на некоторые сочетания (коды с общей проверкой на четность или нечетность), неразделимые коды на одно сочетание (коды с постоянным весом), разделимые коды Бергера. Рассматриваются принципы и примеры построения комбинаторных и декомбинаторных устройств (кодеров и декодеров комбинаторных кодов) в системах передачи данных.
Комбинаторные коды используются для обнаружения ошибок при передаче сообщений по каналам связи, по внутриблочным магистралям устройств, обрабатывающих информацию; для кодирования внутренних состояний цифровых автоматов.
4.1. Первичные (неизбыточные) двоичные коды
Полное множество всех возможных n-разрядных комбинаций (M0)
указанного класса двоичных кодов |
|
|
|
|
|
||
|
M0 = |
|
|
n n |
(4.1) |
||
|
2n = ∑ , |
||||||
n |
|
|
|
i=0 i |
|
||
=Ci |
|
n! |
|
|
|||
|
|
= |
. |
|
|||
|
|
||||||
|
|
|
n |
|
i!(n −i)! |
|
|
i |
|
|
|
|
Поэтому код, составленный из всех кодовых комбинаций, называют кодом на все возможные сочетания. Следовательно, количество рабочих комбинаций кода Mр (используемых для первичного кодирования сообщений) равно количеству всех комбинаций: Mр = M0.
Область применения кода: телеграфия, тракты передачи данных, многофункциональные системы телемеханики, различные системы и устройства обработки информации.
Исторически первыми появились пятиэлементные коды – код Бодо и код Муррея. Указанные коды, позволявшие сформировать 32 различные кодовые комбинации, использовались в телеграфии. Число различных букв, цифр и знаков телеграфных систем того времени не превышало 56. Поэтому использовался двухрегистровый режим работы, т. е. различались цифровой и буквенный регистры. Для вычисления начала и конца заголовка, начала и конца текста использовались такие последовательности, кото-
2
рые не могли появиться в естественном тексте. Например, для начала текста – ZCZC, а для конца – NNNN.
Преимущество этих кодов в том, что при редких переключениях регистров, что характерно для телеграфии, при передаче естественного текста в коде Бодо (Муррея) затрачивается в среднем 5,05 бит/знак. А при использовании шестиэлементного кода, с помощью которого можно было бы передать 64 символа, затрачивалось бы 6 бит/знак. Существенный недостаток кода – низкая эффективность при передаче данных, число разнообразных символов в которых значительно больше 56, и чередование цифр, букв и других знаков достаточно частое [8].
МККТТ (Международный консультативный комитет по телефонии и телеграфии, ныне Международный союз электросвязи – МСЭ) в 1931 г. принял стандартный код № 1 (МТК-1), в основу которого положен код Бодо, а в 1932 г. − стандартный код № 2 (МТК-2), в основу которого положен код Муррея. Для русского алфавита введен третий регистр, переход на который осуществляется передачей комбинации из пяти нулей.
Развитие вычислительной техники, систем передачи данных, широкое применение СВТ для обработки информации сделали необходимой новую стандартизацию первичного кода. Это обусловлено ростом числа служебных и функциональных символов, символов различных математических и логических операций и ряда служебных символов. В результате длительной работы (1962 – 1965 гг.) был предложен семизначный двоичный код ASCII (американский стандарт). Имеется несколько стандартизированных версий этого кода с различными названиями, но в общем они базируются на одном и том же коде. В частности, версия МККТТ известна как международный код № 5 (МТК-5); версия международной организации стандартов (ISO) называется «Семиэлементный код ISO для взаимообмена и обработки информации»; российская версия – КОИ-7 (код для обмена информацией). Всего код образует 128 различных комбинаций, позволяющих закодировать строчные и прописные алфавитно-цифровые знаки, графические, служебные и управляющие символы. В кодовой таблице ASCII содержится 32 управляющих символа, в частности четыре общих класса:
•символы связи – для управления потоком данных по линиям;
•символы печати – для управления физическим расположением информации на печатной странице или на экране монитора;
•символы управления устройствами – для управления терминала-
ми;
•разделители информации – для логического разделения элементов
данных.
Передача любых чисел ведется в двоично-десятичном коде (тетрадами). Расширенный двоично-десятичный код (РДДК) является восьмиэлементным, причем все элементы используются для передачи информации (в отличие от международного кода МТК-5 (ASCII), в котором восьмой
3
элемент является битом проверки на четность), и дает 256 возможных комбинаций. РДДК используется как внутренний код во многих ЭВМ, и поэтому он часто применяется для обмена данными с машинами. Российская версия РДДК – код КОИ-8, внутримашинная версия – код ДКОИ.
Современные коды, предназначенные для представления и обработки информации, например, UTF-8, используют расширенный набор элементов, являясь уже двухбайтными. Они позволяют кодировать значительно большее количество символов и специальных знаков.
4.2.Избыточные комбинаторные коды
4.2.1.Код на некоторые сочетания (четные или нечетные)
Комбинации данного кода отбираются из всех возможных сочетаний неизбыточного кода по принципу четности или нечетности веса кодовых комбинаций. Очевидно, что из всех возможных кодовых комбинаций половина имеет четный вес, а половина – нечетный. Поэтому число рабочих комбинаций кода на некоторые сочетания определяется как
Mр = |
M0 |
= |
2n |
= 2n−1 . |
(4.2) |
|
2 |
2 |
|||||
|
|
|
|
Минимальное кодовое расстояние dmin = 2, с учетом (3.11), r = 1. Данный код обнаруживает всевозможные ошибки нечетной кратности, так как именно они нарушают четность веса. В то же время данный код не обнаруживает ошибки четной кратности, в частности двукратные ошибки.
Оценку избыточности производим по (4.3) и (4.4):
R |
= |
M |
0 −M |
р |
= |
2n −2n−1 |
= 0,5; |
(4.3) |
|||||
|
M0 |
|
|
2n |
|||||||||
I |
|
|
|
|
|
|
|
|
|
|
|||
|
RII = |
n − m |
|
= |
n − (n −1) |
= |
1 |
, |
(4.4) |
||||
|
|
|
n |
||||||||||
|
|
|
|
n |
|
|
|
n |
|
|
|
|
где m – длина информационной части. Параметр m показывает, сколько понадобилось бы символов для неизбыточного (первичного) кодирования Mр кодовых комбинаций. Следовательно, количество информационных символов определяется как
m =[log2 M р] =[log2 2n−1] = n −1. |
(4.5) |
4
Оценим полученные показатели избыточности. Из (4.3) можно сделать вывод о том, что избыточность с точки зрения использования комбинаций кода для кодирования всегда постоянна. Из (4.4) следует, что избыточность с точки зрения использования кодовых символов зависит от длины кодовой комбинации. Таким образом, код на некоторые сочетания тем эффективнее (менее избыточен), чем большая длина у кодовой комбинации. В реальных системах передачи данных указанным кодом часто защищается байт информации (m = 8, n = 9).
Можно выделить два способа формирования кода на некоторые сочетания. Первый способ основан на выборе из полного множества M0 = 2n n-разрядных кодовых комбинаций с нужным (четным или нечетным) весом. Второй способ основан на добавлении к m-разрядным кодовым комбинациям неизбыточного (первичного) кода одного дополнительного символа, формирующего у (m + 1) = n-разрядной кодовой комбинации нужный (четный или нечетный) вес. В данном случае код считается разделимым, так как у него можно в явном виде выделить информационную часть длины m и избыточную часть длины k = 1. Замечательным свойством разделимого кода на некоторые четные сочетания является его принадлежность к различным классам кодов: комбинаторным, алгебраическим, арифметическим.
Поскольку первый способ формирования кода не получил практического применения, то рассмотрим на примере второй способ.
Пример 4.1. Сформируем код на некоторые сочетания для m = 3 информационных символов.
Определим Mр = 23 = 8. Техника построения разделимого кода, т.е. кода с явно выраженными информационными (m) и избыточными (k) символами, такова:
1)выписываем все возможные кодовые комбинации m-разрядного двоичного кода;
2)для кода на четные (нечетные) сочетания приписываем (m + 1)-й разряд, дополняющий вес n-разрядного кодового слова до четного (нечетного) значения (табл. 4.1):
Таблица 4.1
m = 3 |
Ч |
Н |
|
|
|
000 |
0 |
1 |
001 |
1 |
0 |
010 |
1 |
0 |
011 |
0 |
1 |
100 |
1 |
0 |
101 |
0 |
0 |
110 |
0 |
1 |
111 |
1 |
0 |
5
Примечание. Символ «Ч» показывает значение дополнительного символа, который добавляется при формировании кода на четные сочетания. Символ «Н» показывает значение дополнительного символа, который добавляется при формировании кода на нечетные сочетания.
Выделим две процедуры декодирования кодов на некоторые сочета-
ния.
1.Принятая кодовая комбинация сравнивается со всеми кодовыми
комбинациями из множества Мр. При совпадении с одной из них принимается решение о правильности передачи. При несовпадении ни с одной из них принимается решение об обнаружении ошибки, которое приводит
кстиранию сообщения.
2.У принятой кодовой комбинации производится анализ четности веса. При совпадении четности с ожидаемой (заданной при формировании кода) принимается решение о правильности передачи. При несовпадении четности с ожидаемой принимается решение об обнаружении ошибки, которое приводит к стиранию сообщения.
Можно сделать вывод о том, что правильная передача имеет место при отсутствии ошибок, стирание – при ошибках нечетной кратности, трансформация – при ошибках четной кратности.
Оценим вероятностные характеристики кодов на некоторые сочета-
ния:
P |
|
= P(0) = (1 − p)n , |
|
|
|
|
|
|
|||||
пр |
|
|
|
|
|
|
|
|
|
|
|
|
|
cт |
|
(nн+1) / 2 |
|
(nн+1) / 2 |
n |
|
|
||||||
= |
∑ |
P(2i |
−1) |
= |
∑ |
|
|
|
p |
(2i−1) (1 − p)n−(2i−1) , |
|||
P |
н |
|
|
|
|
|
|
||||||
|
|
|
i=1 |
|
|
|
i=1 |
|
2i −1 |
|
(4.6) |
||
|
|
|
nч / 2 |
|
|
nч / 2 |
n |
|
|
|
|||
P |
|
= |
|
|
p(2i−1) |
(1 − p)n−(2i−1) , |
|||||||
ч |
∑ |
P(2i −1) = |
∑ |
|
|
|
|||||||
ст |
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
i=1 |
|
|
|
i=1 |
2i − |
1 |
|
|
|
Pтр =1 − Pпр − Pст.
где Pcнт – вероятность стирания при нечетном (nн) значении длины кодовой комбинации; Pcчт – вероятность стирания при четном (nч) значении длины
кодовой комбинации.
Отметим, что код на четные (нечетные) сочетания широко применяется для обнаружения ошибок при передаче информации по каналам связи, по внутриблочным магистралям, при межузловом обмене.
4.2.2. Код на одно сочетание (код с постоянным весом)
Код на одно сочетание называется еще кодом с постоянным весом, так как из всех возможных сочетаний неизбыточного кода отбираются
6
только кодовые комбинации одинакового (одного) веса w. Тогда число рабочих комбинаций кода с постоянным весом определяется как
M |
|
|
n |
(4.7) |
|
р |
=Cw = |
. |
|||
|
n |
|
|
|
|
|
|
|
w |
|
Данный код является неразделимым кодом, что является определенным недостатком. Недостаток заключается в том, что код с постоянным весом является и первичным кодом (используется для кодирования сообщений), и помехоустойчивым (канальным) кодом.
Выделим две процедуры декодирования кодов с постоянным весом:
1.Принятая кодовая комбинация сравнивается со всеми кодовыми
комбинациями из множества Мр. При совпадении с одной из них принимается решение о правильности передачи. При несовпадении ни с одной из них принимается решение об обнаружении ошибки, которое приводит
кстиранию сообщения.
2.У принятой кодовой комбинации производится анализ веса. При совпадении веса с ожидаемым значением w принимается решение о правильности передачи. При несовпадении четности с ожидаемой принимается решение об обнаружении ошибки, которое приводит к стиранию сообщения.
Для анализируемого кода минимальное кодовое расстояние dmin = 2, поэтому он гарантированно обнаруживает однократные ошибки (r = 1). Дополнительно код обнаруживает ошибки произвольной кратности, нарушающие постоянство веса кодовой комбинации. В частности, обнаруживаются все возможные ошибки нечетной кратности, гарантированно изменяющие вес кодовой комбинации. Также обнаруживаются все возможные однонаправленные ошибки четной кратности, т. е. только ошибки перехо-
да типа 0 → 1 или 1 → 0 в пределах одной кодовой комбинации. Симметричные ошибки четной кратности (два и более) не обнаруживаются, т.к. не нарушают постоянства веса. При симметричных ошибках в пределах одной кодовой комбинации допускаются одновременно переходы 0 → 1 и 1 → 0. Отметим, что асимметричные ошибки, т.е. ошибки только одного знака, являются частным случаем однонаправленных ошибок. Код с постоянным весом оптимален в полностью асимметричных каналах, т. е. не существует кода с той же обнаруживающей способностью, имеющего меньшую избыточность.
Пример 4.2. Построим код с постоянным весом w = 2 и длиной кодовых комбинаций n = 4.
Определим размер множества рабочих комбинаций:
Mр = 4 =6 .2

7
Построим кодовую таблицу (табл. 4.2):
|
|
|
|
|
|
|
|
|
Таблица 4.2 |
|
|
|
|
|
1 |
1100 |
|
|
|
|
|
|
|
|
2 |
0110 |
|
|
|
|
|
|
|
|
3 |
0011 |
|
|
|
|
|
|
|
|
4 |
1001 |
|
|
|
|
|
|
|
|
5 |
1010 |
|
|
|
|
|
|
|
|
6 |
0101 |
|
|
|
Оценим избыточность кода: |
|
|
|
|
|||||
R |
I |
= |
32 − 6 |
= 0,813; |
R |
= |
n −[log Mр] |
= 4 −3 =0,25. |
|
|
|
||||||||
|
32 |
|
II |
|
n |
4 |
|||
|
|
|
|
|
Из этого примера видно, насколько грубее оценка RII. Кроме того, из приведенных выше рассуждений становится понятнее, на обнаружение каких дополнительных (по сравнению с кодом на некоторые сочетания) ошибок расходуется большая избыточность кода с постоянным весом.
4.2.3. Код Бергера
Одним из основных недостатков кода с постоянным весом является то, что он неразделимый и нелинейный. Поэтому область его применения достаточно ограничена. В частности, он применяется для кодирования внутренних состояний цифровых автоматов. Существует нелинейный разделимый квазиоптимальный код для полностью асимметричных каналов, называемый кодом Бергера. Структура кодовых слов показана на рис. 4.1.
m |
k |
|
|
Рис. 4.1. Структура кодовых слов кода Бергера
На первых m позициях размещаются информационные символы, на последних k позициях – избыточные символы.
Избыточные символы представляют собой инверсию от записи
вдвоичном позиционном коде текущего веса информационного m- разрядно-го вектора. Поэтому длина избыточной части k рассчитывается
взависимости от максимального веса кодового вектора:
k = [log2(m + 1)]. |
(4.8) |

8
Рассмотрим алгоритм кодирования:
1.Расчет веса информационного вектора.
2.Преобразование десятичного значения веса в двоичный позиционный код.
3.Инверсия полученного двоичного вектора избыточной части.
4.Формирование кодовой комбинации путем добавления избыточной части к информационной части.
Декодирование кода Бергера происходит по следующему алгоритму.
1.Рассчитывается вес информационной части принятой кодовой комбинации.
2. Полученное значение преобразуется из десятичного значения
вдвоичное и инвертируется.
3.Полученный двоичный вектор сравнивается с избыточной частью принятой кодовой комбинации. Если вектора совпадают, то считается, что прием произошел правильно, если нет – происходит стирание сообщения (обнаружение ошибки).
Для анализируемого кода минимальное кодовое расстояние dmin = 2, поэтому он гарантированно обнаруживает однократные ошибки (r = 1), а также некоторые ошибки более высокой кратности, в частности, асимметричные и однонаправленные ошибки произвольной кратности.
Пример 4.3. Построим код Бергера для m = 5.
Определим длину избыточной части k = [log2(5 + 1)] = 3.
Пусть информационный вектор представляет собой кодовую комби-
нацию следующего вида: 01011. Вес информационной части равен 3, в двоичном виде – 011, в инверсном виде – 100. Следовательно, вектор кода Бергера будет имеет следующий вид: 01011 100.
Код Бергера, так же, как и код с постоянным весом, обнаруживает асимметричные ошибки любой кратности (в пределах кодового слова), но
имеет большую избыточность. |
9 |
|
|||
|
|
|
|
=126 имеет избы- |
|
Пример 4.4. Код с постоянным весом M = |
|
||||
|
|
|
|
4 |
|
точность |
RI = |
512 −126 |
= 0,75. Код Бергера, передающий то же множество |
||
|
|||||
|
512 |
|
|
|
сообщений, имеет m = 7 и k = 3, т. е. его избыточность определяется как
= 1024 −128 =
RI 1024 0,87.
Способность кода Бергера обнаруживать асимметричные (однонаправленные) ошибки обусловлена следующим.
Пусть произошли ошибки одного знака, например 0 → 1, в информационной и избыточной частях кодового вектора. В информационных символах эти ошибки увеличили вес информационного вектора, а в избыточных символах вес двоичного слова уменьшился в результате операции

9
инвертирования, произведенной в декодере. Поэтому маскирование ошибки не произойдет, и она будет обнаружена.
Пример 4.5. Пусть исходный кодовый вектор V = 01011 100, искаженный трехкратной ошибкой вектор V ′ = 11111 101. После декодирования, рассчитав вес информационной части кодовой комбинации, получим 5 → 101 → 010. Очевидно, что рассчитанное значение не совпадает с принятой избыточной частью (010 ≠ 101). Таким образом, асимметричные ошибки увеличивают (уменьшают) текущий вес информационного кодового слова, одновременно уменьшают (увеличивают) вес избыточного слова. Поэтому любая асимметричная (однонаправленная) ошибка будет обнаружена.
Выше были рассмотрены наиболее популярные комбинаторные коды. Но список этих кодов значительно шире. Кроме того, не рассматривались низкоскоростные коды с подстановками, у которых в качестве внешних и внутренних кодов используются комбинаторные коды. Для кодов с подстановками кодовое расстояние равно произведению кодовых расстояний внешнего и внутреннего кодов. Таким образом, можно сравнительно просто построить коды, исправляющие ошибки, которые могут найти применение в трактах систем передачи данных. Это возможно при условии малого объема передаваемых сообщений и сравнительно низких требований к скорости передачи информации (допустима большая избыточность).