КулЛиб - Классная библиотека! Скачать книги бесплатно 

Основы теории кодирования. Учебное пособие [Б. Д. Кудряшов] (pdf) читать онлайн

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]
Б. Д. Кудряшов

Допущено Учебно-методическим объединением вузов Российской Федерации
по университетскому политехническому образованию
в качестве учебного пособия для студентов высших учебных заведений,
обучающихся по направлению подготовки бакалавра 09.03.02
«Информационные системы и технологии» (230400)

Санкт-Петербург
«БХВ-Петербург»
2016

УДК 519.72
ББК 32.811.4
К88

К88

Кудряшов Б. Д.
Основы теории кодирования: учеб. пособие. — СПб.:
БХВ-Петербург, 2016. — 400 с.: ил. — (Учебная литература для вузов)
ISBN 978-5-9775-3527-4
В учебное пособие, ориентированное на семестровый курс лекций, включены классические разделы теории кодирования: линейные коды, основы построения и декодирования алгебраических кодов. Рассказывается о представлении кодов решетками, о декодировании по максимуму правдоподобия. Приведены основы теории сверточных кодов, введение в каскадные коды,
модуляционные коды и турбо-коды. Отдельная глава посвящена низкоплотностным кодам, находящим все более широкое применение в телекоммуникационных стандартах. Все необходимые математические сведения приведены
в виде приложений к главам учебного пособия. В книге много численных примеров, детальных алгоритмов, примеров программ MATLAB.

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

УДК 519.72
ББК 32.811.4

Рецензенты:
Е .Т. Мирончиков — д-р техн. наук, проф. Петербургского государственного
унивеситета путей сообщения;
Ф. И. Соловьева — д-р физ.-мат. наук, проф. Новосибирского государственного
университета.

Подписано в печать 31.08.15.
Формат 70 1001/16. Печать офсетная. Усл. печ. л. 32,25.
Тираж 700 экз. Заказ №
"БХВ-Петербург", 191036, Санкт-Петербург, Гончарная ул., 20.
Первая Академическая типография "Наука"
199034, Санкт-Петербург, 9 линия, 12/28.

ISBN 978-5-9775-3527-4

© Кудряшов Б. Д., 2016
© Оформление, издательство "БХВ-Петербург", 2016

Оглавление

Предисловие . . . . . . . . . . . . . . . . . . . . . . . . . .

1

1. Введение

5

. . . . . . . . . . . . . . . . . . . . . . . . . .

1.1. Постановка задачи помехоустойчивого кодирования .
1.2. Обзор кодов для защиты информации от ошибок . .
Выводы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Задачи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Приложение. Биномиальное и полиномиальное распределения . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2. Линейные коды

. . . . . . . . . . . . . . . . . . . . . .

2.1. Арифметика пространства двоичных
последовательностей . . . . . . . . . . . . . . . .
2.2. Порождающая и проверочная матрицы . . . . .
2.3. Вычисление расстояния по проверочной матрице
2.4. Примеры кодов . . . . . . . . . . . . . . . . . . . .
2.5. Синдромное декодирование . . . . . . . . . . . .
2.6. Радиус покрытия и декодирование по
минимуму расстояния Хэмминга
. . . . . . . .
2.6.1. Радиус покрытия . . . . . . . . . . . . . .
2.6.2. Декодирование по соседям нулевого слова
2.6.3. Декодирование по информационным
совокупностям . . . . . . . . . . . . . . . .
Выводы . . . . . . . . . . . . . . . . . . . . . . . . . . .
Задачи . . . . . . . . . . . . . . . . . . . . . . . . . . .
Приложение. Группы. Основные определения . . . . .

.
.
.
.
.

.
.
.
.
.

5
19
22
23
26
32

.
.
.
.
.

32
37
42
44
48

. . .
. . .
. . .

51
52
54

.
.
.
.

57
62
63
67

.
.
.
.

.
.
.
.

IV

Оглавление

3. Некоторые границы на характеристики кодов . . .

3.1.
3.2.
3.3.
3.4.
3.5.
3.6.

Граница Хэмминга . . . . . . . . . . . . . . . . . . . .
Граница Варшамова–Гилберта . . . . . . . . . . . . . .
Граница Плоткина . . . . . . . . . . . . . . . . . . . . .
Граница Грайсмера . . . . . . . . . . . . . . . . . . . .
Другие границы . . . . . . . . . . . . . . . . . . . . . .
Спектр кода и оценки вероятности
ошибки . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.6.1. Граница вероятности ошибки через спектр кода для ДСК . . . . . . . . . . . . . . . . . . . .
3.6.2. Граница вероятности ошибки для гауссовского
канала . . . . . . . . . . . . . . . . . . . . . . .
3.6.3. Нижняя граница Шеннона . . . . . . . . . . . .
Задачи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Приложение. Тождество Мак-Вильямс . . . . . . . . . . . .

4. Декодирование коротких кодов по максимуму
правдоподобия . . . . . . . . . . . . . . . . . . . . . . .

4.1. Декодирование по максимуму
правдоподобия . . . . . . . . . . . . . . . . . . . . . . .
4.2. Поиск кратчайшего пути в решетке.
Алгоритм Витерби . . . . . . . . . . . . . . . . . . . .
4.3. Минимальная решетка кода . . . . . . . . . . . . . . .
4.4. Построение решетки кода по порождающей матрице .
4.5. Построение решетки кода по проверочной матрице . .
4.6. Декодирование по максимуму апостериорной вероятности с мягкими решениями. Алгоритм БКДР . . . .
4.7. Сложность решеток линейных кодов и сложность декодирования по максимуму правдоподобия . . . . . .
4.7.1. Свойства минимальных решеток линейных
кодов . . . . . . . . . . . . . . . . . . . . . . . .
4.7.2. Границы сложности решеток . . . . . . . . . . .
4.8. Практические алгоритмы декодирования . . . . . . .
4.8.1. BEAST . . . . . . . . . . . . . . . . . . . . . . .
4.8.2. Метод порядковых статистик . . . . . . . . . .
Задачи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

69

70
71
74
77
79
80
80

83
87
90
93
96

96
99
103
107
112
114
124
124
126
129
130
136
139

Оглавление
5. Циклические коды

V
. . . . . . . . . . . . . . . . . . . . 141

5.1. Порождающий и проверочный полиномы циклического кода . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2. Примеры циклических кодов . . . . . . . . . . . . . .
5.3. Кодирование и вычисление синдрома . . . . . . . . . .
Задачи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Приложение. Конечные поля . . . . . . . . . . . . . . . . .
Кольцо вычетов . . . . . . . . . . . . . . . . . . . . . .
Кольцо многочленов . . . . . . . . . . . . . . . . . . .
Мультипликативная группа поля Галуа . . . . . . . .
Минимальные многочлены . . . . . . . . . . . . . . . .

6. БЧХ-коды и РС-коды

142
147
153
160
161
161
162
164
168

. . . . . . . . . . . . . . . . . . 170

6.1. Определение БЧХ-кода
6.2. Построение БЧХ-кодов.
6.3. Коды Рида–Соломона .
Задачи . . . . . . . . . . . .

. . . . . .
Примеры
. . . . . .
. . . . . .

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

.
.
.
.

171
179
182
184

7. Декодирование БЧХ- и РС-кодов . . . . . . . . . . . 187

7.1. Алгоритм Питерсона–Горенстейна–Цирлера . . . . . .
7.2. Алгоритм Берлекэмпа–Месси . . . . . . . . . . . . . .
7.3. Алгоритм Форни . . . . . . . . . . . . . . . . . . . . . .
7.4. Исправление ошибок и стираний . . . . . . . . . . . .
7.5. Декодирование по минимуму обобщенного расстояния
Задачи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Приложение. Линейная сложность последовательностей .

188
191
198
201
206
209
211

8. Сверточные коды . . . . . . . . . . . . . . . . . . . . . 218

8.1.
8.2.
8.3.
8.4.

Представление сверточного кода . . . . . . . . .
Свободное расстояние и спектр сверточного кода
Оценки вероятности ошибки . . . . . . . . . . . .
Декодирование по максимуму правдоподобия .
8.4.1. Реализация алгоритма Витерби . . . . . .
8.5. Высокоскоростные и переменные
сверточные коды . . . . . . . . . . . . . . . . . . .
8.6. Построение блоковых кодов из сверточных . . .
8.6.1. Усеченные сверточные коды . . . . . . . .

.
.
.
.
.

.
.
.
.
.

.
.
.
.
.

219
229
236
241
245

. . . 249
. . . 253
. . . 253

VI

Оглавление
8.6.2. Циклически усеченные сверточные коды . . . 254
Задачи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259

9. Алгебраический подход к сверточным кодам

. . . 268

9.1. Кодер сверточного кода общего вида . . . . . . . . .
9.2. Смитова форма . . . . . . . . . . . . . . . . . . . . .
9.3. Минимальная базовая порождающая матрица . . .
9.4. Проверочная матрица и дуальный код . . . . . . . .
Выводы . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Приложение. МАТЛАБ-программа декомпозиции Смита

.
.
.
.
.
.

268
276
281
285
288
289

10. Длинные коды из коротких кодов . . . . . . . . . . 295

10.1. Итеративные коды . . . . . . . . . . . . . . . . . . . .
10.2. Каскадные и обобщенные каскадные коды . . . . . .
10.3. Турбо-коды . . . . . . . . . . . . . . . . . . . . . . . .
10.3.1. Выбор компонентных кодов . . . . . . . . . . .
10.3.2. Турбо-декодирование . . . . . . . . . . . . . .
10.3.3. Практическая реализация . . . . . . . . . . .
10.4. Кодированная модуляция . . . . . . . . . . . . . . . .
10.4.1. Коды и сигналы . . . . . . . . . . . . . . . . .
10.4.2. Сигнально-кодовые конструкции . . . . . . . .
10.4.3. Кодированная модуляция с перемешиванием
битов . . . . . . . . . . . . . . . . . . . . . . . .
Задачи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

296
300
306
309
310
313
317
318
327
333
337

11. Коды с малой плотностью проверок на четность . 339

11.1.
11.2.
11.3.
11.4.

Проверочная матрица МППЧ-кода . . . . . . . . . . 339
Декодирование по принципу распространения доверия 343
Графы Таннера и характеристики МППЧ-кодов . . . 350
Построение МППЧ-кодов . . . . . . . . . . . . . . . . 356
11.4.1. Квазициклические МППЧ-коды . . . . . . . . 356
11.4.2. Кодирование . . . . . . . . . . . . . . . . . . . 363
11.4.3. Обзор конструкций МППЧ-кодов . . . . . . . 365
11.5. Коды для стандартов: результаты моделирования . . 372

Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
Предметный указатель . . . . . . . . . . . . . . . . . . . . 388

Предисловие
Теорию кодирования можно рассматривать как раздел теории информации, посвященный проблеме достижения пределов скорости
передачи информации, предугаданных Клодом Шенноном. В связи с тем, что научное сообщество готовится отметить в 2016 году
столетний юбилей Шеннона, в 2013 году от лица ученых и инженеров, работающих в области теории информации и ее приложений,
президент IEEE M. S. Coleman, президент Bell Labs G. Rittenhouse
и президент MIT R. Reif выступили с инициативой выпустить в
США почтовую марку, посвященную этому юбилею. В их обращении к руководству Почтовой службы США говорится о значении
теории Шеннона для нашего времени:

We are writing to propose a stamp to honor the centenary
of Clode Elwood Shannon, father of the information
age.
Information systems like smart phones, MP3 players and
World Wide Web are changing our lives. They store
our memories, connect our communities, and carry out
entertainment. They facilitate healthcare delivery and
provide the backbone upon our financial, industrial and
governmental institutions are built.
Much as Newton discovered the laws of gravity
and motion, Shannon discovered the laws of
information. By uncovering the simple laws at the heart of

such overwhelmingly complex problems as communication,
computing, memory and cryptography, Shannon unlocked
the door that led us to the information age.

2

Предисловие

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

Рис. 1. Клод Шеннон

По мере появления новых задач и новых технологий для решения этих задач содержание теории кодирования быстро изменялось,
особенно в последние 20 лет. С другой стороны, время, отводимое
на изучение предмета, все время уменьшается, поскольку появляются на свет новые важные объекты для освоения студентами информационных специальностей. В результате относительно недавно
изданные и переизданные классические монографии и учебники по
теории кодирования объемом свыше 1000 страниц (см., например,
[26]), тяжелы для студентов и аспирантов (в том числе и в буквальном смысле) и при этом не успевают отражать важные обновления
в теории и практике кодирования.

Предисловие

3

Поэтому задача данной книги — сконцентрировать фундаментальные практические важные результаты современной теории кодирования в объеме семестрового курса. При этом предполагается,
что большая часть прикладных вопросов изучается на практических занятиях, при выполнении лабораторных работ и самостоятельно при подготовке проектов. Поэтому в учебник включены задачи, решение которых требует использования компьютера, а также примеры программ, которые будут полезны при решении этих
задач и при реализации алгоритмов кодирования и декодирования.
Особенность теории кодирования — разнообразие используемых
математических методов. «Классические» методы кодирования основывались на дискретной математике, на теории конечных полей.
Параллельно развивались вероятностные методы. В 1990-е годы
произошла «турбо-революция», после которой выросло значение алгоритмических методов анализа графов. Соответственно, предполагается, что читатель умеет программировать, знаком с основами
теории вероятности, комбинаторики и линейной алгебры, знает терминологию теории графов, а также фундаментальные понятия высшей алгебры. Хотя почти все используемые термины дополнительно поясняются, этих напоминаний может оказаться недостаточно и
тогда придется воспользоваться учебниками по соответствующим
разделам математики.
Одна из трудностей при отборе материала — избежать перекоса
в сторону тематики, которая наиболее близка и интересна автору.
В полной мере избежать такого перекоса не удалось. Представлению кодов решетчатыми диаграммами, теории сверточных кодов
и некоторым другим вопросам уделено, возможно, несколько больше внимания, чем следовало. С другой стороны, некоторые важные
вопросы теории и практики кодирования не попали в учебник. Обзор литературы, по которой можно восполнить пробелы, приведен
в параграфе 1.2.
Автору учебника посчастливилось учиться теории информации
и кодированию у В. Д. Колесника, Г. Ш. Полтырева, Е. Т. Мирончикова. Пониманию предмета помогли практическая работа с Г. Тененгольцем в США, с компанией Samsung, совместные научные исследования с Р. Йоханнессоном и его аспирантами в университете
г. Лунд (Швеция), сотрудничество с В. Сидоренко и М. Боссертом

4

Предисловие

в университете г. Ульм (Германия). Всем своим учителям, коллегам
и партнерам автор выражает свою глубокую и искреннюю признательность.
Автор признателен активным читателям и беспощадным критикам учебника — студентам факультета компьютерных технологий
Санкт-Петербургского университета информационных технологий,
механики и оптики за конструктивные замечания и десятки обнаруженных неточностей.
Особенную благодарность автор выражает своей жене, коллеге
и соавтору Бочаровой И. Е. В материалы разделов, посвященных
построению сверточных кодов и кодов с малой плотностью проверок на четность, включены некоторые результаты наших совместных работ.

1.

Введение

В 1948 году, когда, благодаря опубликованию работы Клода Шеннона [103], появилась на свет теория информации, большая часть
информации передавалась в аналоговом виде. Сегодня ситуация изменилась на противоположную: по каналам связи сегодня вместо
человеческой речи или музыки передаются нули и единицы. Более
того, почти все сферы повседневной жизни так или иначе зависят
от скорости и надежности передачи информации.
В этой главе мы воспользуемся фундаментальными теоремами
Шеннона для того, чтобы указать теоретические пределы эффективности помехоустойчивого кодирования и сравнить их с эффективностью кодов, используемых на практике. В дальнейшем, близость к теоретическим пределам будет служить для нас критерием
для сравнения классов кодов.

1.1.

Постановка задачи помехоустойчивого
кодирования

Сначала поясним общую идею защиты информации от ошибок.
Предположим, что в нашем распоряжении имеется канал, на вход
которого можно подавать двоичные символы (рис. 1.1, а).
Такой канал называют двоичным симметричным каналом
(ДСК), вероятность 𝑝0 называют переходной вероятностью или вероятностью ошибки одного символа. Пусть, скажем, 𝑝0 = 10−3 (реальные каналы зачастую много хуже). Такая надежность передачи
информации не может считаться удовлетворительной. Как сделать
ее выше?

6

1. Введение

𝑋
𝑋

𝑌
1−𝑝

0

0

𝑝
𝑝
1−𝑝

а) ДСК

0

𝜖

0

𝑝
𝑝
1

𝑌
1−𝑝−𝜖

𝑧
𝜖

1
1

1−𝑝−𝜖

1

б) ДСтК

Рис. 1.1. Примеры каналов: a — двоичный симметричный канал
(ДСК); б — двоичный канал со стираниями (ДСтК)
Передатчик может, например, повторять передачу каждого бита
3 раза, а приемник принимать решение по большинству.
Упражнение 1.1. Подсчитайте вероятность ошибки при трехкратном повторении каждого бита передаваемой информации при
переходной вероятности ДСК равной 𝑝0 = 10−3 .

Хотя вероятность ошибки стала меньше, такое решение нельзя
признать удачным, поскольку скорость передачи данных уменьшилась в 3 раза. Это означает, что ресурсы системы (полоса частот,
количество линий связи и т.п.) для передачи того же объема информации должны быть тоже увеличены в 3 раза. Или, например,
оператор мобильной связи вынужден был бы сократить количество
абонентов в 3 раза. Нельзя ли придумать более экономное решение?
Упражнение 1.2. Объединим биты передаваемой информации в
пары. Множество «расширенных сообщений» состоит теперь из
4 различных двоичных комбинаций. Сопоставим парам бит последовательности длины 5, как это показано в табл. 1.1. Забегая вперед, список передаваемых последовательностей назовем кодом, сами последовательности — кодовыми словами, а отображение передаваемых данных на кодовые слова — кодированием. Убедитесь в
том, что любые однократные ошибки при таком кодировании не

1.1. Постановка задачи помехоустойчивого кодирования

7

опасны. Какова вероятность ошибок при использовании данного
кода в условиях предыдущего упражнения? Сравните характеристики систем связи, основанных на кодах из упражнений 1.1 и 1.2.
Таблица 1.1. Код для упражнения 1.2
Сообщения
00
01
10
11

Кодовые слова
00000
10110
01011
11101

Упражнение 1.3. Предположим, что приемник использует коды

из упражнений 1.1 и 1.2 следующим образом: если принятая последовательность — кодовое слово, то соответствующее сообщение
выдается получателю. В противном случае получателю выдается
только сигнал, свидетельствующий о том, что принятая информация ненадежна (сигнал обнаружения ошибок). Для того же канала,
что и в предыдущих упражнениях, подсчитайте вероятность того,
что получателю будет выдана неверная информация, и вероятность
выдачи сигнала обнаружения ошибок.
Знания, полученные при выполнении упражнений, позволяют
заключить, что, выбирая различные хитроумные правила кодирования, можно получать различные обменные соотношения между
эффективностью использования канала и обеспечиваемой надежностью.
В общем случае кодирование заключается во внесении избыточности в передаваемое сообщение. Вместо некоторого числа 𝑘 бит по
каналу передается количество сигналов, достаточное для передачи
𝑛 бит, 𝑛 > 𝑘 . Отношение 𝑅 = 𝑘/𝑛 называют скоростью кода. То, что
из общего числа 2𝑛 возможных сигналов для передачи информации
используется лишь 2𝑘 , позволяет, как мы видели выше при выполнении упражнений, исправлять либо обнаруживать ошибки. Задача
декодера — выбрать из числа кодовых слов одно, предположитель-

8

1. Введение

но — то, что передавалось. Вероятностью ошибки мы называем
вероятность того, что решение, вынесенное декодером, неверно.
Интуиция подсказывает, что последовательности (кодовые слова), используемые для передачи сообщений, должны как можно
сильнее отличаться друг от друга, иными словами, находиться на
как можно большем расстоянии. Понятие расстояния Хэмминга и
его влияние на характеристики помехоустойчивости мы обсудим ниже на примерах (см. задачи в конце параграфа).
Постановка задачи построения кодов как задачи достижения
наибольшего минимального расстояния между кодовыми словами — не единственная возможная, но, по крайней мере, до последнего времени она была основной и позволила достичь внушительных результатов во многих приложениях. В середине 90-х годов
прошлого столетия огромное количество теоретических исследований, а затем и прикладных, было посвящено турбо-кодам [47]. Позже, в конце 1990-х — начале 2000-х годов выяснилось, что предложенный Галлагером 30 лет назад класс кодов с малой плотностью
проверок на четность (МППЧ-кодов) [76, 5] во многих отношениях
лучше турбо-кодов. И турбо-коды, и МППЧ-коды характеризуются
тем, что их минимальное расстояние зачастую невелико, но не оно
определяет помехоустойчивость кода. Подробнее мы обсудим эту
проблему при изучении соответствующих классов кодов.
Применительно к ДСК, точное утверждение о возможном соотношении между скоростью кода и достижимой надежностью, заимствованное из теории информации, — следующее.
Для ДСК с переходной вероятностью 𝑝0 пропускная способность
канала вычисляется по формуле
где

𝐶 = 1 − ℎ(𝑝0 ),

(1.1)

ℎ(𝑥) = −𝑥 log2 𝑥 − (1 − 𝑥) log2 (1 − 𝑥) —

(1.2)

энтропия двоичного ансамбля. При скорости передачи в битах на
символ канала 𝑅, меньшей величины пропускной способности 𝐶 ,
может быть обеспечена сколь угодно малая вероятность ошибки
декодирования за счет увеличения длины используемых кодов (и,
соответственно, увеличения сложности кодирования и декодирования). При скорости больше 𝐶 надежная передача невозможна.

1.1. Постановка задачи помехоустойчивого кодирования

9

Например, при 𝑝0 = 10−3 имеем 𝐶 = 0, 9886, т.е. для обеспечения
сколь угодно высокой надежности достаточно внести меньше 2%
избыточных данных.
Сразу заметим, что даже после изучения курса теории кодирования мы не сумеем указать рецепт достижения такой эффективности кодирования. Теоремы Шеннона доказаны неконструктивными
методами и не дают ответа на вопрос о том, как добиться предельно
достижимой помехоустойчивости.
В реальной системе связи на вход канала поступают не нули и
единицы, а сигналы, выбираемые в соответствии с физической природой канала (электрические импульсы, электромагнитные волны,
акустические колебания и т.п.). В этой более общей ситуации вход
канала 𝑥(𝑡) и выход канала 𝑦(𝑡) могут быть связаны, например,
соотношениями вида

𝑦(𝑡) = 𝑥(𝑡) + 𝑛(𝑡),
где случайный процесс 𝑛(𝑡) представляет собой шум в канале связи.
Такой канал называют непрерывным (до этого мы рассматривали
дискретный канал) и, если шум 𝑛(𝑡) не зависит от передаваемых
сигналов (от 𝑥(𝑡)), то шум называют аддитивным.
На передаваемые сигналы накладываются ограничения в виде
мощности сигнала 𝑃 и занимаемой полосы частот 𝑊 . Энергия одного сигнала длительности 𝑇 равна 𝐸 = 𝑃 𝑇 . Чтобы оценить предельную эффективность кодирования, нужно еще условиться о модели
шума. Предположим, что 𝑛(𝑡) — стационарный случайный процесс,
одномерное распределение которого — гауссово с нулевым математическим ожиданием и с дисперсией 𝑁0 /2. Cпектральная плотность
мощности предполагается равномерной равной 𝑁0 /2 (вт/Гц) в диапазоне частот [−𝑊, 𝑊 ]. Такой шум мы называем аддитивным белым гауссовским шумом (АБГШ) и соответствующий канал — каналом с АБГШ.
В этих условиях пропускная способность канала, измеренная в
битах, передаваемых в единицу времени, вычисляется по формуле
(︂
)︂
𝑃
𝐶𝑡 = 𝑊 log2 1 +
бит/с.
(1.3)
𝑊 𝑁0

10

1. Введение

Индексом 𝑡 мы подчеркиваем, что в данном случае (в отличие от
(1.1)) пропускная способность измеряется в битах на единицу времени.
Соответствующая теорема Шеннона утверждает, что при скорости передачи информации ниже 𝐶𝑡 можно добиться сколь угодно
малой вероятности ошибки, а выше этой скорости надежная передача невозможна.
Например, при полосе частот 3400 Гц и отношении сигнал/шум
на 1 Гц 𝑃/(𝑊 𝑁0 ) = 100 (это приблизительные параметры реальной
телефонной линии) находим 𝐶𝑡 ≈ 22000 бит/с.
При отсутствии ограничений на полосу из (1.3), переходя к пределу при 𝑊 → ∞, получаем совсем простую формулу

𝐶𝑡 =

𝑃
𝑁0 ln 2

бит/с.

(1.4)

Сопоставим между собой характеристики системы связи без кодирования и системы с таким кодированием, которое по своим параметрам близко к теоретическим пределам (1.3) и (1.4). Особенно
удобно это сделать на примере системы без ограничений на полосу.
Мы всегда можем ввести в систему кодирование, не нарушая
ограничения на мощность, передавая вместо каждого сигнала длительности 𝑇 секунд более короткие сигналы меньшей энергии. Коротких сигналов больше, и полученную избыточность можно использовать для применения кодов при сохранении постоянной величины битовой скорости передачи информации 𝑅𝑡 , измеренной в
битах/с (при этом расширяется занимаемая сигналом полоса частот, но мы временно игнорируем это обстоятельство).
За время 𝑇 при затратах энергии 𝑃 𝑇 будет передано 𝑅𝑡 𝑇 бит
информации. Введем характеристику

𝐸𝑏 =

𝑃
,
𝑅𝑡

(1.5)

отражающую затраты энергии на бит передаваемой информации.
Величину 𝐸𝑏 /𝑁0 называют отношением сигнал/шум на бит.
В инженерной практике энергетические характеристики принято
измерять в децибелах (дБ): для числа 𝐴 его значение в децибелах
равно 10 lg 𝐴 дБ.

1.1. Постановка задачи помехоустойчивого кодирования

11

Согласно (1.4), надежная передача возможна при

𝑅𝑡 < 𝐶𝑡 =
или

𝑃
𝐸𝑏 𝑅𝑡
=
𝑁0 ln 2
𝑁0 ln 2

𝐸𝑏
> ln 2 = −1.59 дБ.
𝑁0
Итак, из теоремы кодирования для канала с АБГШ следует:
надежная передача информации возможна только тогда, когда отношение сигнал/шум на бит не меньше величины −1.59 дБ.
Рассмотрим передачу информации двоичными сигналами без
кодирования. При использовании для передачи информации по каналу с гауссовским шумом двоичных противоположных сигналов
при передаче символов 0 и 1 на выходе демодулятора наблюдаются
случайные величины с плотностями распределения




2

2

(𝑦+ 𝐸 )
(𝑦− 𝐸 )
1
1


𝑁0
𝑁0
𝑓 (𝑦|0) = √
и 𝑓 (𝑦|1) = √
𝑒
𝑒
𝜋𝑁0
𝜋𝑁0

(1.6)

соответственно. Эти плотности показаны на рис. 1.2.
Поскольку в отсутствие кодирования каждый сигнал несет один
бит информации, энергия сигнала равна 𝐸𝑠 = 𝐸𝑏 . Приемник максимального правдоподобия (см. задачу 2 в конце данной главы) при
𝑦 < 0 выносит решение о том, что передавался 0, и решение в пользу
1 в противном случае. Вероятность ошибки в одном бите не зависит
от передаваемого символа и (при передаче нуля) может быть вычислена как площадь заштрихованной области на рис. 1.2. Иными
словами, вероятность ошибки равна
(︃√︂
)︃
∫︁∞
∫︁0
2𝐸𝑏
𝑃𝑏 = 𝑓 (𝑦|0)𝑑𝑦 =
𝑓 (𝑦|1)𝑑𝑦 = 𝑄
,
(1.7)
𝑁0
0

−∞

где использовано обозначение

1
𝑄(𝑥) = 1 − √
2𝜋

∫︁𝑥
−∞

𝑡2

𝑒− 2 𝑑𝑡.

(1.8)

12

1. Введение

Рис. 1.2. Условные распределения значений на выходе канала при
передаче символов 0 и 1 противоположными сигналами
График зависимости вероятности ошибки от отношения сигнал/шум при передаче без кодирования приведен на рис. 1.3. На
этом же рисунке показана асимптота Шеннона 𝐸𝑏 /𝑁0 = −1.59 дБ.
Из графиков, в частности, можно заметить, что для достижения вероятности ошибки 10−6 требуется 𝐸𝑏 /𝑁0 = 10.53 дБ на
бит. Следовательно, при такой вероятности ошибки потенциально достижимый энергетический выигрыш кодирования составляет
1.59 + 10.53 = 12.06 дБ, или в 16 раз! Цитируя известное высказывание Блэйхута, можно сказать, что улучшать каналы связи — это
выбрасывать деньги на ветер. Лучше просто применить кодирование!
Энергетический выигрыш кодирования одного метода передачи
информации по отношению к другому при заданном уровне вероятности ошибки измеряется как разница выраженных в децибелах
требуемых отношений сигнал/шум в канале для этих методов. Когда говорят просто об энергетическом выигрыше, имеется в виду
выигрыш по отношению к передаче без кодирования.

1.1. Постановка задачи помехоустойчивого кодирования

13

Рис. 1.3. Характеристики некодированной передачи и пределы
Шеннона для декодирования с жесткими и мягкими решениями
К сожалению, если принять во внимание некоторые важные
практические ограничения, то передача при 𝐸𝑏 /𝑁0 = −1.59 дБ на
бит окажется невозможной. Например, предположим, что информация передается двоичными сигналами, и на приемной стороне
сначала выносится решение (0 или 1) о каждом сигнале, а уже затем
выполняется декодирование, т.е. выбор кодового слова, ближайшего
к принятой из канала двоичной последовательности. Такой метод
обработки сигналов называют декодированием с жесткими решениями. Это предположение возвращает нас к показанной на рис. 1.1
модели ДСК.
Обозначим через 𝑝0 вероятность ошибочного решения о сигнале
энергии 𝐸𝑠 . Максимально достижимая скорость кодирования 𝑅𝑐 в
битах на символ канала не превышает пропускной способности ДСК

14

1. Ââåäåíèå

ñ ïåðåõîäíîé âåðîÿòíîñòüþ p0 , ò.å., ñîãëàñíî (1.1), (1.7) è (1.8),

Rc < 1 − h(p0 ) = 1 − h Q( 2Es /N0 ) .
Âåëè÷èíó Es /N0 íàçûâàþò îòíîøåíèåì ñèãíàë/øóì íà ñèãíàë.
Ïðèíÿòîå âûøå óñëîâèå î áåñêîíå÷íîé ïîëîñå îçíà÷àåò ïî ñóòè,
÷òî ïðè çàäàííîé ñêîðîñòè ïåðåäà÷è â áèòàõ â ñåêóíäó ìû óêîðà÷èâàåì ñèãíàëû, óìåíüøàåì ýíåðãèþ Es êàæäîãî äâîè÷íîãî ñèãíàëà
è ïðè ýòîì èìååì p0 → 1/2. Ðàñêëàäûâàÿ äâîè÷íóþ ýíòðîïèþ h(p0 )
ïî ñòåïåíÿì (1/2 − p0 ) â îêðåñòíîñòè òî÷êè p0 = 1/2, ïîëó÷àåì


Rc < 2

1
− p0
2

2
log2 e

(ìîæíî èñïîëüçîâàòü ðàçëîæåíèå ln(1+x) = x−x2 /2+x3 /3−x4 /4+
+ . . . ).
Äëÿ ôóíêöèè Q(x) ïðè ìàëûõ çíà÷åíèÿõ àðãóìåíòà èìååò ìåñòî
ïðèáëèæåííîå ðàâåíñòâî

Q(x) ≈

x
1
−√ .
2


 èòîãå ïîëó÷àåì

2 log2 e Es
.
π N0
Ïîñêîëüêó Rc ïðåäñòàâëÿåò ñîáîé êîëè÷åñòâî áèò, äîñòàâëÿåìîå
ñèãíàëîì ýíåðãèè Es , çàòðàòû ýíåðãèè íà áèò ðàâíû Eb = Es /Rc .
Äëÿ îòíîøåíèÿ ñèãíàë/øóì íà áèò Eb /N0 èìååì ñëåäóþùåå îãðàíè÷åíèå íà ìèíèìàëüíóþ åãî âåëè÷èíó, ïðè êîòîðîé âîçìîæíà íàäåæíàÿ ïåðåäà÷à èíôîðìàöèè
Rc <

Eb
Es
π
=
> ln 2 = 1.09 = 0.37 äÁ.
N0
Rc N 0
2
Ýòè ïîäñ÷åòû ïîêàçûâàþò, ÷òî ïîòåðè, ñâÿçàííûå ñ ïðèíÿòèåì
æåñòêèõ ðåøåíèé íà âûõîäå äåìîäóëÿòîðà, ñîñòàâëÿþò ïðèáëèçèòåëüíî 2 äÁ. Àñèìïòîòà, ñîîòâåòñòâóþùàÿ äåêîäèðîâàíèþ ñ æåñòêèìè ðåøåíèÿìè, ïîêàçàíà íà ðèñ. 1.3.

1.1. Постановка задачи помехоустойчивого кодирования

15

Вернемся к декодированию с мягкими решениями, т.е. к такой
системе связи, в которой при выборе наилучшего кодового слова
учитывается надежность полученных от демодулятора символов.
Примем теперь во внимание ограничение на полосу, точнее говоря, эффективность использования предоставленной для передачи
информации полосы частот.
Спектральной эффективностью кодирования называется величина
𝑅𝑡
бит
𝛽=
.
(1.9)
𝑊 с · Гц
Поясним смысл этого параметра системы связи.
Ограничение на полосу 𝑊 можно интерпретировать как ограничение на минимальную допустимую длительность сигнала 𝑇 , поскольку 𝑊 обратно пропорциональна 𝑇 . При использовании корректирующих кодов в передаваемую последовательность вносится
избыточность. Обозначим через 𝑅𝑐 скорость кода, т.е. долю информационных символов в передаваемой последовательности. Для
того чтобы сравнивать эффективность системы с кодированием и
без кодирования, мы должны приравнять их скорости передачи информации, измеренные в битах в секунду. Мы можем это сделать,
пропорционально уменьшив длительность сигналов и, тем самым,
расширив полосу. В системе с кодированием длительность сигнала должна быть уменьшена до 𝑅𝑐 𝑇 , соответственно, полоса частот
пропорционально увеличивается до 𝑊/𝑅𝑐 . Если спектральная эффективность (число передаваемых бит на один герц полосы) без
кодирования была равной 𝛽 , она уменьшается при введении кодов до величины 𝛽𝑅𝑐 . Таким образом, спектральная эффективность
кодирования адекватно отражает плату за использование кодов —
увеличение ширины полосы частот. Поэтому правильно сравнивать
различные способы кодирования при фиксированной спектральной
эффективности.
Из формулы (1.3) для пропускной способности гауссовского канала с ограниченной полосой с учетом (1.5) имеем
(︂
)︂
𝑅𝑡
𝑅𝑡 𝐸𝑏
< log2 1 +
бит/с.
𝑊
𝑊 𝑁0

16

1. Введение

Отсюда находим границу снизу на отношение сигнал/шум при
заданной спектральной эффективности

𝐸𝑏
2𝛽 − 1
>
.
𝑁0
𝛽
Наиболее наглядными и практически интересными получаются результаты в случае, когда рассматривается передача сигналов со «скоростью Найквиста», т.е. при длительности сигналов
𝑇 = 1/(2𝑊 ). Это минимально возможная длительность ортогональных сигналов в заданной полосе 𝑊 . При этом скорость передачи в
битах в секунду становится равной

𝑅𝑡 =

𝑅𝑐
= 2𝑊 𝑅𝑐
𝑇

и соответствующая ей спектральная эффективность равна

𝛽 = 2𝑅𝑐 .

(1.10)

Получаем еще одну границу снизу на отношение сигнал/шум
при заданной скорости используемого корректирующего кода

𝐸𝑏
22𝑅𝑐 − 1
>
.
𝑁0
2𝑅𝑐
Вернемся к рис. 1.3. На графике кривая вероятности ошибки без
кодирования пересекается с асимптотами Шеннона. Из этого можно
сделать неправильный вывод о том, что при некоторой вероятности
ошибки кодирование оказывается неэффективным. В действительности, опираясь на теорию кодирования при заданном критерии
качества, можно уточнить оценки Шеннона для малых отношений
сигнал/шум на бит с учетом того обстоятельства, что допустима
некоторая вероятность ошибки. Эта поправка к пределу Шеннона
впервые была использована Мак-Элисом [24]. Результаты подсчетов с учетом такого уточнения представлены на рис. 1.4.
В реальных системах скорость 𝑅𝑐 ≤ 1/2 используется в относительно широкополосных каналах связи: некоторых каналах мобильной связи, спутниковых системах, каналах дальней космической
связи. Напротив, скорость 𝑅𝑐 > 1/2 соответствует узкополосным

1.1. Постановка задачи помехоустойчивого кодирования

17

Рис. 1.4. Характеристики некодированной передачи, стандарта
NASA, турбо-кодов и пределы Шеннона для скоростей кодов 1/4,
1/2 и 3/4
каналам, например, каналам телефонной связи. Примеры границ
Шеннона для скоростей 𝑅𝑐 = 1/4, 1/2 и 3/4 вместе с кривой для
некодированной передачи показаны на рис. 1.4. Кроме того, показаны характеристики нескольких вариантов построения реальных
систем связи со скоростью кодов близкой к 1/2.
Кривая, помеченная как «Стандарт NASA», отражает характеристики каскадного кода (см. параграфы 10.2, 10.4) на основе кода
Рида–Соломона (255, 223) (глава 6) и сверточного кода со скоростью 𝑅 = 1/2 (глава 8). Результаты моделирования заимствованы
из [115]. Этот каскадный код использован для связи с космическим
кораблем «Галилео», запущенным в 1989 году к Юпитеру. Кривая
«Турбо-код» отражает характеристики турбо-кода (см. параграф

18

1. Введение

10.3) длиной 65 536 со скоростью 1/2 из работы [47]. Этот код слишком сложен для практического применения, но МППЧ-код (глава
11) примерно такой же длины и примерно с такими же характеристиками помехоустойчивости уже применяется в современном международном стандарте спутникового цифрового телевидения DVBS2 [119].
Мы видим, что реально достижимый эффект от кодирования
составляет примерно 9–10 дБ. Из рисунка напрашивается также
неправильный вывод о том, что характеристики реальных систем
уже достаточно близки к теоретическому пределу и поиск новых кодов уже неинтересен. Действительно, развитие теории кодирования
и технологии реализации сложных электронных схем позволили в
последние 10–15 лет совершить большой шаг вперед. Однако нерешенных задач остается очень много. В частности, коды, характеристики которых показаны на рис. 1.4, имеют чрезвычайно большую
длину и высокую сложность реализации кодирования и декодирования. Их применение, например, в мобильных устройствах, невозможно. Поиск простых и эффективных методов защиты от ошибок
остается актуальной задачей.
Более того, физические ресурсы для передачи данных, например, полоса доступных для радиосвязи частот, ограничены, и
все острее стоит проблема их наиболее эффективного использования. Вернемся к критерию спектральной эффективности. Согласно (1.10), спектральная эффективность равна удвоенной скорости
кода. Отсюда следует, что при двоичном кодировании 𝛽 ≤ 2, что
означает, что на один герц полосы можно передать не более 2 бит
в секунду. Как добиться более высокой спектральной эффективности?
Ответ почти очевиден: нужно использовать недвоичные коды.
Но для передачи недвоичных кодов потребуются недвоичные сигналы. Вместо уже привычных нулей и единиц, которым сопоставлялись положительные и отрицательные импульсы, приходится использовать наборы сигналов, отличающихся между собой значениями амплитуд, частот и фаз. Над такими наборами сигналов тоже
можно строить коды. Прорыв в теории таких кодов над сигналами произошел в 1982 году благодаря Унгербоеку [108], построившему целый класс кодов, которые называют сигнально-кодовыми

1.2. Обзор кодов для защиты информации от ошибок

19

конструкциями. Ориентиром при построении таких кодов служит
уже не расстояние Хэмминга, а расстояние Евклида между кодовыми словами, символы которых — вещественные числа. Задача
построения кодов с высокой спектральной эффективностью будет
кратко рассмотрена в параграфе 10.4. Отметим, что «зазор» между
достигнутыми на сегодня результатами и предельно достижимыми характеристиками (пропускной способностью) тем больше, чем
больше значение требуемой спектральной эффективности 𝛽 .

1.2.

Обзор кодов для защиты информации от
ошибок

В последующих главах мы рассмотрим довольно много классов кодов и алгоритмов кодирования и декодирования. Все ли эти коды
важны? Нельзя ли ограничиться изучением самых «лучших» кодов?
Многообразие изучаемых кодов связано, во-первых, с многообразием задач передачи информации, и, во-вторых, с тем, что теория
кодов динамично развивается, причем иногда почти забытые идеи
и методы неожиданно снова обретают актуальность.
Фундамент теории кодирования был заложен К. Шэнноном. Перевод его основных работ опубликован в сборнике [19]. Уже первые
работы Шэннона указывают на кодирование как на способ обеспечения надежной передачи информации. В 1950-е появились первые конструкции кодов (например, коды Хэмминга, Голея, Рида–
Маллера), сформировалось понятие линейных кодов, разделение
кодов на блоковые и сверточные. 1960-е годы были очень плодотворными для теории кодирования. Для блоковых кодов появились
на свет алгебраические конструкции (коды БЧХ и Рида–Соломона),
допускающие декодирование с малой сложностью. Были разработаны эффективные методы декодирования сверточных кодов (последовательное декодирование, алгоритм Витерби). Помимо этого,
были изобретены каскадные коды Форни, коды Галлагера с малой
плотностью проверок на четность.
В 1970-80-е годы были разработаны сигнально-кодовые конструкции, коды Гоппы и др. Начиная с 1990-х годов, внимание боль-

20

1. Введение

шого числа исследователей привлекли коды, для которых эффективно итеративное декодирование — турбо-коды и коды с малой
плотностью проверок на четность. Сегодня именно эти коды — лидеры как по числу научных публикаций, так и по применению во
вновь разрабатываемых системах связи.
Среди достижений последнего времени нужно указать на полярные коды Арикана [30].
Основные результаты теории кодирования ориентированы на
применение кодов либо в двоичном симметричном канале, либо
в канале с аддитивным гауссовским шумом. Эти модели далеко не всегда адекватно описывают реальные условия применения
кодов. Поэтому параллельно с развитием общей теории кодирования велись поиски способов адаптации корректирующих кодов
к специфическим средам распространения или хранения данных,
накладывающим ограничения на допустимые коды, либо требующим изменения критериев выбора кодов. Наиболее характерные
примеры — магнитные носители, лазерные компакт-диски, оптоволоконные и квантовые каналы, каналы электрических сетей, многоантенные системы мобильной связи (multiple input multiple output
(MIMO)) и др.
Даже поверхностная библиография по теории кодирования
включала бы тысячи работ. В табл. 1.2 приведены основные разделы теории кодирования и указаны ссылки на источники, в основном монографии и учебники, по которым можно ознакомиться с
терминологией и основными понятиями по каждому направлению.
Список литературы не претендует на полноту. Подбирались материалы, по возможности адресованные студентам, на русском языке
или переведенные на русский, написанные широко известными специалистами по соответствующим разделам.

1.2. Обзор кодов для защиты информации от ошибок

21

Таблица 1.2. Литература по основным классам корректирующих
кодов

Раздел теории кодирования

Глава
или параграф
учебника

Литература

Общая теория кодирования (построение кодов, границы)

Линейные блоковые коды
Коды Рида–Маллера
Нелинейные блоковые коды
Коды для криптографии
Каскадные конструкции

2,3



10.1,10.2

[12,
[10,
[14,
[15]
[18,

8]
15]
10, 15]
11, 23]

Алгоритмы декодирования линейных блоковых кодов

Мажоритарное декодирование
Алгоритмы для каналов с мягкими решениями



Общая теория
Методы декодирования
Альтернантные коды, коды Гоппы, алгебро-геометрические коды
Декодирование по алгоритму
Гурусвами–Судана

5,6
7

[12, 2]
[2, 17]



[10, 8]



[8, 27]

Последовательное декодирование
Алгебраическая структура
Характеристики и таблицы


9
8

4

[9, 12]
[11, 17, 26,
27]

Циклические коды, декодирование, обобщения

Сверточные коды и их декодирование

[4, 6, 25]
[25]
[25, 7, 26, 3]

Коды для итеративного декодирования

Теория и построение кодов
Сверточные низкоплотностные коды
Полярные коды

10.3,11



[5, 16, 28]
[35]
[30]

Коды для специальных условий применения

Модуляционные коды
Коды для магнитной записи
Квантовые коды
Коды для MIMO
Коды для сетей связи

10.4





[22, 11]
[8]
[60]
[21, 27]
[89, 85]

22

1. Введение

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

Выводы
∙ Потенциально достижимая скорость передачи информации в
канале связи в битах в секунду определяется ограничениями на мощность сигнала и полосу частот. Последнее ограничение может быть пересчитано в минимальную допустимую
скорость кодирования в битах на сигнал.
∙ Применение кодов, исправляющих ошибки, обеспечивает
большой энергетический выигрыш по сравнению с передачей
без кодирования. Для обеспечения высокой эффективности
использования ресурсов канала коды должны быть длинными
и допускать декодирование с мягкими решениями.
∙ Важной характеристикой кода является его минимальное расстояние. Задача построения хороших кодов может быть сформулирована какзадача построения кодов с наибольшим возможным минимальным расстоянием при заданной скорости.
∙ Минимальное расстояние — важный параметр кода, но не
только оно принимается во внимание при выборе способа защиты от ошибок. С учетом ограничений на сложность реализации кодера и декодера при решении многих практических
задач лучшими оказываются коды с относительно небольшим
минимальным расстоянием, но зато допускающие простое декодирование.

Задачи

23

Задачи
1. Для последовательностей, символы которых выбираются из
алфавита 𝐴 = {0, . . . , 𝑞 − 1}, расстоянием Хэмминга называется число несовпадающих символов. Докажите, что расстояние Хэмминга удовлетворяет аксиомам метрики, т.е. что оно
неотрицательно, симметрично и для него имеет место неравенство треугольника.
2. Пусть 𝑥, 𝑦 ∈ 𝐴𝑛 = {0, . . . , 𝑞 − 1}𝑛 — соответственно входная и
выходная последовательности канала связи, заданного условными вероятностями 𝑝(𝑦|𝑥). Предположим, что канал стационарен и является каналом без памяти, т.е.

𝑝(𝑦|𝑥) =

𝑛
∏︁

𝑝(𝑦𝑖 |𝑥𝑖 ),

𝑖=1

и переходные вероятности 𝑝(𝑦𝑖 = 𝑥|𝑥𝑖 = 𝑦) не зависят от 𝑖.

Декодированием по максимуму апостериорной вероятности
(МАВ) кода 𝐶 = {𝑐𝑚 }, 𝑚 = 1, . . . , 𝑀 над алфавитом 𝐴 называют принятие решения в пользу слова с номером
𝑚
^ = arg max 𝑝(𝑐𝑚 |𝑦).
𝑚

Декодированием по максимуму правдоподобия (МП) кода
𝐶 = {𝑐𝑚 }, 𝑚 = 1, . . . , 𝑀 над алфавитом 𝐴 называют принятие
решения в пользу слова с номером
𝑚
^ = arg max 𝑝(𝑦|𝑐𝑚 ).
𝑚

Если в правилах МП и МАВ одинаковое значение максимума целевой функции достигается для множества из нескольких значений 𝑚, то производится случайный выбор решения
из этого множества. Каким должно быть распределение вероятностей на кодовых словах, чтобы декодирование по МП и
декодирование по МАВ были эквивалентными независимо от
переходных вероятностей канала?

24

1. Введение
3. Докажите, что декодирование по МАВ минимизирует среднюю по
∑︀ всем сообщениям вероятность ошибки декодирования
^ ̸= 𝑚|𝑥 = 𝑐𝑚 ).
𝑃𝑒 = 𝑝(𝑐𝑚 ) Pr(𝑚
𝑚

Подсказка: запишите среднюю вероятность правильного декодирования в виде

𝑃𝑐 =

∑︁ ∑︁

𝑝(𝑦|𝑐𝑚 )𝑝(𝑐𝑚 ),

𝑚 𝑦∈𝑅𝑚

где 𝑅𝑚 представляет собой множество тех 𝑦 , по которым принимается решение в пользу 𝑐𝑚 .
4. Предположим, что входные и выходные символы стационарного канала без памяти выбираются из алфавита 𝑋 =
= 𝑌 = {0, . . . , 𝑞 − 1} и на этом алфавите определена операция
сложения по модулю 𝑞 . Такой канал называют симметричным,
если
{︂ 𝑝0
𝑥 ̸= 𝑦
𝑞−1 ,
𝑝(𝑦|𝑥) =
.
1 − 𝑝0 , 𝑥 = 𝑦
При каких условиях декодирование по минимуму расстояния
Хэмминга (МРХ) совпадает с декодированием по МП?
5. Рассмотрим код 𝐶 = {𝑐𝑚 }, 𝑚 = 1, . . . , 𝑀 над алфавитом 𝐴 и
предположим, что минимальное из попарных расстояний Хэмминга между последовательностями кода равно 𝑑. Эту величину называют минимальным расстоянием кода. Покажите,
что такой код исправляет любые комбинации ошибок кратности не более
⌊︂
⌋︂
𝑑−1
𝑡=
,
2
где скобки ⌊·⌋ обозначают округление числа вниз до ближайшего целого, и обнаруживает любые комбинации ошибок
кратности не более 𝑑 − 1.
6. Для канала с двоичным входом и гауссовским шумом,
описываемого переходными вероятностями (1.6), напишите
МАТЛАБ-программу построения зависимости вероятности

Задачи

25

ошибки от отношения сигнал/шум в канале связи (кривая 1
на рис. 1.3 и 1.4).
7. Для канала со стираниями, показанного на рис. 1.1, зависимость пропускной способности от параметров канала 𝑝 и 𝜀
выражается формулой
(︂
(︂
)︂)︂
𝑝
𝐶 = (1 − 𝜀) 1 − ℎ
.
1−𝜀
Предположим, что этот канал получен из канала с гауссовским шумом принятием решения о стирании всякий раз, когда модуль значения на выходе канала меньше порога Δ. Для
фиксированного значения отношения сигнал/шум 𝐸𝑠 /𝑁0 постройте график зависимости пропускной способности от величины Δ. (Замечание: для получения содержательных результатов отношение 𝐸𝑠 /𝑁0 нужно выбрать таким, чтобы при Δ
пропускная способность 𝐶 была заметно меньше 1).
8. Сформулируйте условия, при выполнении которых декодирование по МП в канале со стираниями (ДСтК) сводится к декодированию по минимуму расстояния Хэмминга на нестертых
позициях. Сколько стираний исправляет код с минимальным
расстоянием 𝑑? Сколько ошибок исправляет код с минимальным расстоянием 𝑑 при наличии 𝑠 стираний?
9. Предположим, что код с минимальным расстоянием 𝑑 используется в ДСК в режиме исправления ошибок кратности до
𝑡 = ⌊(𝑑 − 1)/2⌋ (для некоторых кодов возможно только такое декодирование, поскольку декодирование по МП намного
сложнее). Запишите формулу для вероятности ошибки при
таком декодировании. Запишите также формулу для вероятности ошибочного декодирования в ДСтК при исправлении 𝑡
ошибок и 𝑠 стираний. Какие комбинации ошибок исправляет декодер МП и не исправляет декодер, рассматриваемый в
данной задаче?
10. Код Голея имеет длину 𝑛 = 23, число информационных символов 𝑘 = 12, минимальное расстояние 𝑑 = 7. Считая, что этот

26

1. Введение
код используется в ДСК в режиме исправления ошибок, постройте зависимость энергетического выигрыша кодирования
от характеристик канала связи, т.е. переходной вероятности
ДСК и отношения сигнал/шум на бит в исходном канале с
гауссовским шумом.

11. Рассмотрим два гипотетических кода: код длины 𝑛, исправляющий 𝑡 ошибок, и код длины 2𝑛, исправляющий 2𝑡 ошибок.
Какой из кодов лучше? Подтвердите ваши соображения численными примерами.

Приложение. Биномиальное и
полиномиальное распределения
Начнем с того, что рассмотрим множество последовательностей вида 𝑥 = (𝑥1 , . . . , 𝑥𝑛 ), в которых элемент 𝑥𝑖 может принимать одно из
𝑀𝑖 значений, 𝑖 = 1, . . . , 𝑛. Очевидно, число различных 𝑥 равно

|{𝑥 = (𝑥1 , ..., 𝑥𝑛 ) : 𝑥𝑖 ∈ {0, ..., 𝑀𝑖 − 1}}| =

𝑛
∏︁

𝑀𝑖 .

(1.11)

𝑖=1

В частности, число различных 𝑀 -ичных последовательностей длины 𝑛 равно 𝑀 𝑛 .
Предположим, что все компоненты 𝑥 = (𝑥1 , . . . , 𝑥𝑛 ) выбираются
из одного и того же множества объема 𝑀 , но «без возвращения»,
т.е. один и тот же элемент не может повториться в 𝑥 больше одного
раза. Число таких последовательностей представляет собой число
размещений из 𝑀 элементов по 𝑛 и равно

𝐴𝑛𝑀 = 𝑀 (𝑀 − 1) × . . . × (𝑀 − 𝑛 + 1) =

𝑀!
.
(𝑀 − 𝑛)!

(1.12)

Эта формула следует из (1.11). В частном случае, когда 𝑀 = 𝑛,
речь идет о всевозможных перестановках из 𝑀 элементов. Число
различных перестановок 𝑃𝑀 равно

𝑃𝑀 = 𝑀 !

(1.13)

Приложение

27

Итак, существует 𝐴𝑛𝑀 различных слов длины 𝑛 из неповторяющихся букв алфавита объема 𝑀 . При этом подразумевается, что
порядок следования букв в словах существенен, т.е. слова, отличающиеся порядком букв, различны. Подсчитаем теперь, сколько можно построить различных неупорядоченных подмножеств объема 𝑛
из алфавита объема 𝑀 . Поскольку 𝑃𝑛 = 𝑛! различных последовательностей образуют теперь одно подмножествo, число различных
подмножеств равно
(︂ )︂
𝐴𝑛
𝑀
𝑀 (𝑀 − 1) × . . . × (𝑀 − 𝑛 + 1)
𝑛
𝐶𝑀 =
= 𝑀 =
=
𝑛
𝑃𝑛
𝑛!
𝑀!
=
.
(1.14)
𝑛!(𝑀 − 𝑛)!
Это число называют числом сочетаний из 𝑀 элементов по 𝑛.
Здесь мы привели два обозначения для числа сочетаний. Первое,
𝑛 , распространено в российской математической литературе. Вто𝐶𝑀
(︀ )︀
рое, 𝑀
𝑛 используют в международных математических и технических изданиях. Мы будем придерживаться второго обозначения.
Формула (1.14) не имеет смысла при 𝑀, 𝑛 ≤ 0 и при 𝑀 < 𝑛. Для
всех этих случаев мы формально определим значения числа сочетаний равными нулю, т.е.
(︂ )︂
𝑀
= 0, если 𝑀 ≤ 0, или 𝑛 ≤ 0, или 𝑀 < 𝑛.
(1.15)
𝑛
(︀ )︀
Числа 𝑀
𝑛 называют биномиальными коэффициентами в связи
с использованием в известной формуле бинома Ньютона
𝑛 (︂ )︂
∑︁
𝑛 𝑖 𝑛−𝑖
𝑛
(𝑎 + 𝑏) =
𝑎𝑏 .
𝑖
𝑖=0

Подсчитаем число двоичных последовательностей длины 𝑛, содержащих заданное число 𝜏1 единиц и 𝜏0 = 𝑛 − 𝜏1 нулей. Заметим,
что номера позиций единиц образуют неупорядоченное подмножество множества чисел {1, . . . , 𝑛}. Из (1.14) следует, что искомое число последовательностей равно
(︂ )︂
𝑛
𝑛
𝑁 (𝜏0 , 𝜏1 ) =
=
.
(1.16)
𝜏1
𝜏0 !𝜏1 !

28

1. Введение

Обобщим эту формулу на множество последовательностей
над произвольным алфавитом 𝑋 = {0, . . . , 𝑀 − 1}. Напомним, что композицией последовательности 𝑥 мы называем вектор
𝜏 (𝑥) = (𝜏0 (𝑥), . . . , 𝜏𝑀 −1 (𝑥)), в котором 𝜏𝑖 (𝑥) обозначает число элементов 𝑥𝑡 = 𝑖 в последовательности 𝑥 = (𝑥1 , . . . , 𝑥𝑛 ). Ближайшая
цель состоит в нахождении числа последовательностей 𝑥 с заданной
композицией 𝜏 = (𝜏0 , . . . , 𝜏𝑀 −1 ).
Начнем с того, что положим 𝑀 = 3 и найдем число последовательностей длины 𝑛 с композицией 𝜏 = (𝜏0 , 𝜏1 , 𝜏2 ), 𝑛 = 𝜏0 + 𝜏1 + 𝜏2 .
Для этого
некоторое расположение нулей (это можно
)︀
(︀ 𝑛 зафиксируем
сделать 𝜏0 способами) и подсчитаем число различных расположений 𝜏1 единиц(︀ на оставшихся
𝑛 − 𝜏0 позициях. Это число, как мы
)︀
0
знаем, равно 𝑛−𝜏
.
Поскольку
каждому расположению нулей со𝜏1
ответствует такое количество расположений единиц, общее число
последовательностей равно
(︂ )︂(︂
)︂
𝑛
𝑛 − 𝜏0
𝑛!
(𝑛 − 𝜏0 )!
𝑛!
𝑁 (𝜏 ) =
=
=
.
𝜏0
𝜏1
𝜏0 !(𝑛 − 𝜏0 )! 𝜏1 !(𝑛 − 𝜏0 − 𝜏1 )!
𝜏0 !𝜏1 !𝜏2 !
Аналогично для алфавита произвольного объема 𝑀 легко вывести формулу
𝑛!
𝑁 (𝜏 ) =
.
(1.17)
𝜏0 ! . . . 𝜏𝑀 −1 !
Эта формула является естественным обобщением формулы для
биномиальных коэффициентов. Числа 𝑁 (𝜏 ) называют полиномиальными или мультиномиальными коэффициентами. Также естественно обобщается формула бинома Ньютона на случай возведения в степень произвольного числа слагаемых:
𝑛

(𝑎0 + . . . + 𝑎𝑀 −1 ) =

∑︁
𝜏 :𝜏0 +...+𝜏𝑀 −1 =𝑛

𝑁 (𝜏 )

𝑀
−1
∏︁

𝑎𝜏𝑖 𝑖 .

𝑖=0

Полученные формулы достаточно просты для подсчетов с помощью компьютера, но неудобны для анализа. Ниже мы получим
асимптотические формулы, достаточно точные при больших длинах последовательностей 𝑛. Все вычисления основаны на формуле
Стирлинга
{︂
}︂
{︂
}︂


1
1
𝑛 −𝑛
𝑛 −𝑛
2𝜋𝑛𝑛 𝑒 exp
< 𝑛! < 2𝜋𝑛𝑛 𝑒 exp
. (1.18)
12𝑛 + 1
12𝑛

Приложение

29

Ее подстановка в (1.17) дает
− 𝑀2−1

∑︀
𝑛 log2 𝑛− 𝜏𝑖 log2 𝜏𝑖

𝑁 (𝜏 ) < (2𝜋𝑛)

2

{︃

1

12𝑛

𝑖

)︃1/2
(︃
∏︁ 𝑛
×
𝜏𝑖
𝑖

× exp

∑︁
𝑖

1
12𝜏𝑖 + 1

}︃
(1.19)

.

Из этой формулы получаем верхнюю оценку для логарифма
числа последовательностей с заданной композицией
𝑀 −1
1 ∑︁
log2 𝑁 (𝜏 ) < 𝑛𝐻(^
𝑝) −
log2 (2𝜋𝑛) −
log2 𝑝^𝑖 ,
(1.20)
2
2
𝑖

где в (1.18)–(1.20) индекс 𝑖 пробегает те значения, для которых
𝜏𝑖 положительно, через 𝑝^𝑖 обозначены вычисленные по 𝑥 оценки вероятностей букв, т.е. 𝑝^𝑖 = 𝜏𝑖 /𝑛; через 𝐻(^
𝑝) обозначена энтропия ансамбля 𝑋 , вычисленная по распределению вероятностей
^ = (^
𝑝
𝑝0 , . . . , 𝑝^𝑀 −1 ). Помимо (1.20) можно также записать менее точную, но более компактную оценку

1
𝑛
𝑀 −1
log2 (2𝜋) + log2
. (1.21)
2
2
𝑛−𝑀 +1
Рассмотрим теперь последовательность из 𝑛 опытов, исходы которых — числа множества 𝑋 = {0, . . . , 𝑀 − 1}. Предположим, что
опыты независимы, и вероятности исходов {𝑝0 , . . . , 𝑝𝑀 −1 } не меняются от опыта к опыту. Такую последовательность опытов иногда
называют схемой Бернулли. Некоторые авторы используют термин
«схема Бернулли» только для опытов с двумя исходами (𝑀 = 2),
«удача» и «неудача». Пусть 𝑥 = (𝑥1 , . . . , 𝑥𝑛 ) — некоторая реализация в данной схеме, тогда, в силу независимости исходов опытов,
log2 𝑁 (𝜏 ) < 𝑛𝐻(^
𝑝) −

𝑝(𝑥) =

𝑛
∏︁

𝑝(𝑥𝑖 ).

𝑖=1

В данном произведении сомножители принимают не более 𝑀
различных значений. Перегруппировав сомножители, получим

𝑝(𝑥) =

𝑀
−1
∏︁
𝑗=0

𝜏 (𝑥)

𝑝𝑗 𝑗

,

30

1. Введение

где 𝜏 (𝑥) = (𝜏0 (𝑥), . . . , 𝜏𝑀 −1 (𝑥)) — композиция последовательности
𝑥. Таким образом, вероятность конкретной последовательности в
схеме Бернулли полностью определяется ее композицией и одинакова для последовательностей с одинаковой композицией. Для того, чтобы подсчитать вероятность заданной композиции 𝜏 , нужно
просуммировать вероятности последовательностей с такой композиции. Получаем из (1.16)

𝑝(𝜏 ) = 𝑁 (𝜏 )

𝑀
−1
∏︁
𝑗=0

𝜏
𝑝𝑗 𝑗

𝑀
−1
∏︁
𝑛!
𝜏
= 𝑀 −1
𝑝𝑗 𝑗 .
∏︀
𝜏𝑗 ! 𝑗=0

(1.22)

𝑗=0

Это распределение вероятностей называют полиномиальным
или мультиномиальным. Частным случаем формулы (1.22) является формула биномиального распределения. Вероятность 𝑘 успехов в
серии из 𝑛 опытов, при которых вероятность успеха в одном опыте
равна 𝑝, равна
(︂ )︂
𝑛 𝑘
𝑝𝑛 (𝑘) =
𝑝 (1 − 𝑝)𝑛−𝑘 .
𝑘
Например, при подсчете вероятности ошибки декодирования
для кода, исправляющего 𝑡 ошибок, используют формулу
𝑛 (︂ )︂
∑︁
𝑛 𝑖
𝑃𝑒 =
𝑝 (1 − 𝑝)𝑛−𝑖 .
𝑖

(1.23)

𝑖=𝑡+1

Другой пример: вычисление вероятности ошибки декодирования кода с минимальным расстоянием 𝑑 при исправлении всех комбинаций 𝑡 ошибок и 𝑠 стираний при условии, что 2𝑡 + 𝑠 + 1 ≤ 𝑑.
Обозначив вероятности ошибки в канале через 𝑝 и стирания через
𝜀, из (1.22) получаем формулу

𝑃𝑒 =

∑︁
(𝑡,𝑠):2𝑡+𝑠+1>𝑑

𝑛!
𝑝𝑡 𝜀𝑠 (1 − 𝑝 − 𝜀)𝑛−𝑡−𝜀 .
𝑡!𝑠!(𝑛 − 𝑡 − 𝑠)!

(1.24)

Приложение

31

С помощью формулы Стирлинга для больших 𝑛 и 𝑡 можно вместо (1.23) получить приближенные формулы:
𝑛 (︂ )︂
∑︁
𝑛
𝑖=𝑗
𝑛 (︂
∑︁
𝑖=𝑗

𝑖

𝑖

𝑝 (1 − 𝑝)

𝑛−𝑖

(︂ )︂
𝑛 𝑗

𝑝 (1 − 𝑝)𝑛−𝑗 ;
𝑗

(1.25)

(︂ )︂
)︂
𝑛 𝑗
𝑛 𝑖
𝑗(1 − 𝑝)
𝑛−𝑖
𝑝 (1 − 𝑝)𝑛−𝑗 .
𝑝 (1 − 𝑝)

𝑗(1 − 𝑝) − (𝑛 − 𝑗)𝑝 𝑗
𝑖
(1.26)

Для подсчета биномиальных коэффициентов можно воспользоваться одним из приближений для полиномиальных распределений
(1.19, 1.20), подставив 𝑀 = 2, но более точный результат даст формула
(︂ )︂ √︂
√︂
𝑛
𝑛
𝑛
𝑛ℎ(𝑗/𝑛)
2


2𝑛ℎ(𝑗/𝑛) ,
(1.27)
8𝑗(𝑛 − 𝑗)
𝑗
2𝜋𝑗(𝑛 − 𝑗)
где ℎ(𝑥) = −𝑥 log2 (𝑥) − (1 − 𝑥) log2 (1 − 𝑥). Из приведенных выше
формул непосредственно следуют предельные соотношения, которые пригодятся при анализе поведения кодов и методов декодирования с ростом длины кодовых слов:
(︂ )︂
1
𝑛
lim log2
= ℎ(𝛿);
(1.28)
𝑛→∞ 𝑛
𝑛𝛿
𝑛𝛿 (︂ )︂
∑︁
1
𝑛
lim log2
= ℎ(𝛿);
(1.29)
𝑛→∞ 𝑛
𝑖
𝑖=0

1
𝑛!
log2
= 𝐻(𝑝);
𝑛
(𝑛𝑝0 )! . . . (𝑛𝑝𝑀 −1 )!
(︂ )︂
𝑛
∑︁
1
𝑛 𝑖
lim log2
𝑝 (1 − 𝑝)𝑛−𝑖 = 𝑇 (𝑝, 𝛽),
𝑛→∞ 𝑛
𝑖
lim

𝑛→∞

(1.30)
(1.31)

𝑖=𝑛𝛽+1

где 𝛿 ∈ (0, 1), 𝑝 = (𝑝0 , ..., 𝑝𝑀 −1 ) — вектор вероятностей, 𝑝 < 1/2,
𝛽 ∈ (𝑝, 1),
1−𝑝
𝑝
.
𝑇 (𝑝, 𝛽) = 𝑝 log2 + (1 − 𝑝) log2
𝛽
1−𝛽

2.

Линейные коды

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

2.1.

Арифметика пространства двоичных
последовательностей

Над двоичными символами можно выполнять операции сложения
и умножения. Мы рассматриваем числа 0 и 1 как элементы кольца
вычетов по модулю 2 и как группу по умножению. Иными словами,
множество чисел {0,1} образует простейшее поле из двух элементов 𝐹2 . Ниже приведены таблицы сложения и умножения (табл.

2.1. Арифметика пространства двоичных последовательностей 33
2.1). Аналогично определяется арифметика поля вычетов по модулю произвольного простого 𝑞 . Это поле мы обозначаем через 𝐹𝑞 .
Таблица 2.1. Таблицы сложения и умножения в поле 𝐹2
+
0
1

0
0
1

1
1
0

×
0
1

0
0
0

1
0
1

Упражнение 2.1. Постройте таблицы сложения и умножения для

𝑞 = 3.

От вычислений над скалярными величинами перейдем к изучению действий над последовательностями (векторами). Для произвольного множества 𝐴 мы через 𝐴𝑛 обозначаем множество последовательностей длины 𝑛, составленных из элементов множества 𝐴.
Определим сумму векторов 𝑥 = (𝑥1 , . . . , 𝑥𝑛 ) и 𝑦 = (𝑦1 , . . . , 𝑦𝑛 )
как покомпонентную сумму 𝑥 + 𝑦 = (𝑥1 + 𝑦1 , . . . , 𝑥𝑛 + 𝑦𝑛 ). Умножение вектора 𝑥 на скалярную величину 𝑎 ∈ 𝐹2 определим как
𝑎𝑥 = (𝑎𝑥1 , . . . , 𝑎𝑥𝑛 ).
Множество векторов, замкнутое относительно операций сложения и умножения на скаляр, называется линейным векторным пространством.
Пример 2.1. Примеры двоичных линейных пространств:

А) {00, 01, 10, 11},
Б) {000, 001, 010, 011, 100, 101, 110, 111},
В) {000, 011, 101, 110},
Г) {000, 111}.
Множество 𝐹2𝑛 всех двоичных последовательностей длины 𝑛,
очевидно, является линейным пространством. В частности, пространства примеров А и Б совпадают с 𝐹22 и 𝐹23 . Такие пространства

34

2. Линейные коды

содержат в общем случае 2𝑛 векторов. Пространство примера В содержится в 𝐹23 , но не совпадает с ним, т.е. является его линейным
подпространством.
Заметим, что каждое из трех пространств примера 2.1 содержит нулевой вектор. Этим свойством обладает любое линейное пространство (почему?).
Ключевым понятием в описании линейных пространств является понятие базиса.
Базисом линейного пространства называется наибольшее возможное множество линейно независимых векторов пространства.
Число базисных векторов называется размерностью пространства.
Пример 2.2. Для линейных пространств примера 2.1 имеем:

А) Размерность равна 2, пример базиса: {01, 10}.
Б) Размерность
равна
3,
{001, 010, 100}, {110, 011, 111}.

примеры

базисов:

В) Размерность равна 2, пример базиса: {011, 101}.
Г) Размерность равна 1, базис: {111}.
Основные свойства базиса и порожденного им пространства:

∙ Любой вектор пространства единственным образом может
быть представлен в виде линейной комбинации базисных векторов.
∙ Число элементов векторного пространства размерности 𝑘 равно 𝑞 𝑘 .
Доказательство свойств оставляем читателю в качестве упражнения.
Определение 2.1. Линейным 𝑞 -ичным кодом (𝑛, 𝑘)-кодом 𝐶 на-

зывается любое 𝑘 -мерное подпространство пространства 𝐹𝑞𝑛 всевозможных векторов длины 𝑛.

2.1. Арифметика пространства двоичных последовательностей 35

Скоростью линейного (𝑛, 𝑘)-кода называется отношение 𝑅 =
= 𝑘/𝑛. В двоичном случае (𝑞 = 2) скорость измеряется в битах
на символ канала.
Мы уже замечали, что хорошим будет код, слова которого «далеки» друг от друга в смысле расстояния Хэмминга, которое для
последовательностей 𝑥, 𝑦 длины 𝑛 определяется как
𝑑(𝑥, 𝑦) =

𝑛
∑︁

𝑑(𝑥𝑖 , 𝑦𝑖 ),

𝑖=1

где

{︂
𝑑(𝑥, 𝑦) =

0, 𝑥 = 𝑦;
1, 𝑥 =
̸ 𝑦.

Расстояние Хэмминга удовлетворяет аксиомам расстояния:
1. 𝑑(𝑥, 𝑦) = 0 если и только если 𝑥 = 𝑦
2. 𝑑(𝑥, 𝑦) = 𝑑(𝑦, 𝑥) (симметричность)
3. 𝑑(𝑥, 𝑦) ≤ 𝑑(𝑥, 𝑧) + 𝑑(𝑧, 𝑦) (неравенство треугольника)
Таким образом, имеем метрическое пространство.
Минимальным расстоянием кода 𝐶 называется наименьшее из
попарных расстояний между кодовыми словами:

𝑑=

min

𝑥,𝑦∈𝐶,𝑥̸=𝑦

𝑑(𝑥, 𝑦).

(2.1)

Важность этой характеристики кода обусловлена следующим
фактом.
Теорема 2.1. Код с минимальным расстоянием 𝑑 исправляет любые комбинации ошибок кратности 𝑡 ≤ ⌊(𝑑 − 1)/2⌋

Доказательство. Рассмотрим декодирование по минимуму расстояния Хэмминга. Если произошло 𝑡 ошибок, то расстояние от переданного кодового слова до принятой последовательности равно
𝑡. Нужно доказать, что не найдется другого слова на расстоянии 𝑡
или меньше. Для этого достаточно воспользоваться неравенством
треугольника и определением минимального расстояния.

36

2. Линейные коды
Для линейного кода формула (2.1) может быть упрощена:

Теорема 2.2.

𝑑=

min 𝑑(𝑥, 0) =

𝑥∈𝐶,𝑥̸=0

min 𝑤(𝑥),

𝑥∈𝐶,𝑥̸=0

(2.2)

где 𝑤(𝑥) = 𝑑(𝑥, 0) — число ненулевых элементов в последовательности 𝑥 или вес вектора 𝑥 в метрике Хэмминга.
Упражнение 2.2. Докажите теорему 2.2.
Упражнение 2.3. Найдите скорости и минимальные расстояния

кодов примера 2.1. Убедитесь в том, что использование теоремы 2.2
упрощает поиск минимального расстояния. Во сколько раз?

После введения понятия базиса стало понятнее, как можно сэкономить память, предназначенную для хранения информации о коде: достаточно помнить не все пространство, а только его базис, а
конкретные кодовые слова порождать в процессе кодирования. Это
означает, что, например, для (1000,500)-кода вместо 2500 кодовых
слов достаточно хранить 500 базисных слов длины 1000. Для этого
достаточно 500 Кбит памяти. Таким объемом памяти никого сегодня не удивишь. На самом деле, и эта цифра завышена. Например,
можно использовать циклические коды, в которых слова являются
циклическим сдвигом друг друга. Тогда можно будет хранить всего одно слово, т.е. всего 1000 бит. И даже эта величина может быть
уменьшена.
Декодирование линейного кода, как и кода общего вида, может
быть выполнено путем сравнения каждого кодового слова с принятой из канала последовательностью и выбора ближайшего к ней
в смысле некоторой метрики (например, метрики Хэмминга). На
первый взгляд, сложность декодирования линейного кода намного
меньше, чем кода общего вида. Ведь для перебора по множеству кодовых слов теперь нет необходимости хранить полный список кодовых слов. Однако если речь идет о переборе по 2500 кодовым последовательностям, то сложность обработки отдельной последовательности уже не имеет значения. Нужно думать о методах сокращения
перебора. В следующих параграфах мы сделаем самые первые шаги
в направлении упрощения декодирования двоичных кодов.

2.2. Порождающая и проверочная матрицы

37

Еще один важный вопрос: не потеряем ли мы в потенциальной эффективности кодирования, ограничивая себя рассмотрением
только линейных кодов? Можно доказать, что по крайней мере для
симметричных каналов и при достаточно больших длинах кодов
характеристики линейных кодов (в среднем по множеству кодов)
такие же, как и характеристики кодов общего вида. Подробнее об
этом можно почитать в учебниках по теории информации [6, 13].

2.2.

Порождающая и проверочная матрицы

Определение 2.2. Порождающей матрицей линейного (𝑛, 𝑘)-кода

называется матрица размера 𝑘×𝑛, строки которой — его базисные
векторы.
Например, матрицы
)︂
(︂
1 1 0
,
𝐺=
0 1 1

(︀
)︀
𝐺= 1 1 1

являются порождающими для кодов В) и Г) примера 2.1.
Мы знаем, что кодовые слова — линейные комбинации базисных
векторов, т.е. строк матрицы 𝐺. Это означает, что слова могут быть
получены умножением вектора на матрицу. Сообщение записывается в виде вектора 𝑚 = (𝑚1 , . . . , 𝑚𝑘 ), и соответствующее сообщению
кодовое слово вычисляется по формуле

𝑐 = 𝑚𝐺.
Тем самым, вектор из 𝑘 бит превращается в последовательность
из 𝑛 двоичных кодовых символов, передаваемых по каналу или записываемых в память запоминающего устройства.
Сделаем первые шаги к пониманию того, как можно упростить
декодирование линейного кода.
Предположим, что для некоторого двоичного вектора ℎ =
= (ℎ1 , . . . , ℎ𝑛 ) все кодовые слова (𝑛, 𝑘)-кода 𝐶 = {𝑐𝑖 }, 𝑖 = 0, . . . , 2𝑘 −1
удовлетворяют тождеству

(𝑐𝑖 , ℎ) = 0,

𝑖 = 0, . . . , 2𝑘 − 1,

(2.3)

38

2. Линейные коды

в котором запись (𝑥, 𝑦) обозначает скалярное произведение векторов 𝑥 и 𝑦 .
Про такой вектор ℎ мы скажем, что он ортогонален коду, и назовем его проверкой по отношению к коду. Найдя такой вектор, мы
могли бы проверять с помощью тождества (2.3), является ли принятая из канала последовательность кодовым словом.
Заметим теперь, что (2.3) справедливо для всех кодовых слов,
если оно справедливо для базисных векторов, т.е. если

𝐺ℎT = 0,

(2.4)

где верхний индекс T обозначает транспонирование.
Чем больше таких «проверок» мы найдем, тем, по-видимому,
больше ошибок сумеем обнаружить и исправить.
Упражнение 2.4. Докажите, что проверки образуют линейное

пространство.

Это упражнение очень простое. Пространство проверок назовем
пространством, ортогональным линейному коду, или проверочным
пространством.
Упражнение 2.5. Докажите, что в порождающей матрице (𝑛, 𝑘)-

кода найдутся 𝑘 линейно независимых столбцов.

Здесь нужно вспомнить, что такое ранг матрицы, и воспользоваться тем, что ранги матрицы, вычисленные по строкам и по
столбцам, равны.
Упражнение 2.6. Найдите размерность линейного пространства

проверок.

Решение. Чтобы справиться с этим непростым упражнением,
воспользуемся утверждением упражнения 2.5. Найдем и зафиксируем список номеров 𝑘 линейно независимых столбцов матрицы 𝐺
и назовем этот набор индексов информационной совокупностью.
Совокупность индексов остальных позиций назовем проверочной
совокупностью. Сами позиции и записанные на них символы будем
называть соответственно информационными и проверочными. Чуть
позже смысл этих названий станет яснее.

2.2. Порождающая и проверочная матрицы

39

Выберем произвольно и зафиксируем значения вектора ℎ на
𝑟 = 𝑛 − 𝑘 позициях проверочной совокупности. Какими должны
быть значения на позициях информационной совокупности, чтобы
выполнилось (2.4)?
Просуммируем в каждом уравнении слагаемые, соответствующие проверочной совокупности, обозначим сумму ℎ* и перенесем
сумму в правую часть. Получится система линейных уравнений.
Столбцы матрицы 𝐺, соответствующие информационной совокупности, образуют базис в пространстве столбцов, и, значит, вектор
−ℎ* может быть единственным образом записан в виде их линейной
комбинации.
Мы получили взаимно-однозначное соответствие между значениями компонент вектора ℎ на информационных и проверочных
позициях. Поскольку значения вектора ℎ на проверочных позициях
можно выбрать 2𝑛−𝑘 способами (𝑞 𝑛−𝑘 способами для 𝑞 -ичного кода), в проверочном пространстве будет 2𝑛−𝑘 (соответственно, 𝑞 𝑛−𝑘 )
элементов, и размерность пространства будет равна 𝑟 = 𝑛 − 𝑘 .
Упражнение 2.7. На примере порождающей матрицы

(︂
𝐺=

)︂
1 1 0 1 0
0 1 1 0 1

убедитесь в правильности приведенных выше рассуждений.
Результат упражнения 2.6 сформулируем в виде теоремы.
Теорема 2.3. Размерность проверочного пространства линейного

(𝑛, 𝑘)-кода равна 𝑟 = 𝑛 − 𝑘 .

Число 𝑟 называется избыточностью кода.
Базис проверочного пространства запишем в виде матрицы


ℎ11 ℎ12 · · · ℎ1𝑛

..
.. ⎟ ,
..
𝐻 = ⎝ ...
.
.
. ⎠

ℎ𝑟1 ℎ𝑟2 · · · ℎ𝑟𝑛
называемой проверочной матрицей кода.
Проверочная и порождающая матрицы связаны соотношением

𝐺𝐻 T = 0.

(2.5)

40

2. Линейные коды

Из этого соотношения мы видим, что для любого кодового слова
𝑐 ∈ 𝐶 имеет место

𝑐𝐻 T = 0.

(2.6)

Это тождество можно использовать как критерий принадлежности произвольной последовательности коду, т.е. для обнаружения
ошибок.
Зная 𝐺, можно найти 𝐻 . Для того чтобы понять, как это сделать, заметим, что один тот же код можно задать разными порождающими матрицами, выбирая по-разному базис пространства.
Больше того, заменив в 𝐺 любую строку на любую линейную комбинацию этой строки с другими строками, мы получаем новую порождающую матрицу того же кода.
Перестановка столбцов матрицы 𝐺, вообще говоря, приводит к
другому коду, но этот другой код по своим характеристикам не
отличается от исходного. Коды, различающиеся только нумерацией
позиций, называются эквивалентными.
Понятно, что для каждого кода найдется такой эквивалентный
ему код, что первые 𝑘 позиций кодовых слов образуют информационную совокупность, иными словами, первые 𝑘 столбцов порождающей матрицы образуют невырожденную подматрицу размера 𝑘 × 𝑘 .
Заменяя строки линейными комбинациями строк (метод Гаусса),
полученную матрицу можно привести к виду

(︀
)︀
𝐺 = 𝐼𝑘 𝑃 ,

(2.7)

где 𝐼𝑘 — единичная матрица порядка 𝑘 , а 𝑃 — некоторая матрица
размера 𝑘 × 𝑟.
Матрица вида (2.7) называется порождающей матрицей, приведенной к систематическому виду, а соответствующий код называется систематическим. Кодирование для систематического кода
проще, чем для кода общего вида:

(︀
)︀
𝑐 = 𝑚𝐺 = 𝑚 𝑚𝑃 ,

(2.8)

т.е. в кодовом слове первые 𝑘 позиций — просто копия информационной последовательности 𝑚, а остальные 𝑟 = 𝑛 − 𝑘 (проверочных) позиций получаются умножением информационного вектора

2.2. Порождающая и проверочная матрицы

41

на матрицу размера 𝑘 × 𝑟, что иногда существенно меньше, чем
𝑛 × 𝑟. Соответственно, и информация о систематическом коде занимает существенно меньше памяти, чем информация о линейном
коде общего вида.
Замечание. Формально выражения «систематический код» и
«несистематический код» неправильные, поскольку один и тот же
код (совокупность кодовых слов) может быть описан как систематической, так и несистематической порождающей матрицей. В этом
смысле любой код одновременно и систематический, и несистематический. Тем не менее, мы не будем отступать от привычной устоявшейся терминологии.
Для двоичного систематического кода с порождающей матрицей в форме (2.7) проверочная матрица может быть вычислена по
формуле

(︀
)︀
𝐻 = 𝑃 T 𝐼𝑟 .

(2.9)

Упражнение 2.8. Проверьте (2.9). Подсказка: для этого нужно

подставить (2.9) и (2.7) в (2.5).

Упражнение 2.9. Обобщите (2.9) на случай кода над произволь-

ным полем 𝐹𝑞 .

Как найти проверочную матрицу для несистематического кода?
Нужно привести матрицу к систематическому виду и воспользоваться (2.8). Если первые 𝑘 столбцов порождающей матрицы образуют невырожденную подматрицу (первые 𝑘 позиций образуют
информационную совокупность), то для приведения к систематической форме достаточно таких операций как перестановка строк и
замена строк линейными комбинациями строк. Если нет — нужно
будет сначала найти информационную совокупность и перенумеровать позиции так, чтобы первые позиции стали информационными.
После того, как найдена проверочная матрица эквивалентного систематического кода, нужно восстановить исходный порядок следования символов кодового слова.
Упражнение 2.10. Сформулируйте алгоритм нахождения по-

рождающей матрицы по проверочной.

42

2. Линейные коды

Упражнение 2.11. Объясните, почему любой набор из номеров 𝑘

линейно-независимых столбцов называется информационной совокупностью.

Упражнение 2.12. Постройте порождающие и проверочные матрицы для кодов из примера 2.1.

Подведем итоги этого основополагающего параграфа.

∙ Линейный (𝑛, 𝑘)-код может быть задан любой из двух матриц:
порождающей 𝐺 размера 𝑘 × 𝑛 либо проверочной 𝐻 размера
𝑟 × 𝑛. По 𝐺 легко найти 𝐻 приведением кода к систематической форме. Аналогично по 𝐻 находится 𝐺.
∙ Матрица 𝐺 используется при кодировании (формула (2.8)),
матрицей 𝐻 можно воспользоваться при декодировании, по
меньшей мере, для обнаружения ошибок. Выполнение тождества (2.6) свидетельствует о том, что данная последовательность принадлежит коду.

2.3.

Вычисление минимального расстояния
по проверочной матрице

Формула (2.2) нахождения минимального расстояния в терминах
порождающей матрицы записывается как

𝑑 = min 𝑤 (𝑚𝐺) .
𝑚̸=0

(2.10)

Вычисление по этой формуле требует перебора по 2𝑘 − 1 ненулевым словам кода. Возвращаясь к примеру (1000,500)-кода, легко
понять, почему на практике мы часто пользуемся кодами, минимальное расстояние которых никому не известно.
Казалось бы, для кода (1000,900) проблема еще сложнее. Однако заметим, что при 𝑟 < 𝑘 , т.е. когда скорость кода больше 1/2,
проверочная матрица имеет меньший размер, чем порождающая.
Хотелось бы воспользоваться этим обстоятельством для упрощения
поиска минимального расстояния кода.

2.3. Вычисление расстояния по проверочной матрице

43

Согласно формуле (2.6), кодовому слову 𝑐 веса 𝑤(𝑐) соответствует некоторый набор из 𝑤(𝑐) столбцов проверочной матрицы 𝐻 ,
сумма которых — нулевой вектор. Это означает, что соответствующие столбцы линейно зависимы. Следовательно, для нахождения
минимального расстояния кода нужно найти минимальный набор
линейно зависимых столбцов проверочной матрицы. Приходим к
следующей теореме.
Теорема 2.4. Минимальное расстояние линейного (𝑛, 𝑘)-кода рав-

но 𝑑 в том и только в том случае, когда любые 𝑑 − 1 столбцов
проверочной матрицы линейно независимы и существует набор
из 𝑑 линейно зависимых столбцов.
Подумав над тем, сколько всего может быть линейно независимых столбцов в матрице с 𝑟 строками, получаем следующую интересную границу на минимальное расстояние.
Теорема 2.5. Граница Синглтона: минимальное расстояние ли-

нейного (𝑛, 𝑘)-кода удовлетворяет неравенству 𝑑 ≤ 𝑟+1 = 𝑛−𝑘+1.

Доказательство. Ранг проверочной матрицы равен 𝑟, следовательно 𝑟 +1 столбцов всегда линейно зависимы. Граница Синглтона
следует из теоремы 2.4.
Еще одно доказательство прямо следует из представления порождающей матрицы в систематической форме (2.7) и теоремы 2.2.
Минимальный вес строк порождающей матрицей, очевидно, является оценкой сверху на минимальное расстояние кода.
Упражнение 2.13. Докажите, что:

А) если в 𝐻 нет нулевых столбцов, то минимальное расстояние
кода не меньше 2;
Б) если в 𝐻 все столбцы различны и ненулевые, то минимальное
расстояние кода не меньше 3;
В) если одна из строк проверочной матрицы 𝐻 двоичного кода
не содержит нулей, то минимальное расстояние кода четно.

44

2. Линейные коды

Упражнение 2.14. Найдите минимальные расстояния кодов при-

мера 2.1.

Дуальным к данному коду называется код, порождающая матрица которого является проверочной матрицей данного кода.
Упражнение 2.15. Найдите минимальные расстояния кодов, ду-

альных к кодам примера 2.1.

2.4.

Примеры кодов

Сформулированные в упражнениях свойства линейных кодов позволяют построить несколько хороших кодов.
Пример 2.3. Код с порождающей матрицей

𝐺 = (𝐼𝑛 )
представляет собой (𝑛, 𝑛)-код со скоростью 1 и минимальным расстоянием 𝑑 = 1. Поскольку число проверочных символов 𝑟 = 𝑛−𝑘 =
= 0, проверочная матрица неопределена.
Пример 2.4. (𝑛, 𝑛 − 1)-код с проверочной матрицей

(︀
)︀
𝐻 = 1 1 ··· 1
(вектор из 𝑛 единиц) имеет минимальное расстояние 𝑑 = 2. Его
порождающая матрица имеет вид


1 0 ··· 0 1
⎜0 1 · · · 0 1⎟


𝐺 = ⎜. . .
.. .. ⎟ .
.
.
.
⎝. .
. . .⎠
0 0 ··· 1 1
Это весьма экономный код. Он позволяет ценой одного избыточного символа обнаруживать любые однократные ошибки и любые
другие комбинации ошибок нечетного веса. Его называют кодом с
проверкой на четность.

2.4. Примеры кодов

45

Пример 2.5. Пусть

(︀
)︀
𝐺 = 1 1 ··· 1 .
Этот код — двойственный к коду предыдущего примера. Очевидно, в таком коде всего два слова, т.е. имеем (𝑛, 1)-код. Его проверочная матрица


1 0 ··· 0 1
⎜0 1 · · · 0 1 ⎟


𝐻 = ⎜. . .
.. .. ⎟ .
.
.
.
⎝. .
. . .⎠
0 0 ··· 1 1
Расстояние кода 𝑑 = 𝑛, он исправляет комбинации ошибок кратности до половины длины кодового слова.
Пример 2.6. (Коды Хэмминга). Построим код, исправляющий лю-

бые однократные ошибки. Для этого нужно составить проверочную
матрицу из различных столбцов. При числе проверочных символов
𝑟 длина кода равна 𝑛 = 2𝑟 − 1, а число информационных символов
равно 𝑘 = 2𝑟 − 𝑟 − 1. Такие (2𝑟 − 1, 2𝑟 − 𝑟 − 1)-коды называются
кодами Хэмминга. Таким образом, имеем бесконечную последовательность кодов с расстоянием 3. В качестве примера рассмотрим
случай 𝑟 = 3, т.е.


0 0 0 1 1 1 1
𝐻 = ⎝0 1 1 0 0 1 1⎠ .
1 0 1 0 1 0 1

Для кода Хэмминга легко указать процедуру исправления ошибок. Предположим, что передаваемое сообщение имеет вид 𝑚 =
= (1011). Ему соответствует кодовое слово 𝑐 = 𝑚𝐺 = (1011010).
Предположим, что при передаче этой последовательности произошла одна ошибка и принятая последовательность имеет вид

𝑥 = 𝑐 + 𝑒 = (1011010) + (0100000) = (1111010),
где через 𝑒 обозначен вектор ошибки.

46

2. Линейные коды

Декодер начинает с проверки того, является ли принятая последовательность кодовым словом. По формуле (2.6) находим

𝑥𝐻 T = (010).
Полученная последовательность оказалась двоичной записью номера ошибочной позиции. Легко убедиться в том, что это верно для
любой одиночной ошибки. Попробуйте объяснить, почему это свойство имеет место.
Отметим, что двоичные коды Хэмминга оптимальны в том
смысле, что не существует кодов (даже нелинейных) с бо́льшим
числом слов с расстоянием 3 при такой же длине.
Упражнение 2.16. Получите из кода Хэмминга код с минималь-

ным расстоянием 𝑑 = 4.

Пример 2.7. (Расширенные коды Хэмминга). Решение последнего

упражнения состоит в том, чтобы дописать к проверочной матрице
строку из всех единиц — проверку на четность. Расстояние нового
кода будет не меньше 3 и будет четным, значит, оно равно 4. Кроме
того, перед дописыванием проверки на четность можно приписать к
𝐻 столбец из всех нулей, что не повлияет на расстояние. Итоговый
код имеет в общем случае параметры 𝑛 = 2𝑟−1 , 𝑘 = 𝑛 − 𝑟 = 2𝑟−1 − 𝑟.
При 𝑟 = 4 проверочная матрица имеет вид


0 0 0 0 1 1 1 1
⎜0 0 1 1 0 0 1 1⎟

𝐻=⎜
⎝0 1 0 1 0 1 0 1⎠ .
1 1 1 1 1 1 1 1
Отметим, что расширенные двоичные коды Хэмминга также оптимальны в том смысле, что не существует кодов с бо́льшим числом
слов с расстоянием 4 при такой же длине кодовых слов.
Пример 2.8. (Коды дуальные к кодам Хэмминга). Начнем с того,
что запишем проверочную матрицу кода Хэмминга (15,11)


0 0 0 0 0 0 0 1 1 1 1 1 1 1 1
⎜0 0 0 1 1 1 1 0 0 0 0 1 1 1 1⎟

𝐻=⎜
⎝0 1 1 0 0 1 1 0 0 1 1 0 0 1 1⎠ .
1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

2.4. Примеры кодов

47

Обращает на себя внимание то, что в строках матрицы 𝐻 одинаковое количество единиц. В данном случае 8. По построению матрицы
этим свойством обладает проверочная матрица любого кода Хэмминга, т.е. в общем случае каждая строка содержит 2𝑟−1 единиц.
Более того, этим свойством обладает и любая нетривиальная линейная комбинация строк. Действительно, если бы единиц в некоторой
линейной комбинации 𝑣 было бы больше или меньше, то заменой
одной из строк на такую линейную комбинацию мы получили бы
новую матрицу, которая уже не содержала бы всех ненулевых двоичных последовательностей длины 𝑟 в качестве столбцов. Как следствие, появились бы одинаковые столбцы, расстояние кода было бы
меньше 3.
Итак, мы убедились в том, что любая линейная комбинация
строк проверочной матрицы кода Хэмминга, а значит, строк порождающей матрицы дуального кода, имеет вес 𝑑 = 2𝑟−1 . Таким
образом, код имеет большое минимальное расстояние (примерно половина длины кода) и обладает тем свойством, что для всех пар кодовых слов расстояния одинаковы. Такую конструкцию называют
симплексом, а соответствующий код — симплексным кодом.
Пример 2.9. (Коды дуальные к расширенным кодам Хэммин-

га). Запишем проверочную
(16,11):

0 0 0 0 0 0
⎜0 0 0 0 1 1

⎜0 0 1 1 0 0

⎝0 1 0 1 0 1
1 1 1 1 1 1

матрицу расширенного кода Хэмминга

0
1
1
0
1

0
1
1
1
1

1
0
0
0
1

1
0
0
1
1

1
0
1
0
1

1
0
1
1
1

1
1
0
0
1

1
1
0
1
1

1
1
1
0
1


1
1⎟

1⎟
⎟.
1⎠
1

Выбрав эту матрицу в качестве порождающей матрицы, получим код, в котором из 2𝑟 − 1 = 31 ненулевых кодовых слов кода 30
слов имеют вес 𝑑 = 𝑛/2 = 2𝑟−2 = 8 и одно слово — вес 𝑛 = 2𝑟−1 = 16.
Код, дуальный к расширенному (2𝑟−1 , 2𝑟−1 − 𝑟)-коду Хэмминга с расстоянием 4 представляет собой (2𝑟−1 , 𝑟)-код с расстоянием
𝑑 = 𝑛/2 = 2𝑟−2 , который является кодом Рида–Маллера первого
порядка.

48

2. Линейные коды

Построение кодов с расстоянием 5 и больше — заметно более
трудная задача. Теория конечных полей Галуа позволяет построить такие коды (циклические коды) и даже указать простые методы декодирования. Этим вопросам посвящены соответствующие
разделы курса. Однако сужение класса линейных кодов к циклическим кодам ведет к некоторым потерям в достижимой величине
минимального расстояния.
Поиск оптимальных по расстоянию кодов — увлекательная задача, привлекающая внимание большого числа математиков. Таблицы лучших найденных кодов можно найти в интернете [77]. Небольшая выписка из этой таблицы приведена на рис. 3.2 и 3.3. Заметим, что наименьшая длина, для которой до сих пор (до 2014 года)
неизвестны параметры оптимальных кодов, равна 32. Неизвестно,
например, может ли расстояние (32,14)-кода быть равным 9 (известен только (32,14)-код с 𝑑 =8), а расстояние (32,18)-кода равным 7
(известен (32,18)-код с 𝑑 =6).

2.5.

Синдромное декодирование

Если скорость линейного (𝑛, 𝑘)-кода 𝑅 = 𝑘/𝑛 > 1/2, то размерность 𝑟 = 𝑛 − 𝑘 дуального пространства меньше размерности 𝑘
самого кода. Попробуем воспользоваться этим фактом для упрощения декодирования в ДСК по минимуму расстояния Хэмминга.
Задача декодера — найти кодовое слово, отличающееся от принятой
двоичной последовательности в наименьшем числе позиций.
Пусть 𝐺 и 𝐻 обозначают порождающую и проверочную матрицу (𝑛, 𝑘)-кода и 𝑦 — двоичную последовательность, подлежащую
декодированию. Если передавалось кодовое слово 𝑐 ∈ 𝐶 , то 𝑦 можно представить в виде
𝑦 = 𝑐 + 𝑒,
где вектор 𝑒 = (𝑒1 , . . . , 𝑒𝑛 ) называют вектором ошибок.
Сколько различных комбинаций ошибок может исправить код?
Казалось бы, хороший код исправляет много комбинаций ошибок,
а плохой — мало. На самом деле число исправляемых комбинаций
ошибок не зависит от кода и равно 2𝑛−𝑘 = 2𝑟 .

2.5. Синдромное декодирование

49

Действительно, в силу линейности кода объем множествапоследовательностей 𝑦 , декодируемых в слово 𝑐, одинаков для всех
слов 𝑐 ∈ 𝐶 . (Точнее, решающие области можно выбрать конгруэнтными, т.е. совпадающими с точностью до сдвига в хэмминговом
пространстве.) Этот объем можно подсчитать, поделив общее число 2𝑛 последовательностей длины 𝑛 на число 2𝑘 слов кода. Обозначим через 𝐸 = {𝑒} множество исправляемых комбинаций ошибок,
|𝐸| = 2𝑟 . Таким образом, хороший код отличается от плохого тем,
что для хорошего кода множество исправляемых комбинаций по
своей форме близко к хэмминговой сфере, т.е. состоит из комбинаций ошибок меньшего веса, что соответствует более вероятным
комбинациям ошибок. В частности, для хорошего кода выше величина гарантированной кратности исправляемых ошибок.
При декодировании по МП (в данном случае, по минимуму расстояния, см. задачу 4 к главе 1) мы должны обеспечить исправление
всех 2𝑟 комбинаций ошибок множества 𝐸 .
Поскольку для кодового слова выполняется равенство

𝑐𝐻 𝑇 = 0,

(2.11)

тривиальное решение задачи декодирования со сложностью порядка 2𝑟 состоит в том, чтобы перебрать по множеству 2𝑟 комбинаций
ошибок из 𝐸 , всякий раз прибавляя предполагаемый вектор ошибок к 𝑦 и вычисляя произведение (𝑦 + 𝑒)𝐻 𝑇 . Вектор 𝑐 = 𝑦 + 𝑒, для
которого будет получен нулевой результат, выбирается в качестве
результата декодирования.
Очевидный недостаток метода состоит в том, что он предполагает хранение множества 𝐸 и умножение на проверочную матрицу для каждой последовательности множества 𝐸 . Усовершенствуем
этот способ декодирования.
Для этого рассмотрим произведение

𝑠 = 𝑦𝐻 T ,

(2.12)

называемое синдромом вектора 𝑦 . Неравенство синдрома нулевому
вектору указывает на наличие ошибок в принятой последовательности 𝑦 .
Поскольку
𝑠 = 𝑦𝐻 T = (𝑐 + 𝑒)𝐻 T = 𝑒𝐻 T ,
(2.13)

50

2. Линейные коды

имеет место взаимнооднозначное соответствие между 2𝑟 различными синдромами и 2𝑟 исправляемыми комбинациями ошибок.
Это означает, что умножение на матрицу достаточно выполнить
один раз — при вычислении синдрома 𝑠. В памяти декодера должна храниться таблица соответствия между синдромами и векторами ошибок. Эта таблица для каждого синдрома 𝑠 хранит вектор
наименьшего веса 𝑒, для которого 𝑠 = 𝑒𝐻 T .
Декодер после вычисления 𝑠 = 𝑦𝐻 T по таблице находит соответствующий вектор ошибок 𝑒, и результатом декодирования служит кодовое слово 𝑐 = 𝑦 + 𝑒. Процедура декодирования пояснена
алгоритмом 2.1.
Алгоритм 2.1. Алгоритм синдромного декодирования
Input: Выход канала 𝑦 ;
Output: Информационные символы ;

Вычислить синдром 𝑠 = 𝑒𝐻 T ;
Извлечь из ячейки памяти с адресом 𝑠 вектор ошибок 𝑒 ;
^ = 𝑦 + 𝑒. ;
Вычислить оценку кодового слова 𝑐
Вывод: Информационные символы, соответствующие
^
кодовому слову 𝑐
Упражнение 2.17. Постройте таблицу для синдромного декоди-

рования кода с порождающей

1

𝐺= 0
1

матрицей


1 0 1 0
1 1 0 1⎠ .
0 1 1 0

Итак, по сути, мы рассмотрели два способа декодирования в
канале с жесткими решениями (ДСК) со сложностью порядка 2𝑟 .
В обоих случаях требуется память объема пропорционального 2𝑟 .
Табличное декодирование выглядит предпочтительнее с вычислительной точки зрения.
Существуют более изощренные методы декодирования, которые, правда, эффективны не для всех линейных кодов, а при выполнении некоторых ограничений. Идеи этих методов сформулированы
в задачах в конце главы.

2.6. Радиус покрытия и декодирование...

51

В завершение заметим, что в терминах теории групп (см. Приложение) векторное пространство образует абелеву группу относительно операции сложения векторов. Линейный код является подгруппой этой группы. Множество последовательностей 𝑦 , имеющих
одинаковый синдром, образует смежный класс с некоторым вектором 𝑒 ∈ 𝐸 в качестве образующего элемента. Этот же элемент является вектором наименьшего веса среди всех элементов смежного
класса. Его называют также лидером смежного класса.

2.6.

Радиус покрытия и декодирование по
минимуму расстояния Хэмминга 1

Мы уже знаем два способа декодирования для произвольного линейного кода:

∙ перебор по 𝐿 = 2𝑘 кодовым словам;
∙ перебор по 𝐿 = 2𝑛−𝑘 векторам ошибок.
Удобно характеризовать алгоритмы этого класса асимптотическим показателем экспоненты сложности

log 𝐿
.
𝑛→∞ 𝑛

𝜅 = lim

Описанные выше алгоритмы приводят нас к оценке

𝜅(𝑅) ≤ min{𝑅, 1 − 𝑅}

(2.14)

для любого линейного кода со скоростью 𝑅.
Замечание. Понятия сложности и экспоненты сложности введены неформально. Следовало дать формальное описание вычислителя, на котором выполняются операции, принять во внимание
использование памяти и т.д. Точные формулировки можно найти,
например, в [44].
1
Приведенные в данном параграфе сведения не используются в дальнейшем. Кроме того, в нем используются некоторые сведения (граница
Варшамова–Гилберта) из главы 3.

52

2. Линейные коды

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

Радиус покрытия

Минимальное расстояние кода определяет число гарантированно
исправляемых кодом ошибок 𝑡, в то время как некоторые комбинации ошибок гораздо более высокой кратности, чем 𝑡, могут быть
исправлены декодером максимального правдоподобия (декодером
по минимуму расстояния Хэмминга). Радиус покрытия — наибольшее число ошибок, которые может исправить код.
Для произвольного множества 𝐴 ⊂ 𝐹2𝑛 последовательностей
длины 𝑛 введем обозначение для расстояния между последовательностью 𝑥 ∈ 𝐹2𝑛 и 𝐴:

𝑑(𝐴, 𝑥) = min 𝑑(𝑥, 𝑎).
𝑎∈𝐴

Радиусом покрытия кода 𝐶 называется величина
𝜌 = max 𝑑(𝑥, 𝐶).
𝑥

(2.15)

Иными словами, для линейного (𝑛, 𝑘)-кода 𝜌 представляет собой
наибольший вес среди весов всех 2𝑛−𝑘 последовательностей, декодируемых в нулевое кодовое слово.
Одно из практических применений радиуса покрытия связано
с кодированием двоичного источника с заданным уровнем ошибки

2.6. Радиус покрытия и декодирование...

53

в метрике Хэмминга (более точно, с вероятностной мерой искажения). Если радиус покрытия равен 𝜌, то максимальная ошибка приближения любой последовательности 𝑥 словами кода 𝐶 не превысит
𝜌/𝑛.
Задачу построения кодов с заданной кратностью гарантированно исправляемых ошибок 𝑡 называют еще задачей упаковки пространства шарами радиуса 𝑡 с центрами, задаваемыми словами кода. Построение кодов с заданным радиусом покрытия 𝜌 — задача
покрытия пространства шарами радиуса 𝜌. В первом случае мы
строим упаковку с максимальным числом шаров (кодовых слов),
во втором — строим покрытие минимальным числом кодовых слов.
Коды, удовлетворяющие границе плотной сферической упаковки
(см. следующую главу), являются оптимальным решением обеих
задач. Список таких кодов невелик. Среди нетривиальных двоичных кодов это только коды Хэмминга и Голея.
Сформулируем некоторые свойства радиуса покрытия.
Свойство 2.1. Декодирование в ДСК с исправлением всех ошибок

кратности 𝜈 ≤ 𝜌 включительно эквивалентно декодированию по
минимуму расстояния Хэмминга.
Свойство 2.2. Пусть 𝜌(𝑠) обозначает минимальный вес векто-

ра ошибок 𝑒 такого, что ему соответствует синдром 𝑒𝐻 T = 𝑠.
Тогда
𝜌 = max 𝜌(𝑠).
(2.16)
𝑠

Свойство 2.3. Радиус покрытия линейного кода не превышает

числа проверочных символов кода 𝑟.

Свойство 2.4. Если радиус покрытия линейного кода 𝜌 ≥ 𝑑, то
размерность кода 𝑘 может быть увеличена без уменьшения минимального расстояния кода.
Свойство 2.5. Если (𝑛, 𝑘)-код имеет наибольшую возможную раз-

мерность 𝑘 для заданных длины 𝑛 и минимального расстояния 𝑑,
то имеет место неравенство 𝜌 ≤ 𝑑.
Упражнение 2.18. Докажите сформулированные свойства ради-

уса покрытия.

54

2. Линейные коды

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

покрытия линейного кода. Как можно использовать свойство 2.2
для поиска радиуса покрытия высокоскоростных кодов?
Как часто бывает в теории кодирования, при том, что характеристики кодов вычислить очень трудно, найти средние характеристики случайных кодов можно достаточно просто. Рассмотрим,
например, ансамбль случайных линейных кодов, задаваемых проверочными матрицами, элементы которых — случайные равновероятные независимые двоичные символы. Если удастся установить,
что средняя по этому ансамблю величина радиуса покрытия равна 𝜌, это будет означать, что найдется по меньшей мере один код
с таким радиусом покрытия. Более того, из закона больших чисел
можно будет заключить, что при большой длине кода почти все
случайно выбираемые коды будут иметь такой радиус.
Имеет место следующее утверждение:
Теорема 2.6. При достаточно большой длине (𝑛, 𝑘)-кода со ско-

ростью 𝑅 = 𝑘/𝑛 для любого 𝜖 > 0 в ансамбле равновероятных случайных кодов существуют коды с радиусом покрытия 𝜌 таким,
что
(︁ 𝜌 )︁

≤ 1 − 𝑅 + 𝜖.
(2.17)
𝑛
Иными словами, существуют коды, радиус покрытия которых
удовлетворяет границе Варшамова–Гилберта (см. теорему 3.4).
Доказательство можно найти в [20] для произвольных кодов и в
[64] для линейных кодов. Еще одно (более простое) доказательство
приведено в [44].
2.6.2.

Декодирование по соседям нулевого слова

Этот остроумный алгоритм декодирования предложен в [87].
Рассмотрим (𝑛, 𝑘)-код 𝐶 . Обозначим через 𝑅(𝑐) решающую область кодового слова 𝑐 ∈ 𝐶 в метрике Хэмминга, а через 𝐷(𝑐)

2.6. Радиус покрытия и декодирование...

55

ее ближайшую окрестность, т.е. множество всех таких последовательностей 𝑥 ∈ 𝐹2𝑛 ∖𝑅(𝑐), из которых инверсией одного из символов
получается последовательность 𝑥′ ∈ 𝑅(𝑐).
Множество слов 𝑍 ⊆ {𝐶 ∖ 0} называется множеством соседей
нулевого слова, если это множество наименьшей мощности такое,
что
⋃︁
𝐷(0) ⊆
𝑅(𝑐).
𝑐∈𝑍

Иными словами, решающие области элементов множества соседей нулевого слова граничат с решающей областью нулевого слова
и полностью покрывают ближайшую окрестность нулевого слова.
Отметим, что множество соседей нуля не обязательно единственно,
но мощность этого множества 𝑁Z = |𝑍| для заданного кода определена однозначно.
Теорема 2.7. Для любого 𝑥 ∈
/ 𝑅(0) найдется 𝑐 ∈ 𝑍 такой, что

𝑤(𝑥 + 𝑐) < 𝑤(𝑥).

Доказательство Будем по одному ⋂︀
обнулять любые ненулевые
символы 𝑥, пока не получим 𝑥′ ∈ 𝐷(0) 𝑅(𝑐′ ) для некоторого 𝑐′ ∈
𝑍 . Из неравенства треугольника имеем
𝑑(𝑐, 𝑥) ≤ 𝑑(𝑥, 𝑥′ ) + 𝑑(𝑥′ , 𝑐′ ) <
< 𝑑(𝑥, 𝑥′ ) + 𝑑(𝑥′ , 0) = 𝑤(𝑥),
откуда следует утверждение теоремы.
Из теоремы следует алгоритм декодирования перебором по множеству соседей нулевого слова. Для последовательности 𝑥 на выходе канала перебором по множеству соседей находим 𝑐′ ∈ 𝑍 , который, будучи сложен с 𝑥, даст последовательность 𝑥′ меньшего веса.
Повторяя процедуру для новой последовательности, после не больше чем 𝑤(𝑥) итераций придем к последовательности 𝑥′ , вес которой
не может быть уменьшен добавлением соседей. Эта последовательность принадлежит 𝑅(0). Суммируя соседей 𝑐′ , использованных на
^ переданного кодопоследовательных итерациях, получаем оценку 𝑐
вого слова. Псевдокод декодирования по множеству соседей представлен в виде алгоритма 2.2.

56

2. Линейные коды

Алгоритм 2.2. Алгоритм декодирования по соседям нулевого

слова

Input: Выход канала 𝑥;
Output: Информационные символы;

Инициализация: Flag=1; 𝑐^ = 0;
while Flag==1 do
Flag=0;
foreach 𝑣 ∈ 𝑍 do
if 𝑤(𝑥 + 𝑣) < 𝑤(𝑥) then
^←𝑐
^ + 𝑣;
𝑐
𝑥 ← 𝑥 + 𝑣;
Flag=1;
break;
end
end

end
Вывод: Информационные символы, соответствующие

^
кодовому слову 𝑐

Оценим асимптотическую сложность алгоритма как функцию
длины кода 𝑛. Число итераций не превышает веса входной последовательности и может быть оценено сверху длиной кода. Сложность
одной итерации пропорциональна числу соседей 𝑁Z .
Максимальный вес вектора ошибок, декодируемого в нулевое
слово, не превышает величины радиуса покрытия кода 𝜌, значит,
вектор ошибок из ближайшей окрестности имеет вес не более 𝜌 + 1.
Соответствующий ему сосед, в решающую область которого он попадает, удален от этого вектора на расстояние не более 𝜌. Отсюда
выводим, что все соседи нулевого слова — слова веса не более 2𝜌+1.
Оценим сверху число соседей нулевого слова полным числом
кодовых слов в 𝑛-мерном шаре 𝐵𝑛 (2𝜌 + 1) радиуса 2𝜌 + 1 вокруг нулевого слова. В ансамбле случайных линейных кодов, задаваемых
случайными проверочными матрицами, элементы которых — случайные двоичные числа, любая последовательность является кодовым словом с вероятностью 2𝑘 /2𝑛 (см. вывод границы Варшамова–

2.6. Радиус покрытия и декодирование...

57

Гилберта, стр. 74). Поэтому можно оценить число соседей как

𝑁Z ≤ 2𝑘−𝑛 |𝐵𝑛 (2𝜌 + 1)| .

(2.18)

Объем шара радиуса 𝑡 в 𝑛-мерном хэмминговом пространстве
𝑡 (︂ )︂
∑︁
𝑛
|𝐵𝑛 (𝑡)| =
.
𝑖
𝑖=0

Из теорем 2.7 и 3.4 следует, что почти для всех кодов из ансамбля случайных кодов радиус покрытия и минимальное расстояние
кода в пределе при 𝑛 → ∞ удовлетворяют границе Варшамова–
Гилберта
𝑑
𝜌
𝑅 = 1 − ℎ(𝛿),
= = 𝛿.
𝑛
𝑛
В итоге, из (2.18) с учетом (1.29) получаем асимптотическую
оценку показателя сложности декодирования по соседям нулевого
слова:
{︂
ℎ(2𝛿) − ℎ(𝛿), 𝑅 > 1 − ℎ(0.25),
(2.19)
𝜅Z (𝑅) ≤
1 − ℎ(𝛿),
𝑅 ≤ 1 − ℎ(0.25).
Пороговое значение скорости 𝑅 = 1 − ℎ(0.25) = 0.1887 определяет минимальную скорость, начиная с которой декодирование по
соседям нулевого слова эффективнее простого перебора по кодовым
словам.
График функции 𝜅Z (𝑅) показан на рис. 2.1.
Видно, что выигрыш метода декодирования по соседям нулевого слова по экспоненте сложности в сравнении с непосредственным перебором очень большой. Тем не менее, как мы увидим ниже,
декодирование в ДСК может быть выполнено еще проще. Оценка сложности (2.19) интересна тем, что точно такое же поведение
сложности наблюдается для декодирования кодов, представленных
решетками (см. главу 4), но уже не с жесткими решениями, а с
мягкими решениями в канале с АБГШ.
2.6.3.

Декодирование по информационным
совокупностям

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

58

2. Линейные коды

Рис. 2.1. Границы экспоненты сложности декодирования: min(𝑅, 1−
𝑅) — декодирование перебором по кодовым словам либо синдромное
декодирование; «СНС» — декодирование по соседям нулевого слова;
«ИС» — декодирование по информационным совокупностям

однозначно восстанавливается кодовое слово. Согласно свойству 2.3
радиус покрытия не превышает числа проверочных символов. Поэтому, если число ошибок в канале не превышает величины радиуса
покрытия кода, то, вероятно, найдется свободная от ошибок информационная совокупность, по которой можно восстановить кодовое
слово. Вывод формулы асимптотической сложности декодирования
по информационным совокупностям был впервые опубликован в работах [39] и [63].
Пусть 𝑦 — последовательность на выходе ДСК, полученная при
передаче некоторого кодового слова 𝑐 двоичного (𝑛, 𝑘)-кода. Мы будем пытаться отыскать информационную совокупность, по которой

2.6. Радиус покрытия и декодирование...

59

можно восстановить кодовое слово при условии, что число ошибок
не превышает радиуса покрытия кода. Хотя хороший список таких
информационных совокупностей следовало бы подготовить заранее
до начала декодирования, мы будем обсуждать стратегию, основанную на случайном выборе информационных совокупностей.
Конечно, не любой набор из 𝑘 номеров позиций кодового слова соответствует некоторой информационной совокупности. Если
мы вычислим ранг подматрицы, составленной из столбцов, номера
которых указаны 𝑘 выбранными позициями, то эта подматрица может быть невырожденной, в этом случае имеем информационную
совокупность. Она может иметь ранг 𝑘 ′ < 𝑘 , и тогда только 𝑘 ′ битов, соответствующих базисным столбцам, можно считать инфор′
мационными. Найдутся в точности 2𝑘−𝑘 различных кодовых слов,
совпадающих с 𝑦 на 𝑘 позициях. Можно показать, что в среднем
по ансамблю случайных кодов доля «свободных» битов (𝑘 − 𝑘 ′ )/𝑘
при увеличении 𝑘 стремится к нулю (см. [39, 63], а также [44]). Поэтому при анализе алгоритма мы пренебрежем дополнительными
вычислениями, связанными с проверкой всех дополнительных кандидатов. Проще говоря, считаем, что любой выбор 𝑘 позиций из 𝑛
дает информационную совокупность.
Зафиксируем достаточно большое число 𝑁I . Алгоритм декодирования состоит в том, что декодер 𝑁I раз случайно выбирает информационную совокупность, всякий раз восстанавливает кодовое
слово и находит расстояние до последовательности 𝑦 . После 𝑁I попыток получателю выдается ближайшее к 𝑦 кодовое слово из 𝑁I
найденных кандидатов.
Сложность каждой попытки довольно велика, т.к. требуется
приведение порождающей матрицы к систематической форме на
выбранных позициях, а затем кодирование. Тем не менее, сложность попытки растет полиномиально с длиной кода, и показатель
экспоненты сложности всего алгоритма определяется допустимым
максимальным числом попыток декодирования 𝑁I . Псевдокод декодирования по информационным совокупностям приведен в виде
алгоритма 2.3.
Вероятность ошибки декодирования по информационным совокупностям ограничена сверху суммой вероятности ошибки декодирования по максимуму правдоподобия и вероятности ошибки ал-

60

2. Линейные коды

Алгоритм 2.3. Алгоритм декодирования по информацион-

ным совокупностям

Input: Выход канала 𝑥 ;
Output: Информационные символы ;

Инициализация: 𝑐^ = 0, 𝑑opt = 𝑤(𝑥);
for i=1 to 𝑁I do
Выбрать случайный набор из 𝑘 упорядоченных индексов
𝑖 = (𝑖1 , ..., 𝑖𝑘 );
Построить список 𝐶0 слов, совпадающих с 𝑥 на позициях
из 𝑖;
foreach 𝑐 ∈ 𝐶0 do
if 𝑑(𝑐, 𝑥) < 𝑑opt then
Обновить решение;
^ ← 𝑐;
𝑐
𝑑opt ← 𝑑(𝑐, 𝑥);
end
end
end
Вывод: Информационные символы, соответствующие

^
кодовому слову 𝑐

горитма — вероятности 𝑃𝑒 (𝑁I ) того, что все 𝑁I выборов неудачны
(содержат ошибки канала).
Если число ошибок в канале не превышает величины радиуса
покрытия 𝜌, то ошибка при одной попытке происходит с вероятностью не больше
(︀𝑛−𝜌)︀
1 − (︀𝑛𝑘 )︀
𝑘

и в результате 𝑁I независимых попыток получаем оценку
(︃
(︀ )︀ )︃𝑁I
𝑛−𝜌

𝑃𝑒 (𝑁I ) ≤

1 − (︀𝑛𝑘 )︀

.

𝑘

Воспользуемся тождеством
(︂ )︂(︂
)︂ (︂ )︂(︂
)︂
𝑛 𝑛−𝑎
𝑛 𝑛−𝑏
=
,
𝑎
𝑏
𝑏
𝑎

2.6. Радиус покрытия и декодирование...

61

чтобы привести оценку к более удобной форме

(︃
𝑃𝑒 (𝑁I ) ≤

(︀𝑛−𝑘)︀ )︃𝑁I

𝜌
1 − (︀𝑛)︀

.

𝜌

Заметим, что правая часть с ростом 𝑛 в зависимости от выбранного числа попыток 𝑁I может стремиться либо к константе
𝑒−1 = lim𝑧→∞ (1 − 1/𝑧)𝑧 , либо к нулю или к бесконечности. Чтобы
вероятность ошибки стремилась к нулю, произведение
(︀𝑛−𝑘)︀
𝜌
𝑁I × (︀𝑛)︀
𝜌

должно расти с увеличением 𝑛. Если рост будет экспоненциальным,
со сколь угодно малым положительным показателем экспоненты,
то дополнительная вероятность ошибки 𝑃𝑒 (𝑁I ) будет убывать по
двойному экспоненциальному закону, и ею можно будет пренебречь
по сравнению с вероятностью ошибки декодирования по максимуму
правдоподобия.
Таким образом, для любого 𝜀 > 0 граница сверху на асимптотический показатель экспоненты сложности удовлетворяет неравенству
(︀𝑛)︀
1
𝜌
𝜅I (𝑅) ≤ lim log2 (︀𝑛−𝑘)︀ + 𝜖 =
(2.20)
𝑛→∞ 𝑛
𝜌
)︂
(︂
𝛿
+ 𝜖,
(2.21)
= ℎ(𝛿) − (1 − 𝑅)ℎ
1−𝑅
𝑅 = 1 − ℎ(𝛿),
(2.22)
в котором мы снова использовали обозначение 𝛿 = 𝑑/𝑛 = 𝜌/𝑛 для
относительного расстояния кода, которое в соответствии с теоремами 2.7 и 3.4. почти для всех кодов ансамбля совпадает с относительным радиусом покрытия и удовлетворяет границе Варшамова–
Гилберта. Переход от (2.20) к (2.21) основан на (1.29).
Более аккуратный выбор асимптотического поведения числа попыток позволяет доказать (2.21) при 𝜖 = 0. График функции 𝜅I (𝑅)
показан на рис. 2.1. Мы видим, что при скорости кода 𝑅 = 1/2

62

2. Линейные коды

показатель экспоненты сложности примерно в 2 раза меньше, чем
для декодирования по соседям нулевого слова и в 4 раза меньше
показателя сложности переборного декодирования.
Не случайно именно метод декодирования по информационным
совокупностям чаще других используют, например, для нахождения минимального расстояния линейных кодов.
Известны асимптотически более эффективные (но и более громоздкие в описании и анализе) алгоритмы декодирования в ДСК.
Подробный обзор литературы по этой тематике приведен в [44].

Выводы
∙ Линейный код — линейное подпространство линейного пространства.
∙ Порождающая матрица кода — базис подпространства, образующего код.
∙ Проверочная матрица — базис ортогонального пространства.
∙ Любой код либо может быть представлен в систематической
форме, либо эквивалентен систематическому коду.
∙ Преобразование порождающей матрицы в проверочную и наоборот выполняется с помощью приведения кода к систематической форме.
∙ Минимальное расстояние кода равно минимальному весу
ненулевых кодовых слов.
∙ Минимальное расстояние кода равно минимальному числу линейно зависимых столбцов.
∙ Параметры линейного кода удовлетворяют границе Синглтона: 𝑑 ≤ 𝑛 − 𝑘 + 1.
∙ Нетрудно построить хорошие короткие линейные коды: коды
с расстоянием 2, 3, 4 и дуальные к ним.

Задачи

63

∙ Декодирование линейного (𝑛, 𝑘 )-кода по минимуму расстояния Хэмминга при скорости кода 𝑅 = 𝑘/𝑛 < 1/2 может быть
выполнено перебором по кодовым словам со сложностью пропорциональной 2𝑘 . При 𝑅 = 𝑘/𝑛 > 1/2 при помощи синдромного декодирования оно может быть выполнено со сложностью пропорциональной 2𝑟 , 𝑟 = 𝑛 − 𝑘 .

Задачи
1. Построить наилучшие в смысле минимального расстояния коды длины 6 со скоростями 1/6, 2/6, 3/6, 4/6, 5/6, 1.
2. Для наилучших известных кодов со скоростью 𝑘/𝑛=1/2 из
табл. 3.2 построить зависимости ошибки от длины кодов[︀ при]︀
декодировании с исправлением ошибок кратности до 𝑡 = 𝑑−1
2
для ДСК с переходной вероятностью 0.1, 0.01, 0.001. Подсчитайте энергетический выигрыш кодирования для вероятности
ошибки декодирования 10−5 .
3. По заданной проверочной (порождающей) матрице найти порождающую (проверочную), определить скорость и минимальное расстояние кода. В качестве примеров используйте
матрицы из следующего списка:




]︂
[︂
001011
101100
010110




,
а) 010110 , б) 010110 , в)
101101
101100
001011






001011
111111
010110
г) ⎣101101⎦, д) ⎣010110⎦, е) ⎣111111⎦,
101100
110100
001011




[︂
]︂
0101100
1110100
010110
ж)
, з) ⎣1011010⎦, и) ⎣0111010⎦,
111111
1111111
0011101


1110100
к) ⎣0111010⎦.
1111111

64

2. Линейные коды
4. Итеративные коды (коды-произведения). Рассмотрим два линейных кода с параметрами (𝑛1 , 𝑘1 ) и (𝑛2 , 𝑘2 ) и минимальными
расстояниями 𝑑1 и 𝑑2 соответственно. Запишем 𝑘1 𝑘2 информационных символов в виде таблицы с 𝑘1 строками и 𝑘2 столбцами. Допишем в каждый столбец проверочные символы, закодировав столбцы первым кодом, затем допишем в каждую из
𝑛1 строк проверочные символы, закодировав строки вторым
кодом. Докажите следующие утверждения.

∙ Полученный код является линейным (𝑛1 𝑛2 , 𝑘1 𝑘2 )-кодом.
∙ Каждый столбец является словом первого кода, строка
— второго.
∙ Минимальное расстояние кода равно 𝑑 = 𝑑1 𝑑2 .
∙ Декодирование по строкам, а затем по столбцам гарантирует исправление не больше 𝑑1 𝑑2 /4 ошибок.
Потенциально код способен исправлять до 𝑡 = ⌊(𝑑 − 1)/2⌋ =
= ⌊(𝑑1 𝑑2 − 1)/2⌋ ошибок. Подумайте над тем, как улучшить
декодирование, оставаясь в рамках алгоритмов, основанных
на попытках декодирования составляющих кодов длин 𝑛1 и
𝑛2 . Подсказка: при заданном минимальном расстоянии кода стираний исправляется больше, чем ошибок. Желательно
часть ошибок заменить стираниями.
5. Сколько существует различных линейных (𝑛, 𝑘)-кодов?
Сколько существует различных неэквивалентных линейных
(𝑛, 𝑘)-кодов? Предложите способы поиска кодов с наилучшим
минимальным расстоянием.
6. Укажите соответствие между синдромами и векторами ошибок для кода Хэмминга с произвольным числом проверочных
символов.
7. Для примеров матриц из задачи 3, интерпретируемых как
проверочные матрицы, постройте таблицы синдромного декодирования.

Задачи

65

8. Большинство результатов данного раздела сформулировано
для двоичных кодов. Однако это ограничение, сделанное для
простоты изложения, непринципиально. Какие теоремы данного раздела и как должны быть переформулированы для
случая кодов над произвольным полем 𝐹𝑞 ?
9. Циклический(︀ код. Под циклическим
)︀ сдвигом последовательности 𝑔 = 𝑔1 𝑔2 . . . 𝑔𝑛−1 𝑔𝑛 на(︀ одну позицию вправо
)︀
понимается последовательность 𝑔 = 𝑔𝑛 𝑔1 𝑔2 . . . 𝑔𝑛−1 .
Код, в котором циклический сдвиг любого кодового слова —
тоже кодовое слово, называется циклическим кодом (глава 5).
Постройте порождающую матрицу линейного циклического
(7,4)-кода как набор(︀ из четырех циклических
сдвигов после)︀
довательности 𝑔 = 1 1 0 1 0 0 0 . Определите минимальное расстояние кода. Как изменятся характеристики кода при изменении длины (последовательность 𝑔 при этом дополняется нулями в нужном количестве) и (или) размерности
кода? Сравните параметры получаемых кодов с параметрами
лучших известных кодов.
(︀
)︀
10. Дополняя последовательность 𝑔 = 1 1 1 0 1 нулями,
постройте циклические коды с расстоянием 4. Сравните параметры получаемых кодов с параметрами лучших известных
кодов.
11. Попробуйте построить нетривиальный циклический код с расстоянием 𝑑 = 5 размерности 𝑘 ≥ 3 и длины 𝑛 < 𝑘𝑑.
12. Сверточный код. Выберем некоторую четную длину кода
𝑛 > 4 и выберем в качестве первой строки порождающей матрицы (𝑛, 𝑘)-кода дополненную нулями последовательность
(︀
)︀
А) 𝑔 = 1 1 0 1
(︀
)︀
Б) 𝑔 = 1 1 0 1 0 1
(︀
)︀
В) 𝑔 = 1 1 0 1 1 1
Остальные строки получите (не циклическими!) сдвигами
вправо на две позиции первой строки до тех пор, пока последний (самый правый) ненулевой символ не окажется на позиции

66

2. Линейные коды
с номером 𝑛. Определите минимальное расстояние и скорость
кода. Сравните параметры получаемых кодов с параметрами
лучших известных кодов.
Построенный код – частный случай усеченного сверточного
кода (глава 8).

13. Квазициклический код. Код, в котором циклический сдвиг на
фиксированное число позиций 𝑐 > 1 любого кодового слова –
тоже кодовое слово, называется квазициклическим. Воспользуйтесь последовательностями из предыдущей задачи для построения квазициклических кодов со скоростью 𝑅 = 1/2.
Подсчитайте минимальное расстояние кодов и сравните параметры полученных кодов с параметрами лучших известных
кодов. Как изменится расстояние кода при увеличении или
уменьшении длины?
Коды этого класса в русскоязычной литературе называют
циклически усеченными, в то время как по-английски они называются «tail-biting»-коды. Почему?
14. Для кодов из задачи 1 найдите радиусы покрытия. Нельзя ли
улучшить построенные Вами коды с точки зрения их радиуса
покрытия?
15. Декодирование методом нулевых соседей. Постройте множество соседей нулевого слова для кодов из задачи 1. Сравните
сложность декодирования по нулевым соседям со сложностью
декодирования перебором по словам кода и со сложностью
синдромного декодирования.
16. Декодирование по информационным совокупностям. Сколько
информационных совокупностей имеют код Хэмминга (7,4) и
расширенный код Хэмминга (8,4)? Оцените сложность декодирования по информационным совокупностям для этих кодов
и сравните со сложностью других алгоритмов декодирования.

Приложение

67

Приложение. Группы. Основные определения
Определение 2.3. Множество 𝐺 = {𝑔} называется группой, ес-

ли на нем определена некоторая операция (обозначим ее «*») и
выполняются следующие аксиомы.
1. Замкнутость: если 𝑎, 𝑏 ∈ 𝐺, то 𝑎 * 𝑏 ∈ 𝐺.
2. Ассоциативность: 𝑎 * (𝑏 * 𝑐) = (𝑎 * 𝑏) * 𝑐.
3. Существует единичный элемент 𝑒: 𝑎*𝑒 = 𝑒*𝑎 = 𝑎 для любых
𝑎 ∈ 𝐺.
4. Для каждого элемента 𝑎 ∈ 𝐺 существует обратный элемент 𝑏 ∈ 𝐺 такой, что 𝑎 * 𝑏 = 𝑒.
Если групповой операцией является сложение, то единичным
элементом мы традиционно считаем 0, а обратным к 𝑎 служит −𝑎.
Если же групповой операцией является умножение, то единичный
элемент — это 1, а обратный к 𝑎 записываем как 𝑎−1 .
Число элементов группы называется порядком группы.
Группа называется коммутативной или абелевой, если групповая операция коммутативна. Классический пример некоммутативной групповой операции — операция перемножения в группе невырожденных квадратных матриц. В рамках данного курса мы будем
иметь дело, в основном, с коммутативными группами.
Если 𝐻 ⊂ 𝐺 и 𝐻 само является группой, то 𝐻 называется подгруппой.
Для определенности рассмотрим коммутативную группу по сложению.
2.4. Рассмотрим некоторый элемент группы
𝑔 ∈ 𝐺, 𝑔 ∈
/ 𝐻 . Тогда множество элементов вида {𝑔 + ℎ, ℎ ∈ 𝐻 }
называется смежным классом группы 𝐺 по подгруппе 𝐻 . При
этом сам элемент 𝑔 называется образующим элементом смежного класса.
Определение

Методом доказательства «от противного» нетрудно убедиться в
справедливости следующего утверждения.

68

2. Линейные коды

Теорема 2.8. Смежные классы, соответствующие двум образу-

ющим элементам, либо совпадают, либо не пересекаются.

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

группы.

В случае абелевой группы можно определить операцию над
смежными классами 𝐵 = {𝑏} и 𝐵 ′ = {𝑏′ }

𝐵 + 𝐵 ′ = {𝑏} + {𝑏′ } = {𝑏 + 𝑏′ , 𝑏 ∈ 𝐵, 𝑏′ ∈ 𝐵 ′ }
(групповая операция, конечно, может быть любой, мы рассматриваем сложение только для определенности).
Множество смежных классов по подгруппе 𝐻 само образует
группу (с 𝐻 в качестве единичного элемента). Эта группа называется фактор-группой группы 𝐺 по 𝐻 и обозначается как 𝐺|𝐻 .
Пример 2.10. Множество чисел {0, 1, 2, 3, 4, 5} образует группу по

сложению по модулю 6. Порядок группы равен 6. Обратными к
0, 1, . . . , 5 элементами являются соответственно 0, 5, 4, 3, 2, 1. Примерами подгрупп являются {0, 3} и {0, 2, 4}. Их порядки равны 2 и
3. Смежными классами 𝐻 = {0, 3} являются множества

𝐵0 = 𝐻 = {0, 3}, 𝐵1 = {1, 4}, 𝐵2 = {2, 5}.
В этой фактор-группе можно вычислять суммы элементов. Например,

𝐵1 + 𝐵2 = {1 + 2, 1 + 5, 4 + 2, 4 + 5} = {0, 3} = 𝐵0 .

3.

Некоторые границы на
характеристики кодов

Минимальное расстояние кодов — наиболее важная характеристика
линейного кода, она чаще других параметров используется как ориентир при поиске эффективных кодовых конструкций. Для построения кодов типично используются комбинаторные, алгебраические
и вероятностные методы. Желательно иметь последовательности
кодов с фиксированной скоростью и линейно растущим с длиной
кода минимальным расстоянием. Если это условие выполняется,
можно гарантировать, что вероятность ошибки убывает экспоненциально с длиной кода, и, следовательно, может быть обеспечена
сколь угодно малая вероятность ошибки декодирования. Такие коды (или классы кодов) называют асимптотически хорошими.
От скорости роста минимального расстояния с длиной кода зависит, насколько близко можно приблизиться к пределу Шеннона — пропускной способности канала. Однако задача построения
кодов интересна и важна без привязки к конкретной модели канала. В данной главе мы рассматриваем минимальное расстояние
как критерий качества кода и вычисляем для него оценки снизу и
сверху.
Знание верхних и нижних границ на минимальное расстояние
кодов позволяет судить о том, насколько хороша та или иная конструкция, а также избавляет от бесплодных попыток построить код
с заведомо недостижимыми характеристиками.
В конце главы мы приводим верхние и нижние границы на вероятность ошибки для заданного кода — это, соответственно, границы
Полтырева и Шеннона.

70

3.1.

3. Некоторые границы на характеристики кодов

Граница Хэмминга

Первая граница очень простая. Она основана на том, что при упаковке пространства шарами суммарный объем всех шаров не больше общего числа точек в пространстве.
Теорема 3.1. Для любого 𝑞 -ичного кода с длиной 𝑛 и минимальным расстоянием 𝑑 ≥ 2𝑡 + 1 число кодовых слов 𝑀 удовлетворяет
неравенству

𝑀≤

𝑞𝑛
.
𝑡 (︀ )︀
∑︀
𝑛
𝑖
𝑖 (𝑞 − 1)

(3.1)

𝑖=0

Доказательство. Шар радиуса 𝑡 c центром в точке 𝑥 — это
множество точек, расположенных на расстоянии не более 𝑡 от 𝑥.
В пространстве 𝑋 𝑛 всех 𝑞 -ичных последовательностей с метрикой
Хэмминга объем каждого такого шара 𝐵𝑡 (𝑥) не зависит от 𝑥 и равен
𝑡 (︂ )︂
∑︁
𝑛
|𝐵𝑡 (𝑥)| =
(𝑞 − 1)𝑖 .
𝑖
𝑖=0

Если центры шаров размещены в кодовых словах кода объема
𝑀 с минимальным расстоянием 𝑑 ≥ 2𝑡 + 1, то шары не пересекаются. Их суммарный объем не превышает общего числа точек в
пространстве 𝑞 𝑛 , из чего следует неравенство (3.1).
Упражнение 3.1. Сопоставьте характеристики кодов Хэмминга с

границей Хэмминга.

Изучим асимптотическое поведение границы (3.1) при увеличении длины кодов.
Теорема 3.2. Скорость 𝑅 = log𝑞 𝑀/𝑛 любого q-ичного кода с относительным минимальным расстоянием 𝛿 = 𝑑/𝑛 при достаточно
большой длине кода 𝑛 удовлетворяет неравенству
(︂ )︂
𝛿
𝛿
𝑅 ≤ 𝑅H (𝛿) = log2 𝑞 − ℎ
− log2 (𝑞 − 1),
(3.2)
2
2

где ℎ (𝑥) = −𝑥 log2 𝑥 − (1 − 𝑥) log2 (1 − 𝑥).

3.2. Граница Варшамова–Гилберта

71

Доказательство Для доказательства нужно воспользоваться
формулами (1.20) или (1.21) приложения к главе 1.
В случае двоичных кодов, 𝑞 =2, неравенство (3.2) принимает вид
(︂ )︂
𝛿
.
(3.3)
𝑅 ≤ 𝑅H (𝛿) = 1 − ℎ
2
График асимптотической границы Хэмминга показан на
рис. 3.1.
Интересно, что выражение в правой части (3.3) очень напоминает выражение для пропускной способности ДСК 𝐶 = 1 − ℎ(𝑝).
Из сравнения формул нетрудно вывести (например, с помощью
неравенства Чебышева или любой другой оценки вероятности больших уклонений), что, если бы существовали коды, удовлетворяющие границе Хэмминга с равенством, то, декодируя с исправлением ошибок кратности 𝑡, можно было бы передавать информацию
со скоростью сколь угодно близкой к пропускной способности. Однако, как мы увидим позже, при 𝑛 → ∞ и 𝛿 > 0 таких кодов не
существует, что не исключает, конечно, возможности приблизиться
к пропускной способности канала.
Среди нетривиальных двоичных кодов равенство в границе Хэмминга имеет место только для кодов Хэмминга и кода Голея (23,12).

3.2.

Граница Варшамова–Гилберта

Приведенная в предыдущем параграфе граница Хэмминга — верхняя граница на минимальное расстояние. В этом параграфе мы получим такую же простую нижнюю границу, т.е. границу, гарантирующую возможность построения кодов с некоторыми параметрами.
Эта граница называется границей Варшамова–Гилберта (ВГ).
Теорема 3.3. Если имеет место неравенство

𝑞

𝑛−𝑘

)︂
𝑑−2 (︂
∑︁
𝑛−1
>
(𝑞 − 1)𝑖 ,
𝑖

(3.4)

𝑖=0

то существует q-ичный линейный (𝑛, 𝑘)-код с минимальным расстоянием 𝑑.

72

3. Некоторые границы на характеристики кодов
1
0.9
0.8
0.7

1
2

0.6

δ
0.5

3

0.4
0.3
0.2
0.1
0
0

4
5

0.2

0.4

0.6

0.8

1

R

Рис. 3.1. Границы на минимальное расстояние: 1 — граница Хэмминга, 2 — граница Плоткина, 3 — граница Элайеса–Басалыго,
4 — граница МакЭлиса–Родемича–Рамсея–Велча, 5 — граница
Варшамова–Гилберта

Доказательство Будем шаг за шагом строить проверочную матрицу кода с 𝑟 строками и с заданным минимальным расстоянием 𝑑,
т.е. матрицу, в которой любые 𝑑 − 1 столбцов линейно независимы.
Первый столбец может быть любым не равным нулю. Второй столбец должен быть не кратен первому, третий не может совпадать с
линейной комбинацией первых двух и т.д. На 𝑖-м шаге имеем 𝑖 − 1
столбцов длины 𝑟. Проверим, можно ли продолжить построение,
добавив еще один столбец. Из общего числа 2𝑟 возможных столб-

3.2. Граница Варшамова–Гилберта

73

цов длины 𝑟 нужно исключить один нулевой, (𝑞 − 1)(𝑖 − 1) столбцов,
(︀𝑖−1)︀
кратных уже выбранным. Далее нужно исключить (𝑞 − 1)2
2
попарных линейных комбинаций столбцов. Продолжая, исключаем линейные комбинации вплоть до (𝑑 − 2) различных столбцов из
(𝑖 − 1) выбранных. Если (3.4) верно, то код длины 𝑛 = 𝑖 существует,
но кода бо́льшей длины, вообще говоря, может не существовать.
Аналогично асимптотической форме границы Хэмминга имеем
асимптотическую границу ВГ.
Теорема 3.4. При достаточно большой длине (𝑛, 𝑘)-кода и любом

𝜀 > 0 найдется код с относительным минимальным расстоянием 𝛿 = 𝑑/𝑛 со скоростью 𝑅 = 𝑘/𝑛, для которого имеет место
неравенство
𝑅 ≥ 𝑅VG (𝛿) − 𝜀,

где
𝑅VG (𝛿) = log2 𝑞 − ℎ (𝛿) − 𝛿 log2 (𝑞 − 1).

(3.5)

Для двоичных кодов граница имеет вид

𝑅VG (𝛿) = 1 − ℎ (𝛿) .

(3.6)

Эта функция показана на рис. 3.1. Из сравнения границ 𝑅H (𝛿) и
𝑅VG (𝛿) мы видим, что достижимое по границе ВГ расстояние вдвое
меньше, чем оценка, вытекающая из границы Хэмминга. Если бы
удалось построить длинные коды, удовлетворяющие границе ВГ, то
при декодировании с исправлением 𝑡 = ⌊(𝑑 − 1)/2⌋ ошибок максимально достижимая скорость передачи со сколь угодно малой вероятностью ошибки была бы все равно ниже пропускной способности
канала. Опять приходим к выводу, что декодирования с исправлением ошибок кратности, гарантируемой минимальным расстоянием кода, недостаточно для достижения пропускной способности
канала. Декодирование же по МП (в случае ДСК это будет декодирование по минимуму расстояния Хэмминга) вполне может быть
асимптотически эффективным.
Приведем еще одно, неконструктивное, доказательство границы
ВГ. Для простоты будем рассматривать двоичные коды.

74

3. Некоторые границы на характеристики кодов

Построим проверочную матрицу (𝑛, 𝑘)-кода 𝐻 , выбирая ее элементы из множества {0, 1} независимо с одинаковыми вероятностями. Каждая такая матрица задает некоторый код, все такие коды
равновероятны. С какой вероятностью код имеет минимальное расстояние, меньшее 𝑑?
Это событие эквивалентно тому, что для заданной матрицы 𝐻
найдется последовательность 𝑐 = (𝑐1 , . . . , 𝑐𝑛 ) веса 𝑤(𝑐) < 𝑑, являT
ющаяся
(︀ 𝑛 )︀ кодовым словом, т.е. 𝑐𝐻 = 0. Для этого хотя бы одна
из 𝑤 сумм 𝑤 = 𝑤(𝑐) случайных столбцов длины (𝑛 − 𝑘) должна
быть равна нулю. Поскольку все такие столбцы представляют собой случайные равновероятные последовательности длины (𝑛 − 𝑘)
(вероятность каждой последовательности равна 2𝑘−𝑛 ), то вероятность нулевой суммы тоже равна 2𝑘−𝑛 , и вероятность плохого кода
можно оценить как
𝑑−1
∑︁

T

Pr(𝑐𝐻 = 0|𝑤(𝑐) = 𝑤) ≤ 2

𝑤=1

−𝑛+𝑘

𝑑−1 (︂ )︂
∑︁
𝑛
.
𝑤

𝑤=1

Воспользовавшись асимптотическими формулами для числа сочетаний (см. приложение к главе 1), легко убедиться, что, если скорость кода меньше 𝑅VG (𝛿) − 𝜀, то правая часть убывает с ростом
𝑛 пропорционально 2−𝑛𝜀 . Это означает, что доля плохих кодов (с
минимальным расстоянием ниже границы ВГ) стремится к нулю с
увеличением длины кодов. Тем самым установлено, что доля случайных кодов с расстоянием ниже границы ВГ стремится к нулю
с ростом длины кода, и, следовательно, почти все случайные коды
удовлетворяют границе ВГ.
При малых 𝑛 все хорошие известные коды имеют расстояние,
превышающее эту границу. Означает ли это, что граница ВГ — слабая граница? Удивительно, но именно эта (асимптотическая) граница, известная с начала 50-х годов прошлого века, так и не была
улучшена (для малых 𝑞 , в частности, для двоичных кодов).

3.3.

Граница Плоткина

При сравнении границ Хэмминга и ВГ обращает на себя внимание то, что между ними нет согласия даже в «тривиальной» точке

3.3. Граница Плоткина

75

𝑅 = 0. Кажется, что чаша весов предпочтения должна склониться в
сторону границы Хэмминга, поскольку код длины 𝑛 с расстоянием
𝑑 = 𝑛 существует — это код (𝑛, 1) из двух противоположных слов.
Следовательно, точка (𝑅 = 0, 𝑑/𝑛 = 1) кажется достижимой. Но
тут кроется ошибка: с точки зрения асимптотики код (𝑛, 2) — тоже
код с нулевой скоростью. Максимально достижимое относительное
расстояние для нее уже заведомо меньше единицы. Для него уже
граница Хэмминга недостижима.
Упражнение 3.2. Подсчитайте величину

lim (𝑑/𝑛) для оптимального кода с 𝑘 = 2, 3, . . . информационными символами. Подсказка: ответ будет приведен в следующем параграфе, посвященном
границе Грайсмера.
𝑛→∞

Из этого упражнения следует, что вопрос о достижимом при
𝑅 → 0 минимальном расстоянии нетривиален. Ответ на этот вопрос
дает граница Плоткина. В этом параграфе мы будем рассматривать
для простоты только линейные двоичные коды. Нам потребуются
вспомогательные леммы.
Лемма 3.5. Сумма по всем кодовым словам (𝑛, 𝑘)-кода значений
символов на фиксированной позиции слова равна либо 0, либо 2𝑘−1 .
Иными словами, каждая позиция в коде либо всегда равна нулю,
либо принимает значения 0 и 1 в равном числе кодовых слов.

Доказательство. Рассмотрим, для определенности, первую позицию кода.Если в порождающей матрице 𝐺 первый столбец —
нулевой, то он будет нулевым во всех словах, что соответствует
первой из двух возможностей в утверждении леммы.
Если первый столбец ненулевой, одна из строк 𝐺 начинается с
единицы. Предположим, без потери общности, что это последняя
строка. Прибавив ее ко всем строкам, которые также начинаются с
единицы, получим порождающую матрицу того же кода, в которой
все элементы первого столбца, за исключением последнего, равны
нулю.
Линейные комбинации первых 𝑘 − 1 строк матрицы дают 2𝑘−1
слов, начинающихся с нуля. Прибавление к ним последней строки
дает ровно 2𝑘−1 слов, начинающихся с единицы.

76

3. Некоторые границы на характеристики кодов

Лемма 3.6. Для любого линейного кода

𝑛2𝑘−1
≥ 𝑑.
2𝑘 − 1

(3.7)

Доказательство. В числителе левой части — оценка сверху на
суммарное число единиц во всех кодовых словах. Эта оценка непосредственно следует из леммы 3.5. В знаменателе — число ненулевых кодовых слов. Таким образом, дробь слева — среднее число
единиц в ненулевых словах кода. Средний вес не может быть меньше минимального, откуда следует утверждение леммы.
Из леммы 3.6, в частности, следует, что при больших 𝑘

1
1
1
𝑑
≤ + 𝑘+1
≈ .
𝑛
2 2
2
−2

(3.8)

Лемма 3.7. Пусть 𝐾(𝑛, 𝑑) обозначает максимальное возможное

число информационных символов кода длины 𝑛 с расстоянием 𝑑.
При 𝑛 > 𝑑 имеет место неравенство
𝐾(𝑛, 𝑑) ≤ 𝐾(𝑛 − 1, 𝑑) + 1.

(3.9)

Доказательство. Лемма говорит, что при заданном расстоянии
увеличение длины кода на единицу позволит увеличить размерность кода не больше, чем на один бит. Достаточно доказать, что,
если существует (𝑛, 𝑘)-код с расстоянием 𝑑, то найдется (𝑛−1, 𝑘−1)код с расстоянием 𝑑.
Рассмотрим (𝑛, 𝑘)-код и представим его порождающую матрицу
𝐺 в систематической форме. Без потери общности предположим,
что первый столбец начинается с единицы, а остальные символы
столбца равны нулю. Вычеркнув из 𝐺 первый столбец и первую
строку, получим код длины 𝑛 − 1 размерности 𝑘 − 1, а расстояние
кода либо не изменилось, либо увеличилось.
Теорема 3.8. При достаточно больших 𝑛 для любого (𝑛, 𝑘)-кода

со скоростью 𝑅 = 𝑘/𝑛 и относительным расстоянием 𝛿 = 𝑑/𝑛
имеет место граница Плоткина
𝑅 ≤ 𝑅P (𝛿) = 1 − 2𝛿.

(3.10)

3.4. Граница Грайсмера

77

Доказательство. Из леммы 3.7 имеем
𝐾(𝑛, 𝑑) ≤ 𝐾(2𝑑 − 1, 𝑑) + 𝑛 − 2𝑑 + 1.

(3.11)

Из (3.8) нетрудно видеть, что, поскольку 𝑑/(2𝑑 − 1) > 1/2, длинных кодов с положительной скоростью и относительным расстоянием 𝑑/(2𝑑 − 1) не существует, т.е. lim𝑛→∞ 𝐾(2𝑑 − 1, 𝑑)/𝑛 = 0. Деля
обе части (3.11) на 𝑛 и переходя к пределу при 𝑛 → ∞, получаем
требуемый результат.
График границы Плоткина 𝑅P (𝛿) вместе с другими границами
показан на рис. 3.1. Мы видим, что эта граница существенно сильнее границы Хэмминга для низких скоростей кодов.

3.4.

Граница Грайсмера

Граница Грайсмера часто оказывается полезной для оценки возможности построения конкретного кода. Кроме того, она косвенно
подсказывает, как можно строить хорошие низкоскоростные коды
с большими расстояниями.
Вывод границы основан на простой лемме.
Лемма 3.9. Пусть 𝑁 (𝑘, 𝑑) обозначает минимальную возможную
длину двоичного линейного кода размерности 𝑘 с минимальным
расстоянием 𝑑. Тогда

𝑁 (𝑘, 𝑑) ≥ 𝑑 + 𝑁 (𝑘 − 1, ⌈𝑑/2⌉) ,

(3.12)

где выражение ⌈𝑎⌉ обозначает округление вещественного числа 𝑎
вверх до ближайшего целого.
Доказательство. Приведем порождающую матрицу произвольного кода длины 𝑛 = 𝑁 (𝑘, 𝑑) к виду
(︂ 𝑁 (𝑘,𝑑)−𝑑
)︂
0
1𝑑
𝐺=
,
𝐺1
𝐺2
где запись 𝑎𝑖 обозначает 𝑖-кратное повторение элемента 𝑎.

78

3. Некоторые границы на характеристики кодов

Заметим, что код, задаваемый матрицей 𝐺1 , имеет размерность
𝑘 − 1. Иначе одна из линейных комбинаций ее строк была бы нулевой, а ее продолжение (соответствующая линейная комбинация
строк 𝐺2 ) имело бы вид 1𝑑 . То есть нашлось бы кодовое слово, совпадающее с первой строкой 𝐺, что означает, что исходный код не
имел размерность 𝑘 .
Предположим теперь, что минимальный вес одного из слов кода,
заданного 𝐺1 , равен 𝑑1 < 𝑑/2. Тогда вес его продолжения не меньше
𝑑 − 𝑑1 > 𝑑/2. Прибавив к этому слову первую строку матрицы 𝐺,
мы уменьшим вес правой части до величины, меньшей 𝑑/2, и суммарный вес окажется меньше 𝑑. Поскольку этого не может быть,
наше предположение о том, что минимальный вес кода, заданного
𝐺1 , меньше 𝑑/2, неверно.
В результате (𝑘 − 1)-кратного применения леммы приходим к
следующей теореме.
Теорема 3.10.
𝑘−1 ⌈︂ ⌉︂
∑︁
𝑑
𝑁 (𝑘, 𝑑) ≥
.
2𝑖

(3.13)

𝑖=0

В задачах в конце главы приведено несколько примеров применения границы.
Подумаем над тем, возможно ли построить такие линейные коды, которые были бы оптимальными с точки зрения границы Грайсмера. Для таких кодов в (3.13) должно выполняться равенство. Точнее говоря, на каждой итерации вида (3.12) должно выполняться
равенство.
Упражнение 3.3. Убедитесь в том, что симплексные коды (ду-

альные к кодам Хэмминга) и коды Рида–Маллера первого порядка
(дуальные по отношению к расширенным кодам Хэмминга) удовлетворяют границе Грайсмера.
Итак, уже понятно, что построить очень низкоскоростные коды
длины 2𝑘−1 или кратной 2𝑘 −1, удовлетворяющие границе Грайсмера, несложно. Нужно сначала выбирать все столбцы порождающей
матрицы разными и затем повторить все столбцы нужное число
раз.

3.5. Другие границы

79

Пусть длина кода не кратна 2𝑘 − 1. Это означает, что некоторые столбцы будут повторяться, некоторые — нет. Задача построения кода сводится к задаче правильного выбора столбцов, которые
будут повторяться. Интуиция справедливо подсказывает, что все
дополнительные столбцы должны быть различными (иначе найдется информационная последовательность, которая обнулит сразу
несколько добавленных кодовых позиций). Заметим также, что первые 2𝑘 −1 столбцов задают код со словами одинакового веса, значит
«прибавка» минимального расстояния зависит только от веса различных линейных комбинаций дописываемых столбцов. Например,
если дописанная матрица имеет неполный ранг, то минимальное
расстояние итогового кода вообще не изменится.
Подробно о построении кодов, удовлетворяющих границе Грайсмера, можно почитать в главе 17 книги [10].

3.5.

Другие границы

Приведем без доказательства еще две асимптотические границы,
справедливые как для линейных, так и нелинейных кодов.
Граница Бассалыго–Элайеса
(︂
)︂
1 1√
𝑅≤1−ℎ

1 − 2𝛿 .
2 2
Граница МакЭлиса–Родемича–Рамсея–Велча (МЭРРВ)

𝑅 ≤ min 𝐵(𝑢, 𝛿),
𝑢∈(0,1−2𝛿]

где
и

𝐵(𝑢, 𝛿) = 1 + 𝜇(𝑢2 ) − 𝜇(𝑢2 + 2𝛿𝑢 + 2𝛿)

)︂
1 1√
𝜇(𝑥) = ℎ

1 − 2𝑥 .
2 2
Все асимптотические границы показаны на рис. 3.1 в виде функций 𝛿(𝑅). Сравнение графиков показывает, что в асимптотической
теории кодирования вопрос о достижимой скорости кодов с заданным расстоянием не имеет окончательного ответа, несмотря на титанические усилия многих математиков. Интересно, что лучшая
(︂

80

3. Некоторые границы на характеристики кодов

верхняя граница (МЭРРВ) была опубликована в 1977 году, а нижняя граница ВГ известна с 1953 года.
Дальнейшее уточнение любой их двух границ по прошествии
стольких лет кажется уже невероятным. (Отметим, что небольшое
продвижение произошло в 1984 г., когда С. Г. Влэдуц, Г. Л. Кацман,
М. А. Цфасман в работе [34] доказали существование кодов над
алфавитом размера 𝑞 ≥ 49 с расстояниями выше границы ВГ.)

3.6.

Спектр кода и оценки вероятности
ошибки

В настоящее время компьютерное моделирование все больше вытесняет подсчет по формулам при анализе помехоустойчивости систем
кодирования. Тем не менее, моделирование может быть неэффективным, например, при оценивании вероятностей ошибок порядка
10−12 и ниже. Ниже мы приводим как справочный материал лучшие известные верхние границы вероятности ошибки для линейных блоковых кодов. Эти оценки, полученные Полтыревым Г. Ш.
в 1994 году [97], вполне конкурируют по точности с оценками, получаемыми моделированием.
Для получения оценок вероятности ошибки помимо расстояния
кодов нужно знать весовой спектр линейного кода, т.е. набор чисел
𝑆0 , 𝑆1 , ..., 𝑆𝑛 , где 𝑆𝑤 обозначает число кодовых слов веса 𝑤.
Завершает параграф нижняя оценка вероятности ошибки декодирования блокового кода, полученная Шенноном в 1959 году
[102, 19].
3.6.1.

Граница вероятности ошибки через спектр кода
для ДСК

В силу линейности кода вероятность ошибки не зависит от передаваемого слова, и поэтому граница выводится для нулевого слова.
Граница для ДСК выводится очень просто, она основана на разделении векторов ошибок на «близкие» и «далекие». К вероятностям
ошибок, связанных с векторами из этих групп, применяются разные способы оценивания. Как далекие рассматриваются векторы

3.6. Спектр кода и оценки вероятности ошибки

81

веса больше порога 𝑊 . Конкретное значение порога мы выберем
позже.
Пусть 𝑃𝑒 обозначает вероятность ошибки, а 𝑃𝑒 (𝑊 ) — ее оценку,
вычисленную при фиксированном значении параметра 𝑊 . Применительно к ДСК с переходной вероятностью 𝑝 получаем неравенство
𝑛
∑︁
𝑃𝑒 ≤ 𝑃𝑒 (𝑊 ) =
𝑃 (ℰ, 𝑤, 𝜈 < 𝑊 ) + Pr(𝜈 ≥ 𝑊 ),
(3.14)
𝑤=𝑑

в котором 𝑃 (ℰ, 𝑤, 𝜈 < 𝑊 ) — совместная вероятность двух событий:

∙ одно из слов веса 𝑤 ближе к принятому вектору, чем нулевое
слово;
∙ число ошибок в канале 𝜈 меньше 𝑊 .
Для уточнения оценки (3.14) заметим, что близкие векторы приводят к ошибкам только в пользу слов веса

𝑤 ≤ 2(𝑊 − 1).
Среди 𝑙 ≤ 𝑊 − 1 ошибок 𝜂 ошибок приходится на 𝑤 ненулевых позиций, а остальные 𝑙 − 𝜂 расположены на 𝑛 − 𝑤 нулевых
позициях слова. Заметим, что 𝑙 ∈ {𝑡𝑤 , ..., 𝑊 − 1}, 𝑡𝑤 = ⌈(𝑤 + 1)/2⌉,
𝜂 ∈ {𝑡𝑤 , ..., min{𝑙, 𝑤}}, т.е. диапазон значений 𝜂 зависит от 𝑤. Напомним, что ⌈𝑎⌉ обозначает округление 𝑎 вверх до ближайшего целого.
Обозначим 𝜂𝑤 = min{𝜂, 𝑤}. Оценивая вероятность объединения
событий суммой вероятностей событий, получаем
)︂
𝑙 (︂
𝑊
−1 ∑︁
∑︁
𝑤 𝜂𝑤
𝑃 (ℰ, 𝑤, 𝜈 < 𝑊 ) ≤ 𝑆𝑤
𝑝 (1 − 𝑝)𝑤−𝜂𝑤 ×
𝜂
𝑤
𝜂=𝑡
𝑙=𝑡𝑤

𝑤

× Pr ((𝑙 − 𝜂𝑤 )
= 𝑆𝑤

= 𝑆𝑤

𝑊
−1
∑︁

ошибок на

(𝑛 − 𝑤)

нулевых позициях)

𝑙=𝑡𝑤

)︂
(︂
)︂
𝑙 (︂
∑︁
𝑤 𝜂𝑤
𝑤−𝜂𝑤 𝑛 − 𝑤
𝑝 (1 − 𝑝)
𝑝𝑙−𝜂𝑤 (1 − 𝑝)𝑛−𝑤−𝑙+𝜂𝑤
𝜂
𝑙

𝜂
𝑤
𝑤
𝜂=𝑡

𝑊
−1
∑︁

𝑙
∑︁

𝑤

𝑙=𝑡𝑤 𝜂=𝑡𝑤

(︂

𝑤
𝜂𝑤

)︂(︂

)︂
𝑛−𝑤 𝑙
𝑝 (1 − 𝑝)𝑛−𝑙 ,
𝑙 − 𝜂𝑤

(3.15)

82

3. Некоторые границы на характеристики кодов

где {𝑆𝑤 } — спектр весов кодовых слов кода.
Неравенство (3.14) принимает вид
2(𝑊 −1)

𝑃𝑒 ≤
+

∑︁

𝑆𝑤

𝑤=𝑑
𝑛
∑︁ (︂
𝑙=𝑊

𝑊
−1
∑︁
𝑙=𝑡𝑤

)︂(︂
)︂
𝑙 (︂
∑︁
𝑤
𝑛−𝑤 𝑙
𝑝 (1 − 𝑝)𝑛−𝑙 +
𝜂
𝑙

𝜂
𝑤
𝑤
𝜂=𝑡
𝑤

)︂

𝑛 𝑙
𝑝 (1 − 𝑝)𝑛−𝑙 ,
𝑙

(3.16)

аналогичный лемме 1 [97]. Отличия — в уточнении диапазонов индексов суммирования.
Поменяем порядок суммирования в (3.16)

𝑃𝑒 ≤
+

−1)
𝑊
−1 2(𝑊
∑︁
∑︁
𝑙=𝑡𝑑 𝑤=2𝑙−1
𝑛 (︂ )︂
∑︁
𝑛 𝑙
𝑙=𝑊

𝑙

)︂(︂
)︂
𝑙 (︂
∑︁
𝑤
𝑛−𝑤 𝑙
𝑆𝑤
𝑝 (1 − 𝑝)𝑛−𝑙 +
𝜂
𝑙

𝜂
𝑤
𝑤
𝜂=𝑡
𝑤

(3.17)

𝑝 (1 − 𝑝)𝑛−𝑙 .

Первое слагаемое, соответствующее близким векторам, принимает вид
𝑊
−1
∑︁
𝐵(𝑙, 𝑊 )𝑝𝑙 (1 − 𝑝)𝑛−𝑙 ,
𝑙=𝑡𝑑

где
2(𝑊 −1)

𝐵(𝑙, 𝑊 ) =

∑︁
𝑤=2𝑙−1

)︂(︂
)︂
𝑙 (︂
∑︁
𝑤
𝑛−𝑤
𝑆𝑤
.
𝜂𝑤
𝑙 − 𝜂𝑤
𝜂=𝑡
𝑤

Из (3.17) заключаем, что порог 𝑊 определяет
множитель перед
(︀𝑛)︀
𝑝𝑙 (1 − 𝑝)𝑛−𝑙 , равный либо (︀𝐵(𝑙,
𝑊
)
,
либо
.
Для
малых 𝑊 коэф𝑙
)︀
𝑛
фициент 𝐵(𝑙, 𝑊 ) меньше 𝑙 , но с ростом 𝑙 ситуация меняется на
противоположную. Оптимальным будет выбор 𝑊 , при котором
(︂ )︂
𝑛
𝐵(𝑙 = 𝑊 + 1, 𝑊 ) ≥
.
𝑊
Небольшое уточнение оценки Полтырева можно получить, если
учесть, что при 𝜂 = 𝑤/2 ошибка происходит с вероятностью 1/2.

3.6. Спектр кода и оценки вероятности ошибки
Обозначим

{︂
𝛼(𝑤, 𝜂) =

83

1/2, 𝑤 = 2𝜂
.
1
𝑤=
̸ 2𝜂

Окончательная форма оценки
2(𝑊 −1)

𝑃𝑒 ≤
+

∑︁

𝑆𝑤

𝑙
∑︁

𝑙=𝑡𝑤 𝜂=𝑡𝑤

𝑤=𝑑
𝑛 (︂
∑︁
𝑙=𝑊

𝑊
−1
∑︁

(︂ )︂(︂
)︂
𝑤
𝑛−𝑤 𝑙
𝛼(𝑤, 𝜂)
𝑝 (1 − 𝑝)𝑛−𝑙 +
𝜂𝑤
𝑙 − 𝜂𝑤

)︂
𝑛 𝑙
𝑝 (1 − 𝑝)𝑛−𝑙 ,
𝑙

(3.18)

где 𝑊 — наименьшее значение такое, что
2𝑊
∑︁

𝑆𝑤

𝑤=2𝑙−1

𝑊
∑︁
𝜂=𝑡𝑤

(︂ )︂(︂
)︂ (︂ )︂
𝑤
𝑛−𝑤
𝑛
𝛼(𝑤, 𝜂)

.
𝜂𝑤
𝑊 − 𝜂𝑤
𝑊

Заметим, что параметр 𝑊 не зависит от канала, он определяется
только свойствами кода: его длиной и спектром.
3.6.2.

Граница вероятности ошибки для гауссовского
канала

Перейдем к каналу с гауссовским шумом. Считаем, что двоичные
кодовые символы передаются противоположными сигналами, энергию сигналов принимаем равной единице. Дисперсия величин 𝑦 ,
вычисляемых демодулятором, равна 𝜎 2 = 𝑁0 /2.
Обозначим через
1 − 𝑥2
𝑒 2
(3.19)
𝑓 (𝑥) =
2𝜋
стандартную гауссовскую плотность распределения вероятностей.
Если математические ожидания 𝑦 при передаче нуля и единицы
равны соответственно −1 и +1, то распределения вероятностей на
выходе демодулятора имеют вид
(︂
)︂
(︂
)︂
𝑦+1
𝑦−1
𝑓 (𝑦|0) = 𝑓
; 𝑓 (𝑦|1) = 𝑓
.
𝜎
𝜎
Оценка Полтырева (сам автор назвал ее тангенциальносферической границей) выражается через некоторые специальные

84

3. Некоторые границы на характеристики кодов

функции. Это не создает проблем при выполнении вычислений, поскольку для этих функций имеются подпрограммы в среде МАТЛАБ.
Гамма-функция определяется как
∫︁ ∞
Γ(𝑧) =
𝑡𝑧−1 𝑒−𝑡 𝑑𝑡.
(3.20)
0

При целых значениях аргумента Γ(𝑛) = (𝑛 − 1)!. Полезны также
следующие свойства гамма-функции
(︂ )︂

1
Γ(𝑧 + 1) = 𝑧Γ(𝑧); Γ
= 𝜋.
2
Естественные обобщения гамма-функции — неполная гаммафункция
∫︁ ∞
𝑡𝑧−1 𝑒−𝑡 𝑑𝑡,
Γ(𝑧, 𝑥) =
𝑥

нижняя неполная гамма-функция
∫︁ 𝑥
𝛾(𝑧, 𝑥) =
𝑡𝑧−1 𝑒−𝑡 𝑑𝑡
0

и регуляризированная гамма-функция

𝑃 (𝑧, 𝑥) =

𝛾(𝑧, 𝑥)
.
Γ(𝑧)

Очевидно, Γ(𝑧, 𝑥) + 𝛾(𝑧, 𝑥) = Γ(𝑧).
Через гамма-функции выражается функция так называемого
𝜒2𝑛 -распределения, описывающая распределение вероятностей суммы квадратов 𝑛 независимых гауссовских случайных величин с нулевым математическим ожиданием и единичной дисперсией.
Плотность 𝜒2𝑛 -распределения для величины 𝑥 с 𝑛 степенями свободы имеет вид
𝑥𝑛/2−1 𝑒−𝑥/2
𝑓 (𝑥, 𝑛) = 𝑛/2
.
2 Γ(𝑛/2)
Для кумулятивной функции 𝜒2𝑛 -распределения имеем выражение
𝛾(𝑛/2, 𝑥/2)
𝜒2𝑛 (𝑥) =
= 𝑃 (𝑛/2, 𝑥/2).
Γ(𝑛/2)

3.6. Спектр кода и оценки вероятности ошибки

85

С учетом введенных обозначений оценка вероятности ошибки
имеет вид

)︂ }︃
(︂ 2
∫︁ √𝑛 (︁ )︁ ⎨ ∑︁ {︃ ∫︁ 𝑟𝑥
(︁ 𝑦 )︁
2
𝑥
𝑟

𝑦
𝑥
𝑓
𝑆𝑤
𝑑𝑦 +
𝑓
𝜒2𝑛−2
𝑃𝑒 ≤
𝜎 ⎩
𝜎
𝜎2
𝛽
(𝑥)
−∞
𝑤
𝑤≤𝑤0
(︂ 2 )︂}︂
(︂ √ )︂
𝑟𝑥
𝑛
2
+ 1 − 𝜒𝑛−1
𝑑𝑥 + 𝑄
.
(3.21)
2
𝜎
𝜎
В этой формуле 𝑓 (·) — гауссовская плотность (3.19), функция
𝑄(·) определена соотношением (1.8),
⌊︂ 2 ⌋︂
𝑟0 𝑛
𝑤0 =
;
2
𝑟0 + 𝑛
(︂
)︂
𝑥

𝑟𝑥 = 𝑟0 1 −
;
𝑛
√︂
1
𝑤
𝜇𝑤 (𝑟) =
;
𝑟 1 − 𝑤/𝑛
(︂
)︂ √︂
𝑥
𝑤
𝛽𝑤 (𝑥) =
1− √
.
1 − 𝑤/𝑛
𝑛
Параметр 𝑟0 представляет собой решение относительно 𝑟 уравнения
(︀
)︀
∫︁ arccos 𝜇𝑤 (𝑟)
∑︁
√ Γ 𝑛−2
𝑛−3
2
𝑆𝑤
sin
𝜑 𝑑𝜑 = 𝜋 (︀ 𝑛−1 )︀ .
(3.22)
Γ 2
0
𝑤:𝜇𝑤 (𝑟)=1 , break ; end ;
y = y + SP ( w +1) * quad ( sinf ,0 , acos ( mu ) );
end ;

3.6.3.

Нижняя граница Шеннона

Сравнение с шенноновским пределом отношения сигнал/шум, подсчитанным по формуле для пропускной способности, не всегда продуктивно. При ограниченной задержке декодирования пропускная
способность канала заведомо недостижима. Нижние границы на вероятность ошибки, подсчитанные с учетом длины кода, позволяют
гораздо более точно оценить, насколько близко построенный код к
наилучшему возможному результату при заданной длине.
Несмотря на большие усилия, предпринятые для получения хороших нижних границ, одной из наиболее точных до сих пор остается полученная в 1959 году граница Шенона [102]. Детальный обзор
работ по верхним и нижним оценкам вероятности ошибки приведен
в [81].
Границу Шеннона называют также границей плотной сферической упаковки. Ее идея состоит в том, что кодовые слова кода длины 𝑛 со скоростью 𝑅 представляются в виде точек на поверхности

88

3. Некоторые границы на характеристики кодов


евклидовой сферы радиуса 𝑛 𝐸𝑠 , где 𝐸𝑠 — энергия сигнала. Решающим областям соответствуют конусы с общей вершиной в начале
координат.
Рассмотрим сферу, вписанную в основание одного такого конуса, и обозначим через соответствующий 𝜃 телесный полуугол,
𝜃 ∈ [0, 𝜋]. Поскольку такие конусы, соответствующие разным кодовым словам, не пересекаются, максимальное число кодовых слов
можно оценить как отношение площади, вырезанной на поверхности сферы полууглом всего 𝑛-мерного пространства
Ω𝑛 (𝜋) =

2𝜋 𝑛/2
Γ(𝑛/2)

к площади, вырезанной одним конусом
𝑚−1

2𝜋 2
Ω𝑛 (𝜃) =
Γ( 𝑛−1
2 )

𝜃

∫︁

(sin 𝜑)𝑛−2 𝑑𝜑.

0

Здесь Γ(𝑥) — гамма-функция (3.20). Приравнивая отношение
площадей числу кодовых слов 𝑀 = 2𝑛𝑅 , находим минимальное
возможное значение параметра 𝜃 как решение уравнения

Ω𝑛 (𝜃)
= 2−𝑛𝑅 .
Ω𝑁 (𝜋)

(3.23)

При известном 𝜃 в качестве оценки снизу вероятности ошибки
декодирования кодового слова можно использовать аппроксимацию
[57] формулы Шеннона [102]:

𝑃sh (𝑛, 𝑅,

𝐸𝑏
1
1
) ≈ √ √
×
𝑁0
𝑛𝜋 1 + 𝐺2 sin 𝜃
√︁
(︁
(︁
)︁)︁𝑛
𝐸b
𝐸b
1
𝐺 sin 𝜃 exp − 2𝑁
+
𝐺
cos
𝜃
2
𝑁0
0
√︁
×
, (3.24)
𝐸b
2
𝐺
sin
𝜃

cos
𝜃
𝑁0

где

1
𝐺=
2

(︃√︂

𝐸𝑏
cos 𝜃 +
𝑁0

√︂

𝐸𝑏
cos2 𝜃 + 4
𝑁0

)︃

и 𝐸b /𝑁0 = 𝐸𝑠 /(𝑁0 𝑅) — отношение сигнал/шум на бит.

3.6. Спектр кода и оценки вероятности ошибки

89

Этими формулами можно смело пользоваться при длине кодов
меньше 1000 и при вероятности ошибки меньше 0.1. Листинг 3.2
МАТЛАБ-программы поможет в этом.
Точные формулы границы Шеннона и обсуждение вычислительных аспектов их применения для произвольных длин кодов можно
найти в работе [110].
Программа 3.2. Подсчет границы Шеннона вероятности ошибки декодирования по максимуму правдоподобия
function PE = boutros_Lbound (N ,r , sigma )
% Аппроксимация Boutros - Patel нижней границы
% Шеннона на вероятность ошибки
% n - длина кода
% r - скорость кода
% sigma = sqrt ( N0 /2) - средне - квадратическое
% отклонение шума
% PE - оценка вероятности ошибки
global n R ;
n=N;
R=r;
% find interval where function has a root
interval = fzero ( @sp_equation ,1.0) ;
% refine the root
theta = fzero ( @sp_equation , interval ) ;
sint = sin ( theta ) ;
cost = cos ( theta ) ;
ct = cost / sigma ;
st = sint / sigma ;
G =0.5*( ct + sqrt ( ct ^2+4) ) ;
EL = -1/2/ sigma ^2+ ct * G /2;
A = G * sint ;
numer_q =( A ^ n ) * exp ( EL * n ) ;
denom_q = sqrt (1+ G ^2) * sint *( G * st * sint - cost ) *...
sqrt ( pi * n ) ;
PE = numer_q / denom_q ;
end
% - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - -%
function y = cone_angle ( x )
global n R ;
y =R -((1+ log2 ( pi * n ) ) /2+ log2 ( cos ( x )) + ...
(1 - n ) * log2 ( sin ( x ) ) ) / n ;
end
% - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - - -%

90

3. Некоторые границы на характеристики кодов

function y = sp_equation ( x )
global n R ;
B = log (2) + log ( pi ) * n /2 - gammaln ( n /2) ;
y = n * R * log (2) -B + logomega ( x ) ;
end
% - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - -%
function x = logomega ( theta )
global n ;
x = log (2) + (n -1) /2* log ( pi ) - gammaln (( n -1) /2) +...
log ( quad ( @sinn ,0 , theta ) ) ;
end
% - - - - - - - - - - - - - - - - - - - - - -- - - - - - - - - - - - - -%
function y = sinn ( x )
global n ;
y = sin ( x ) .^( n -2) ;
end

Задачи
В задачах данного раздела понадобятся таблицы лучших известных
кодов. Постоянно обновляемые таблицы таких кодов и границ на их
параметры общедоступны на сайте [77]. Выдержка из этих таблиц
приведена на рис. 3.2, 3.3. Лучшие нелинейные коды представлены
на сайте [90].
1. Докажите, что коды Хэмминга и код Голея (23,12), 𝑑 = 7,
удовлетворяют границе Хэмминга с равенством.
2. Сопоставьте характеристики кодов, дуальных к кодам Хэмминга, с границами на минимальное расстояние.
3. Задайтесь параметрами 𝑛 и 𝑑. Примените границы этой главы
для того, чтобы определить диапазон возможных значений
размерности кода 𝑘 .
4. Задайтесь параметрами 𝑛 и 𝑘 . Примените границы этой главы
для того, чтобы определить диапазон возможных значений
минимального расстояния кода 𝑑.

Задачи
n/k 3 4 5 6 7 8 9
7

4 3 2 2 1

8

4 4 2 2 2 1

9

4 4 3 2 2 2 1

91
10

11

12

13

14

15

16

17

18

19

20

10 5 4 4 3 2 2 2

1

11 6 5 4 4 3 2 2

2

1

12 6 6 4 4 4 3 2

2

2

1

13 7 6 5 4 4 4 3

2

2

2

1

14 8 7 6 5 4 4 4

3

2

2

2

1

15 8 8 7 6 5 4 4

4

3

2

2

2

1

16 8 8 8 6 6 5 4

4

4

2

2

2

2

1

17 9 8 8 7 6 6 5

4

4

3

2

2

2

2

1

18 10 8 8 8 7 6 6

4

4

4

3

2

2

2

2

1

19 10 9 8 8 8 7 6

5

4

4

4

3

2

2

2

2

1

20 11 10 9 8 8 8 7

6

5

4

4

4

3

2

2

2

2

1

21 12 10 10 8 8 8 8

7

6

5

4

4

4

3

2

2

2

2

22 12 11 10 9 8 8 8

8

7

6

5

4

4

4

3

2

2

2

23 12 12 11 10 9 8 8

8

8

7

6

5

4

4

4

3

2

2

24 13 12 12 10 10 8 8

8

8

8

6

6

4

4

4

4

3

2

25 14 12 12 11 10 9 8

8

8

8

6

6

5

4

4

4

4

3

26 14 13 12 12 11 10 9

8

8

8

7

6

6

5

4

4

4

4

27 15 14 13 12 12 10 10

9

8

8

8

7

6

6

5

4

4

4

28 16 14 14 12 12 11 10

10

8

8

8

8

6

6

6

5

4

4

29 16 15 14 13 12 12 11

10

9

8

8

8

7

6

6

6

5

4

30 16 16 15 14 12 12 12

11

10

9

8

8

8

7

6

6

6

5

31 17 16 16 15 13 12 12

12

11

10

9

8

8

8

7

6

6

6

32 18 16 16 16 14 13 12

12

12

10

10

8-9

8

8

8

6-7

6

6

33 18 16 16 16 14 14 12

12

12

11

10

9-10

8-9

8

8

7-8

6-7

6

34 19 17 16 16 15 14 13

12

12

12

10

10

9-10

8-9

8

8

12

12

11

10

10

9-10

8

8

8

7-8

12

12

11

10

10

8-9

8

8

8

12

12

10-11

10

9-10

8-9

8

8

11-12 10-11

35 20 18 16 16 16 15 14 12-13

36 20 18 17 16 16 16 14 13-14 12-13
37 20 19 18 17 16 16 15

14

13-14 12-13

38 21 20 18 18 16 16 16

14

14

13-14

12

12

39 22 20 19 18 17 16 16

15

14

14

12-13

12

40 22 20 20 18 18 16 16

16

15

14

13-14 12-13

n/k 3 4 5 6 7 8 9

10

11

12

13

14

12

10

11-12 10-11

12

12

15

16

7-8 6-7

9-10 8-9
10

8

9-10 8-9

11-12 10-11 10 9-10
17

18

19

20

Рис. 3.2. Минимальные расстояния лучших известных линейных
кодов

92

3. Некоторые границы на характеристики кодов

n/k 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
21

1

22

2

1

23

2

2

1

24

2

2

2

1

25

2

2

2

2

1

26

3

2

2

2

2

1

27

4

3

2

2

2

2

1

28

4

4

3

2

2

2

2 1

29

4

4

4

3

2

2

2 2 1

30

4

4

4

4

3

2

2 2 2 1

31

5

4

4

4

4

3

2 2 2 2 1

32

6

5

4

4

4

4

2 2 2 2 2 1

33

6

6

5

4

4

4

3 2 2 2 2 2 1

34

6

6

6

4

4

4

4 3 2 2 2 2 2 1

35 6-7 6

6

5

4

4

4 4 3 2 2 2 2 2 1

36 7-8 6-7 6

6

5

4

4 4 4 3 2 2 2 2 2

37

8 7-8 6-7 6

6

5

4 4 4 4 3 2 2 2 2

38

8

8 6-8 6-7 6

6

5 4 4 4 4 3 2 2 2

39

8

8 7-8 6-8 6-7 6

6 5 4 4 4 4 3 2 2

40 8-9 8

8 7-8 6-8 6-7 6 6 5 4 4 4 4 3 2

n/k 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
Рис. 3.3. Минимальные расстояния лучших известных линейных
кодов (продолжение)

Приложение

93

5. Для лучших коротких кодов со скоростью 𝑅 = 1/2 сравните их характеристики с неасимптотическими формами границ
Варшамова–Гилберта и Хэмминга.
6. Постройте бесконечные последовательности хороших кодов с
числом информационных символов 𝑘 = 1, 2, 3, 4, . . .. Сравните
результаты с границей Грайсмера.
7. Используя границу Грайсмера, постройте последовательность
оценок длин оптимальных кодов с минимальным расстоянием 8. Сравните полученные параметры кодов с параметрами
наилучших известных кодов.
8. Напишите программу построения линейных кодов, гарантированно достигающих границу Варшамова–Гилберта. Оцените сложность алгоритма. До каких длин кодов и расстояний
ваша программа позволяет получать коды за разумное время
(несколько минут на один код)?
9. Проанализируйте поведение чисел вдоль диагоналей таблиц
на рис. 3.2, 3.3. Дайте формальное объяснение. Сколько оценок на параметры кодов и какие именно надо уточнить, чтобы
в вопросе о минимальном расстоянии кодов длины до 40 не
оставалось белых пятен?

Приложение. Тождество Мак-Вильямс
Приведем без доказательства важный и неожиданный результат,
называемый тождествами Мак-Вильямс. Эти тождества связывают линейными уравнениями спектр произвольного линейного кода
со спектром дуального к нему кода. Коэффициенты уравнений зависят только от длины кодов и не зависят от самих кодов.
Пусть 𝐴𝑤 обозначает число слов веса 𝑤 в линейном (𝑛, 𝑘)-коде.
Однородный многочлен двух формальных переменных 𝑥 и 𝑦

𝑊 (𝑥, 𝑦) =

𝑛
∑︁
𝑤=0

𝐴𝑤 𝑥𝑛−𝑤 𝑦 𝑤

94

3. Некоторые границы на характеристики кодов

называется весовой функцией кода. В теории кодирования и теории
связи чаще используется функция одного аргумента



𝑊 (𝑦) = 𝑊 (𝑥, 𝑦)⃒

𝑥=1

=

𝑛
∑︁

𝐴𝑤 𝑦 𝑤 ,

𝑤=0

называемая порождающей функцией спектра кода.
В дальнейшем знак ⊥ в верхнем индексе переменной указывает на то, что переменная относится к дуальному коду. Например,
𝑊 ⊥ (𝑥, 𝑦) — весовая функция дуального кода.
Теорема 3.11. Теорема Мак-Вильямс [10]. Весовые функции 𝑞 -

ичного (𝑛, 𝑘)-кода и дуального к нему (𝑛, 𝑛 − 𝑘)-кода связаны соотношениями
𝑊 ⊥ (𝑥, 𝑦) = 𝑞 −𝑘 𝑊 (𝑥 + 𝑦, 𝑥 − 𝑦).

(3.25)

Заметим, что обе части (3.25) — линейные функции спектров,
т.е. один спектр получается линейным преобразованием другого.
Запишем (3.25) в форме
−𝑘
𝐴⊥
ℎ =𝑞

𝑛
∑︁

𝐴𝑤 𝑃ℎ (𝑤; 𝑛).

(3.26)

𝑤=0

Коэффициенты 𝑃ℎ (𝑤; 𝑛) уравнений (3.26) являются многочленами степени ℎ переменной 𝑤 с коэффициентами, зависящими от
𝑛. Эти многочлены называют многочленами Кравчука. Для кодов
над алфавитом размера 𝑞 они определяются соотношениями

𝑃ℎ (𝑥; 𝑛) =


∑︁

𝑖

ℎ−𝑖

(−1) (𝑞 − 1)

𝑖=0

(︂ )︂(︂
)︂
𝑥 𝑛−𝑥
.
𝑖
ℎ−𝑖

(3.27)

В матричной форме (3.26) имеет вид

𝐴⊥ = 𝑞 −𝑘 𝑃 𝐴,

(3.28)

(︀
)︀T
(︀
)︀T
... 𝐴⊥
где 𝐴 = 𝐴0 ... 𝐴𝑛 , 𝐴⊥ = 𝐴⊥
— векторы-столбцы
𝑛
0
коэффициентов спектра, 𝑃 = {𝑝𝑖,𝑗 }, 𝑖, 𝑗 = 0, ..., 𝑛 — матрица из
значений многочленов Кравчука, 𝑝𝑖,𝑗 = 𝑃𝑖 (𝑗; 𝑛).

Приложение

[38]

95

Для практических вычислений удобны рекуррентные формулы

𝑝𝑖+1,𝑗+1 = 𝑝𝑖+1,𝑗 − 𝑝𝑖,𝑗+1 − (𝑞 − 1)𝑝𝑖,𝑗

(3.29)

с начальными значениями

𝑝0,𝑗
𝑝𝑖,0

= 1, 𝑗 = 0, , 1, ..., 𝑛
(︂ )︂
𝑛
=
(𝑞 − 1)𝑖 , 𝑖 = 0, , 1, ..., 𝑛.
𝑖

(3.30)
(3.31)

Пример 3.1. Для двоичных кодов длины 𝑛 = 7 формулы (3.28),
(3.29) дают следующую матрицу преобразования спектров







𝑃 =⎜






1
7
21
35
35
21
7
1

1
1
1
5
3
1
9
1 −3
5 −5 −3
−5 −5
3
−9
1
3
−5
3 −1
−1
1 −1

1
−1
−3
3
3
−3
−1
1

1
−3
1
5
−5
−1
3
−1


1
1
−5 −7 ⎟

9
21 ⎟

−5 −35 ⎟
⎟.
−5
35 ⎟

9
21 ⎟

−5
7 ⎠
1 −1

Например, дуальным по отношению к коду Хэмминга (7,4) со
(︀
)︀T
спектром 𝐴 = 1 0 0 7 7 0 0 1 , служит симплексный код
(7,3). По формуле (3.28) находим его спектр

(︀
)︀T
𝐴⊥ = 𝑃 𝐴 = 1 0 0 0 15 0 0 0
.

4.

Декодирование
коротких кодов по
максимуму
правдоподобия

В этой главе мы рассмотрим методы декодирования, которые могут
быть применены к коротким кодам. Эти методы имеют практическую значимость, поскольку короткие коды применяются как сами
по себе для передачи коротких сообщений, так и в качестве элементов каскадных конструкций.
Методы декодирования, обсуждаемые в данной главе, в последние годы обрели особую значимость в связи с развитием принципа «распространения доверия» («belief propagation») для декодирования любых кодов, построенных как комбинация других кодов.
Основой такого декодирования служат декодеры, обрабатывающие
мягкие решения на входе и формирующие мягкие решения на выходе. Метод Бала–Кука–Джелинека–Равива, применяемый к решетке
кода, — одно из лучших решений этой задачи.

4.1.

Декодирование по максимуму
правдоподобия

Предполагается, что канал связи без памяти задан переходными
вероятностями {𝑝(𝑦|𝑥), 𝑥 ∈ 𝑋, 𝑦 ∈ 𝑌 }. Такая запись подразумевает,

4.1.Декодирование по максимуму правдоподобия

97

что канал дискретный. Мы приняли эту модель только для простоты записи. Все рассматриваемые алгоритмы без изменений могут
быть применены к наиболее важной с точки зрения практики ситуации, канала с мягкими решениями, когда вход канала дискретный
(обычно двоичный), а выход — непрерывный.
Предположим, что для передачи сообщений по этому каналу используется код 𝐶 = {𝑐𝑚 , 𝑚 = 1, . . . , 𝑀 } ⊆ 𝑋 𝑛 длины 𝑛 объема 𝑀 .
Напомним, что декодирование последовательности 𝑦 = (𝑦1 , . . . , 𝑦𝑛 )
на выходе канала по максимуму правдоподобия (МП) состоит в выборе такого кодового слова 𝑐𝑚 , для которого максимальна функция
правдоподобия 𝑝(𝑦|𝑐𝑚 ).
В силу предположения об отсутствии памяти в канале для произвольной входной последовательности 𝑥 = (𝑥1 , . . . , 𝑥𝑛 ) имеем

𝑝(𝑦|𝑥) =

𝑛
∏︁

𝑝(𝑦𝑖 |𝑥𝑖 ).

𝑖=1

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

Λ𝑚 (𝑦) = ln 𝑝(𝑦|𝑐𝑚 ) =

𝑛
∑︁
𝑖=1

ln 𝑝(𝑦𝑖 |𝑐𝑚𝑖 ) =

𝑛
∑︁

𝜆𝑚 (𝑦𝑖 ).

𝑖=1

Оптимальное в смысле МП декодирование сводится к поиску
индекса 𝑚, для которого эта сумма максимальна.
В случае двоичных кодов кодовые символы принимают одно из
двух значений множества {0, 1}. Поэтому для каждого значения
𝑦 на выходе канала можно вычислить так называемое отношение
правдоподобия
𝑝(𝑦|1)
𝐿(𝑦) = ln
.
(4.1)
𝑝(𝑦|0)
При передаче 1 ожидаемое значение отношения правдоподобия
положительно, при передаче 0 — отрицательно. Таким образом, посимвольное принятие «жестких» решений по максимуму правдоподобия производится сравнением 𝐿(𝑦) с нулем. Чем сильнее отличается от нуля 𝐿(𝑦), т.е. чем больше величина 𝛼 = |𝐿(𝑦)|, тем большей

98

4. Декодирование коротких кодов

кажется надежность соответствующих жестких решений. Поэтому
вектор, составленный из значений 𝛼𝑖 = 𝐿(𝑦𝑖 ), называют вектором
надежностей.
Введем обозначения 𝐿(𝑦) = (𝐿(𝑦1 ), . . . , 𝐿(𝑦𝑛 )), 𝜉 𝑚 =
= (𝜉𝑚1 , . . . , 𝜉𝑚𝑛 ), где 𝜉𝑚𝑖 = 2𝑐𝑚𝑖 − 1, т.е. вектор 𝜉 получается из
вектора 𝑐 заменой нулей и единиц вещественными числами −1 и
+1 соответственно.
Упражнение 4.1. Докажите, что для канала с двоичным входом

декодирование по МП сводится к поиску кодового слова, для которого максимально скалярное произведение

𝐿𝑚 (𝑦) = (𝜉 𝑚 , 𝐿(𝑦)) .

(4.2)

Решение. Рассмотрим два кодовых слова 𝑐𝑚 и 𝑐𝑚′ , 𝑚′ ̸= 𝑚,

и убедимся в том, что из неравенства Λ𝑚 (𝑦) ≥ Λ𝑚′ (𝑦) следует
𝐿𝑚 (𝑦) ≥ 𝐿𝑚′ (𝑦). Обозначим через 𝐼𝑢𝑣 множество номеров позиций,
на которых в слове 𝑐𝑚 записан двоичный символ 𝑢, а в 𝑐𝑚′ — символ
𝑣 . Имеем
∑︁
∑︁
𝐿𝑚 (𝑦) − 𝐿𝑚′ (𝑦) =
(+1 − (−1))𝐿(𝑦𝑗 ) +
(−1 − (+1))𝐿(𝑦𝑗 ) =
𝑗∈𝐼10

= 2

𝑗∈𝐼01

∑︁

𝐿(𝑦𝑗 ) − 2

𝑗∈𝐼10

= 2

= 2

∑︁
𝑗∈𝐼10
𝑛
∑︁

𝐿(𝑦𝑗 ) =

𝑗∈𝐼01

ln

ln

𝑗=1

∑︁

∑︁
𝑝(𝑦|𝑐𝑚′ 𝑗 )
𝑝(𝑦|𝑐𝑚𝑗 )
−2
ln
=
𝑝(𝑦|𝑐𝑚′ 𝑗 )
𝑝(𝑦|𝑐𝑚𝑗 )
𝑗∈𝐼01

𝑝(𝑦|𝑐𝑚𝑗 )
= Λ𝑚 (𝑦) − Λ𝑚′ (𝑦).
𝑝(𝑦|𝑐𝑚′ 𝑗 )

Обратим внимание, что вектор 𝐿(𝑦) отношений правдоподобия
вычисляется один раз. Затем декодирование по МП сводится к выполнению 𝑛 − 1 сложений для каждого из 𝑀 кодовых слов кода и
последующему выбору наибольшего значения. С увеличением числа
кодовых слов сложность такого декодирования перебором по кодовым словам становится, конечно, неприемлемо высокой.
Ниже мы рассмотрим некоторые способы сокращения перебора
при сохранении экспоненциального характера роста сложности с

4.2. Поиск кратчайшего пути в решетке. Алгоритм Витерби

99

увеличением длины кода. Более изощренные методы декодирования
будут рассмотрены позже.
Приведем примеры метрик для декодирования по МП.
Пример 4.1. Декодирование по МП в ДСК. Рассмотрим ДСК с

переходной вероятностью 𝑝0 . Из (4.1) получаем, что
{︃
0
ln 1−𝑝
𝑝0 , 𝑦 = 1;
𝐿(𝑦) =
𝑝0
ln 1−𝑝
, 𝑦 = 0.
0

(4.3)

Обозначим 𝛿 = ln((1 − 𝑝0 )/𝑝0 ). Тогда слагаемые в скалярном
произведении (4.2) равны 𝛿 при 𝑦𝑖 = 𝑐𝑚𝑖 и −𝛿 в противном случае.
Следовательно,
𝐿𝑚 (𝑦) = 𝛿 (𝑛 − 2𝑑(𝑦, 𝑐𝑚 )) ,
где 𝑑(𝑦, 𝑐𝑚 ) — расстояние Хэмминга между 𝑦 и 𝑐𝑚 . Как и следовало ожидать, декодирование по МП при 𝛿 > 0 (т.е. при 𝑝0 < 1/2)
эквивалентно декодированию по минимуму расстояния Хэмминга.
Пример 4.2. Декодирование по МП в канале с аддитивным белым

гауссовским шумом (АБГШ) Предположим, что канал описывается
условными плотностями


2

(𝑦+ 𝐸 )
1

𝑁0
𝑓 (𝑦|0) = √
𝑒
;
𝜋𝑁0



2

(𝑦− 𝐸 )
1

𝑁0
𝑓 (𝑦|1) = √
𝑒
.
𝜋𝑁0

(4.4)

Тогда (4.1) принимает вид


4 𝐸
𝐿(𝑦) = 𝑦
.
𝑁0

Постоянный множитель при 𝑦 не играет роли при принятии решений, поэтому, в соответствии с (4.2), декодирование по МП сводится к максимизации скалярного произведения (𝜉 𝑚 , 𝑦).

4.2.

Поиск кратчайшего пути в решетке.
Алгоритм Витерби

Представление логарифма функции правдоподобия (либо логарифма отношения правдоподобия) кодового слова в виде суммы позволяет интерпретировать эти величины как аддитивную метрику

100

4. Декодирование коротких кодов

слова или как его «длину». Если мы найдем удобное представление
кода в виде графа, то задача сведется к поиску кратчайшего пути на графе. Такой подход, первоначально предложенный Витерби
для декодирования сверточных кодов, впоследствии оказался весьма продуктивным как для анализа, так и для декодирования блоковых кодов.
Пример графа, называемого в теории кодирования решетчатой
диаграммой или просто решеткой, приведен на рис. 4.1. Мы видим,
что решетка — это граф, обладающий следующими специальными
свойствами.

𝑎13
𝑎01

1

0
2

𝑎46
4

𝑎24
𝑎25

𝑎36
𝑎37

𝑎14
𝑎15

𝑎02

3

𝑎68
8

𝑎47
𝑎56

5

6

7

𝑎78

𝑎57

Рис. 4.1. Пример решетки
1. Вершины графа разбиты на непересекающиеся подмножества,
называемые уровнями или ярусами. Вершины каждого уровня связаны только с вершинами соседних уровней.
2. Нулевой ярус и последний ярус содержат по одному узлу.
3. Граф направленный, возможно движение только от уровня с
меньшим номером к уровню с большим номером.
4. Ребрам графа приписаны метрики, их называют также весами или длинами. Метрики могут быть как положительными,
так и отрицательными. Длина (метрика) пути измеряется как
сумма длин (метрик) ребер.

4.2. Поиск кратчайшего пути в решетке. Алгоритм Витерби

101

Задача состоит в отыскании кратчайшего пути от начального
узла решетки к конечному узлу. (Хотя требование наличия только
одного начального и одного конечного узла решетки при описании
блоковых кодов решетками не является обязательным, в рамках
данного раздела нас будут интересовать только такие решетки.)
Тривиальное решение задачи состоит в полном переборе по множеству всех путей. В решетке на рис. 4.1 таких путей 10 (проверьте
правильность подсчета). Для вычисления метрики каждого пути
нужно выполнить 3 сложения, т.е. всего 30 сложений. Чтобы принять решение о самом коротком пути, потребуется 9 операций сравнения и выбора.
Нетривиальное решение основано на принципе динамического
программирования. Проще говоря, оно основано на том, что в тех
узлах, где происходит слияние путей, можно без потери оптимальности принимать решения о лучшем пути и отбрасывать путь с
худшей метрикой. В нашем примере такими являются узлы с номерами 4, 5, 6, 7. Окончательное решение будет принято в узле 8 при
сравнении двух выживших кандидатов.
Например, в узле 5 мы сравниваем две суммы: 𝑎01 + 𝑎15 и
𝑎02 + 𝑎25 . На последующих ярусах решетки к этим суммам будут
прибавляться одни и те же слагаемые. Поэтому без потери оптимальности из этих двух сумм можно выбрать меньшую и закрепить ее за узлом. При использовании такого подхода для выбора
наилучшего пути достаточно 13 сложений и 7 операций сравнения
и выбора.
Сформулируем алгоритм поиска кратчайшего пути в решетке
в общем виде. Алгоритм 4.1, называемый в теории кодирования
алгоритмом Витерби, указывает оптимальное правило вычисления
кратчайшего пути на графе.
Для того чтобы воспользоваться этим алгоритмом, мы построим описание линейных блоковых кодов с помощью решеток, с ребрами которых ассоциированы кодовые символы кода. После получения последовательности 𝑦 на выходе канала декодер заменяет
кодовые символы на логарифмы их функций правдоподобия или
эквивалентные им величины (см. примеры 4.1, 4.2). Например, при
декодировании по минимуму расстояния Хэмминга решетка размечается расстояниями Хэмминга между кодовым символом и соот-

102

4. Декодирование коротких кодов

Алгоритм 4.1. Алгоритм Витерби поиска кратчайшего пути

на графе

Input: Решетка кода с заданными метриками ребер ;
Output: Кратчайший путь в решетке от яруса 0 до яруса на

глубине 𝑁 как последовательность номеров ребер,
исходящих из узлов решетки ;
Инициализация: Метрика единственного узла нулевого яруса
(начального узла) приравнивается нулю, за этим узлом
закрепляется «пустой» путь.;
Цикл по ярусам решетки;
for l=1 to N do
𝑉𝑙 –- множество узлов на ярусе 𝑙;
foreach node ∈ 𝑉𝑙 do
1. Находим метрику каждого из путей, ведущих в
данный узел, как сумму метрик предшествующих
узлов и метрик ребер, связывающих узлы-предшественники с данным узлом.
2. Среди кандидатов выбираем путь с минимальной
метрикой, эту метрику приписываем данному узлу.
3. Путь, ведущий в узел, вычисляется дописыванием
к пути, ведущему в выбранный предшествующий
узел, номера ребра, соответствующего переходу
из узла-предшественника в данный узел.
end
end
Вывод: Выбранный путь в конечный узел

ветствующим символом, полученным на выходе канала, а в гауссовском канале записываются просто значения на выходе канала со
знаком, который определяется кодовым символом.
В случае ДСК алгоритм Витерби используется для отыскания
пути с минимальной метрикой, а в случае гауссовского канала —
для отыскания пути с максимальной накопленной вдоль пути ре-

4.3. Минимальная решетка кода

103

шетки суммой, что соответствует максимуму скалярного произведения в (4.2) или максимуму функции правдоподобия.

4.3.

Минимальная решетка кода

Рассмотрим множество кодовых слов произвольного линейного кода. Попробуем построить для него решетку с наименьшим возможным числом узлов. В решетке кода ребрам приписываются значения
кодовых символов. Мы будем сначала рассматривать решетки, в которых каждому ребру приписывается ровно один кодовый символ,
хотя в общем случае можно приписывать блоки кодовых символов,
и тогда решетку называют секционированной. Несекционированная
(побитовая) решетка кода длины 𝑛 состоит из 𝑛 + 1 ярусов.
Начнем с простого примера. Код (3, 2) с проверкой на четность,
заданный порождающей матрицей
)︂
(︂
1 1 0
,
(4.5)
𝐺=
0 1 1
может быть описан решеткой, показанной на рис. 4.2. Мы не указываем на этом и следующих рисунках направления ребер, полагая
их по умолчанию направленными слева направо. Ребрам решетки
приписаны двоичные кодовые символы.
0

0
1

1

0
1

1

0
Рис. 4.2. Решетка кода (3, 2)
При известной последовательности на выходе канала 𝑦 =
= (𝑦1 , . . . , 𝑦𝑛 ) кодовые символы 𝑐𝑖 = 0 или 𝑐𝑖 = 1 можно заменить
функциями правдоподобия ln 𝑝(𝑦𝑖 |0) и ln 𝑝(𝑦𝑖 |1). Тем самым декодирование по максимуму правдоподобия может быть сведено к поиску
кратчайшего пути в решетке по алгоритму Витерби.

104

4. Декодирование коротких кодов

Упражнение 4.2. При передаче по каналу с гауссовским шумом

одного из кодовых слов кода, заданного матрицей (4.5), на выходе
канала получена последовательность 𝑦 = (−0.83, 0.68, −1.09). Выполните декодирование с помощью алгоритма Витерби.
Подсказка: решетка, размеченная с учетом правила, выведенного в примере 4.2, показана на рис. 4.3.
−0.68

0.83
0.68

1.09
0.68

−0.83

−1.09
−0.68

Рис. 4.3. Размеченная решетка кода (3, 2) при получении на выходе
канала последовательности 𝑦 = (−0.83, 0.68, −1.09)
Сложность декодирования, очевидно, определяется числом узлов решетки. Таким образом, задача построения эффективного декодера сводится к задаче построения решетки с наименьшим числом узлов.
В общем случае для одного и того же кода можно построить различные решетки, имеющие различную сложность. Последовательность, в которой 𝜉𝑖 представляет собой число узлов на 𝑖-м ярусе
решетки, называется профилем сложности решетчатого представления кода.
Решетка с профилем 𝜉 = (𝜉0 , 𝜉1 , ..., 𝜉𝑛 ) для данного кода называется минимальной, если профиль сложности любой другой решетки




этого кода 𝜉 ′ = (𝜉0 , 𝜉1 , . . . , 𝜉𝑛 ) удовлетворяет неравенствам 𝜉𝑖 ≥ 𝜉𝑖
при всех 𝑖 = 0, 1, . . . , 𝑛.
Из этого определенияследует, что мы требуем от минимальной
решетки, чтобы она была проще любой другой решетки на каждом
ярусе. Это требование кажется чрезмерно жестким, но, как мы увидим, минимальная решетка для каждого кода не только существует,
но и может быть довольно легко построена.
Для произвольного (не обязательно линейного) кода
𝐶 = {𝑐𝑚 , 𝑚 = 1, ..., 𝑀 } длины 𝑛 выпишем список его кодовых

4.3. Минимальная решетка кода

105

слов, 𝑐𝑚 = (𝑐𝑚1 , . . . , 𝑐𝑚𝑛 ), 𝑚 = 1, . . . , 𝑀 . Выберем некоторый
индекс 𝑖 ∈ {0, . . . , 𝑛} и разобьем каждое слово на две части, длины
𝑖 и 𝑛 − 𝑖, 𝑐𝑚 = (𝑐𝑝𝑚 , 𝑐𝑓𝑚 ). Верхние индексы «𝑝» и «𝑓 » указывают
на «прошлое» (past) и «будущее» (future). Заметим, что в любой
решетке кода пути, приходящие в некоторый узел, имеют «общее
будущее», и пути, исходящие из одного узла — «общее прошлое».
В последнем предложении было бы точнее говорить о кодовых
словах, соответствующих путям, но мы и дальше для краткости
будем пользоваться этим сленгом, подразумевая существование
взаимно-однозначного соответствия между множеством путей и
множеством кодовых слов кода.
Рассмотрим множество:

𝐹𝑖 = {𝑐𝑓 : (𝑐𝑝 , 𝑐𝑓 ) ∈ 𝐶 для некоторого 𝑐𝑝 }.
Заметим, что в 𝐹𝑖 каждому 𝑐𝑝 могут соответствовать одно или
несколько продолжений 𝑐𝑓 . Следовательно, 𝐹𝑖 можно разбить единственным образом на подмножества 𝐹𝑖 (𝑐𝑝 ) = {𝑐𝑓 : (𝑐𝑝 , 𝑐𝑓 ) ∈ 𝐶}.
Сопоставим различным таким подмножествам узлы яруса 𝑖. Узел 𝑣
яруса 𝑖 свяжем ребром с узлом 𝑣 ′ яруса 𝑖 + 1, если для некоторого
кодового слова прошлое, соответствующее 𝑣 ′ , является продолжением на один символ одной из последовательностей, ведущих в узел
𝑣 . Этот кодовый символ приписывается ребру, соединяющему 𝑣 с 𝑣 ′ .
Выполнив эту процедуру при 𝑖 = 0, ..., 𝑀 , получим некоторую решетку 𝑇 .
Пример 4.3. Рассмотрим линейный код с порождающей матрицей




1 0 1 1 0 1
𝐺 = ⎝1 0 1 0 1 0 ⎠ .
1 1 0 1 0 0
Код содержит 8 кодовых слов

𝑐0 = (000000),
𝑐4 = (101101),

𝑐1 = (110100),
𝑐5 = (011001),

𝑐2 = (101010),
𝑐6 = (000111),

𝑐3 = (011110)
𝑐7 = (110011)

В табл. 4.1 приведены множества 𝐹𝑖 (𝑐𝑝 ) для всех 𝑖 = 0, . . . , 6.
Каждому множеству сопоставлен узел решетки на ярусе 𝑖, узлы

106

4. Декодирование коротких кодов

пронумерованы буквами из множества {𝑎, ..., 𝑑}. В таблице приведены предшествующие состояния и кодовые символы, соответствующие переходам. С помощью данных, представленных в табл. 4.1,
легко построить решетку, показанную на рис. 4.4. Профиль сложности решетки определяется числом различных 𝐹𝑖 (𝑐𝑝 ) при 𝑖 = 0, . . . , 6.
В данном случае профиль имеет вид (1,2,4,4,4,2,1).
Таблица 4.1.
примера 4.3

Построение
𝑐𝑝


𝑖

0
1

3

4

5
6

𝑎

0
1

𝑎
𝑏

решетки

𝐹𝑖 (𝑐𝑝 )

0
1
00
01
10
11
000
011
101
110
0000,1101
0001,1100
0111,1010
0110,1011
00000,11010,10101,01111
10110,01100,00011,11001
{𝑐𝑚 , 𝑚 = 0, . . . , 7}

2

минимальной

0
1
0
1

𝑎
𝑏
𝑐
𝑑

{𝑐𝑚 , 𝑚 = 0, . . . , 7}
00000,11110,11001,00111
10100,01010,01101,10011
0000,0111
1110,1001
1010,1101
0100,0011
000,111
110,001
010,101
100,011
00
11
10
01
0
1


0
1
1
0

0

𝑎

𝑎
1

1

𝑏
𝑐
𝑑

𝑏

1

1

{𝑣𝑖−1 }


𝑣𝑖
𝑎
𝑎
𝑏
𝑎
𝑏
𝑐
𝑑
𝑎
𝑏
𝑐
𝑑
𝑎
𝑏
𝑐
𝑑
𝑎
𝑏
𝑎

𝑎
𝑎
𝑎
𝑎
𝑏
𝑏
𝑎
𝑏
𝑐
𝑑
𝑎, 𝑑
𝑎, 𝑑
𝑏, 𝑐
𝑏, 𝑐
𝑎, 𝑐
𝑏, 𝑑
𝑎, 𝑏

𝑎
𝑏

1

0
0

0

𝑐
1

0

0

для

𝑑

Рис. 4.4. Решетка, соответствующая табл. 4.1

0
1

кода
{𝑐𝑖 }

0
1
0
1
0
1
0
1
1
0
0,1
1,0
1,0
0,1
0,1
1,0
0,1

𝑎

4.4. Построение решетки кода по порождающей матрице

107

Можно убедиться в том, что полученная решетка минимальна.
Для этого рассмотрим произвольную решетку данного кода 𝑇 ′ . Как
и в любой другой решетке, в 𝑇 ′ два слова 𝑐1 = (𝑐𝑝1 , 𝑐𝑓1 ) и 𝑐2 = (𝑐𝑝2 , 𝑐𝑓2 )
могут иметь общую вершину на ярусе 𝑖 только в том случае, если
𝐹𝑖 (𝑐𝑝1 ) = 𝐹𝑖 (𝑐𝑝2 ) (два слова имеют общее множество возможных продолжений). Поэтому два пути, проходящие через общий узел в 𝑇 ′ ,
также проходят через общий узел и в 𝑇 , по построению множества
𝐹𝑖 . Обратное, вообще говоря, неверно. Поэтому число узлов на ярусе 𝑖 в 𝑇 ′ не может быть меньше числа узлов на этом же ярусе в 𝑇
при всех 𝑖; иными словами, решетка 𝑇 минимальна.
Подведем итоги построения в виде теоремы.
Теорема 4.1. Всякий код имеет минимальную решетку, все ми-

нимальные решетки совпадают с точностью до нумерации узлов
каждого яруса.
Более точное утверждение и детальное доказательство можно
найти, в частности, в работе [112].
Заметим, что при получении минимальной решетки мы объединяли пути, имеющие общее прошлое. В равной степени можно было
изменить направление построения и объединять пути, имеющие общее будущее. Подводя итоги, можем сформулировать следующее
утверждение.
Признак минимальности решетки: если на каждом ярусе
все пути, имеющие общее будущее (прошлое), проходят через один
узел решетки, то такая решетка для данного кода минимальна.

4.4.

Построение решетки кода
по порождающей матрице

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

108

4. Декодирование коротких кодов

Опишем одну из возможных конструкций решетки линейного
кода.
Для произвольной последовательности 𝑥 = (𝑥1 , . . . , 𝑥𝑛 ) ее началом 𝑏(𝑥) назовем номер позиции первого ненулевого элемента, концом 𝑒(𝑥) — номер позиции последнего ненулевого элемента. Элементы на позициях с номерами 𝑏(𝑥), . . . , 𝑒(𝑥) − 1 назовем активными,
число активных элементов называется спэном последовательности.
Например, для последовательности 𝑥 = (0, 0, 1, 0, 1, 1, 1, 0, 0, 0)
получаем 𝑏(𝑥) = 3, 𝑒(𝑥) = 7, спэн равен 4, позиции с третьей по
шестую активны.
Порождающая матрица называется приведенной к минимальной спэновой форме (МСФ), если все начала строк различны и все
концы строк различны. Для определенности потребуем также, чтобы строки матрицы были упорядочены по возрастанию начал строк.
Не составляет труда привести произвольную порождающую
матрицу к минимальной спэновой форме, заменяя ее строки их суммами с другими строками.
Узлы на ярусе 𝑖 решетки нумеруются значениями информационных символов, соответствующих строкам, активным в 𝑖-й позиции.
Пример 4.4. Приведем к МСФ порождающую матрицу



1 0 1 1 0 1
𝐺 = ⎝1 0 1 0 1 0⎠ .
1 1 0 1 0 0
Для этого прибавим первую строку ко второй и третьей и переставим вторую и третью строки. Получим


1 0 1 1 0 1
𝐺 = ⎝0 1 1 0 0 1⎠ .
0 0 0 1 1 1
Строки упорядочены по началам. Теперь прибавим вторую строку к первой и последнюю строку ко второй. Получаем матрицу в
МСФ


1 1 0 1 0 0
𝐺 = ⎝0 1 1 1 1 0⎠ .
0 0 0 1 1 1

4.4. Построение решетки кода по порождающей матрице

109

На нулевом ярусе имеем единственный начальный узел. На первом ярусе решетки номера узлов 0 и 1 определяются значениями
первого информационного символа, а переходы из узлов в узлы следующего яруса — совместно номером узла и возможными значениями второго информационного символа и т.д. Решетка кода показана
на рис. 4.5.
Рассмотрим, например, построение четвертого яруса решетки.
Узлы предыдущего яруса соответствуют значениям информационных символов 𝑚2 , 𝑚1 , поскольку в столбце с номером 3 активны
первая и вторая строки. Узлы следующего яруса соответствуют
значениям пар 𝑚3 , 𝑚2 , поскольку активны вторая и третья строки.
Если, например, 𝑚2 = 1, 𝑚1 = 0, т.е. предыдущее состояние (1,0), то
при 𝑚3 = 0 следующим состоянием станет (0,1), т.к. 𝑚3 = 0, 𝑚2 = 1.
При 𝑚3 = 1 произойдет переход в (1,1). На ребрах пишутся значения, соответствующие четвертой позиции кодового слова, т.е. четвертому столбцу порождающей матрицы. При переходе из (1,0) в
(0,1) значения информационных символов 𝑚1 = 0, 𝑚2 = 1, 𝑚3 = 0
после умножения на соответствующие элементы столбца (1 1 1)T и
суммирования порождают кодовый символ 1. Аналогично, при переходе в (1,1) информационные символы 𝑚1 = 0, 𝑚2 = 1, 𝑚3 = 1
порождают (0 1 1)(1 1 1)T = 0.
Профиль сложности решетки (1,2,4,4,4,2,1), т.е. совпадает с
оптимальным профилем, построенным в предыдущем параграфе.
Немного более простую решетку можно получить, объединив второй и третий ярусы в одну секцию. Секционированная решетка показана на рис. 4.6. Ее профиль сложности (1,2,4,4,2,1).
Отметим, что в некоторых случаях секционирование позволяет
не только улучшить профиль сложности, но и уменьшить (не больше чем в 2 раза) максимальное число узлов на ярусах решетки.
Этот пример легко обобщить на произвольную матрицу в МСФ.
Номера узлов решетки на ярусе 𝑖 определяются значениями информационных символов, соответствующих строкам, которые активны
в позиции с номером 𝑖. Кодовые символы, соответствующие переходам из узла в узел, вычисляются как линейная комбинация активных элементов соответствующего столбца порождающей матрицы.
Рассмотрим вопрос о минимальности.

110

4. Декодирование коротких кодов
𝑚1
0

0

𝑚2 𝑚1
0

0

00

𝑚2 𝑚1
0

0

00
1

1

1

1

𝑚3 𝑚2

01

1

0

10

1

0

1
1

10

10

0

0

11

1

0

1

01

0

11

0

1

01

1

0

00

0
1
0

𝑚3

1

11

Рис. 4.5. Побитовая решетка кода примера 4.4
𝑚1
0

0

𝑚2 𝑚1
0

0

00

00
01

1

1

1

𝑚3 𝑚2
00

1

0

0

1
1

10

10

10

11

0

1

01
00
11

0

0
1

01

01

𝑚3

0

10
11

11

Рис. 4.6. Секционированная решетка кода примера 4.4

𝑚𝑖 , 𝑖 = 1, 2, 3

Перестраиваемая схема из
сумматоров по модулю 2

𝑐𝑖 , 𝑖 = 1, ..., 6

Рис. 4.7. Кодер на основе конечного автомата 4.4

4.4. Построение решетки кода по порождающей матрице

111

Теорема 4.2. Решетка, получаемая из порождающей матрицы в

МСФ, минимальна.

Доказательство. Достаточно показать, что пути, определяющие кодовые слова с одинаковыми последовательностями 𝑐𝑓 некоторой длины 𝑛 − 𝑙, не проходят через различные узлы на ярусе с
номером 𝑙.
Заметим, что для данного слова узел, через который проходит
путь на ярусе 𝑙, определяется значениями информационных символов, соответствующих активным на этом ярусе строкам. Эти строки
линейно независимы и заканчиваются на ярусах с номерами больше
𝑙. Поэтому нетривиальные линейные комбинации этих строк отличны от нуля хотя бы на одной из позиций старше 𝑙.
Предположим теперь, что найдутся два слова с одинаковым будущим, проходящие через разные узлы на ярусе 𝑙. Их сумма образует слово, которое активно на ярусе 𝑙 и равно нулю на позициях
с номерами больше 𝑙. Поскольку таких слов быть не может, слова с одинаковым будущим проходят через одни и те же узлы, т.е.
решетка минимальна.
Решетки, показанные на рис. 4.5 и 4.6, допускают следующую
важную интерпретацию. Узлам решетки могут быть сопоставлены
состояния регистра сдвига, на который последовательно поступают информационные символы. Этот регистр может быть использован для формирования кодовых слов, поскольку кодовые символы
зависят только от символов, находящихся на данном такте в регистре сдвига. Кодер, построенный по такому принципу, показан
на рис. 4.7. До начала работы кодера в регистре записаны нули.
Затем, такт за тактом, на вход регистра поступают информационные символы, а перестраиваемая схема из сумматоров по модулю
2 вычисляет соответствующие кодовые символы. Очевидно, связи
в решетке кода в точности отображают переходы регистра из состояния в состояние, а разметка решетки полностью определяется
связями ячеек регистра с сумматорами. Такая интерпретация важна для понимания связи между блоковыми и сверточными кодами
и подсказывает возможность получения блоковых кодов с малой
сложностью решетки из сверточных кодов.

112

4.5.

4. Декодирование коротких кодов

Построение решетки кода
по проверочной матрице

Логика предшествующего рассмотрения подсказывает, что для высокоскоростных кодов (со скоростью больше 1/2) представление кодов проверочной матрицей компактнее, чем порождающей матрицей. Сложность декодирования должна определяться параметрами
проверочной матрицы, и решетка, построенная по проверочной матрице, должна быть проще.
С другой стороны, теорема 4.1 утверждает, что минимальная
решетка кода единственна с точностью до нумерации узлов ярусов
решетки. Интересно, что теория решетчатого описания блоковых
кодов началась именно с построения так называемых синдромных
решеток (см. работы [43] и [116]) для кодов со скоростью больше 1/2.
И только через несколько лет пришло понимание того, что решетчатое представление может быть эффективным для декодирования
любых линейных кодов, и что существует несколько одинаково эффективных способов построения минимальных решеток.
Хотя в нашем распоряжении уже есть хороший способ построения минимальных решеток, полезно рассмотреть еще один способ,
исторически предшествовавший предыдущему. Начнем с примера.
Пример 4.5. Проверочная матрица кода из примера 4.4 может

быть записана, в частности, в виде


1 1 0 0 1 1
𝐻 = ⎝0 0 1 0 1 1 ⎠ .
0 1 0 1 0 1

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

4.5. Построение решетки кода по проверочной матрице

113

больше, чем на предыдущем ярусе. Поскольку синдромов не может
быть больше чем 2𝑛−𝑘 = 2𝑟 = 8, понятно, что синдромы начнут
совпадать и общее число узлов на каждом ярусе ограничено сверху
величиной 2𝑟 = 8. Полученная синдромная решетка данного кода
показана на рис. 4.8.
Построение, описанное в примере, тривиально обобщается на
произвольный линейный код.
000

0

0

000

000

0

000

0

0

000

1 1

1

1

1

100

1

001

0

001

0

000

001

1

0

000

1

111

0

100

1

110

0

110

1 1

101

1

111

0

0

111

Рис. 4.8. Синдромная решетка кода примера 4.5
Теорема 4.3. Синдромная решетка минимальна.

Доказательство. Достаточно показать, что пути, определяющие кодовые слова с одинаковыми последовательностями 𝑐𝑓 , никогда не проходят через различные узлы. Рассмотрим кодовое слово
𝑐 = (𝑐𝑝 , 𝑐𝑓 ). Частичные синдромы, вычисленные по 𝑐𝑝 и 𝑐𝑓 , совпадают. Следовательно, все совпадающие 𝑐𝑓 исходят из одного и
того же узла, определяемого частичным синдромом, вычисленным
по 𝑐𝑝 .
Заканчивая обсуждение способов построения решеток, заметим,
что минимальная решетка каждого кода однозначно определена с
точностью до нумерации узлов уровней, но решетки эквивалентных
кодов, отличающихся порядком следования символов, могут иметь
различную и довольно сильно отличающуюся сложность. Тривиальной верхней границей на максимальную сложность (максимальное число узлов на ярусах решетки) для любого кода является граница

114

4. Декодирование коротких кодов

𝜉max = max 𝜉𝑖 ≤ min{2𝑘 , 2𝑛−𝑘 }.
𝑖

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

4.6.

Декодирование по максимуму
апостериорной вероятности с мягкими
решениями. Алгоритм БКДР

До сих пор, говоря о декодировании по максимуму апостериорной вероятности (МАВ), мы подразумевали декодирование в пользу сообщения или кодового слова, апостериорная вероятность которого при известной последовательности на выходе канала максимальна. При известных и неравных априорных вероятностях сообщений МАВ-декодирование, вообще говоря, эффективнее МПдекодирования. Можно рассматривать в качестве сообщений отдельные информационные или избыточные символы. Тогда декодирование по МАВ будет формировать побитово-оптимальное решение в отличие от МП-декодирования, при котором формируется
решение обо всем кодовом слове. Может оказаться, что посимвольное МАВ-декодирование обеспечивает меньшую вероятность ошибки на бит передаваемой информации, чем декодирование по МП,
даже при равных вероятностях входных символов.
Начиная с середины 90-х годов прошлого века, актуальность посимвольного МАВ-декодирования резко возросла, что привлекло значительное внимание к маленькой заметке Бала–Кука–
Джелинека–Равива (БКДР), опубликованной в 1974 году. Причина
в том, что появились на свет способы каскадирования кодов, для
которых оказалось эффективным итеративное декодирование. Поясним идею, лежащую в его основе.

4.6. Алгоритм БКДР

115

Одни и те же информационные символы кодируются двумя или
несколькими кодерами. После передачи данных по каналу мягкие
решения демодулятора поступают на вход одного из декодеров. Результаты декодирования поступают на другой декодер. Решения,
принятые первым декодером, рассматриваются этим вторым декодером как выход некоторого канала, и решения второго декодера снова поступят на вход первого декодера в надежде на то, что
часть ошибок уже исправлена, и во второй попытке первый декодер лучше сделает свою работу, чем в первой. Обычно выполняется
несколько десятков итераций. Такого роды методы получили общее название алгоритмов на основе распространения доверия (belief
propagation).
Мы уже знаем, что декодирование мягкого выхода канала много эффективнее, чем декодирование по жестким решениям. Следовательно, в такой итеративной схеме каждый декодер должен не
только принимать решения, но и выдавать информацию об их надежности.
Итак, в схемах итеративного декодирования востребованы побитовые МАВ-декодеры, обрабатывающие мягкие решения на входе и
формирующие мягкие решения на выходе. На английском языке такие декодеры получили аббревиатуру SISO (soft input, soft output).
Именно такую задачу решает декодер БКДР, рассматриваемый ниже в данном параграфе.
Рассмотрим двоичный блоковый код 𝐶 = {𝑐𝑚 , 𝑚 = 1, . . . , 𝑀 } ⊆
⊆ {0, 1}𝑛 , описываемый некоторой решеткой, и последовательность
𝑦 = (𝑦1 , . . . , 𝑦𝑛 ) ∈ 𝑌 𝑛 на выходе канала. Апостериорные вероятности символов 𝑐 ∈ {0, 1} на позиции с номером 𝑡 записываются как

𝑝(𝑐𝑡 = 𝑐|𝑦) =
где

𝑝(𝑐𝑡 = 𝑐, 𝑦) =

𝑝(𝑐𝑡 = 𝑐, 𝑦)
,
𝑝(𝑦)

(4.6)

∑︁

(4.7)

𝑝(𝑐, 𝑦),

𝑐∈𝐶𝑡 (𝑐)

и 𝐶𝑡 (𝑐) обозначает ту часть кодовых слов, в которых символ на
позиции с номером 𝑡 равен 𝑐. Сложность вычислений по этим формулам имеет тот же порядок, что и число кодовых слов в коде.

116

4. Декодирование коротких кодов

Наша задача — упростить вычисления, используя решетчатое представление кода. Идея, как и в алгоритме Витерби, состоит в том,
чтобы при вычислениях апостериорных вероятностей для яруса 𝑡
максимально использовать результаты вычислений, уже выполненных для других ярусов.
Суммирование по кодовым словам в (4.7) мы заменим суммированием по множеству состояний (узлов решетки). Для этого введем
обозначение 𝑠𝑡 для состояния (точнее, номера состояния) на ярусе
𝑡. Мы начнем с вычисления условных вероятностей

(︀
)︀ Pr (𝑠𝑡−1 = 𝑚′ , 𝑠𝑡 = 𝑚, 𝑦)
Pr 𝑠𝑡−1 = 𝑚′ , 𝑠𝑡 = 𝑚|𝑦 =
.
𝑝 (𝑦)

(4.8)

Числитель наиболее интересен, поскольку знаменатель не зависит от информационных и кодовых символов. Введем специальное
обозначение для числителя:

𝜎𝑡 (𝑚′ , 𝑚) = Pr(𝑠𝑡−1 = 𝑚′ , 𝑠𝑡 = 𝑚, 𝑦).

(4.9)

Как мы увидим позже, по этим вероятностям легко находятся искомые апостериорные вероятности (4.6). Далее будет использована сокращенная запись 𝑦 𝑗𝑖 = (𝑦𝑖 , 𝑦𝑖+1 , . . . , 𝑦𝑗 ) для подпоследовательностей последовательности 𝑦 . Из (4.9), разбивая событие
(𝑠𝑡−1 = 𝑚′ , 𝑠𝑡 = 𝑚, 𝑦) на прошлое, настоящее и будущее, получаем

(︀
)︀
𝑛
𝜎𝑡 (𝑚′ , 𝑚) = Pr (𝑠𝑡−1 = 𝑚′ , 𝑦 𝑡−1
1 ), (𝑠𝑡 = 𝑚, 𝑦𝑡 ), (𝑦 𝑡+1 ) .

(4.10)

Совместная вероятность трех событий раскладывается в произведение Pr(𝐴1 𝐴2 𝐴3 ) = Pr(𝐴1 ) Pr(𝐴2 |𝐴1 ) Pr(𝐴3 |𝐴1 𝐴2 ). В нашем
случае мы должны принять во внимание, что символы последова𝑛
тельности 𝑦 = 𝑦 𝑛1 = (𝑦 𝑡−1
1 , 𝑦𝑡 , 𝑦 𝑡+1 ) зависимы, поскольку получены
в результате передачи некоторого кодового слова. В то же время,
по предположению об отсутствии памяти в канале, символы последовательности 𝑦 𝑛1 условно независимы при известном переданном
кодовом слове. Поэтому при известном кодовом символе 𝑐𝑡 условное
распределение вероятностей для 𝑦𝑡 однозначно определено. В свою
очередь, кодовый символ 𝑐𝑡 при известном номере узла 𝑠𝑡−1 уже
не зависит от предыдущих кодовых символов, следовательно, 𝑦 𝑛𝑡+1

4.6. Алгоритм БКДР

117

не зависит от 𝑦 𝑡1 при известном 𝑠𝑡 . Поэтому вероятности событий,
входящих в (4.10), равны

Pr(𝐴1 ) = Pr(𝑠𝑡−1 = 𝑚′ , 𝑦 𝑡−1
1 );

Pr(𝐴2 |𝐴1 ) = Pr(𝑠𝑡 = 𝑚, 𝑦𝑡 |𝑠𝑡−1 = 𝑚′ , 𝑦 𝑡−1
1 ) = Pr(𝑠𝑡 = 𝑚, 𝑦𝑡 |𝑠𝑡−1 = 𝑚 );

Pr(𝐴3 |𝐴1 𝐴2 ) = Pr(𝑦 𝑛𝑡+1 |𝑠𝑡−1 = 𝑚′ , 𝑠𝑡 = 𝑚, 𝑦 𝑡1 ) = Pr(𝑦 𝑛𝑡+1 |𝑠𝑡 = 𝑚).
Введем вспомогательные обозначения

𝛼𝑡 (𝑚) = Pr(𝐴1 ) = Pr(𝑠𝑡 = 𝑚, 𝑦 𝑡1 );




(4.11)

𝛾𝑡 (𝑚 , 𝑚) = Pr(𝑠𝑡 = 𝑚, 𝑦𝑡 |𝑠𝑡−1 = 𝑚 );

(4.12)

Pr(𝑦 𝑛𝑡+1 |𝑠𝑡

(4.13)

𝛽𝑡 (𝑚) =

= 𝑚).

В этих обозначениях

𝜎𝑡 (𝑚′ , 𝑚) = 𝛼𝑡−1 (𝑚′ )𝛾𝑡 (𝑚′ , 𝑚)𝛽𝑡 (𝑚).

(4.14)

Следующий шаг — вывод рекуррентных соотношений для сомножителей 𝛼𝑡 , 𝛾𝑡 и 𝛽𝑡 . По формуле полной вероятности запишем
∑︁
𝑡−1

𝛼𝑡 (𝑚) =
Pr(𝑠𝑡−1 = 𝑚′ , 𝑦 𝑡−1
1 ) Pr(𝑠𝑡 = 𝑚, 𝑦𝑡 |𝑠𝑡−1 = 𝑚 , 𝑦 1 ).
𝑚′

Условие 𝑦 𝑡−1
при известном 𝑠𝑡−1 можно опустить, поэтому по1
лучаем рекуррентное соотношение
∑︁
𝛼𝑡 (𝑚) =
𝛼𝑡−1 (𝑚′ )𝛾𝑡 (𝑚′ , 𝑚).
(4.15)
𝑚′

с начальными условиями

{︂
𝛼0 (𝑚) =

1, 𝑚 = 0;
0, 𝑚 =
̸ 0.

(4.16)

118

4. Декодирование коротких кодов

Аналогично, но как бы двигаясь в обратном направлении, запишем
∑︁
𝛽𝑡 (𝑚) =
Pr(𝑠𝑡+1 = 𝑚′ , 𝑦 𝑛𝑡+1 |𝑠𝑡 = 𝑚) =
𝑚′

=

∑︁

=

∑︁

Pr(𝑠𝑡+1 = 𝑚′ , 𝑦𝑡+1 , 𝑦 𝑛𝑡+2 |𝑠𝑡 = 𝑚) =

𝑚′

Pr(𝑠𝑡+1 = 𝑚′ , 𝑦𝑡+1 |𝑠𝑡 = 𝑚, 𝑦 𝑛𝑡+2 ) ×

𝑚′

× Pr(𝑦 𝑛𝑡+2 |𝑠𝑡 = 𝑚, 𝑠𝑡+1 = 𝑚′ , 𝑦𝑡+1 ) =
∑︁
=
Pr(𝑠𝑡+1 = 𝑚′ , 𝑦𝑡+1 |𝑠𝑡 = 𝑚) Pr(𝑦 𝑛𝑡+2 |𝑠𝑡+1 = 𝑚′ ).
𝑚′

В результате приходим к рекурсии
∑︁
𝛽𝑡 (𝑚) =
𝛽𝑡+1 (𝑚′ )𝛾𝑡+1 (𝑚′ , 𝑚)

(4.17)

𝑚′

с граничными условиями

{︂
𝛽𝑛 (𝑚) =

1, 𝑚 = 0;
0, 𝑚 =
̸ 0.

(4.18)

Далее,

𝛾𝑡 (𝑚′ , 𝑚) = Pr(𝑠𝑡 = 𝑚, 𝑦𝑡 |𝑠𝑡−1 = 𝑚′ ) =
= 𝑝(𝑠𝑡 = 𝑚|𝑠𝑡−1 = 𝑚′ )𝑝(𝑦𝑡 |𝑠𝑡 = 𝑚, 𝑠𝑡−1 = 𝑚′ ) =
= 𝑝(𝑐𝑡 )𝑝(𝑦𝑡 |𝑐𝑡 ) =

(4.19)

= 𝑝(𝑢𝑡 )𝑝(𝑦𝑡 |𝑐𝑡 )

(4.20)

для тех пар (𝑚, 𝑚′ ), которые связаны ребрами решетки, и
𝛾𝑡 (𝑚′ , 𝑚) = 0 для остальных пар. В формулах (4.19) и (4.20) мы
приняли во внимание, что переходы из состояния в состояние определяются однозначно соответствующими кодовыми (информационными) символами. (Если в решетке есть параллельные ребра, формула изменится, появится суммирование по соответствующим кодовым или информационным символам.) Вероятность 𝑝(𝑦𝑡 |𝑐𝑡 ) определяется переходными вероятностями (или условными плотностями)
канала, а вероятность 𝑝(𝑐𝑡 ) (или 𝑝(𝑢𝑡 )) представляет собой априорную вероятность кодового символа 𝑐𝑡 (или информационного 𝑢𝑡 ).

4.6. Алгоритм БКДР

119

Мы пользуемся (4.19) или (4.20) в зависимости от того, какие априорные вероятности известны при декодировании.
Пусть теперь 𝑆𝑡 (𝑐) обозначает множество таких пар (𝑚, 𝑚′ ), которым соответствует значение 𝑐𝑡 = 𝑐. Тогда из (4.6—4.9) получаем
∑︀
𝜎𝑡 (𝑚′ , 𝑚)

𝑝(𝑐𝑡 = 𝑐|𝑦) =

(𝑚′ ,𝑚)∈𝑆𝑡 (𝑐)

𝑝(𝑦)

.

(4.21)

Если нас интересуют апостериорные вероятности не кодовых,
а информационных символов 𝑢𝑡 ∈ {0, 1}, управляющих переходами в решетке, то множество переходов на ярусе 𝑡 разбивается на
подмножества 𝑈𝑡 (𝑢) и вместо (4.21) используют
∑︀
𝜎𝑡 (𝑚′ , 𝑚)

𝑝(𝑢𝑡 = 𝑢|𝑦) =

(𝑚′ ,𝑚)∈𝑈𝑡 (𝑢)

𝑝(𝑦)

.

(4.22)

В обоих случаях неизвестную вероятность 𝑝(𝑦) можно определить, например, из условия нормировки 𝑝(𝑐𝑡 = 0|𝑦)+𝑝(𝑐𝑡 = 1|𝑦) = 1.
Кроме того,
𝑝(𝑦) = 𝛼𝑛 (0) = 𝛽0 (0).
В знании 𝑝(𝑦) нет необходимости, если нас интересуют мягкие
решения в форме логарифмов отношений апостериорных вероятностей
∑︀
𝜎𝑡 (𝑚′ , 𝑚)
𝑝(𝑐𝑡 = 1|𝑦)
(𝑚′ ,𝑚)∈𝑆𝑡 (1)
∑︀
𝜆𝑡 = ln
.
(4.23)
= ln
𝜎𝑡 (𝑚′ , 𝑚)
𝑝(𝑐𝑡 = 0|𝑦)
(𝑚′ ,𝑚)∈𝑆𝑡 (0)

Жесткое решение по МАВ принимается по правилу
{︂
1, 𝜆𝑡 > 0;
𝑐^𝑡 =
0, 𝜆𝑡 ≤ 0,

(4.24)

а величина |𝜆𝑡 | характеризует надежность решения.
Подведем итоги в форме алгоритма 4.2 декодирования по МАВ.
Для наглядности мы представили алгоритм в виде пяти циклов,
хотя при практической реализации достаточно двух проходов по
решетке, прямого и обратного. Величины 𝛾 и 𝛼 вычисляются при
прямом проходе, а 𝜎 и 𝜆 — при обратном.

120

4. Декодирование коротких кодов

Алгоритм 4.2. Алгоритм БКДР
Input: Последовательность 𝑦 на выходе канала, априорные

вероятности информационных символов 𝑢1 , . . . , 𝑢𝑘
либо кодовых символов 𝑐1 , . . . , 𝑐𝑛 ;
Output: Последовательность логарифмов отношений
правдоподобия 𝜆1 , . . . , 𝜆𝑛 ;
Инициализация;
for t=0 to n do
для всех пар (𝑚′ , 𝑚) вычисляются 𝛾𝑡 (𝑚′ , 𝑚) по формуле
(4.19) или (4.20);
end

Прямой проход;
for t=0 to n do
для всех 𝑚 вычисляются величины 𝛼𝑡 (𝑚) ;
end

Обратный проход;
for t=0 to n do
для всех 𝑚 вычисляются величины 𝛽𝑡 (𝑚) ;
end

Подсчет 𝜎 ;
for t=0 to n do
для всех пар (𝑚′ , 𝑚) вычисляются 𝜎𝑡 (𝑚′ , 𝑚) по формуле
(4.14)
end
for t=0 to n do

по формуле (4.23) находим 𝜆𝑡 ,

end
Вывод: Последовательность 𝜆𝑡 , 𝑡 = 1, 2, . . . , 𝑛

Пример 4.6. Рассмотрим код с порождающей матрицей

(︂
)︂
1 1 1 0 0
𝐺=
.
0 1 0 1 1
Предположим, что в результате передачи по ДСК с переходной вероятностью 𝑝0 = 0.1 принята последовательность 𝑦 =
= (0, 0, 1, 0, 1). Примем входные вероятности кодовых слов одина-

4.6. Алгоритм БКДР

121

ковыми и подсчитаем апостериорные вероятности кодовых слов,
информационных символов и отдельных кодовых символов. Секционированная решетка для этого кода показана на рис. 4.9,а. Над
решеткой выписана полученная из канала последовательность.
Вычисления, выполненные для «прямого» решения задачи (без
использования решетки), показаны в табл. 4.2. Эти вычисления
будут служить ориентиром для проверки правильности вычислений по решетке.
Таблица 4.2. Прямое вычисление результатов декодирования для
примера 4.6
Информационные
символы
𝑢1 , 𝑢2

00
01
10
11

Кодовое
Функция правдоподослово 𝑐 =
бия 𝑝(𝑦|𝑐)
= (𝑐1 , .., 𝑐5 )

𝑦 = (0, 0, 1, 0, 1)
𝑝20 (1 − 𝑝0 )3 = 0.00729
𝑝30 (1 − 𝑝0 )2 = 0.00081
𝑝30 (1 − 𝑝0 )2 = 0.00081
𝑝20 (1 − 𝑝0 )3 = 0.00729

00000
01011
11100
10111
3
∑︀
𝑝(𝑦) =
𝑝(𝑦|𝑐𝑚 )𝑝(𝑐𝑚 ) = 0.00405

Апостериорная вероятность
𝑝(𝑐|𝑦) =
= 𝑝(𝑦|𝑐)𝑝(𝑐)
𝑝(𝑦)

0.45
0.05
0.05
0.45

𝑚=0

Символы

Логарифмы отношений апостериорных вероятностей ln 𝑝(1|𝑦)
𝑝(0|𝑦)

𝑢1
𝑢2
𝑐1 , 𝑐3 , 𝑐4 , 𝑐5
𝑐2

0
0
0
−2.1972

На рис. 4.9 показаны все шаги декодирования по алгоритму
БКДР. Для формирования отношений правдоподобия в соответствии с (4.23), нужно сначала просуммировать значения 𝜎𝑡 , соот-

122

4. Декодирование коротких кодов

ветствующие значениям информационных символов 1. Затем эту
сумму нужно поделить на сумму 𝜎𝑡 , соответствующих значениям
0. Для наглядности, переходы по 1 показаны жирными линиями.
Выполняя подсчеты, убеждаемся в совпадении результатов декодирования по МАП с результатами, представленными в табл. 4.2.
По данной решетке мы можем оценить логарифмы отношений апостериорных вероятностей для информационных символов. Чтобы
получить оценки для кодовых символов, нужно суммировать 𝜎𝑡 с
учетом значений соответствующих кодовых символов. Например, в
данном примере значению 𝑐2 = 0 соответствуют переходы 0 → 0 и
1 → 1. Другие два перехода соответствуют 𝑐2 = 1.
Имеем
0.0002025 + 0.0002025
ln
= −2.1972,
0.0018225 + 0.0018225
что в точности совпадает с величиной в табл. 4.2.
В заключение отметим важный аспект практического применения алгоритма БКДР — высокие требования к точности вычислений. В формулах фигурируют значения вероятностей последовательностей. При большой длине последовательностей эти вероятности становятся маленькими вещественными числами, и для их записи потребуется представление в формате плавающей запятой. При
реализации декодирования в виде микросхем или с помощью специализированных вычислителей использование вычислений с плавающей запятой снижает быстродействие и в разы увеличивает сложность и, в конечном итоге, стоимость устройств. Поэтому на практике вместо формул (4.14)–(4.23) используются их аппроксимации,
основанные на выполнении действий только над логарифмами вероятностей. Мы вернемся к этому вопросу позже при изучении итеративных алгоритмов декодирования (см. параграф 10.3.3).

4.6. Алгоритм БКДР
𝑦=
0

123

0

01

0

00

0

01

10
1

00

0

0

11

1

11

1

01

а) Решетка кода и принятая последовательность 𝑦
1
2 (1

0

− 𝑝0 )

1
2 𝑝0

1
2 (1

0

− 𝑝0 )𝑝0

1 2
2 𝑝0

1
2 (1

0
− 𝑝0 )𝑝0

(1 − 𝑝0 )𝑝0

0

(1 − 𝑝0 )𝑝0
1

1
2 (1

− 𝑝0

1

)2

б) Формулы для подсчета 𝛾
0.45

0

0.05

0.045

0
0.005
1

0.09

0
0.045

0.09

1

0.405

0

в) Подсчет 𝛾
0.45

1

0.045

0.45
0.005

0.05

0.05

0.09

0.0225
0.045

0.405

0.00405

0.09

0.0225

г) Подсчет 𝛼
0.00405

0.45

0.05

0.0045
0.005
0.0405

0.045

0.09
0.045

0.405

0.09

0.09

1

0.09

д) Подсчет 𝛽

0

1 × 0.45 × 0.0045
=0.002025

1 × 0.05 × 0.0405
=0.002025

0.0018225
0
0
0.0002025
0.0002025
1

0.0018225

1

0.002025

0

0.002025

е) Подсчет 𝜎

Рис. 4.9. МАП-декодирование по алгоритму БКДР для кода примера 4.6

124

4.7.

4. Декодирование коротких кодов

Сложность решеток линейных кодов и
сложность декодирования по максимуму
правдоподобия

Каково место рассмотренных выше решетчатых представлений кодов в теории и практике кодирования? Представление кодов решетками, к сожалению, не позволяет уйти от экспоненциальной сложности декодирования. Несмотря на очень быстрый прогресс в области микроэлектроники, вычислительная и аппаратная сложность
более 28 –212 арифметических операций или элементов памяти на
один символ кодового слова остается предельно допустимой величиной. Исходя из этой очень грубой оценки, можно сразу сказать,
что при скорости кодов около 𝑘/𝑛 = 1/2 коды длин порядка 50–100
могут быть декодированы с помощью решеток, только если для
них существуют эффективные представления с малой сложностью.
Приведенные в этом параграфе оценки сложности решеток оказываются довольно точными как в асимптотике, так и для кодов конечной длины.
4.7.1.

Свойства

минимальных

решеток

линейных

кодов

Вернемся к обозначениям параграфа 4.3, в частности, для последовательности 𝑎 длины 𝑖 через 𝐹𝑖 (𝑎) будем обозначать множество
всех 𝑐𝑓 таких, что 𝑐 = (𝑎, 𝑐𝑓 ) — кодовое слово кода 𝐶 .
Свойство 4.1. Для линейного кода множество 𝐹𝑖 (0) — линейный

код длины 𝑛 − 𝑖.

Это свойство непосредственно вытекает из линейности исходного кода длины 𝑛.
Свойство 4.2. Для линейного кода любое непустое множество

𝐹𝑖 (𝑎) при 𝑎 ̸= 0 либо совпадает с 𝐹𝑖 (0), либо не пересекается с
ним.

Доказательство Предположим сначала, что (𝑎, 0) принадлежит коду. Тогда из 𝑏 ∈ 𝐹𝑖 (𝑎) следует (𝑎, 𝑏) ∈ 𝐶 и, в силу линейности, (0, 𝑏) ∈ 𝐶 , т.е. 𝑏 ∈ 𝐹𝑖 (0). Следовательно, 𝐹𝑖 (𝑎) = 𝐹𝑖 (0).

4.7. Сложность решеток

125

В противном случае, когда (𝑎, 0) — не кодовое слово, а (𝑎, 𝑏) —
кодовое слово, их сумма (0, 𝑏) не может принадлежать коду, а значит, множества 𝐹𝑖 (𝑎) и 𝐹𝑖 (0) не пересекаются.
Из этого свойства следует еще одно свойство.
Свойство 4.3. Для линейного кода, если множество 𝐹𝑖 (𝑎) не пу-

сто и не совпадает с 𝐹𝑖 (0), то оно может быть получено из 𝐹𝑖 (0)
«сдвигом», т.е. прибавлением ко всем его элементам одного и того
же вектора 𝑏 такого, что (𝑎, 𝑏) — кодовое слово.
В терминах алгебры множеств 𝐹𝑖 (0) образует линейное подпространство линейного пространства всех таких последовательностей
𝑏, что (𝑎, 𝑏) — кодовое слово при некотором 𝑎. При этом 𝐹𝑖 (𝑎)
либо совпадает с 𝐹𝑖 (0), либо является смежным классом в этом
пространстве, рассматриваемом как группа относительно операции
покомпонентного сложения векторов. Из свойств смежных классов
заключаем:
Свойство 4.4. Для линейного кода множества 𝐹𝑖 (𝑎) при различных 𝑎 либо совпадают, либо не пересекаются.

Еще одно очевидное следствие из сформулированных выше
свойств:
Свойство 4.5. Для исходного линейного кода с минимальным рас-

стоянием 𝑑 множество 𝐹𝑖 (0) — линейный код длины 𝑛 − 𝑖 с минимальным расстоянием не меньше 𝑑.

Аналогично множеству продолжений кодовых слов 𝐹𝑖 (𝑎) можно
рассматривать множества начал кодовых слов, которые мы обозначаем как 𝑃𝑖 (𝑎) («𝑃 » — аббревиатура от «past»). Все свойства множества продолжений справедливы для множества начал, в частности, 𝑃𝑖 (0) — линейный код длины 𝑖 с минимальным расстоянием не
меньше минимального расстояния 𝑑 исходного кода.
Мы установили, что для любого линейного кода для любой фиксированной точки 𝑖 можно вычислить размерность 𝑘𝑖𝑝 подкода 𝑃𝑖 (0)
пространства начал и подкода 𝐹𝑖 (0) пространства продолжений
𝑓
𝑘𝑛−𝑖
. Индекс 𝑛 − 𝑖 указывает длину последовательностей, образующих подкод 𝐹𝑖 (0).

126

4. Декодирование коротких кодов

Следующая теорема была практически одновременно установлена в работах Мудера [94] и Форни [74].
Теорема 4.4. Для линейного (𝑛, 𝑘)-кода 𝐶 с профилем сложности
его минимальной решетки 𝜉 = (𝜉0 , 𝜉1 , ..., 𝜉𝑛 ) при всех 𝑖 = 1, ..., 𝑛−1
имеет место тождество
𝑓
𝑘 = 𝑘𝑖𝑝 + log2 𝜉𝑖 + 𝑘𝑛−𝑖
.

(4.25)

Доказательство. Множество путей, приходящих в один узел
яруса 𝑖 решетки, соответствует одному из множеств 𝑃𝑖 (𝑎). Множество путей, исходящих из этого узла, соответствует одному из
множеств 𝐹𝑖 (𝑏). Поскольку мощности этих множеств не зависят от
конкретных 𝑎 и 𝑏, заключаем, что через каждый узел проходит
𝑝
𝑓
одинаковое число путей 2𝑘𝑖 +𝑘𝑛−𝑖 . Множества 𝑃𝑖 (𝑎) и 𝐹𝑖 (𝑏), соответствующие разным узлам решетки, не пересекаются, а общее число
путей равно числу кодовых слов. Поэтому, умножив число путей
через узел на число узлов, получаем
𝑝

𝑓

2𝑘 = 𝜉 × 2𝑘𝑖 +𝑘𝑛−𝑖 .
После логарифмирования получим утверждение теоремы.
4.7.2.

Границы сложности решеток

Теорема 4.4 связывает параметры кода (длину и размерность) с
профилем сложности решетки через параметры некоторых подкодов кода. Манипулируя границами на характеристики кодов, мы
попытаемся установить границы на сложность решеток. Этот подход к анализу асимптотической сложности решеток был впервые
использован Зябловым и Сидоренко в [37]. Более детальный анализ как асимптотики сложности, так границ сложности для кодов
конечной длины, представлен в [86].
В случае линейного кода число узлов на каждом ярусе является
степенью двойки. Нам будет удобно измерять сложность логарифмом числа узлов, т.е. мы используем логарифмический профиль
сложности: 𝜁𝑖 = log2 𝜉𝑖 , 𝑖 = 0, ..., 𝑛. Логарифмической сложностью
решетки называется максимальная величина

𝜁 = max 𝜁𝑖 .
𝑖

4.7. Сложность решеток

127

Начнем с кодов конечной длины. Обозначим через 𝐾(𝑛, 𝑑) максимальную возможную размерность кода длины 𝑛 с минимальным
расстоянием 𝑑. Непосредственно из (4.25) для любого (𝑛, 𝑘)-кода
получаем
𝜁 ≥ max 𝑘 − 𝐾(𝑖, 𝑑) − 𝐾(𝑛 − 𝑖, 𝑑).
(4.26)
𝑖

Пример 4.7. Рассмотрим код Голея (23,12) с расстоянием 𝑑 = 7.

Параметр разбиения 𝑖 можно выбрать из множества {7,...,12}. Например, при 𝑖 = 7...12 с помощью таблицы лучших линейных кодов
находим оценки

𝜁 ≥ 12 − 𝐾(7, 7) − 𝐾(16, 7) = 12 − 1 − 5 = 6
𝜁 ≥ 12 − 𝐾(8, 7) − 𝐾(15, 7) = 12 − 1 − 5 = 6
𝜁 ≥ 12 − 𝐾(9, 7) − 𝐾(14, 7) = 12 − 1 − 4 = 7
𝜁 ≥ 12 − 𝐾(10, 7) − 𝐾(13, 7) = 12 − 1 − 3 = 8
𝜁 ≥ 12 − 𝐾(11, 7) − 𝐾(12, 7) = 12 − 2 − 2 = 8
Отсюда заключаем, что для любой решетки этого кода 𝜁 ≥ 8.
В данном случае эта оценка сложности точна, решетка с такой
сложностью для кода Голея существует (см. [52]).
Из (4.26) можно вывести асимптотическую версию нижней границы сложности. Скорость и относительное расстояние (𝑛, 𝑘)-кода с
минимальным расстоянием 𝑑 обозначим через 𝑅(𝛿) = 𝑘/𝑛 и 𝛿 = 𝑑/𝑛.
Относительная сложность решетки 𝜅 = 𝜁/𝑛 может быть интерпретирована как показатель экспоненты сложности решетки или, что
то же самое, показатель экспоненты сложности декодирования по
МП с мягкими решениями.
Поделив обе части (4.26) и выбрав длину кода 𝑛 достаточно
большой, получим
(︂ )︂
(︂
)︂
𝛿
𝛿
𝜅 ≥ max 𝑅(𝛿) − 𝛾𝑅max
− (1 − 𝛾)𝑅max
,
(4.27)
𝛾
1−𝛾
𝛾∈[0,1/2]
где 𝑅max (𝛿) обозначает максимально достижимую скорость кода с
заданным относительным расстоянием. В качестве 𝑅(𝛿) можно выбрать границу Варшамова–Гилберта, 𝑅(𝛿) = 1 − ℎ(𝛿). Подставив в
неравенство (4.26) известные верхние границы на функцию 𝑅max (𝛿),

128

4. Декодирование коротких кодов

получим асимптотические нижние оценки показателя экспоненты
сложности решетки для кодов, удовлетворяющих границе ВГ.
Если мы примем верной гипотезу о том, что граница ВГ асимптотически точна для двоичных кодов, то можно в качестве 𝑅max (𝛿)
тоже использовать границу ВГ. Используя свойства выпуклых
функций, или приравняв производную по 𝛾 нулю, нетрудно убедиться в том, что максимум по 𝛾 в правой части достигается при
𝛾 = 1/2. Приходим к оценке для экспоненты сложности
{︂
ℎ(2𝛿) − ℎ(𝛿), 𝑅 > 1 − ℎ(0.25),
𝜅(𝑅) ≥
(4.28)
1 − ℎ(𝛿),
𝑅 ≤ 1 − ℎ(0.25)
при 𝑅 = 1 − ℎ(𝛿).
Для того чтобы утверждать, что эта граница достижима, нужно
убедиться в существовании таких кодов, параметры которых достигают границу ВГ, и при этом выполняются дополнительные условия: для любого 𝑖 два кода, один из которых задан проверочной
матрицей, составленной из первых 𝑖 столбцов исходной проверочной матрицы, а другой задан последними 𝑛 − 𝑖 ее столбцами, достигали границу ВГ. Хотя параметры случайно выбранного кода
удовлетворяют границе ВГ с вероятностью близкой к единице, далеко не очевидно, что существуют хорошие коды, для которых все
разбиения на две части порождают два хороших кода. Тем не менее,
коды, достигающие (4.28), существуют (это вытекает, в частности,
из результатов работы [41]).
Тем самым (4.28) можно рассматривать как точный ответ на
вопрос о сложности решеток линейных кодов в той степени, в которой точна граница ВГ как граница на минимальное расстояние
двоичных линейных кодов.
Удивительным представляется тот факт, что граница сложности
решеток в точности совпала с границей сложности декодирования
по методу соседей нулевого слова (2.19). Это косвенно свидетельствует о том, что почти для каждого узла минимальной решетки
найдется сосед нулевого слова, соответствующий некоторому пути
в решетке, проходящему через этот узел. Если эта интерпретация
верна, то декодирование по решетке можно рассматривать как эффективную реализацию декодирования по соседям нуля для канала
с мягкими решениями.

4.8. Практические алгоритмы декодирования

129

Более точные формулировки и анализ сложности решеток линейных кодов можно найти в [86, 112]. Нижние границы сложности
для коротких кодов приведены в [52].

4.8.

Практические алгоритмы
субоптимального декодирования

Все рассмотренные выше методы декодирования имеют экспоненциальную по длине кода сложность. Для декодирования с мягкими
решениями мы предложили пока только декодирование по решетке
кода. Дополнительную информацию об асимптотической сложности оптимального или близкого к оптимальному декодирования кодов, параметры которых удовлетворяют границе ВГ, можно найти
в [69].
Общий вывод состоит в том, что показатель экспоненты сложности оптимального декодирования может быть существенно меньше,
чем для полного перебора по множеству кодовых слов, но все же
накладывает очень жесткие ограничения на параметры кодов, для
которых такое декодирование может быть реализовано на практике.
Задача состоит в том, чтобы существенно упростить декодирование
за счет некоторого (предполагается, что незначительного) проигрыша по вероятности ошибки.
В таком виде задача кажется плохо сформулированной: неясно, какой именно проигрыш по вероятности ошибки считать допустимым, и какое упрощение считать значительным. Более того,
критерии сложности реализации для конечных длин кодов формализовать довольно сложно.
Неточность формулировки компенсируется актуальностью проблемы. Если вновь предлагаемый метод проигрывает оптимальному декодированию порядка 0.1–0.2 дБ, результаты считаются приемлемыми. Что касается сложности, если с использованием нового
метода удается оценить характеристики кодов длины 100–200 при
вероятности ошибки на блок порядка 10−6 , то алгоритм рассматривается как перспективный для практических целей.
Важная особенность рассматриваемых в этом параграфе алгоритмов — случайное число операций, зависящее от конкретной реа-

130

4. Декодирование коротких кодов

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

BEAST

Название алгоритма BEAST является аббревиатурой полного англоязычного названия Bidirectional Efficient Algorithm for Searching
Trees, т.е. двусторонний эффективный алгоритм для анализа деревьев. Идея,как видно из названия, состоит в замене поиска по решетке двусторонним встречным поиском по дереву, причем при поиске игнорируются возможные слияния путей-кандидатов. Первоначально алгоритм рассматривался как способ вычисления характеристик сверточных кодов [49] (см. главу 8). Сложность BEAST
применительно к декодированию в канале с мягкими решениями
обсуждалась в [53], асимптотическая сложность — в [50].
Рассмотрим линейный (𝑛, 𝑘)-код, обозначим через 𝑦 = (𝑦1 , ..., 𝑦𝑛 )
последовательность длины 𝑛 на выходе канала при передаче одного из кодовых слов. Требуется найти то из кодовых слов, которое
минимизирует расстояние 𝜇(𝑣, 𝑦) по всему множеству кодовых слов
𝑣 = (𝑣1 , ..., 𝑣𝑛 ). Для описания алгоритма конкретный вид декодирующей функции 𝜇(𝑣, 𝑦) не имеет значения, для нас важны только
следующие свойства:
∑︀
∙ Аддитивность: 𝜇(𝑣, 𝑦) = 𝑛𝑖=1 𝜇(𝑣𝑖 , 𝑦𝑖 ).

∙ Неотрицательность: 𝜇(𝑣, 𝑦) ≥ 0 для любых пар (𝑣, 𝑦).
∙ Ограниченность: 𝜇(𝑣, 𝑦) ≤ 𝜇0 для любых пар (𝑣, 𝑦), где неотрицательная константа 𝜇0 зависит от параметров канала и не
зависит от кода.
Заметим, что в случае ДСК и канала с АБГШ декодирование
по МП может быть сведено к декодированию по минимуму метрики
𝜇, удовлетворяющей этим требованиям. (Мы по привычке называем 𝜇 метрикой, хотя формально 𝜇 не обязательно удовлетворяет
аксиомам метрики.)
Представим рассматриваемый код с помощью решетки. Задача,
как и прежде, состоит в том, чтобы найти кратчайший путь от на-

4.8. Практические алгоритмы декодирования

131

чального узла решетки к конечному узлу. Предположим, что 𝑇^ —
^ = (^
метрика искомого оптимального пути 𝑣
𝑣1 , ..., 𝑣^𝑛 ). Тогда найдется индекс 𝑡, для которого выполняются два условия

𝜇(^
𝑣 𝑡1 , 𝑦 𝑡1 ) < 𝑇^/2;
𝜇(^
𝑣 𝑛 , 𝑦 𝑛 ) ≥ 𝑇^/2,
𝑡+1

𝑡+1

(4.29)
(4.30)

где использовано обозначение 𝑥𝑗𝑖 = (𝑥𝑖 , ..., 𝑥𝑗 ). Значение 𝑡, удовлетворяющее условиям (4.29) и 4.30), будет определено однозначно,
если мы потребуем, чтобы это было максимальное значение среди
всех таких 𝑡.
Факт существования такого симметричного разбиения на «прошлое» и «будущее» подсказывает простую идею, лежащую в основе
алгоритма BEAST: чтобы найти все пути с метрикой не больше 𝑇 ,
алгоритм строит множество путей ℱ («forward»), начинающихся в
начале решетки и имеющих вес меньше 𝑇 /2, и второе множество путей ℬ («backward»), растущих в противоположном направлении, от
конечного узла к начальному, и таких, что их метрика превышает
𝑇 /2, но укороченные слева на одно ребро пути имеют метрику меньше или равную 𝑇 /2. Пути каждого подмножества сортируются по
номеру узла решетки, в котором закончился путь. После этого находим согласованные пути-кандидаты, такие, что начальная часть
из ℱ и продолжение из ℬ образует вместе кодовое слово. Понятно,
что если путь с метрикой меньше или равной 𝑇 существует, он обязательно будет в числе выбранных кандидатов. Если таких путей
несколько, выбираем путь с лучшей метрикой, если же таких нет,
то нужно увеличить порог 𝑇 и повторить процедуру.
Формальное описание BEAST представлено в виде алгоритма 4.3.
В описании алгоритма присутствует параметр Δ, определяющий шаг приращения порога метрики в случае, если при предыдущем значении порога решение не было получено. Величина Δ
влияет на производительность декодера: при слишком маленьком
значении параметра возрастает число попыток декодирования, а
при слишком большом — может оказаться высокой сложность той
попытки, на которой будет найдено решение. Однако в любом случае число итераций ограничено сверху линейной функцией длины
кода.

132

4. Декодирование коротких кодов

Алгоритм 4.3. Алгоритм BEAST
Input: Решетка кода с заданными метриками ребер,

вычисленными по последовательности 𝑦 на выходе
канала.
Output: Кодовое слово, соответствующее кратчайшему пути
в решетке от яруса 0 до конечного яруса на глубине
𝑁
𝜁 P и 𝜁 C –- соответственно предок и потомок узла 𝜁 ,
𝑊F (𝜁) –- метрика пути из начального узла в 𝜁 ,
𝑊B (𝜁) –- метрика пути из 𝜁 в конечный узел.
Инициализация:
Flag = 0; 𝑇 = 0;
while Flag==0 do
𝑇 ←𝑇 +Δ
1. Построение прямого дерева

ℱ = {𝜁|𝑊F (𝜁) ≥ 𝑇 /2, 𝑊F (𝜁 P ) < 𝑇 /2}

2. Построение обратного дерева
ℬ = {𝜁|𝑊B (𝜁) < 𝑇 /2}

3. Поиск совпадений
∙ Сортировка путей в ℱ и ℬ по номерам узлов 𝜁 , в которых
заканчиваются пути.
∙ Если некоторый узел 𝜁 присутствует в обоих списках,
проверяем, равна ли сумма длины пути из ℱ и длины пути
из ℬ длине кодового слова 𝑛. В случае равенства включаем
путь в список кандидатов.
∙ Если множество кандидатов не пусто, из числа кандидатов
выбираем кандидата с наименьшей метрикой. Flag = 1
end

4.8. Практические алгоритмы декодирования

133

Алгоритм 4.3 в случае неудачной попытки начинает строить множества ℱ и ℬ заново, тем самым повторяя все вычисления, выполненные в процессе предыдущей попытки декодирования.
Несложно поправить алгоритм и устранить эти избыточные вычисления, хотя на порядок сложности это не повлияет.
Эксперименты с алгоритмом показали, что для конкретных кодов более существенное улучшение быстродействия может быть получено за счет выбора неодинаковых порогов для ℱ и ℬ и перевычисления не обоих, а только одного из двух деревьев (меньшего по
размеру) на очередной итерации.
Заметим, что не двусторонний характер поиска, а сортировка
является ключевым моментом, обеспечивающим выигрыш по сложности. Постараемся объяснить это следующими очень грубыми эвристическими оценками сложности.
Можно считать число путей (не обязательно одинаковой длины), расположенных на расстоянии не более 𝑇 вокруг принятой последовательности, экспоненциальной функцией числа 𝑇 , скажем,

𝜅 = 𝑒𝛼𝑇 ,
где 𝛼 — неотрицательная величина, и величину 𝜅 примем в качестве оценки сложности декодирования при одностороннем поиске
по дереву. Размеры прямого и обратного деревьев можно принять
одинаковыми и равными

𝜅𝐹 = 𝜅𝐵 = 𝑒𝛼𝑇 /2 .
Это и есть грубая оценка сложности BEAST-декодирования без
учета сложности процедуры поиска согласованных путей.
Если бы эта процедура выполнялась попарным сравнением путей, то сложность была бы пропорциональна
(︁
)︁2
𝜅𝐹 × 𝜅𝐵 = 𝑒𝛼𝑇 /2 = 𝑒𝛼𝑇 ,
т.е. примерно равна сложности декодирования односторонним поиском по дереву! В то же время сложность быстрой сортировки
массива из 𝑁 элементов оценивается как 𝑁 log 𝑁 . Поэтому полная
сложность BEAST-декодирования имеет порядок

𝜅BEAST = 𝛼𝑇 𝑒𝛼𝑇 /2 ,

134

4. Декодирование коротких кодов

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

представляющие собой точки 𝑛-мерного метрического (например, евклидова) пространства и 𝑑min — минимальное расстояние
между точками, соответствующими кодовым словам. Тогда при
𝑇 < 𝑑min ни в множестве ℱ , ни в ℬ нет путей, проходящих через
общий узел решетки кода.
Доказательство. В силу линейности кода сумма двух путей,
приходящих в один узел, — кодовое слово. Поэтому расстояние между такими путями не меньше 𝑑min . В силу неравенства треугольника сумма расстояний от путей до принятой последовательности, т.е.
сумма метрик путей тоже не меньше 𝑑min , а значит одна из метрик
больше 𝑑min /2 > 𝑇 /2, что противоречит правилу построения множеств ℱ и ℬ . Стало быть, предположение о существовании путей,
приходящих в один узел, приводит к противоречию.
Заметим, что для доказательства теоремы мы вынуждены были
предположить, что метрика декодирования, помимо сформулированных выше требований, удовлетворяет неравенству треугольника. Это ограничение может оказаться существенным. Например, в
канале с АБГШ декодирование по МП может быть реализовано как
декодирование по минимуму квадрата евклидова расстояния. Для
квадрата метрики Евклида неравенство треугольника не выполняется.
Рассмотрим декодирование в канале с АБГШ подробнее. Представим последовательность на входе декодера линейного (𝑛, 𝑘)-кода
в виде 𝑦 = (𝑦1 , ..., 𝑦𝑛 ) = (𝛼1 𝛽1 , ..., 𝛼𝑛 𝛽𝑛 ), где 𝛼𝑖 и 𝛽𝑖 — соответственно
знаки входных символов декодера и надежности жестких решений,

4.8. Практические алгоритмы декодирования
т.е.

135

{︂

−1, 𝑦𝑖 < 0
, 𝛽𝑖 = |𝑦𝑖 |, 𝑖 = 1, ..., 𝑛.
1, 𝑦𝑖 ≥ 0
По знакам жесткие двоичные решения восстанавливаются по
формуле
1
𝑟𝑖 = (1 − 𝛼𝑖 ), 𝑖 = 1, ..., 𝑛.
2
Чтобы ввести подходящую метрику декодирования, зафиксируем неотрицательный вектор надежностей 𝛽 . Для произвольной двоичной последовательности 𝑐 = (𝑐1 , ..., 𝑐𝑛 ) обозначим через 𝐼0 и 𝐼1
индексы расположений, соответственно, нулей и единиц в 𝑐. Определим вес 𝑐 как
∑︁
𝜇(𝑐) =
𝛽𝑖 .
𝛼𝑖 =

𝑖∈𝐼1

Расстояние между 𝑐 и 𝑐′ определяется как 𝜇(𝑐 + 𝑐′ ), т.е. как вес
суммы векторов по модулю 2.
Нетрудно видеть, что для 𝜇(𝑐) выполняются все свойства метрики. Назовем эту метрику обобщенной метрикой Хэмминга. В [109]
эта метрика названа эллипсоидной метрикой.
Теорема 4.6. Пусть 𝑦 — выходная последовательность канала с

АБГШ, 𝑥 — вычисленная по ней последовательность жестких решений. Для (𝑛, 𝑘)-кода 𝐶 = {𝑐𝑖 }, 𝑖 = 0, ..., 2𝑘 − 1 декодирование по
максимуму правдоподобия эквивалентно декодированию по минимуму обобщенной метрики Хэмминга 𝜇(𝑐𝑖 + 𝑥).
Доказательство. Двоичный вектор 𝑐𝑖 + 𝑥 содержит единицы на
позициях, где жесткие решения отличаются от символов кодового
слова. Для некоторого кодового слов 𝑐 = (𝑐1 , ..., 𝑐𝑛 ) обозначим через 𝐼0 множество тех позиций, где жесткие решения совпадают с
кодовыми символами, т.е. 𝑥𝑖 = 𝑐𝑖 , и через 𝐼1 дополнение к 𝐼0 . В канале с АБГШ декодирование по МП сводится к декодированию по
максимуму скалярного произведения (см. (4.2)) (𝑦, 2𝑐 − 1), в которое надежности символов на позициях из 𝐼0 входят со знаком «+»,
символы из 𝐼1 — со знаком «−». Таким образом, решение о 𝑐 по МП
должно максимизировать
∑︁
𝑗∈𝐼0

𝛽𝑗 −

∑︁
𝑗∈𝐼1

𝛽𝑗 =

𝑛
∑︁
𝑗=1

𝛽𝑗 − 2

∑︁
𝑗∈𝐼1

𝛽𝑗 =

𝑛
∑︁
𝑗=1

𝛽𝑗 − 2𝜇(𝑐 + 𝑥),

136

4. Декодирование коротких кодов

и, следовательно, минимизировать 𝜇(𝑐 + 𝑥), что и требовалось доказать.
Хорошей характеристикой практической сложности алгоритма
служит длина кодов, для которых может быть выполнено моделирование декодирования в разумное время. Разумеется, эта длина
зависит от используемых вычислительных средств, качества программирования и т.п. Однако эта зависимость не так сильна, как
может показаться. Поскольку сложность растет экспоненциально с
длиной кода, ускорение программы или производительности компьютера в 2 раза позволит увеличить длину кодов всего на единицу...
Сложность алгоритма BEAST позволяет декодировать коды со
скоростью 𝑅 = 1/2 длины порядка 𝑛 = 100.
4.8.2.

Метод порядковых статистик

Применительно к декодированию в ДСК в главе 2 мы рассматривали методы декодирования, не связанные с решетками. Наиболее оптимистичными оказались оценки сложности для методов, основанных на переборе по информационным совокупностям кода в надежде найти информационную совокупность, не содержащую ошибок.
Кажется естественным попытаться воспользоваться этим подходом
для декодирования с мягкими решениями. Более того, можно ожидать дополнительного упрощения, поскольку надежности символов
подсказывают, какие информационные совокупности наиболее надежны, и потому с большей вероятностью приведут к успешному
декодированию.
Метод порядковых статистик [75] использует всего одну, самую
надежную, информационную совокупность и для поиска решения
выполняет перебор по возможным комбинациям ошибок на этой
совокупности. Отметим, что введенное авторами название метода
не отражает его сути, оно связано, скорее с методами анализа его
эффективности.
В алгоритме 4.4 метрикой декодирования 𝜇 может служить, например, обобщенное расстояние Хэмминга, введенное в предыдущем параграфе, посвященном алгоритму BEAST.

4.8. Практические алгоритмы декодирования

137

Алгоритм 4.4. Алгоритм на основе порядковых статистик
Input: Знаки и надежности жестких решений, 𝛼, 𝛽 .
^
Output: Решение о кодовом слове 𝑐

Инициализация:
^=0
𝜇0 ← ∞, 𝑐
1. Найти перестановку 𝜋 такую, что 𝜋(𝛽 ) — неубывающая
последовательность.
2. Применить перестановку 𝜋 к столбцам порождающей
матрицы кода и найти наименьшее число ℎ ≥ 𝑘 такое, что
первые ℎ столбцов переставленной порождающей матрицы
образуют матрицу полного ранга 𝑘 .
3. Среди ℎ столбцов переставленной порождающей матрицы
найти набор из 𝑘 линейно-независимых столбцов и привести
переставленную матрицу к диагональной форме на
˜
соответствующих 𝑘 позициях. Обозначим новую матрицу 𝐺
4. for 𝑤 = 0 to 𝑤max do
(︀ )︀
Для каждого из 𝑤𝑘 возможных расположений 𝑤 позиций
𝑖1 , ...., 𝑖𝑤 на 𝑘 позициях информационной совокупности

∙ инвертировать 𝑤 жестких решений 𝛼𝑗 на позициях
𝑗 ∈ {𝑖1 , ...., 𝑖𝑤 }
∙ восстановить кодовое слово 𝑐 умножением соответствующих
˜
информационных символов на 𝐺
∙ найти метрику 𝜇(𝑐) кодового слова 𝑐.
^ ← 𝑐,
∙ if 𝜇(𝑐) < 𝜇0 then 𝑐
end

𝜇0 ← 𝜇(𝑐)

5. Восстановить порядок следования символов в кодовом
слове
^ ← 𝜋 −1 (^
𝑐
𝑐)

138

4. Декодирование коротких кодов

Параметр 𝑤max , ограничивающий максимальный вес корректируемых комбинаций ошибок на позициях информационной совокупности, определяет компромисс между вычислительной сложностью
декодирования и эффективностью. В работе [75] на примерах показано, что для кода с минимальным расстоянием 𝑑 при 𝑤max = 𝑑/4
достигается вероятность ошибки, близкая к вероятности ошибки
декодирования по МП.
Дальнейшее развитие эта техника декодирования получила в
работе [109]. Алгоритм, названный «Box and Match», использует не
𝑘 , а некоторое большее количество 𝑠 > 𝑘 самых надежных позиций,
включающих информационную совокупность. Избыточные 𝑠−𝑘 позиций применяются для сокращения перебора по информационным
позициям. Общий эффект состоит в некотором снижении количества вычислений за счет использования дополнительной памяти,
объем которой растет экспоненциально с длиной кода.
Вычислительная сложность алгоритма Box and Match позволила его авторам выполнить моделирование декодирования (почти по
максимуму правдоподобия) кода (192,96).

Выводы
В этой главе мы изучали оптимальное или близкое к оптимальному декодирование линейных кодов. Кажется вполне естественным
построить хороший код и затем применить к нему хороший метод
декодирования. Однако на этом пути мы не можем построить реализуемых на практике методов кодирования и декодирования, близких по своим характеристикам к теоретическим пределам. Основное ограничение — сложность. Все рассмотренные нами методы декодирования имеют экспоненциальную по длине кода сложность декодирования. В следующих главах мы будем изучать специальные
классы кодов, для которых существуют полиномиально-сложные
декодеры и даже декодеры с линейной сложностью.
Сформулируем основные результаты данной главы.
1. Задача декодирования по максимуму правдоподобия сводится
к задаче поиска кратчайшего пути на графе. Правило вычисления длин путей определяется моделью канала.

Задачи

139

2. Любой код можно представить решетчатой диаграммой. Поиск кратчайшего пути может быть выполнен с помощью алгоритма Витерби.
3. Для каждого кода однозначно (с точностью до изоморфизма)
определена минимальная решетка — решетка с наименьшим
возможным числом узлов на каждом ярусе.
4. Минимальная решетка получается приведением порождающей матрицы кода к минимальной спэновой форме, либо строится как синдромная решетка по проверочной матрице кода.
5. Декодирование по максимуму апостериорной вероятности с
мягкими решениями на выходе (SISO-декодирование) выполняется по решетке кода с помощью алгоритма БКДР.
6. Асимптотическая сложность декодирования по решетке, характеризуемая показателем экспоненты сложности, существенно меньше сложности декодирования перебором по кодовым словам.
7. Примеры альтернативных алгоритмов декодирования — алгоритмы BEAST, декодирование по порядковым статистикам,
Box and Match. Эти алгоритмы позволяют декодировать коды длин порядка 100–200 с вероятностью ошибки, близкой к
вероятности ошибки декодирования по максимуму правдоподобия.

Задачи
1. Как алгоритмы декодирования применить к задаче поиска минимального расстояния линейных кодов?
2. Напишите программу переборного декодирования по МП и
МАВ для кодов, задаваемых матрицами из задачи 3 главы 2.
С помощью моделирования постройте зависимость вероятности ошибки на бит от отношения сигнал/шум для ДСК и канала с АБГШ для двух методов декодирования, а также энерге-

140

4. Декодирование коротких кодов
тический выигрыш кодирования при вероятности ошибки на
бит 10−5 .

3. Пусть

𝐺=

(︂
)︂
1 1 0 1 0
1 0 1 1 1

и при передаче по ДСК с переходной вероятностью 𝑝0 = 0.1
принята последовательность (0, 1, 1, 1, 1). Вычислите апостериорные вероятности кодовых слов, кодовых символов и информационных символов. Определите решение МП-декодера
и МАВ-декодера.
4. Для примеров матриц из задачи 3, интерпретируемых как порождающие или проверочные матрицы, постройте минимальные решетки приведением к МСФ и синдромные решетки.
5. Постройте решетку для кода из задачи 3 и решите задачу 3 с
применением алгоритма БКДР.
6. Продумайте схему переборного декодирования, декодеров Витерби и БКДР. Оцените объем памяти, необходимой для хранения промежуточных данных, как функцию параметров кода
и сложности решетчатого описания. Сопоставьте сложность
декодирования перебором по кодовым словам, по алгоритму
Витерби и по алгоритму БКДР.
7. Для одного из кодов длины 𝑛 =20–32 определите его спектр.
Воспользуйтесь программой моделирования (задача 2) и границами Полтырева и Шеннона (глава 3) для оценивания вероятности ошибки как функции отношения сигнал/шум в ДСК
и в канале с АБГШ. Сопоставьте результаты.
.

5.

Циклические коды

Циклические коды — подкласс линейных кодов. Эти коды обладают
тем замечательным свойством, что все циклические сдвиги любого
кодового слова принадлежат коду. В частности, порождающая матрица может быть составлена из сдвигов одного слова. Таким образом, для хранения полной информации о коде длины 𝑛 достаточно
𝑛 бит. Трудно ожидать, что коды такого узкого подкласса будут
также хороши, как и линейные коды общего вида. Действительно,
асимптотически эти коды плохи, но на удивление большая часть
известных хороших кодов конечных длин — циклические коды. Более того, циклическими являются и коды Рида–Соломона, которые
сегодня являются безусловными рекордсменами по числу реализованных в реальных устройствах кодеров и декодеров, поскольку
они применяются во всех накопителях на жестких дисках, в устройствах записи информации на CD, DVD, флеш-памяти и т.п. Среди
преимуществ циклических кодов, помимо простоты их описания,
— возможность построения простых схем кодирования и декодирования. Об этом пойдет речь позже, после изучения специальных
классов циклических кодов — БЧХ-кодов и кодов Рида–Соломона.

142

5.1.

5. Циклические коды

Порождающий и проверочный
полиномы циклического кода

Начнем прямо с определения.
Определение 5.1. Линейный (𝑛, 𝑘)-код над полем 𝐹𝑞 называется

циклическим, если циклический сдвиг любого слова также является кодовым словом.

Применительно к циклическим кодам удобно использовать
представление двоичных последовательностей длины 𝑛 в виде полиномов степени не выше 𝑛 − 1.
Пример 5.1. Последовательностям 10110, 10001, 00100 соответ-

ствуют полиномы 1 + 𝑥2 + 𝑥3 , 1 + 𝑥4 , 𝑥2 .

В этом примере рассмотрены полиномы с коэффициентами из
поля 𝐹2 . Точно так же записываются полиномы с коэффициентами
из произвольного конечного поля 𝐹𝑞 . До определенного момента нас
будут интересовать в основном двоичные коды.
По мере изложения мы все больше будем опираться на свойства групп, колец и полей. Самые необходимые определения даны
в приложении к данной главе.
Пусть имеется полином

𝑓 (𝑥) = 𝑓0 + 𝑓1 𝑥 + ... + 𝑓𝑛−1 𝑥𝑛−1
с коэффициентами из поля 𝐹𝑞 , причем значения коэффициентов
могут быть, в том числе, и нулевыми. Умножим этот полином на
𝑥. Получим новый полином

𝑥𝑓 (𝑥) = 0 + 𝑓0 𝑥 + ... + 𝑓𝑛−2 𝑥𝑛−1 + 𝑓𝑛−1 𝑥𝑛 .
Видно, что последовательность коэффициентов полинома 𝑥𝑓 (𝑥)
получается сдвигом вправо последовательности коэффициентов полинома 𝑓 (𝑥). Если мы теперь приведем правую часть последнего
соотношения по модулю 𝑥𝑛 − 1, т.е. примем, что 𝑥𝑛 = 1, то получим

𝑥𝑓 (𝑥) = 𝑓𝑛−1 + 𝑓0 𝑥 + ... + 𝑓𝑛−2 𝑥𝑛−1

mod (𝑥𝑛 − 1).

5.1. Порождающий и проверочный полиномы

143

Таким образом, умножение 𝑓 (𝑥) на 𝑥 по модулю 𝑥𝑛 − 1 дает
циклический сдвиг 𝑓 (𝑥).
Упражнение 5.1. Докажите, что множество вычетов всех поли-

номов по модулю 𝑥𝑛 − 1 образует кольцо.

Мы называем полином приведенным, если коэффициент при его
старшей степени равен единице.
С этого момента мы не различаем последовательностей и полиномов. Для нас теперь (𝑛, 𝑘)-код 𝐶 = {𝑐(𝑥)} — это линейное подпространство размерности 𝑘 в пространстве полиномов 𝑐(𝑥) степени не
выше 𝑛 − 1. Мы уже убедились в том, что представление кодовых
слов в виде полиномов удобно хотя бы потому, что циклические
сдвиги описываются умножением на мономы.
Теорема 5.1. Пусть имеется циклический (𝑛, 𝑘)-код. Если 𝑔(𝑥) –

кодовое слово, то и 𝑚(𝑥)𝑔(𝑥)
словом для любого 𝑚(𝑥).

mod 𝑥𝑛 − 1 тоже будет кодовым

Упражнение 5.2. Докажите теорему 5.1.
Теорема 5.2. Пусть имеется циклический (𝑛, 𝑘)-код. Среди слов
кода cуществует только один приведенный полином 𝑔(𝑥) наименьшей степени ℎ.

Доказательство. Если бы нашлось два различных полинома
степени ℎ, то их сумма (разность в недвоичном случае) оказалась
бы полиномом степени меньше ℎ, что невозможно по условию теоремы.
Теорема 5.3. Пусть имеется циклический (𝑛, 𝑘)-код и 𝑔(𝑥) — ко-

довое слово наименьшей степени ℎ. Тогда любое слово кода делится
на 𝑔(𝑥).
Доказательство. Поскольку степень любого слова не меньше
степени 𝑔(𝑥), запишем произвольное слово 𝑐(𝑥) в виде
𝑐(𝑥) = 𝑔(𝑥)𝑞(𝑥) + 𝑟(𝑥),

(5.1)

где 𝑞(𝑥) и 𝑟(𝑥) — частное и остаток от деления 𝑐(𝑥) на 𝑔(𝑥). Из этого
представления по теореме 5.1 следует, что 𝑟(𝑥) — кодовое слово. Но

144

5. Циклические коды

степень 𝑟(𝑥) строго меньше степени 𝑔(𝑥), что невозможно по теореме 5.2. Следовательно, 𝑟(𝑥) должен быть равен нулю, а кодовое
слово 𝑐(𝑥), согласно (5.1), кратно 𝑔(𝑥).
Следствие 1. Пусть имеется циклический (𝑛, 𝑘)-код и 𝑔(𝑥) — ко-

довое слово наименьшей степени ℎ. Тогда 𝑔(𝑥) является делителем
𝑥𝑛 − 1.
Упражнение 5.3. Докажите следствие 1 из теоремы 5.3. Подсказ-

ка: запишите 𝑥𝑛 − 1 через частное и остаток от деления на 𝑔(𝑥)
аналогично (5.1). Поскольку все выражение равно нулю по модулю
𝑥𝑛 − 1, остаток должен делиться на 𝑔(𝑥), либо он тоже должен быть
равен нулю.
Теорема 5.4. Пусть имеется циклический (𝑛, 𝑘)-код и 𝑔(𝑥) — ко-

довое слово наименьшей степени ℎ. Тогда ℎ = 𝑛 − 𝑘 .

Доказательство. Из теоремы 5.3 вытекает, что все слова кода кратны 𝑔(𝑥). Для доказательства надо подсчитать размерность
множества полиномов, кратных 𝑔(𝑥). Полиномы 𝑔(𝑥), 𝑥𝑔(𝑥),. . . ,
𝑥𝑛−ℎ−1 𝑔(𝑥) линейно независимы и являются базисом линейного пространства размерности 𝑛 − ℎ. В виде их линейной комбинации можно получить любое слово вида 𝑚(𝑥)𝑔(𝑥) mod 𝑥𝑛 − 1, т.е. это множество линейных комбинаций порождает весь код, и его размерность
равна размерности кода, т.е. 𝑘 = 𝑛 − ℎ, что и требовалось доказать.
Определение 5.2. Полином 𝑔(𝑥), фигурирующий в теоремах 5.1—

5.4, называется порождающим полиномом циклического кода.

Пример 5.2. Пусть 𝑛 = 7 и 𝑔(𝑥) = 1 + 𝑥2 + 𝑥3 . Этот порожда-

ющий полином, согласно теореме 5.4, порождает циклический код
размерности 4. Выписывая базис 𝑔(𝑥), 𝑥𝑔(𝑥),. . . , 𝑥𝑛−ℎ−1 𝑔(𝑥) в виде
двоичных последовательностей, получаем порождающую матрицу


1 0 1 1 0 0 0
⎜0 1 0 1 1 0 0 ⎟

𝐺=⎜
⎝0 0 1 0 1 1 0 ⎠ .
0 0 0 1 0 1 1

5.1. Порождающий и проверочный полиномы

145

Нетрудно подсчитать, что минимальное расстояние кода равно 3, т.е. мы получили циклическое представление кода Хэмминга
(7,4).
Предыдущий пример подсказывает, что в общем случае порождающая матрица легко выписывается через коэффициенты порождающего полинома:


𝑔0 𝑔1 𝑔2 · · · 𝑔𝑟


𝑔0 𝑔1 · · · 𝑔𝑟−1 𝑔𝑟


𝐺=⎜
(5.2)
⎟,
.. ..
..
.. ..


.
.
.
.
.

𝑔0

· · · 𝑔𝑟−1 𝑔𝑟

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

ℎ(𝑥) =

𝑥𝑛 − 1
.
𝑔(𝑥)

(5.3)

Согласно Следствию 1, деление в правой части выполняется без
остатка. Из этого равенства имеем

ℎ(𝑥)𝑔(𝑥) = 0 mod 𝑥𝑛 − 1.

(5.4)

Более того, для любого кодового слова 𝑐(𝑥) = 𝑚(𝑥)𝑔(𝑥) имеем

𝑐(𝑥)ℎ(𝑥) = 0 mod 𝑥𝑛 − 1.

(5.5)

Определение 5.3. Полином ℎ(𝑥), определенный соотношением

(5.3), называется проверочным полиномом циклического кода длины 𝑛, заданного порождающим полиномом 𝑔(𝑥).
Степень проверочного полинома равна размерности кода
𝑘 = 𝑛 − 𝑟.

146

5. Циклические коды

Чтобы выписать проверочную матрицу кода, перепишем (5.4)
через коэффициенты полиномов:

𝑔0 ℎ0
𝑔0 ℎ1 +𝑔1 ℎ0
𝑔0 ℎ2 +𝑔1 ℎ1 +𝑔2 ℎ0
...
...
...

=0
=0
=0
...
𝑔 𝑟 ℎ𝑘 = 0

Дополнительные уравнения можно получить из тождеств

ℎ(𝑥)(𝑥𝑗 𝑔(𝑥)) = 0 mod 𝑥𝑛 − 1,

𝑗 = 1, ..., 𝑘 − 1.

Нетрудно видеть, что всем уравнениям удовлетворяет проверочная матрица


ℎ𝑘 ℎ𝑘−1 ℎ𝑘−2 · · · ℎ0


ℎ𝑘 ℎ𝑘−1 · · · ℎ1 ℎ0


𝐻=⎜
(5.6)
⎟.
..
.. .. .. ..


.
.
.
.
.

ℎ𝑘

· · · ℎ1 ℎ0

Заметим, что в строках матрицы 𝐻 коэффициенты проверочного полинома следуют в инверсном порядке. Полином, инверсный
полиному ℎ(𝑥), можно записать в форме 𝑥𝑘 ℎ(𝑥−1 ). Итак, доказано
следующее утверждение.
Теорема 5.5. Дуальный код циклического (𝑛, 𝑘)-кода с порождаю-

щим многочленом 𝑔(𝑥) и проверочным многочленом ℎ(𝑥) является
циклическим (𝑛, 𝑛 − 𝑘) кодом с порождающим многочленом
𝑔 ⊥ (𝑥) = 𝑥𝑘 ℎ(𝑥−1 ).
Из теоремы следует, в частности, что проверочный полином может рассматриваться как порождающий многочлен кода, эквивалентного дуальному коду. Его кодовые слова могут быть получены
инверсией (переписыванием в обратном порядке) слов дуального
кода.
Упражнение 5.4. Найдите порождающий многочлен кода дуаль-

ного коду Хэмминга (7,4) (см. пример 5.2).

5.2. Примеры циклических кодов

147

Упражнение 5.5. Что можно сказать о сложности декодирова-

ния циклического кода с помощью решетки? (См. задачу 8 в конце
главы.)

5.2.

Примеры циклических кодов

Построить циклический код, как мы знаем из предыдущего параграфа, несложно. Для этого нужно разложить на множители многочлен 𝑥𝑛 − 1 и выбрать любой (не обязательно простой) делитель
𝑥𝑛 − 1 в качестве порождающего многочлена циклического кода
длины 𝑛. Чем больше степень делителя, тем меньше скорость, и,
возможно, больше минимальное расстояние кода.
Пример 5.3. Положим 𝑛 = 7. Имеем

𝑥7 + 1 = (1 + 𝑥)(1 + 𝑥 + 𝑥3 )(1 + 𝑥2 + 𝑥3 ).
Отсюда следует, что множество циклических кодов длины 7
включает в себя
А. (7,6)-код с 𝑔(𝑥) = 1 + 𝑥,
Б. (7,4)-коды с 𝑔(𝑥) = 1 + 𝑥 + 𝑥3 и 𝑔(𝑥) = 1 + 𝑥2 + 𝑥3 ,
В. (7,1)-код с 𝑔(𝑥) = (1 + 𝑥 + 𝑥3 )(1 + 𝑥2 + 𝑥3 ) = 1 + 𝑥 + 𝑥2 + 𝑥3 +
+𝑥4 + 𝑥5 + 𝑥6 .
Г. (7,3)-коды с 𝑔(𝑥) = (1 + 𝑥)(1 + 𝑥2 + 𝑥3 ) = 1 + 𝑥 + 𝑥2 + 𝑥4 и
𝑔(𝑥) = (1 + 𝑥)(1 + 𝑥 + 𝑥3 ) = 1 + 𝑥2 + 𝑥3 + 𝑥4 .
Коды А и В — пара дуальных кодов: код с проверкой на четность
и код с повторениями. Два кода Б — коды Хэмминга, отличающиеся
порядком следования символов: один из них получается переписыванием кодовых символов другого кода в обратном порядке. Коды
Г — два кода Хэмминга с дополнительной проверкой на четность,
т.е. симплексные коды, дуальные по отношению к кодам Хэмминга.
В этом примере рассматриваются коды над полем характеристики 2, поэтому знаки «+» и «−» не различаются.

148

5. Циклические коды

Поскольку 𝑥𝑛 − 1 имеет корнем 1, то многочлен 𝑥 + 1 всегда
его делит. Поэтому при любом 𝑛 можно выбрать 𝑔(𝑥) = 𝑥 + 1 в
качестве порождающего полинома. При любом 𝑚(𝑥) произведение
𝑐(𝑥) = 𝑚(𝑥)(𝑥 + 1) имеет четное число слагаемых, т.е. получаемый
код — это (𝑛, 𝑛 − 1)-код с проверкой на четность.
Точно так же двойственный к нему код — код с повторениями —
тоже циклический код при всех 𝑛.
Пример 5.4. (Двоичные коды Хэмминга.) Пусть 𝑛 = 2𝑚 − 1. В ка-

честве порождающего многочлена 𝑔(𝑥) выберем любой примитивный многочлен 𝑝(𝑥) поля 𝐺𝐹 (2𝑚 ) (см. приложение). Тогда число избыточных символов будет равно 𝑚, размерность кода 𝑘 = 2𝑚 −𝑚−1.
Осталось убедиться в том, что минимальное расстояние кода равно 3. Предположим, что среди кодовых слов нашлось слово веса
2, кратное 𝑔(𝑥) = 𝑝(𝑥). Слово веса 2 имеет вид 𝑐(𝑥) = 𝑥𝑖 + 𝑥𝑗 =
= 𝑥𝑖 (𝑥𝑗−𝑖 + 1), 𝑗 > 𝑖. В этом случае 𝑝(𝑥) оказывается делителем
многочлена вида 𝑥ℎ − 1 при ℎ < 𝑚, т.е. порядок корней многочлена
меньше 𝑚, что невозможно в силу предположения о примитивности 𝑝(𝑥). Следовательно, в коде нет слов веса меньше 3, и мы имеем
(𝑛 = 2𝑚 − 1, 𝑘 = 2𝑚 − 𝑚 − 1)-код Хэмминга.
Проверочная матрица кода может быть выбрана в виде
(︀
)︀
𝑚
𝑚
𝐻 = 1 𝛼 ... 𝛼2 −3 𝛼2 −2 ,
где 𝛼 — примитивный элемент поля. Подразумевается, что вместо
элементов поля выписываются в виде столбцов их двоичные представления. Двоичная последовательность при умножении на 𝐻 даст
ноль только в том случае, если 𝛼 является корнем соответствующего многочлена, т.е. только если этот многочлен делится на примитивный многочлен.
Пример 5.5. (Двоичные коды максимальной длины.) Более точ-

но назвать эти коды кодами из последовательностей максимальной
длины. Их применение много шире рамок теории кодирования. Они
используются для установления синхронизации, в криптографии,
для генерации псевдослучайных последовательностей и т.д.
Циклический код длины 𝑛 = 2𝑚 − 1, проверочным многочленом
ℎ(𝑥) которого является примитивный многочлен 𝑝(𝑥) поля 𝐺𝐹 (2𝑚 ),
называется кодом максимальной длины.

5.2. Примеры циклических кодов

149

По определению, код максимальной длины дуален коду Хэммин𝑚
га. Порождающий многочлен кода равен 𝑔(𝑥) = (𝑥2 −1 − 1)/ℎ(𝑥).
Кодирование, как и для любого циклического кода, можно выполнить умножением информационного полинома 𝑚(𝑥) на 𝑔(𝑥).
На рис. 5.1 показана одна из наиболее распространенных блоксхем генератора последовательности максимальной длины. Эта же
схема может служить кодером для кода максимальной длины. В момент начала работы кодера в ячейки его регистра сдвига записывается начальная последовательность (информационные символы).
На каждом из 𝑛 тактов работы схемы на выход поступает некоторый кодовый символ, содержимое регистра сдвигается вправо
(умножается на 𝑥). Как только на выходе появляется ненулевое значение, оно умножается на 𝑝(𝑥) и вычитается из содержимого регистра, тем самым производится приведение по модулю 𝑝(𝑥). Выходом
схемы является последовательность максимальной длины. Поясним
работу схемы примером.
𝑚𝑡

× −𝑝0

+

+

...

−𝑝2 ×

...

𝑚𝑡+1

× −𝑝1

𝑚𝑡+𝑚−2

+

𝑚𝑡+𝑚−1

(𝑐0 , 𝑐1 , ..., 𝑐𝑛−1 )

× −𝑝𝑚−1

Рис. 5.1. Генератор последовательностей максимальной длины или
кодер кода максимальной длины

𝑚𝑡

+

𝑚𝑡+1

𝑚𝑡+2

𝑚𝑡+3

(𝑐0 , 𝑐1 , ..., 𝑐𝑛−1 )

Рис. 5.2. Генератор последовательностей максимальной длины при
𝑝(𝑥) = 1 + 𝑥 + 𝑥4 или кодер кода (15,4)
На рис. 5.2 показан пример кодера для случая, когда ℎ(𝑥) =
= 𝑝(𝑥) = 1 + 𝑥 + 𝑥4 — примитивный многочлен поля 𝐺𝐹 (24 ). Поло-

150

5. Циклические коды

жим состояние регистра равным 𝑚(𝑥) = 𝑚0 + 𝑚1 𝑥 + 𝑚2 𝑥2 + 𝑚3 𝑥3 =
= 𝑥2 + 𝑥3 , что соответствует кодированию информационной последовательности (0, 0, 1, 1). В табл. 5.1 показаны вычисления, выполняемые кодером, такт за тактом.
Таблица 5.1. Работа генератора последовательности максимальной
длины
Такт
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Состояние
регистра
0011
1101
1010
0101
1110
0111
1111
1011
1001
1000
0100
0010
0001
1100
0110

Выходной
символ
1
1
0
1
0
1
1
1
1
0
0
0
1
0
0

Нетрудно видеть, что, если мы обозначим через 𝑚𝑡 (𝑥) полином,
описывающий состояние регистра на такте 𝑡, то последовательность
состояний окажется циклическим сдвигом последовательности по𝑚
линомов 1, 𝑥, 𝑥2 , . . . , 𝑥2 −2 по модулю 𝑝(𝑥). В табл. 5.1 этой последовательности соответствуют строки с номерами 9, 10, ..., 8. Иными
словами, множество состояний регистра пробегает все возможные
ненулевые состояния.
Для произвольного постоянного во времени конечного автомата
с памятью 𝑚 бит выход автомата определяется детерминированной функцией содержимого его ячеек памяти. Максимальное число
различных состояний равно 2𝑚 , и эта же величина определяет мак-

5.2. Примеры циклических кодов

151

симальную длину псевдослучайной последовательности, генерируемой автоматом. В случае линейного автомата нулевому начальному состоянию соответствует нулевая выходная последовательность,
поэтому максимальная длина оказывается равной 2𝑚 − 1, отсюда и
название последовательности — последовательность максимальной
длины.
Поскольку кодовые слова отличаются только начальными состояниями регистра, они являются сдвигами друг друга. Нулевому
начальному состоянию соответствует нулевое кодовое слово. Минимальное расстояние (минимальный вес кодового слова) равно числу
единиц в последовательности максимальной длины. На рис. 5.1 и
5.2 видно, что единиц в кодовом слове будет столько, сколько ненулевых элементов поля заканчивается на 1, т.е. минимальное расстояние равно 2𝑚−1 .
Докажем, что все сдвиги порождающего многочлена 𝑔(𝑥) =
𝑚
= (𝑥2 − 1)/ℎ(𝑥) различны. Предположим, что два сдвига совпадают, т.е. для некоторых 𝑖 и 𝑗 имеет место равенство

𝑥𝑖 𝑔(𝑥) = 𝑥𝑗 𝑔(𝑥) mod 𝑥𝑛 − 1.
Это означает, что для некоторого 𝑟(𝑥)

𝑥𝑖 𝑔(𝑥) = 𝑥𝑗 𝑔(𝑥) + 𝑟(𝑥)(𝑥𝑛 − 1).
Поделив обе части на 𝑔(𝑥), получаем

𝑥𝑖 − 𝑥𝑗 = 𝑟(𝑥)𝑝(𝑥),
откуда следует, что 𝑝(𝑥) является делителем двучлена меньшей степени, чем 𝑛 = 2𝑚 − 1, что невозможно, поскольку 𝑝(𝑥) — примитивный многочлен. Тем самым мы убедились в том, что все 2𝑚 − 1
сдвигов последовательностей максимальной длины различны, и они
вместе с нулевым словом образуют (2𝑚 − 1, 𝑚)-код с расстоянием
2𝑚−1 .
Пример 5.6. (Код Голея.) Положим 𝑛 = 23. Можно, перемножив

многочлены, проверить, что

𝑥23 − 1 = (𝑥 − 1)𝑔(𝑥)˜
𝑔 (𝑥),

152
где

5. Циклические коды

𝑔(𝑥) = 𝑥11 + 𝑥10 + 𝑥6 + 𝑥5 + 𝑥4 + 𝑥2 + 1,
𝑔˜(𝑥) = 𝑥11 + 𝑥9 + 𝑥7 + 𝑥6 + 𝑥5 + 𝑥 + 1.

При этом многочлены 𝑔(𝑥) и 𝑔˜(𝑥) — взаимные друг к другу, т.е.
коэффициенты одного многочлена получаются переписыванием в
обратном порядке коэффициентов другого многочлена, 𝑔˜(𝑥) =
= 𝑥11 𝑔(𝑥−1 ). Получается, что существует два нетривиальных циклических кода длины 23: код (23,12), порождаемый 𝑔(𝑥), и дуальный к нему код (23,11), порождаемый многочленом (𝑥 − 1)˜
𝑔 (𝑥).
Докажем, что расстояния кода Голея и дуального к нему кода
равны соответственно 7 и 8.
Код, порождаемый 𝑔(𝑥), — частный случай БЧХ-кодов, которые
будут рассматриваться в следующем параграфе. Из теоремы БЧХ
мы получим оценку 𝑑 ≥ 5. Покажем, что в коде Голея нет слов веса
5 и 6. Для этого сначала рассмотрим так называемый расширенный
код Голея (24,12), получаемый дописыванием проверки на четность
к словам кода (23,12). При этом слова четного веса, конечно, не
изменяются. Порождающая матрица расширенного кода Голея состоит из 12 сдвигов 𝑔(𝑥) (порождающая матрица исходного кода) и
столбца из всех единиц. Все строки в результате имеют вес 8.
Дальнейшие рассуждения базируются на трех леммах.
Лемма 5.6. Расширенный код Голея самодуален.

Доказательство. Этот факт можно проверить непосредственно, помножив порождающую матрицу на транспонированную порождающую матрицу. Другое доказательство основано на том, что
проверочный многочлен кода Голея равен ℎ(𝑥) = (𝑥 + 1)˜
𝑔 (𝑥). Следовательно, порождающий многочлен дуального (23,11)-кода равен
𝑔 ⊥ (𝑥) = 𝑥12 ℎ(𝑥−1 ) = (1 + 𝑥)𝑔(𝑥). Отсюда следует, что код (23,11) —
подкод (23,12), составленный из слов четного веса. Если дописать
к порождающей матрице кода (23,11) строку из всех единиц, то получим альтернативную порождающую матрицу для (23,12), которая ортогональна себе, если не принимать во внимание последнюю
строку. После дописывания столбца общей проверки на четность

5.3. Кодирование и вычисление синдрома

153

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

Доказательство. Пусть 𝑎 и 𝑏 — ненулевые слова. Тогда скалярное произведение (𝑎, 𝑏) равно нулю, если эти слова имеют четное число совпадающих позиций. Отсюда следует, что 𝑤(𝑎 + 𝑏) =
= 𝑤(𝑎) + 𝑤(𝑏) − 4𝑠, где 𝑠 — целое. Поскольку в порождающей матрице расширенного кода Голея все строки имеют вес 8, и код самодуален, вес всех линейных комбинаций кратен 4.
Лемма 5.8. В коде Голея нет слов веса 5 и 6.

Доказательство. Наличие таких слов в коде Голея привело бы
к существованию слов веса 6 в расширенном коде Голея, что противоречит лемме 5.7.
Из доказанных утверждений следует, что расширенный код Голея (24,12) имеет расстояние 8, откуда вытекает, что код Голея
(23,12) имеет расстояние 7.
Упражнение 5.6. Убедитесь, что код Голея (23,12) — совершен-

ный код, т.е. удовлетворяет границе Хэмминга.

5.3.

Кодирование и вычисление синдрома

Казалось бы, при современном уровне техники нет смысла останавливаться на деталях реализации устройств — подобные задачи
сводятся к программированию в той или иной среде. Однако возможность чрезвычайно эффективной реализации элементов кодеров и декодеров на регистрах сдвига — примечательная особенность
циклических кодов, немало способствовавшая их широкому распространению.
Начнем с задачи кодирования. Формула, связывающая кодовое
слово 𝑐(𝑥) с соответствующим информационным многочленом 𝑚(𝑥)
и порождающим многочленом 𝑔(𝑥), имеет вид

154

5. Циклические коды

(5.7)

𝑐(𝑥) = 𝑚(𝑥)𝑔(𝑥).

Степени при 𝑥 можно рассматривать как индексы времени,
умножение на 𝑥 соответствует сдвигу на один такт. Поэтому операция (5.7) аналогична операции свертки двух последовательностей
или операции фильтрации входной последовательности 𝑚(𝑥) фильтром с конечным откликом (или с конечной импульсной характеристикой (КИХ-фильтром)) 𝑔(𝑥).
Пример 5.7. Рассмотрим код Хэмминга (15,11). Выберем в ка-

честве порождающего многочлена 𝑔(𝑥) = 1 + 𝑥 + 𝑥4 . На рис. 5.3
представлен фильтр-умножитель, который можно использовать в
качестве кодера.
( 0, 0..., 0 , 𝑚𝑘−1 , ..., 𝑚0 )
⏟ ⏞
𝑛−𝑘 нулей

𝑔0=1

𝑔1=1

𝑔2=0

𝑔3=0

𝑔4=1

+
(𝑐𝑛−1 , 𝑐𝑛−2 , ..., 𝑐1 , 𝑐0 )

Рис. 5.3. Несистематический кодер циклического кода
До начала работы кодера в регистр записаны нули. Затем один
за другим поступают информационные символы и складываются,
умножаясь на порождающий многочлен. Выходами кодера будут
последовательно 𝑐0 = 𝑚0 𝑔0 , 𝑐1 = 𝑚0 𝑔1 + 𝑚1 𝑔0 , и т.д., что в точности
соответствует (5.7). После подачи 𝑘 информационных символов поступают один за другим 𝑛−𝑘 нулей, и последним кодовым символом
будет, как и должно быть, 𝑐𝑛−1 = 𝑚𝑘 𝑔𝑘 .
Аналогично, вычисление синдрома можно выполнить в виде
умножения на проверочный полином кода ℎ(𝑥) принятой последовательности 𝑏(𝑥) = 𝑐(𝑥) + 𝑒(𝑥), где 𝑒(𝑥) — полином, соответствующий
вектору ошибок.

5.3. Кодирование и вычисление синдрома

155

Итак, на базе КИХ-фильтров, похожих на фильтр, приведенный
на рис. 5.3, можно строить как кодеры, так и вычислители синдромов. Однако это решение не самое удачное. Во-первых, желательно использовать систематические коды, т.к. при этом уменьшается
сложность восстановления информации в декодере. Во-вторых, по
крайней мере, если 𝑘 > 𝑛−𝑘 , желательно уменьшить сложность вычисления синдрома, сделать ее пропорциональной 𝑛 − 𝑘 , а не 𝑘 . Обе
задачи, как мы увидим, успешно решаются применением фильтров
с обратной связью, или, в терминах цифровой обработки сигналов,
БИХ-фильтров (фильтров с бесконечной импульсной характеристикой).
Посмотрим, как можно сделать кодирование систематическим.
Для этого запишем кодовое слово в виде

𝑐(𝑥) = 𝑥𝑛−𝑘 𝑚(𝑥) + 𝑡(𝑥).

(5.8)

Эта запись означает, что в старших разрядах слова записана информационная последовательность, а полином 𝑡(𝑥) должен иметь
степень не выше 𝑛 − 𝑘 − 1 и быть таким, чтобы 𝑐(𝑥) делился на порождающий многочлен 𝑔(𝑥). Этого можно добиться, выбрав в качестве 𝑡(𝑥) остаток от деления −𝑥𝑛−𝑘 𝑚(𝑥) на 𝑔(𝑥), т.е. найти такие
𝑡(𝑥) и 𝑞(𝑥), что

−𝑥𝑛−𝑘 𝑚(𝑥) = 𝑞(𝑥)𝑔(𝑥) + 𝑡(𝑥).
В этом случае (cм. (5.8)) 𝑐(𝑥) = −𝑞(𝑥)𝑔(𝑥), т.е. является кодовым
словом. Для построения кодового слова само частное 𝑞(𝑥) не требуется, достаточно к информационной последовательности дописать
остаток 𝑡(𝑥) от деления −𝑥𝑛−𝑘 𝑚(𝑥) на 𝑔(𝑥).
Вычисление остатка от деления с помощью регистра очень похоже на школьное деление чисел «столбиком». Начиная со старших
разрядов, мы вычитаем делитель, умноженный на такой элемент
поля, который обеспечивает равенство нулю старшего разряда делимого.
Пример 5.8. Схема кодера для кода Хэмминга (15,11) с порожда-

ющим многочленом 𝑔(𝑥) = 1 + 𝑥 + 𝑥4 показана на рис. 5.4. Кроме
сумматоров и элементов задержки схема содержит два переключателя, на положениях которых надписаны номерасоответствующих

156

5. Циклические коды

тактов. Начальное положение регистра — нулевое. На первых одиннадцати тактах информационные символы поступают одновременно в обратную связь регистра и на выход схемы. За 11 шагов в регистре формируется остаток от деления информационной последовательности на порождающий многочлен. Этот остаток на последних
4 тактах подается на выход как проверочные символы к данным
информационным символам. Кодирование информационной последовательности 𝑚 = (𝑚0 , . . . , 𝑚10 ) = (0, 1, 0, 0, 0, 0, 1, 1, 0, 1, 1) систематическим кодером, показанным на рис. 5.4, шаг за шагом поясняется в табл. 5.2. Обратите внимание, что сначала поступают старшие разряды информационной последовательности. Казалось бы,
отсутствует умножение на 𝑥𝑛−𝑘 = 𝑥4 . Оно присутствует неявно:
за информационными символами как бы следуют нули, и деление
осуществляется, как и должно быть, в течение 11 тактов.
Результат вычислений в точности совпадает с результатом деления в столбик (единицы соответствуют коэффициентам при соответствующих степенях 𝑥):

11 01 10 000 100 0 0 0 10011
10011
1100...
10000
10011
11000
10011
1011
10011
10000
10011
11000
10011
1011
Рассмотрим теперь задачу вычисления синдрома. Если на выходе канала наблюдается последовательность 𝑏(𝑥) = 𝑐(𝑥) + 𝑒(𝑥), то
синдромный полином 𝑠(𝑥) вычисляется либо умножением на ℎ(𝑥)
(по аналогии с несистематическим кодированием, см. рис. 5.3), либо
делением на порождающий многочлен 𝑔(𝑥):

5.3. Кодирование и вычисление синдрома

157

11–14
0–10
11–14

𝑟0

+

𝑟1

𝑟2

𝑟3

+

(𝑐0 , 𝑐1 , ..., 𝑐14 )

0–10

(𝑚0 , 𝑚1 , ..., 𝑚10 )

Рис. 5.4. Систематический кодер кода (15, 11)

Таблица 5.2. Кодирование систематическим кодером кода Хэмминга
(15,11)
Такт

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Вход

1
1
0
1
1
0
0
0
0
1
0





Обратная
связь

1
1
0
0
1
1
0
1
0
0
1





Состояние
регистра
0000
1100
1010
0101
0010
1101
1010
0101
1110
0111
0011
1101
0110
0011
0001
0000

Выходной
символ

1
1
0
1
1
0
0
0
0
1
0
1
0
1
1

158

5. Циклические коды

(𝑏0 , 𝑏1 , ..., 𝑏14 )

+

+

𝑠0

𝑠0

𝑠0

𝑠0

Рис. 5.5. Вычислитель синдрома для кода (15,11)

𝑠(𝑥) = 𝑏(𝑥) mod 𝑔(𝑥).
Пример 5.9. Схема вычисления синдрома для кода (15,11) пока-

зана на рис. 5.5. Предположим, что последовательность на выходе
канала (𝑏0 , 𝑏1 , . . . , 𝑏14 ) = (010101101101100), что соответствует полиному 𝑏(𝑥) = 𝑥13 +𝑥11 +𝑥9 +𝑥8 +𝑥6 +𝑥5 +𝑥3 +𝑥2 . Предполагается, что
начальное состояние регистра — нулевое, и последовательность поступает на вход, начиная со старших коэффициентов. Вычисления,
выполняемые схемой на каждом такте работы, показаны в табл.
5.3. Честное деление в столбик показывает, что синдром вычислен
правильно.
Для исправления ошибок нужно не только подсчитать синдром,
но и найти соответствующий этому синдрому вектор ошибок. Для
этого можно использовать запоминающее устройство, в котором
для каждого из 2𝑛−𝑘 − 1 ненулевых синдромов хранится соответствующий ему вектор ошибок длины 𝑛. Поскольку код циклический, можно немного сократить объем необходимой памяти.
Теорема 5.9. Если

𝑠(𝑥) = 𝑏(𝑥) mod 𝑔(𝑥),

то

(𝑥𝑏(𝑥)(mod(𝑥𝑛 − 1))) (mod𝑔(𝑥)) = 𝑥𝑠(𝑥)(mod𝑔(𝑥)).

Доказательство. Обозначим через 𝑞𝑏 (𝑥) частное от деления 𝑏(𝑥)
на 𝑔(𝑥). Тогда
𝑏(𝑥) = 𝑔(𝑥)𝑞𝑏 (𝑥) + 𝑠(𝑥)

5.3. Кодирование и вычисление синдрома

159

Таблица 5.3. Вычисление синдрома кода Хэмминга (15,11)
Такт

0
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Вход

0
0
1
1
0
1
1
0
1
1
0
1
0
1
0

Обратная
связь

0
0
0
0
0
0
1
1
0
0
1
1
1
0
0

Состояние
регистра
0000
0000
0000
1000
1100
0110
1011
0001
1100
1110
1111
1011
0001
1100
1110
0111

и

𝑥𝑏(𝑥) = 𝑥𝑔(𝑥)𝑞𝑏 (𝑥) + 𝑥𝑠(𝑥).
Поскольку 𝑥𝑏(𝑥)( mod (𝑥𝑛 −1)) = 𝑥𝑏(𝑥)−𝑏𝑛−1 (𝑥𝑛 −1) и 𝑔(𝑥) делит
𝑥𝑛 − 1, из последнего тождества после приведения по модулю 𝑔(𝑥)
получаем утверждение теоремы.
Иными словами, теорема утверждает, что циклическому сдвигу последовательности длины 𝑛 соответствует циклический сдвиг
синдрома, выполняемый с приведением по модулю порождающего
многочлена.
При декодировании циклического кода принятую последовательность можно записать в циклический регистр сдвига из 𝑛 ячеек. Для каждого циклического сдвига заново вычисляется синдром
и проверяется наличие вычисленного вектора в памяти декодера.
Если он там есть, соответствующий вектор ошибок прибавляется к

160

5. Циклические коды

принятому слову, и на этом декодирование заканчивается. Из Теоремы 5.9 следует, что достаточно хранить только такие синдромы,
которые не являются циклическими сдвигами других синдромов,
уже помещенных в память декодера. Кажется, что таким способом можно сократить объем памяти примерно в 𝑟 = 𝑛 − 𝑘 раз, но
на самом деле многие последовательности длины 𝑟 имеют много
меньше, чем 𝑟 различных сдвигов (например, последовательность
из всех единиц). По этой причине память уменьшается не в 𝑟 раз, а
примерно в 4 раза. Декодер, использующий эту возможность, называют декодером Меггитта. Платой за экономию памяти является
значительное увеличение времени работы декодера.

Задачи
1. Постройте циклические коды длин 𝑛 = 3, ..., 9. Определите
скорость и минимальное расстояние кодов и дуальных к ним
кодов.
2. Постройте все поля характеристики 2 из 8 элементов. Проверьте, что они изоморфны друг другу.
3. Определите порядки элементов мультипликативной группы
поля 𝐺𝐹 (𝑞) при 𝑞 = 2, 3, 4, 5, 7, 8, 9.
4. Постройте поле 𝐺𝐹 (24 ) как кольцо вычетов по модулю 𝑝(𝑥) =
= 1 + 𝑥 + 𝑥4 . Найдите обратные элементы к элементам поля.
5. Постройте поле 𝐺𝐹 (24 ) как кольцо вычетов по модулю 𝑝(𝑥) =
= 1 + 𝑥 + 𝑥2 + 𝑥3 + 𝑥4 . Найдите обратные элементы к элементам поля.
6. Представьте порождающую матрицу циклического кода Хэмминга (7,4) в систематической форме и выпишите соответствующую проверочную матрицу. Как будет выглядеть декодер
Меггитта для этого кода?
7. Предположим, что кодом Хэмминга (15,11) передается сообщение (10111101001) и в канале ошибка произошла в позиции
с номером 7. Повторите вычисления, выполняемые кодером

Приложение

161

при систематическом кодировании и декодером при вычислении синдрома. Используя результаты выполнения задачи 4,
покажите, как произойдет исправление этой ошибки декодером Меггитта.
8. Докажите, что минимальная решетка циклического кода имеет максимальную по всем уровням сложность min{2𝑘 , 2𝑛−𝑘 }.
Эта величина совпадает с максимальной возможной сложностью минимальной решетки линейного кода. Означает ли это,
что сложность решетки кода Голея не может быть меньше 212 ?

Приложение. Конечные поля
Кольцо вычетов

Определение 5.4. Кольцом называется множество 𝑅, на кото-

ром определены две операции, называемые сложением и умножением, и для которого справедливы аксиомы:
1. 𝑅 образует абелеву группу по сложению.
2. 𝑅 замкнуто относительно операции умножения.
3. Ассоциативность: 𝑎(𝑏𝑐) = (𝑎𝑏)𝑐.
4. Дистрибутивность: 𝑎(𝑏 + 𝑐) = 𝑎𝑏 + 𝑎𝑐.

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

162

5. Циклические коды

Определение 5.5. Полем называется множество 𝐹 , на котором

определены две операции, называемые сложением и умножением,
и для которого справедливы аксиомы:
1. 𝐹 образует абелеву группу по сложению.
2. Множество ненулевых элементов 𝐹 образует абелеву группу
по умножению.

Пример 5.10. При любом 𝑞 множество целых чисел по модулю

числа 𝑞 является кольцом, при условии, что операции сложения и
умножения выполняются с последующим приведением по модулю
𝑞 . Это кольцо является коммутативным кольцом с единицей. Оно
является полем, если число 𝑞 — простое.
Упражнение 5.7. Пусть 𝑅𝑞 обозначает кольцо вычетов целых чи-

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

Поле из 𝑞 элементов в дальнейшем будем обозначать 𝐺𝐹 (𝑞).
GF — аббревиатура словосочетания Galois Field (поле Галуа), связанного с именем французского ученого с очень необычной биографией. Рекомендуем почитать о нем хотя бы в Интернете.
Кольцо многочленов

Рассмотренные примеры подсказывают, что при простых 𝑞 существуют поля с 𝑞 элементами — это поля целых чисел по модулю 𝑞 .
Можно построить поля мощности 𝑞 при составном 𝑞 . Чтобы построить такие поля, рассмотрим специальное кольцо — кольцо многочленов.
Элементами кольца являются многочлены вида 𝑎(𝑥) = 𝑎0 +
+𝑎1 𝑥 + ... + 𝑎𝑚 𝑥𝑚 , где коэффициенты выбираются из некоторого
поля 𝐺𝐹 (𝑞). Операции сложения и умножения многочленов выполняются обычным образом. Такое кольцо обозначим 𝐹 [𝑥].
Напомним, что приведенным называется многочлен, у которого
коэффициент при старшей степени аргумента равен 1.

Приложение

163

Определение 5.6. Для приведенного многочлена 𝑝(𝑥) степени

больше единицы кольцом многочленов по модулю 𝑝(𝑥) называется множество всех многочленов степени меньше степени 𝑝(𝑥) с
операциями умножения и сложения, определенными как сложение
и умножение по модулю 𝑝(𝑥). Это кольцо обозначим 𝐹𝑝(𝑥) [𝑥].
Теорема 5.10. Кольцо 𝐹𝑝(𝑥) [𝑥] является полем тогда и только

тогда, когда 𝑝(𝑥) — простой (т.е. приведенный и неразложимый)
многочлен.

Доказательство. Начнем с доказательства необходимости. Покажем, что при простом 𝑝(𝑥) каждый элемент кольца 𝐹𝑝(𝑥) [𝑥]
имеет обратный элемент по умножению. Для этого выберем произвольный элемент 𝑠(𝑥) и покажем, что все произведения вида
𝑠(𝑥)𝑎(𝑥) mod 𝑝(𝑥) различны. Это будет означать, что одно из произведений равно 1. Соответствующий элемент 𝑎(𝑥) будет обратным
к 𝑠(𝑥). Предположим противное, т.е. что для некоторых 𝑎(𝑥) и 𝑏(𝑥)
имеет место 𝑠(𝑥)𝑎(𝑥) = 𝑠(𝑥)𝑏(𝑥) mod 𝑝(𝑥), или, что то же самое,
𝑠(𝑥)𝑑(𝑥) = 0 mod 𝑝(𝑥) имеет место для некоторого 𝑑(𝑥). Это означает, что 𝑠(𝑥)𝑑(𝑥) = 𝑡(𝑥)𝑝(𝑥) при некотором 𝑡(𝑥). Один из многочленов
в левой части обязан делиться на 𝑝(𝑥), поскольку 𝑝(𝑥) — простой.
Это невозможно, поскольку степень каждого из этих двух многочленов меньше степени 𝑝(𝑥). Тем самым доказано существование
обратного элемента, и данное кольцо — поле.
Чтобы доказать необходимость, заметим, что при непростом
𝑝(𝑥) = 𝑢(𝑥)𝑣(𝑥) делители 𝑝(𝑥) не имеют обратных, поскольку иначе
можно было бы записать
𝑢(𝑥) = [𝑢(𝑥)𝑣(𝑥)] 𝑣 −1 (𝑥) = 𝑝(𝑥)𝑣 −1 (𝑥) = 0 mod 𝑝(𝑥).
Отсюда следует, что 𝐹𝑝(𝑥) [𝑥] не удовлетворяет аксиомам поля при
непростом 𝑝(𝑥).
Поле, построенное как кольцо многочленов по модулю неприводимого 𝑝(𝑥) степени 𝑚 с коэффициентами из 𝐺𝐹 (𝑞), содержит 𝑞 𝑚
элементов. Оно называется расширением 𝐺𝐹 (𝑞) и обозначается как
𝐺𝐹 (𝑞 𝑚 ).
Итак, любой простой многочлен может быть использован для
построения поля Галуа 𝐺𝐹 (𝑞 𝑚 ).

164

5. Циклические коды

Пример 5.11. Два примера колец многочленов по модулю много-

членов второй степени приведены в табл. 5.4. Кольцо многочленов
по модулю 1 + 𝑥 + 𝑥2 является полем.

Таблица 5.4. Два кольца многочленов по модулю полинома второй
степени

𝑝(𝑥) = 1 + 𝑥2
Элемент Обратный элемент
0

1
1
𝑥
𝑥
1+𝑥
не определен

𝑝(𝑥) = 1 + 𝑥 + 𝑥2
Элемент Обратный элемент
0

1
1
𝑥
1+𝑥
1+𝑥
𝑥

Хотя поле Галуа, как мы видели, может быть задано любым
простым многочленом, оно единственно с точностью до изоморфизма. Для построения кодов и вычислений в поле Галуа оказывается
удобным описание мультипликативной группы поля в виде набора
степеней одного из элементов поля.
Остановимся подробнее на свойствах мультипликативной группы поля.
Мультипликативная группа поля Галуа

Пусть имеется произвольная группа по умножению, состоящая из
𝑞 − 1 элементов. Выберем некоторый элемент группы 𝑎. Очевидно,
вместе с этим элементом группе принадлежат все элементы вида
𝑎𝑖 , 𝑖 = 1, 2, . . . Поскольку в группе конечное число элементов, для
некоторого числа 𝑠 получим 𝑎𝑠 = 1.
Определение 5.7. Наименьшее 𝑠 такое, что 𝑎𝑠 = 1, называется

порядком элемента 𝑎.

Согласно теореме 2.9, порядок подгруппы является делителем
порядка группы, поэтому 𝑞 − 1 делится на 𝑠 и, в частности, может
совпадать с 𝑠. Таким образом, каждый ненулевой элемент поля удовлетворяет уравнению
𝑥𝑞−1 − 1 = 0
(5.9)

Приложение

165

и любой элемент поля — уравнению

𝑥𝑞 − 𝑥 = 0.

(5.10)

Это утверждение называется малой теоремой Ферма. Оно приводит к важному свойству, формулируемому ниже в виде теоремы
5.13, доказательство которой станет простым, благодаря двум элементарным леммам.
Лемма 5.11. Если порядки 𝑠𝑎 и 𝑠𝑏 элементов 𝑎 и 𝑏 взаимно про-

сты, то порядок их произведения 𝑎𝑏 равен произведению их порядков 𝑠𝑎𝑏 = 𝑠𝑎 𝑠𝑏 .

Доказательство. Поскольку (𝑎𝑏)𝑠𝑎 𝑠𝑏 = 1, достаточно доказать,
что порядок 𝑎𝑏 не может быть меньше, чем 𝑠𝑎 𝑠𝑏 . Если для некоторого 𝑙 имеет место (𝑎𝑏)𝑙 = 1, то (𝑎𝑏)𝑙𝑠𝑎 = 𝑏𝑙𝑠𝑎 = 1. Это возможно,
только если показатель степени 𝑙𝑠𝑎 кратен порядку 𝑠𝑏 элемента 𝑏.
Поскольку 𝑠𝑎 и 𝑠𝑏 взаимно просты, делаем вывод, что 𝑙 кратно 𝑠𝑏 .
Аналогично можно убедиться, что 𝑙 кратно 𝑠𝑎 . В итоге заключаем,
что 𝑙 = 𝑠𝑎 𝑠𝑏 .
Лемма 5.12. Если число 𝑠𝑡 является делителем 𝑞 − 1, то в поле

Галуа найдется элемент порядка 𝑠𝑡 .

Доказательство. Положим 𝑞 − 1 = 𝑠𝑡 𝑢. Уравнению 𝑥𝑢 = 1 удовлетворяет 𝑢 − 1 < 𝑞 − 1 элементов, т.е. не все элементы поля. Пусть
𝑎 не удовлетворяет этому уравнению, т.е. 𝑎𝑢 ̸= 1. При этом для
𝑡
элемента 𝑏 = 𝑎𝑢 имеет место 𝑏𝑠 = 𝑎𝑞−1 = 1, т.е. его порядок либо
равен 𝑠𝑡 , либо делит его, т.е. равен 𝑠𝑗 , 𝑗 < 𝑡. Поскольку множество
𝑡
всех элементов поля, которые удовлетворяют уравнению 𝑥𝑠 = 1,
𝑗
содержит все элементы, удовлетворяющие 𝑥𝑠 = 1, и при этом число решений первого уравнения больше, чем второго, непременно
найдется элемент, удовлетворяющий только первому из этих двух
уравнений, т.е. элемент порядка 𝑠𝑡 (см. пример 5.12 ниже).
Теорема 5.13. В поле из 𝑞 элементов найдется элемент порядка

𝑞 − 1.

166

5. Циклические коды

Доказательство. При простом 𝑞 − 1 все нетривиальные элементы имеют такой порядок, т.к. 𝑞 −1 — единственный делитель порядка группы. Пусть число 𝑞 − 1 составное, его разложение на простые
𝑠
𝑠
∏︀
∏︀
𝑝𝜈𝑖 𝑖 =
𝜃𝑖 .
множители запишем в виде 𝑞 − 1 =
𝑖=1

𝑖=1

Из лемм 5.11 и 5.12 теперь следует, что найдется элемент порядка 𝑞 − 1.
Теорема 5.13, по сути, утверждает, что все ненулевые элементы
поля Галуа можно получить возведением в степень одного элемента
поля. Таким образом, в терминологии теории групп мультипликативная группа поля Галуа является циклической группой. Элемент,
из которого последовательным применением групповой операции
можно получить всю группу, называется образующим элементом
циклической группы. Этот элемент играет настолько большую роль
в теории групп, что у него есть еще одно название.
Определение 5.8. В поле 𝐺𝐹 (𝑝𝑚 ) элемент порядка 𝑝𝑚 − 1 назы-

вается примитивным.

Пример 5.12. Мультипликативная группа поля 𝐺𝐹 (52 ) содержит

24 элемента, т.е. порядки элементов являются числами из множества {1, 2, 3, 4, 6, 8, 12, 24}. Если 𝑥 — примитивный элемент, то 𝑥𝑠
имеет порядок 2 при 𝑠 = 12, порядок 3 при 𝑠 = 8, 16, порядок 4 при
𝑠 = 6, 18, порядок 6 при 𝑠 = 4, 20, порядок 8 при 𝑠 = 3, 9, 15, 21, порядок 12 при 𝑠 = 2, 10, 14, 22. Элементы степеней 5,7,11,13,17,19,23
(взаимно простые с 24) имеют порядок 24, т.е. являются примитивными.
Мы показали выше, что любой неприводимый многочлен можно использовать для построения поля Галуа. Теперь стало ясно, что
поле может быть описано заданием одного примитивного элемента.
Наша следующая цель — связать эти два представления, полиномиальное и степенное.

Пример 5.13. Рассмотрим кольцо многочленов по модулю 𝑝(𝑥) =

= 1 + 𝑥 + 𝑥3 . Поскольку многочлен неразложим над 𝐺𝐹 (2), это
кольцо является полем 𝐺𝐹 (23 ). В нем должен существовать элемент порядка 7. Возможно, элемент 𝑥 является таковым. Чтобы

Приложение

167

проверить этот факт, нужно подсчитать его степени по модулю 𝑝(𝑥).
Вычисления сведены в табл. 5.5. Каждый новый элемент полиномиального представления получен умножением предыдущего на 𝑥
по модулю 𝑝(𝑥).
Таблица 5.5. Мультипликативная группа поля 𝐺𝐹 (23 )
Степень примитивного
элемента
𝑥
𝑥2
𝑥3
𝑥4
𝑥5
𝑥6
𝑥7 = 𝑥0

Полиномиальное
представление
𝑥
𝑥2
𝑥3 = 1 + 𝑥
𝑥 + 𝑥2
𝑥2 + 𝑥3 = 1 + 𝑥 + 𝑥2
𝑥 + 𝑥2 + 𝑥3 = 1 + 𝑥2
𝑥 + 𝑥3 = 1

Двоичная запись
полинома
010
100
011
110
111
101
001

Вычисления подтвердили, что 𝑥 — примитивный элемент. Как
мы увидим позже, совсем не любой неразложимый многочлен примитивен и может быть использован для описания ненулевых элементов в виде циклической группы.
Упражнение 5.8. Постройте поле 𝐺𝐹 (32 ).
Определение 5.9. Простой многочлен 𝑝(𝑥) степени 𝑚 с коэффи-

циентами из 𝐺𝐹 (𝑝) называется примитивным многочленом, если в поле полиномов по модулю 𝑝(𝑥) элемент 𝑥 является примитивным.
Рассмотрим произвольное поле 𝐺𝐹 (𝑞) и число 1 в этом поле.
Суммируя различное число единиц, будем получать различные элементы поля, и, в силу конечности поля, для некоторого 𝑝 выполняется равенство
1⏟ + 1 +⏞. . . + 1 = 0.
𝑝 слагаемых

Минимальное число 𝑝, для которого выполняется это равенство,
называется характеристикой поля. Число 𝑝 — простое, т.к. иначе

168

5. Циклические коды

мы получили бы равенство 𝑝 = 𝑠𝑡 = 0, из которого бы следовало,
что либо 𝑟, либо 𝑠 равны нулю.
Само поле называют полем характеристики 𝑝. В таком поле
имеют место тождества
(5.11)

𝑝𝑥 = 0;
𝑝

(𝑥 + 𝑦)

𝑝

𝑝

= 𝑥 +𝑦 .

(5.12)

Первое следует из определения, а для доказательства второго
нужно воспользоваться формулой бинома Ньютона. При этом окажется, что все члены разложения, кроме 𝑥𝑝 и 𝑦 𝑝 , содержат
в ка(︀ )︀
честве сомножителей биномиальные коэффициенты 𝑝𝑖 , кратные 𝑝,
т.к. 𝑝 — простое, и равные нулю в силу (5.11).
Минимальные многочлены

Корнем многочлена 𝑝(𝑥) с коэффициентами из поля 𝐺𝐹 (𝑝) называется элемент 𝑥, для которого имеет место равенство 𝑝(𝑥) = 0. Если
𝑎 является корнем 𝑝(𝑥), то 𝑝(𝑥) делится на двучлен (𝑥 − 𝑎). Таким
образом, многочлен степени 𝑚 может иметь не больше 𝑚 корней (не
обязательно принадлежащих тому же полю, что и коэффициенты
многочлена 𝑝(𝑥)).
Поскольку все элементы поля 𝐺𝐹 (𝑞) удовлетворяют (5.10), имеет место разложение
∏︁
𝑥𝑞 − 𝑥 =
(𝑥 − 𝛼).
(5.13)
𝛼∈𝐺𝐹 (𝑞)

Отсюда следует, что в поле 𝐺𝐹 (𝑝𝑚 ) всякий элемент является
корнем некоторого многочлена степени 𝑝𝑚 или меньше.
Определение 5.10. Минимальным многочленом 𝑀 (𝑥) над полем

𝐺𝐹 (𝑝) элемента 𝛼 в поле 𝐺𝐹 (𝑝𝑚 ) называется нормированный многочлен наименьшей степени, корнем которого является 𝛼.
Свойства минимальных многочленов:
Свойство 5.1. Минимальный многочлен элемента 𝛼 неприводим.

Приложение

169

Доказательство. В противном случае один из сомножителей
имел бы корнем 𝛼, и его степень была бы меньше степени 𝑀 (𝑥).
Свойство 5.2. Любой многочлен, имеющий корень 𝛼, делится на

𝑀 (𝑥).

Доказательство. Пусть для некоторого 𝑓 (𝑥) имеет место 𝑓 (𝛼) =
0. Тогда остаток 𝑓 (𝑥) от деления 𝑓 (𝑥) на 𝑀 (𝑥) тоже должен иметь
корень 𝛼. Но степень остатка меньше степени 𝑀 (𝑥), что противоречит предположению о минимальности 𝑀 (𝑥).
Свойство 5.3. 𝑥𝑝

𝑚

− 𝑥 делится на 𝑀 (𝑥).

Доказательство. Это свойство непосредственно следует из
свойства 2.
Свойство 5.4. Степень 𝑀 (𝑥) не превышает 𝑚.

Доказательство. Поле 𝐺𝐹 (𝑝𝑚 ) представляет собой 𝑚-мерное
линейное пространство полиномов степени не более 𝑚−1. Элементы
1, 𝛼, 𝛼2 , ...𝛼𝑚 линейно зависимы и, следовательно, для некоторого
набора коэффициентов 𝑓0 , 𝑓1 , ..., 𝑓𝑚 имеет место равенство 𝑓0 +𝑓1 𝛼+
... + 𝑓𝑚 𝛼𝑚 = 𝑓 (𝛼) = 0.
Свойство 5.5. Степень минимального многочлена 𝑀 (𝑥) прими-

тивного элемента равна 𝑚.

Доказательство. Если бы степень была меньше, например 𝑑, то
степени корней 𝑀 (𝑥), приведенные по модулю 𝑀 (𝑥), образовали бы
поле из 𝑝𝑑 < 𝑝𝑚 элементов, и порядок примитивного элемента был
бы меньше числа элементов поля, что противоречит определению
примитивного элемента.

6.

БЧХ-коды и РС-коды

Не будет преувеличением сказать, что БЧХ и РС-коды — рекордсмены по практическому использованию в разнообразных системах
и устройствах хранения и передачи данных. Кроме того, эти коды важны с теоретической точки зрения, поскольку, по сути, все
остальные кодовые конструкции алгебраических блоковых кодов
являются в той или иной степени их обобщением и развитием. Большая часть лучших известных кодов получается модификацией кодов этого класса.
Коды БЧХ получили свое название от имен первооткрывателей
Боуза, Рой-Чоудхури ([56], 1960 г.) и Хоквингема ([79], 1959 г.), название РС-кодов связано с их авторами Ридом и Соломоном ([98],
1960 г.).
Важно отметить, что коды БЧХ и РС мы рассматриваем как
«длинные» коды с «простым» декодированием. Эти слова надо понимать следующим образом. Коды БЧХ образуют бесконечную последовательность кодов, для которых известен способ построения и
способ их декодирования с полиномиальной сложностью в канале
с жесткими решениями с исправлением ошибок кратности до половины «конструктивного расстояния». Конструктивное расстояние
БЧХ-кодов при фиксированном размере алфавита асимптотически
плохое, доля исправляемых ошибок убывает с ростом длины кодов, тем не менее, при конечных длинах эти коды достаточно хороши. Коды Рида–Соломона имеют наибольшее возможное расстояние, удовлетворяющее границе Синглтона, но алфавит кода растет
с его длиной.
Итак, достоинство рассматриваемых в данном разделе кодов —
простота конструкции и алгоритма декодирования в канале с жест-

6.1. Определение БЧХ-кода

171

кими решениями. Недостаток — отсутствие разумного по сложности алгоритма декодирования в канале с мягкими решениями. Этот
недостаток частично преодолевается использованием предложенного Форни декодирования по МОР (минимуму обобщенного расстояния), которое сводится к многократному декодированию в жестком
канале. Этот метод будет рассмотрен позже в параграфе 7.5.

6.1.

Определение БЧХ-кода

Прежде чем будут даны формальные определения, попробуем самостоятельно построить код с минимальным расстоянием 5, т.е. код,
исправляющий две ошибки. В примерах на построение линейных
кодов мы легко научились строить коды с расстоянием 1, 2, 3, 4. Не
может быть, чтобы следующий шаг оказался для нас непосильным.
Запишем проверочную матрицу кода Хэмминга (15,11) в виде

(︀
)︀
𝐻 = 1 𝛼1 𝛼2 · · · 𝛼14 ,
где 𝛼 обозначает примитивный элемент поля 𝐺𝐹 (24 ), построенного,
например, с помощью примитивного многочлена 𝑝(𝑥) = 1 + 𝑥 + 𝑥4 .
Чтобы получить двоичную форму матрицы (она нам сейчас не нужна), достаточно записать степени примитивного элемента в виде
двоичных коэффициентов их разложения по степеням 𝛼.
Упражнение 6.1. Постройте поле 𝐺𝐹 (24 ).

Результат выполнения этого упражнения приведен в табл. 6.1.
Одну ошибку, как и должно быть, код исправляет. Пусть 𝑏(𝑥) =
= 𝑐(𝑥) + 𝑒(𝑥) — полином, соответствующий принятой из канала последовательности при передаче кодового слова 𝑐(𝑥), полином 𝑒(𝑥)
соответствует вектору ошибок. Тогда синдром мы запишем как

𝑠=

𝑛−1
∑︁
𝑖=0

𝑖

𝑏𝑖 𝛼 =

𝑛−1
∑︁

𝑒𝑖 𝛼𝑖 = 𝑏(𝛼) = 𝑒(𝛼).

𝑖=0

Если, скажем, ошибка произошла в позиции с номером 𝑖, то
𝑏(𝑥) = 𝑥𝑖 и 𝑠 = 𝛼𝑖 , и по 𝑠 мы однозначно определим номер ошибочной позиции 𝑖. Посмотрим, что произойдет в случае двух ошибок.

172

6. БЧХ-коды и РС-коды
Пусть 𝑒(𝑥) = 𝑥𝑖 + 𝑥𝑗 , 𝑖 ̸= 𝑗 . Получим
(6.1)

𝑠 = 𝛼𝑖 + 𝛼𝑗 .

В правой части получили некоторый элемент поля, который
ошибочно указывает нам на некоторую позицию, где ошибки нет.
Очевидно, имея только одну строку в матрице 𝐻 , мы не сможем
исправить две ошибки. Уравнение (6.1) — одно уравнение с двумя
неизвестными. Исправить положение могло бы второе уравнение.
Таким образом, нужна дополнительная избыточность в виде еще
одной строки, и тогда у нас была бы система уравнений вида
{︂
𝑠1 = 𝛼 𝑖 + 𝛼 𝑗 ;
(6.2)
𝑠2 = 𝑓 (𝛼𝑖 ) + 𝑓 (𝛼𝑗 ).
Если удачно выбрать функцию 𝑓 , то из этих двух уравнений с
двумя неизвестными мы смогли бы находить единственную неизвестную пару (𝑖, 𝑗) и тем самым гарантировать исправление двух
ошибок, т.е. гарантировать минимальное расстояние 5. Заметим,
что линейные функции не годятся, поскольку уравнения окажутся
линейно зависимыми. Из нелинейных функций первое, что приходит на ум — возведение в квадрат.
Это правильное решение, но не для любого поля. Для полиномов с коэффициентами из поля 𝐺𝐹 (2) имеет место тождество
𝑏(𝑥2 ) = (𝑏(𝑥))2 , из которого следует 𝑠2 = (𝑠1 )2 . Это означает, что
любое решение первого уравнения одновременно является решением второго.
Выберем функцию 𝑓 (𝑥) = 𝑥3 . Тогда новая проверочная матрица
примет вид
(︂ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 )︂
1 𝛼 𝛼 𝛼 𝛼 𝛼 𝛼 𝛼 𝛼 𝛼 𝛼 𝛼 𝛼 𝛼 𝛼
𝐻=
3
6
9
12
3
6
9
12
3
6
9
12 . (6.3)
1 𝛼 𝛼 𝛼 𝛼

1 𝛼 𝛼 𝛼 𝛼

1

𝛼

𝛼

𝛼

𝛼

Во второй строке записаны элементы первой строки, возведенные в третью степень.
Пусть, как и прежде, 𝑖 и 𝑗 — номера ошибочных позиций. Введем обозначения 𝑥 = 𝛼𝑖 , 𝑦 = 𝛼𝑗 . Тогда, обозначив скалярное произведение первой строки с принятой последовательностью через 𝑠1 ,

6.1. Определение БЧХ-кода
Таблица
6.1.
Поле
𝑝(𝑥) = 1 + 𝑥 + 𝑥4
Степень
−∞
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14

𝐺𝐹 (24 ),

Многочлен
0
1
𝑥
𝑥2
𝑥3
1+𝑥
𝑥 + 𝑥2
𝑥2 + 𝑥3
1 + 𝑥 + 𝑥3
1 + 𝑥2
𝑥 + 𝑥3
1 + 𝑥 + 𝑥2
𝑥 + 𝑥2 + 𝑥3
1 + 𝑥 + 𝑥2 + 𝑥3
1 + 𝑥2 + 𝑥3
1 + 𝑥3

173
порожденное

многочленом

Последовательность
0000
0001
0010
0100
1000
0011
0110
1100
1011
0101
1010
0111
1110
1111
1101
1001

второй — через 𝑠3 , получаем уравнения
{︂
𝑥 + 𝑦 = 𝑠1 ;
𝑥3 + 𝑦 3 = 𝑠 3 .

(6.4)

При одной или двух ошибках 𝑠1 ̸= 0, поэтому, деля второе уравнение на первое, находим

𝑥2 + 𝑦 2 + 𝑥𝑦 = 𝑠3 /𝑠1 .
Здесь мы воспользовались тем, что в поле характеристики 2
вычитание и сложение эквивалентны. Поскольку в этом поле (𝑎 +
𝑏)2 = 𝑎2 + 𝑏2 , имеем
𝑥𝑦 = 𝑠3 /𝑠1 − 𝑠21 .
По теореме Виета, произведение и сумму двух чисел можно интерпретировать как коэффициенты квадратного уравнения с кор-

174
нями 𝑥 и 𝑦 :

6. БЧХ-коды и РС-коды

𝑧 2 + 𝜎1 𝑧 + 𝜎2 = 0,

где

𝜎1 = 𝑠1 ,

𝜎2 = 𝑠3 /𝑠1 − 𝑠21 .

(6.5)
(6.6)

Итак, задачу декодирования можно считать решенной при условии, что мы умеем решать квадратные уравнения над конечными
полями. Хотя решения уравнений небольшой степени (до 4-й) можно искать непереборными методами, на практике чаще всего их решают просто подстановкой в уравнение вида (6.5) всех ненулевых
элементов поля. Порядок сложности этой процедуры примерно такой же, как порядок сложности вычисления синдрома. Поэтому логическая простота такого решения делает его предпочтительным.
Подытожим процедуру декодирования данного кода в виде алгоритма 6.1.
Пример 6.1. Рассмотрим код с проверочной матрицей (6.3). Пред-

положим, что на выходе канала наблюдается последовательность
(1, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 1). Вычисляем синдром: 𝑠1 = 𝛼11
и 𝑠3 = 𝛼4 , находим коэффициенты уравнения, 𝜎1 = 𝛼11 , 𝜎2 = 𝛼11 .
Поочередной подстановкой элементов поля убеждаемся в том, что
корнями являются 𝛼2 и 𝛼9 . Это означает, что ошибочными являются позиции с номерами 3 и 10. Кодовое слово с исправленными
ошибками имеет вид (1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 1, 1). Информационные символы (1, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1) выдаются
получателю (в предположении, что использовано систематическое
кодирование).

Мы убедились в том, что код, заданный проверочной матрицей вида (6.3), исправляет любые 2-кратные ошибки. Можно утверждать, что его минимальное расстояние не меньше 5, а число проверочных символов не больше 8 (оно равно 8, если строки 𝐻 линейно независимы, что имеет место в данном случае). Построенный
код — БЧХ-код (15,7) с минимальным расстоянием 5.
Название кода — аббревиатура от имен авторов конструкции
Боуза и Чоудхури [56] (1960) и Хоквингема [79] (1959).

6.1. Определение БЧХ-кода

175

Алгоритм 6.1. Исправление двух ошибок
Input: Двоичная последовательность 𝑏, полученная из

канала ;
Output: Кодовое слово 𝑐;
Инициализация: 𝑐 ← 𝑏, флаг успешного декодирования 𝐹 = 1;
Вычисляем компоненты синдрома 𝑠1 и 𝑠3 ;

if 𝑠1 = 𝑠3 = 0 then

Имеем кодовое слово. Декодирование закончено

else
if 𝑠1 = 0 , 𝑠3 ̸= 0 then

Ошибок больше 2. Декодирование невозможно ;
𝐹 ← 0;

else
if 𝑠1 ̸= 0 , 𝑠3 = 𝑠31 then

Одиночная ошибка ;
Находим позицию ошибки по 𝑠1 и исправляем,
инвертируя соответствующую позицию в 𝑐.

else

Находим коэффициенты уравнения (6.5) по
формулам (6.6);
Поочередной подстановкой элементов 1, 𝛼1 , . . . ,
𝛼𝑛−1 в уравнение (6.5) находим корни уравнения;
if корни найдены then
исправляем ошибки в 𝑐
else

корни не найдены;
число ошибок не меньше 3; 𝐹 ← 0;

end
end
end

end
Вывод: Флаг 𝐹 , последовательность 𝑐

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

176

6. БЧХ-коды и РС-коды

Первая строка в (6.3) показывает, что 𝑐(𝑥) — кодовое слово, если 𝑐(𝛼) = 0, откуда немедленно следует, что 𝛼, 𝛼2 , 𝛼4 , . . . являются
корнями 𝑐(𝑥), т.е. все корни минимального многочлена являются
корнями 𝑐(𝑥). Это означает, что 𝑐(𝑥) делится на минимальный многочлен 𝑀1 (𝑥) = 𝑝(𝑥) примитивного элемента 𝛼. Точно так же мы
устанавливаем, что 𝑐(𝑥) делится на минимальный многочлен 𝑀3 (𝑥)
элемента 𝛼3 . Отсюда следует, что построенный код — циклический
с порождающим многочленом

𝑔(𝑥) = 𝑀1 (𝑥)𝑀3 (𝑥).

Теорема 6.1. (Граница БЧХ.) Пусть 𝑔(𝑥) — порождающий мно-

гочлен циклического кода, и 𝛼 — примитивный элемент конечного
поля. Если для некоторых чисел 𝑏 ≥ 0 и 𝑑 ≥ 2 имеют место равенства
𝑔(𝛼𝑖 ) = 0, 𝑖 = 𝑏, . . . , 𝑏 + 𝑑 − 2,
(6.7)
то минимальное расстояние кода не меньше 𝑑.

Иными словами, если 𝑑 − 1 последовательных степеней примитивного элемента поля обращают в ноль порождающий многочлен
кода, то минимальное расстояние не меньше 𝑑. В рассмотренном
выше примере кода, исправляющего 2 ошибки, такими степенями
были 1, 2, 3, 4. При этом, как мы убедились, расстояние кода было
не меньше 5.
Доказательство. Из условия теоремы следует, что каждое кодовое слово 𝑐(𝑥) обращается в ноль при подстановке вместо 𝑥 любого
из 𝑑 − 1 элементов вида 𝛼𝑖 , 𝑖 = 𝑏, . . . , 𝑏 + 𝑑 − 2. Отсюда следует, что
проверочная матрица кода может быть записана в виде


1
𝛼𝑏
𝛼2𝑏
···
𝛼(𝑛−1)𝑏
⎜1 𝛼𝑏+1
𝛼2(𝑏+1) · · · 𝛼(𝑛−1)(𝑏+1) ⎟


𝐻 = ⎜.
(6.8)
⎟.
..
..
..
..

⎝ ..
.
.
.
.

1 𝛼𝑏+𝑑−2 𝛼2(𝑏+𝑑−2) · · · 𝛼(𝑛−1)(𝑏+𝑑−2)
Докажем, что любые 𝑑 − 1 столбцов линейно независимы. Для
этого рассмотрим произвольный набор индексов 𝑖1 , . . . , 𝑖𝑑−1 и соот-

6.1. Определение БЧХ-кода

177

ветствующую подматрицу

𝛼 𝑖1 𝑏
𝛼 𝑖2 𝑏
𝑖
(𝑏+1)
𝑖
⎜ 𝛼1
𝛼 2 (𝑏+1)


..
..

.
.

···
···
..
.

𝛼𝑖𝑑−1 𝑏



𝛼𝑖𝑑−1 (𝑏+1)
..
.



⎟.


𝛼𝑖1 (𝑏+𝑑−2) 𝛼𝑖2 (𝑏+𝑑−2) · · · 𝛼𝑖𝑑−1 (𝑏+𝑑−2)

Ее определитель равен

1
⎜ 𝛼 𝑖1

𝛼(𝑖1 +...+𝑖𝑑−1 )𝑏 det ⎜
..

.

1
𝛼 𝑖2
..
.

···
···
..
.

1



𝛼𝑖𝑑−1
..
.



⎟.


𝛼𝑖1 (𝑑−2) 𝛼𝑖2 (𝑑−2) · · · 𝛼𝑖𝑑−1 (𝑑−2)

Известно тождество

1
1
···
⎜ 𝑎1
𝑎
·
··
2

det ⎜ ..
..
.
..
⎝ .
.

1
𝑎𝑚
..
.

· · · 𝑎𝑚−1
𝑎𝑚−1
𝑎𝑚−1
𝑚
2
1

(6.9)


𝑚
⎟ 𝑚−1
∏︁ ∏︁

=
(𝑎𝑖 − 𝑎𝑗 ),



(6.10)

𝑗=1 𝑖=𝑗+1

в котором матрица в левой части называется матрицей Вандермонда. Ее определитель называют определителем Вандермонда. Он
отличен от нуля, если элементы 𝑎1 , . . . , 𝑎𝑚 различны.
Нетрудно видеть, что определитель в (6.9) является частным
случаем определителя Вандермонда. Поскольку 𝛼 — примитивный
элемент, его различные степени различны, определитель не равен
нулю, ранг матрицы 𝐻 не меньше 𝑑 − 1, и, следовательно, минимальное расстояние кода не меньше 𝑑.
Определение 6.1. Циклический код длины 𝑛 над 𝐺𝐹 (𝑞) называ-

ется кодом БЧХ с конструктивным расстоянием 𝑑, если для некоторого 𝑏 ≥ 0 порождающий многочлен кода равен
𝑔(𝑥) = НОК {𝑀𝑖 (𝑥), 𝑖 = 𝑏, 𝑏 + 1, . . . , 𝑏 + 𝑑 − 2} .

(6.11)

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

178

6. БЧХ-коды и РС-коды

многочленов, поскольку минимальные многочлены часто совпадают.
Например, рассмотренный выше код с расстоянием 5 имел корнями примитивный элемент в степени с первой по четвертую. Для
степеней 1, 2 и 4 минимальным многочленом служил общий примитивный многочлен, по которому было построено само поле. Поэтому порождающий многочлен — произведение не четырех, а только
двух минимальных многочленов, соответствующих первой и третьей степеням примитивного элемента.
Теорема 6.2. Пусть код БЧХ длины 𝑛 с конструктивным рас-

стоянием 𝑑 над полем 𝐺𝐹 (𝑝) задан порождающим многочленом,
корнями которого являются 𝑑−1 последовательных степеней элемента 𝛼 порядка 𝑛 в некотором расширении 𝐺𝐹 (𝑝𝑚 ) поля 𝐺𝐹 (𝑝).
Тогда минимальное расстояние кода не меньше 𝑑, а размерность
кода не меньше 𝑛 − 𝑚(𝑑 − 1).
Доказательство. Обоснования требует только оценка размерности кода. Поскольку степень каждого минимального многочлена не
превышает 𝑚, а число сомножителей, образующих порождающий
многочлен, не превышает 𝑑 − 1, степень произведения не больше
𝑚(𝑑 − 1). Эта величина является верхней оценкой избыточности
кода.
Коды БЧХ длины 𝑛 = 𝑞 𝑚 − 1 называют примитивными. Длины
непримитивных БЧХ-кодов являются делителями числа 𝑞 𝑚 − 1.
Для двоичных БЧХ-кодов оценка теоремы 6.2 может быть существенно улучшена. Поскольку минимальный многочлен 𝑀2𝑖 (𝑥)
совпадает с 𝑀𝑖 (𝑥), выбрав в качестве порождающего многочлена

𝑔(𝑥) = НОК {𝑀1 (𝑥), 𝑀3 (𝑥), . . . , 𝑀2𝑡−1 (𝑥)} ,

(6.12)

можно гарантировать конструктивное расстояние 𝑑 = 2𝑡+1. Отсюда
получаем оценку размерности двоичного БЧХ-кода с минимальным
расстоянием 𝑑 = 2𝑡 + 1:
𝑘 ≥ 𝑛 − 𝑚𝑡.
(6.13)

6.2. Построение БЧХ-кодов. Примеры

6.2.

179

Построение БЧХ-кодов. Примеры

Из предыдущего параграфа, в принципе, понятно, как можно построить БЧХ-код с заданным числом исправляемых ошибок. Для
этого нужно подобрать последовательность корней порождающего
многочлена в соответствии с определением 6.1 и построить порождающий многочлен в соответствии с (6.11) или (6.12).
Заметим, что истинная избыточность кода зависит от того, какими конкретно окажутся наборы примитивных многочленов.
Те элементы поля, которые имеют одинаковые минимальные
многочлены, называют сопряженными элементами. Поскольку в
поле характеристики 𝑝 значения любого полинома в точках 𝛽
и 𝛽 𝑝 одинаковы, то подмножества сопряженных элементов можно получать возведением элементов в степень 𝑝. Пусть для некоторого 𝑠 имеет место равенство 𝛽 = 𝛼𝑠 , где 𝛼 — примитивный элемент поля, и пусть 𝑚𝑠 — наименьшее число, такое, что
𝑝𝑚𝑠 𝑠 = 𝑠 (mod 𝑝𝑚 − 1). Наборы показателей степеней

{𝑠, 𝑝𝑠, 𝑝2 𝑠, . . . , 𝑝𝑚𝑠 𝑠}
при различных 𝑠 образуют непересекающиеся множества, называемые циклотомическими классами. В каждом классе наименьшее
число 𝑠 называется представителем класса.
Циклотомические классы не пересекаются и покрывают все
множество показателей степеней мультипликативной группы поля.
Оценки параметров БЧХ-кодов определяются структурой циклотомических классов и выбранным расширением конечного поля.
Пример 6.2. Циклотомическими классами по модулю 15 являются

множества

𝐶0
𝐶1
𝐶3
𝐶5
𝐶7

= {0};
= {1, 2, 4, 8};
= {3, 6, 12, 9};
= {5, 10};
= {7, 14, 13, 11}.

Исходя из структуры циклотомических классов, легко построить таблицу БЧХ-кодов длины 15. Их параметры приведены в
табл. 6.2.

180

6. БЧХ-коды и РС-коды
Таблица 6.2. Примеры БЧХ-кодов длины 15

Показатели
степеней корней
0
1,2,4,8
0,1,2,4,8
1,2,3,4,6,9,12
1,. . . ,5,6,8,9,
10,12
1,2,. . . ,14

Порождающий
многочлен
𝑀0 (𝑥) = 𝑥 + 1
𝑀1 (𝑥)
𝑀0 (𝑥)𝑀1 (𝑥)
𝑀1 (𝑥)𝑀3 (𝑥)
𝑀1 (𝑥)𝑀3 (𝑥)×
×𝑀5 (𝑥)
𝑀1 (𝑥)𝑀3 (𝑥)×
×𝑀5 (𝑥)𝑀7 (𝑥)

Размерность
𝑛 − deg 𝑔(𝑥)
14
11
10
7
5

Расстояние
2
3
4
5
7

1

15

Упражнение 6.2. Постройте циклотомические классы и таблицу

кодов длины 31.

Пример 6.3. Приведем пример непримитивного БЧХ-кода. Поло-

жим 𝑛 = 23. Циклотомические классы имеют вид:

𝐶0 = {0};
𝐶1 = {1, 2, 4, 8, 16, 9, 18, 13, 3, 6, 12};
𝐶5 = {5, 10, 20, 17, 11, 22, 21, 19, 15, 7, 14}.
Примеры кодов приведены в табл. 6.3. Код во второй строке —
код Голея. На этом примере мы видим, что оценка БЧХ на минимальное расстояние бывает неточной.
Итак, для получения параметров БЧХ-кода достаточно знания
структуры циклотомических классов поля, из которого выбираются
корни порождающего многочлена.
Для нахождения порождающего многочлена нужно знать минимальные многочлены корней. Один из способов их нахождения
минимальных многочленов:
∏︁
𝑀𝑖 (𝑥) =
(𝑥 − 𝛼𝑗 ),
𝑗∈𝐶𝑖

где произведение вычисляется по всем элементам циклотомического класса.

6.2. Построение БЧХ-кодов. Примеры

181

Таблица 6.3. Примеры БЧХ-кодов длины 23
Показатели
степеней
корней

ПорождаРазмерность
ющий
𝑛 − deg 𝑔(𝑥)
многочлен
0
𝑀0 (𝑥) = 𝑥 + 1
22
1,2,3,4,6,8,...
𝑀1 (𝑥)
12
...19,20,21,22,...
𝑀5 (𝑥)
12
0,1,2,3,4,6,...
𝑀0 (𝑥)𝑀1 (𝑥)
11
1,...,23
𝑀1 (𝑥)𝑀5 (𝑥)
1

Расстояние
конструк-

истин-

тивное

ное

2
5
5
6
23

2
7
7
8
23

Таблица 6.4. Двоичные примитивные многочлены
Степень
2
3
4
5
6
7
8
9
10
11
12
13
14
15

Полином
2,1,0
3,1,0
4,1,0
5,2,0
6,1, 0
7,3,0
8,4, 3, 2,0
9,4,0
10,3,0
11,2,0
12,6,4,1,0
13,4,3,1,0
14,10,6,1,0
15,1,0

Степень
16
17
18
19
20
21
22
23
24
25
26
27
28
29

Полином
16,12,3,1,0
17,3,0
18,7,0
19,5,2,1,0
20,3,0
21,2,0
22,1,0
23,5,0
24,7,2,1,0
25,3,0
26,6,2,1,0
27,5,2,1,0
28,3,0
29,2,0

Пример 6.4. Минимальный многочлен элемента 𝛼5 в поле 𝐺𝐹 (24 ),

заданном примитивным полиномом 𝑝(𝑥) = 1 + 𝑥 + 𝑥4 , равен

𝑀5 (𝑥) = (𝑥 + 𝛼5 )(𝑥 + 𝛼10 ) =
= 𝑥2 + (𝛼5 + 𝛼10 )𝑥 + 𝛼0 =
= 𝑥2 + 𝑥 + 1

182

6. БЧХ-коды и РС-коды

Таблица 6.5. Разложения чисел 2𝑚 − 1 на простые сомножители

𝑚
3
4
5
6
7
8
9
10
11
12
13

Разложение
7
3×5
31
3×3×7
127
3×5×17
7×73
3×11×31
23×89
3×3×5×7×13
8191

𝑚
14
15
16
17
18
19
20
21
22
23
24

Разложение
3×43×127
7×31×151
3×5×17×257
131071
3
3 × 7 × 19 × 73
524287
3×5×5×11×31×41
7×7×127×337
3×23×89×683
47×178841
3×3×5×7×13×17×241

При выполнении этих вычислений использована табл. 6.1. Согласно этой таблице двоичными представлениями 𝛼5 и 𝛼10 служат
(0110) и (0111). Сумма этих элементов равна единице.
Для построения двоичных БЧХ-кодов нужны примитивные
многочлены, задающие поля 𝐺𝐹 (2𝑚 ). Примеры таких многочленов
представлены в табл. 6.4. В таблице указаны степени, входящие в
многочлен с ненулевыми коэффициентами.
Для построения непримитивных кодов БЧХ полезны разложения чисел вида 2𝑚 − 1 на простые сомножители. Разложения для
относительно малых значений 𝑚 приведены в табл. 6.5.

6.3.

Коды Рида–Соломона

Хотя это не подчеркивалось особо, при изучении кодов БЧХ мы, в
основном, интересовались двоичными кодами. По крайней мере, все
коды в примерах были двоичными. Вся теория, на которой базируются БЧХ-коды, в равной степени верна и для недвоичных кодов.
Недвоичные коды могут быть полезны в системах связи с недвоичной модуляцией. В этом смысле среди недвоичных кодов особенно
интересны коды, алфавиты которых — расширения двоичного поля.

6.3. Коды Рида–Соломона

183

В определенном смысле корректирующая способность недвоичных кодов при одинаковом числе гарантированно исправляемых
ошибок несколько лучше, чем двоичных кодов: если несколько двоичных ошибок приходятся на один недвоичный символ недвоичного
кода, они рассматриваются как одна ошибка. Это означает, что код
над полем 𝐺𝐹 (2𝑚 ), исправляющий 𝑡 ошибок, в действительности
может исправить 𝑡 «синхронизированных» пакетов ошибок длины
𝑚 каждый, т.е. вплоть до 𝑡𝑚 ошибок. Во многих системах передачи и хранения информации ошибки группируются, и поэтому коды
над большими алфавитами могут оказаться весьма практичными.
По сути, коды Рида–Соломона [98] (РС-коды, 1960 г.) — частный
случай БЧХ-кодов. В соответствии с (6.11), избыточность БЧХкода тем меньше, чем меньше степень минимальных многочленов,
образующих порождающий многочлен циклического кода. Степень
не может быть меньше 1, и она равна единице, если формальная переменная 𝑥 принимает значения в том же поле, что и поле 𝐺𝐹 (2𝑚 ),
использованное для построения проверочной матрицы кода. Действительно, в таком поле минимальным многочленом элемента 𝛽
служит 𝑥 − 𝛽 . Поскольку степеням переменной 𝑥 соответствуют позиции кодового слова, длина кода должна быть не больше числа
элементов мультипликативной группы поля.
Определение 6.2. Кодом Рида–Соломона над 𝐺𝐹 (𝑞) называется

код БЧХ длины 𝑛 = 𝑞 − 1.

Из определения следует, что порождающий многочлен кода
Рида–Соломона с конструктивным расстоянием 𝑑 имеет вид

𝑔(𝑥) = (𝑥 − 𝛼𝑏 )(𝑥 − 𝛼𝑏+1 ) × · · · × (𝑥 −𝛼𝑏+𝑑−2 ).

(6.14)

Чаще всего полагают 𝑏 = 1, но другие значения 𝑏 также используются и, более того, иногда приводят к более простым схемам
кодирования.
Из (6.14) и теорем 6.1 и 6.2 следует, что параметры РС-кода
связаны соотношением

𝑑 − 1 = 𝑛 − 𝑘,

(6.15)

т.е. удовлетворяют границе Синглтона. Поскольку граница Синглтона одновременно является верхней границей на минимальное

184

6. БЧХ-коды и РС-коды

расстояние кодов, РС-коды являются оптимальными в смысле минимального расстояния, их еще называют кодами с максимально
достижимым расстоянием (МДР-кодами).
Пример 6.5. Рассмотрим код длины 𝑛 = 15 над полем 𝐺𝐹 (24 ).

Для построения кода с минимальным расстоянием 5 положим 𝑏 = 1,
и тогда

𝑔(𝑥) = (𝑥 − 𝛼)(𝑥 − 𝛼2 )(𝑥 − 𝛼3 )(𝑥 − 𝛼4 ) = 𝑥4 + 𝛼13 𝑥3 + 𝛼6 𝑥2 + 𝛼3 𝑥 + 𝛼10 .
Имеем (15,11)-код с 𝑑 = 5. Напомним, что двоичный код с таким
же расстоянием имел параметры (15,7). Если записывать информационные и кодовые символы 𝐺𝐹 (24 ) в двоичном виде, то получим
линейный код (60, 44) с расстоянием 5. Как двоичный код этот код
неоптимален, т.к. для кода с такой длиной и размерностью достижимое расстояние точно неизвестно, оно лежит в интервале от 6
до 7.
Одно из основных применений РС-кодов — использование в качестве компонентных кодов в каскадных конструкциях, которые будут рассматриваться позже (см. задачу 7 в конце главы).
При заданном размере алфавита желательно иметь код как
можно большей размерности. В этом смысле полезны расширенные
коды Рида–Соломона длины 𝑛 = 𝑞 + 1, размерности 𝑘 с расстоянием 𝑑 = 𝑛 − 𝑘 + 1. Проверочная матрица такого кода может быть
представлена, в частности, в виде


1
1
1
···
1
0
⎜0
𝛼
𝛼2
···
𝛼(𝑞−1)
0⎟


𝐻 = ⎜.
..
..
..
.. ⎟ .
..
⎝ ..
.
.
.
.
.⎠

0 𝛼𝑞−𝑘 𝛼2(𝑞−𝑘) · · · 𝛼(𝑞−𝑘)(𝑞−1) 1
Легко убедиться в том, что любые 𝑛 − 𝑘 столбцов этой матрицы
линейно независимы.

Задачи
1. Постройте матрицу вида (6.3), но с возведением элементов
первой строки не в третью, а во вторую степень. Определите
минимальное расстояние и размерность кода.

Задачи

185

2. Напишите программы для построения поля, нахождения минимальных многочленов, нахождения корней уравнений перебором по элементам поля. Напишите программу удобного МАТЛАБ-калькулятора для выполнения арифметических
операций в конечном поле. Этот калькулятор пригодится при
решении задач на декодирование БЧХ и РС-кодов.
3. Укажите параметры БЧХ-кодов длины 31 и 63. Сравните параметры с параметрами лучших известных линейных кодов.
4. Укажите параметры непримитивных БЧХ-кодов длины 17 и
21. Сравните их с параметрами лучших известных линейных
кодов.
5. Построить порождающие многочлены двоичных БЧХ-кодов и
РС-кодов длины 31, исправляющих 2-кратные ошибки.
6. Код БЧХ длины 31, исправляющий 2-кратные ошибки, использован для передачи сообщений. Примитивный многочлен,
использованный для построения кода 𝑝(𝑥) = 1+𝑥2 +𝑥5 . На выходе двоичного канала связи наблюдается последовательность
𝑦 =403415447 (это двоичная последовательность, записанная
в восьмеричной форме). Определите переданное сообщение.
7. Каскадные коды [18]. Выберем два кода:

∙ (𝑁, 𝐾)-код Рида–Соломона с минимальным расстоянием
𝐷 над полем 𝐺𝐹 (2𝑘 ) (внешний код);
∙ двоичный (𝑛, 𝑘)-код с минимальным расстоянием 𝑑 (внутренний код).
Кодирование для каскадного кода выполняется в два этапа.
Последовательность из 𝑘𝐾 двоичных информационных символов разбивается в блоки по 𝑘 бит, каждый блок интерпретируется как элемент поля 𝐺𝐹 (2𝑘 ) и последовательность из
𝐾 расширенных информационных символов кодируется внешним кодом. Затем 𝑁 кодовых символов этого кода интерпретируются как двоичные последовательности длины 𝑘 и кодируются внутренним кодом. Полученная на выходе кодера после-

186

6. БЧХ-коды и РС-коды
довательность представляет собой кодовое слово каскадного
кода.

∙ Найдите параметры (длину, скорость и расстояние) каскадного кода.
∙ Является ли код линейным?
∙ По аналогии с декодированием итеративных кодов (см.
задачу 4 главы 2) предложите процедуры декодирования
каскадного кода.
∙ Сравните каскадные и итеративные коды по скорости,
расстоянию, сложности построения, сложности декодирования.

7.

Декодирование БЧХи РС-кодов

В предыдущей главе на примере кодов, исправляющих двукратные
ошибки, мы рассмотрели одну из возможных процедур декодирования. Непосредственно из структуры проверочной матрицы видно,
что задача декодирования сводится к решению системы нелинейных уравнений относительно позиций ошибок (точнее, элементов
поля, соответствующих позициям ошибок). Огромное практическое
значение кодов БЧХ и РС послужило стимулом к поиску более эффективных алгоритмов. Одно из первых решений задачи — алгоритм Питерсона (1960) и Горенстейна–Цирлера (1961), который сводит задачу исправления 𝑡 ошибок к решению системы из 𝑡 линейных
уравнений. Сложность такого декодирования пропорциональна 𝑡3 .
Берлекэмп (1968), используя особенности матрицы коэффициентов системы уравнений, уменьшил сложность решения до величины порядка 𝑡2 . Месси (1969) сумел интерпретировать алгоритм Берлекэмпа как алгоритм построения рекуррентного фильтра, тем самым упростив и понимание алгоритма, и его реализацию. В окончательном виде этот алгоритм получил название алгоритма Берлекэмпа–Месси. Дальнейшее упрощение декодирования
связано с применением быстрых преобразований Фурье над конечными полями. Основные исследования в этой области были выполнены Блэйхутом (1981). В результате достигнута асимптотическая
сложность декодирования кода длины 𝑛, пропорциональная 𝑛 log 𝑛.
Тем не менее, на практике при реализации декодирования на БИС
чаще всего применяется обычная версия алгоритм Берлекэмпа–

188

7. Декодирование БЧХ- и РС-кодов

Месси. В данной главе рассматриваются алгоритм Питерсона–
Горенстейна–Цирлера (ПГЦ) и алгоритм Берлекэмпа–Месси (БМ).

7.1.

Алгоритм Питерсона–Горенстейна–
Цирлера

При описании декодирования кодов БЧХ и РС нет необходимости
различать эти два класса кодов. Достаточно рассматривать БЧХкоды над произвольным полем 𝐺𝐹 (𝑞). Объяснения будут немного проще, если мы предположим, что последовательными корнями
порождающего многочлена являются 𝛼, 𝛼2 , ..., 𝛼𝑑−1 , где 𝛼 — примитивный элемент поля. Через 𝑑 мы обозначили конструктивное
расстояние кода, ему соответствует кратность исправляемых ошибок 𝑡 = ⌊(𝑑 − 1)/2⌋. Напомним, что ⌊𝑎⌋ обозначает округление 𝑎
вниз до ближайшего целого.
Переданное кодовое слово 𝑐(𝑥), вектор ошибок 𝑒(𝑥) и принятую
из канала последовательность 𝑣(𝑥) запишем в виде

𝑐(𝑥) = 𝑐0 + 𝑐1 𝑥 + ... + 𝑐𝑛−1 𝑥𝑛−1 ;
𝑒(𝑥) = 𝑒0 + 𝑒1 𝑥 + ... + 𝑒𝑛−1 𝑥𝑛−1 ;
𝑣(𝑥) = 𝑐(𝑥) + 𝑒(𝑥) = 𝑣0 + 𝑣1 𝑥 + ... + 𝑣𝑛−1 𝑥𝑛−1 .
Поскольку 𝑐(𝛼𝑗 ) = 0 при 𝑗 = 1, ..., 𝑑 − 1, для соответствующих
компонент синдрома имеем

𝑆𝑗 = 𝑣(𝛼𝑗 ) = 𝑒(𝛼𝑗 ).
Предположим, что число ошибок (вес вектора ошибок) 𝜈 < 𝑡 и
что ошибки произошли на позициях с номерами 𝑖1 , 𝑖2 , ..., 𝑖𝜈 . Тогда

𝑆𝑗 = 𝑒𝑖1 𝛼𝑖1 𝑗 + 𝑒𝑖2 𝛼𝑖2 𝑗 + · · · + 𝑒𝑖𝜈 𝛼𝑖𝜈 𝑗 ,
где 𝑒𝑖ℎ обозначает значение ошибки на позиции ℎ. Запись упростится, если использовать обозначения 𝑌ℎ = 𝑒𝑖ℎ , 𝑋ℎ = 𝛼𝑖ℎ . Получаем
систему уравнений

𝑆𝑗 = 𝑌1 𝑋1𝑗 + 𝑌2 𝑋2𝑗 + · · · + 𝑌𝜈 𝑋𝜈𝑗 ,

𝑗 = 1, ..., 𝑑 − 1.

(7.1)

7.1. Алгоритм Питерсона–Горенстейна–Цирлера

189

Величины 𝑌ℎ и 𝑋ℎ называют соответственно значениями и локаторами ошибок. При 𝜈 ≤ 𝑡 комбинация ошибок может быть исправлена, система имеет единственное решение, но найти его непросто,
поскольку система нелинейна и число неизвестных велико. Ключ
к решению задачи — в замене переменных: вместо 𝑋ℎ мы будем
искать коэффициенты полинома, корнями которого служат 𝑋ℎ−1 .
Этот полином называется полиномом локаторов ошибок.
Итак, введем полином

Λ(𝑥) =

𝜈
∏︁

(1 − 𝑥𝑋𝑗 ) = 1 + Λ1 𝑥 + ... + Λ𝜈 𝑥𝜈 .

(7.2)

𝑗=1

Поясним дальнейшие выкладки на примере случая 𝜈 = 3. Из
(7.1) имеем
𝑌1 𝑋1 + 𝑌2 𝑋2 + 𝑌3 𝑋3 = 𝑆1 ;
𝑌1 𝑋12 + 𝑌2 𝑋22 + 𝑌3 𝑋32 = 𝑆2 ;
(7.3)
𝑌1 𝑋13 + 𝑌2 𝑋23 + 𝑌3 𝑋33 = 𝑆3 ,
...
а из (7.2) последовательной подстановкой 𝑥 = 𝑋1−1 , 𝑥 = 𝑋2−1 и
𝑥 = 𝑋3−1 получаем
⎧ 3
⎨𝑋1 + Λ1 𝑋12 + Λ2 𝑋1 + Λ3 = 0;
𝑋 3 + Λ1 𝑋22 + Λ2 𝑋2 + Λ3 = 0;
(7.4)
⎩ 23
𝑋3 + Λ1 𝑋32 + Λ2 𝑋3 + Λ3 = 0.
Неизвестными для нас служат коэффициенты многочлена локаторов ошибок Λ𝑖 . В последней системе уравнений в столбцах локаторы стоят в одинаковых степенях. Это наводит на мысль, что
линейные комбинации столбцов могут порождать новые уравнения,
в которых коэффициентами при Λ𝑖 будут степенные суммы из (7.3),
т.е. синдромы. Действительно, умножая уравнения (7.4), соответственно, на 𝑋1 𝑌1 , 𝑋2 𝑌2 и 𝑋3 𝑌3 и суммируя, с учетом (7.3), получаем
уравнение
𝑆4 + Λ1 𝑆3 + Λ2 𝑆2 + Λ3 𝑆1 = 0.
Еще два уравнения получим, умножая (7.4) на 𝑋𝑖2 𝑌1 , 𝑖 = 1, 2, 3,
а потом на 𝑋𝑖3 𝑌1 , 𝑖 = 1, 2, 3. Получим систему линейных уравнений,
которая в матричной форме может быть записана как

190

7. Декодирование БЧХ- и РС-кодов


⎞⎛ ⎞ ⎛

𝑆1 𝑆2 𝑆3
Λ3
−𝑆4
⎝𝑆2 𝑆3 𝑆4 ⎠ ⎝Λ2 ⎠ = ⎝−𝑆5 ⎠ .
𝑆3 𝑆4 𝑆5
Λ1
−𝑆6

(7.5)

Контуры будущего алгоритма становятся понятными: из (7.5)
находим коэффициенты полинома локаторов ошибок, потом из
(7.2) — его корни, т.е. локаторы ошибок. После этого из (7.3) найдем
значения ошибок. Чтобы окончательно сформулировать алгоритм,
введем обозначения


𝑆1
𝑆2 · · ·
𝑆𝜇
⎜ 𝑆2
𝑆3 · · · 𝑆𝜇+1 ⎟



.
..
.. ⎟
..
M𝜇 = ⎜ .
,
(7.6)
.
.
. ⎟
⎝ .

.
𝑆𝜇 𝑆𝜇+1 .. 𝑆2𝜇−1


𝑋1 𝑋2 · · · 𝑋𝜇
⎜𝑋 2 𝑋 2 · · · 𝑋 2 ⎟
𝜇⎟
2
⎜ 1
..
.. ⎟
..
L𝜇 = ⎜
.
(7.7)
⎜ ...
.
.
. ⎟


.
𝑋1𝜇 𝑋2𝜇 .. 𝑋𝜇𝜇
Формулы (7.3) и (7.5) в общем случае имеют вид
⎛ ⎞
⎛ ⎞
𝑌1
𝑆1
⎜ 𝑌2 ⎟
⎜ 𝑆2 ⎟
⎜ ⎟
⎜ ⎟
L𝜇 ⎜ . ⎟ = ⎜ . ⎟ ;
⎝ .. ⎠
⎝ .. ⎠

(7.8)

𝑌𝜇

𝑆𝜇


Λ𝜇
−𝑆𝜇+1
⎜Λ𝜇−1 ⎟
⎜−𝑆𝜇+2 ⎟




M𝜇 ⎜ . ⎟ = ⎜ . ⎟ .
⎝ .. ⎠
⎝ .. ⎠
Λ1
−𝑆2𝜇




(7.9)

Теорема 7.1. Матрицы M𝜇 , L𝜇 невырождены, если 𝜇 равно числу

ошибок 𝜈 , и матрица M𝜇 вырождена, если 𝜈 < 𝜇.

7.2. Алгоритм Берлекэмпа–Месси

Доказательство. Докажем теорему на примере
Положим сначала 𝜈 = 𝜇 = 3 и запишем M3 в виде

⎞⎛
⎞⎛
1
1
1
𝑌1 𝑋1
0
0
1
𝑌2 𝑋2
0 ⎠ ⎝1
M3 = ⎝ 𝑋1 𝑋2 𝑋3 ⎠ ⎝ 0
𝑋12 𝑋22 𝑋32
0
0
𝑌3 𝑋3
1

191
случая 𝜇 = 3.


𝑋1 𝑋12
𝑋2 𝑋22 ⎠ .
𝑋3 𝑋32
(7.10)
Матрица M3 невырождена, поскольку является произведением
трех невырожденных матриц (две из них — матрицы Вандермонда).
Определитель матрицы L3 можно также выразить через определитель Вандермонда, и эта матрица также невырождена.
Допустим теперь, что 𝜇 = 3, но 𝜈 = 2. При этом разложение
(7.10) остается в силе, если положить 𝑌3 = 0. Очевидно, определитель матрицы M3 станет равным нулю, т.к. центральная матрица
в (7.10) окажется вырожденной.
Формально декодирование ПГЦ описывается алгоритмом 7.1.
Пример 7.1. Рассмотрим РС-код (15,9) над полем 𝐺𝐹 (24 ). Поле

задано примитивным многочленом 𝑝(𝑥) = 1 + 𝑥 + 𝑥4 , список элементов поля приведен в табл. 6.1. Пример декодирования со всеми
промежуточными вычислениями представлен в табл. 7.1.

7.2.

Алгоритм Берлекэмпа–Месси

Алгоритм ПГЦ сводит задачу нахождения позиций и значений 𝜈
ошибок к решению двух систем линейных уравнений порядка 𝜈 .
Для решения можно воспользоваться, например, методом Гаусса, и
тогда сложность вычислений будет иметь порядок 𝜈 3 . Можно заметить, что в (7.5) и (7.9) мы имеем дело с весьма специфической
матрицей коэффициентов: строки являются сдвигами предыдущих
строк. Такие матрицы (матрицы с постоянными диагоналями) называются теплицевыми. Для них существуют более простые способы обращения, чем для матриц общего вида. Рассматриваемый ниже алгоритм БМ использует сходство структуры матрицы коэффициентов со структурой, которая часто встречается во многих приложениях, в частности, в задачах цифровой обработки сигналов.

192

7. Декодирование БЧХ- и РС-кодов

Алгоритм
𝜈 ≤ 𝑡 = ⌊(𝑑 − 1)/2⌋ ошибок
Алгоритм

7.1.

ПГЦ.

Исправление

до

Input: Выход канала 𝑣(𝑥);
Output: Кодовое слово 𝑐(𝑥);

Вычислить компоненты синдрома
for 𝑗 = 1 to 𝑑 − 1 do 𝑆𝑗 = 𝑣(𝛼𝑗 ) ;

Положить 𝜈 = 𝑡 + 1, 𝐷 = 0 ;
while 𝐷 == 0 do
𝜈 ← 𝜈 − 1; 𝐷 = det(M𝜈 ).
end

Вычислить коэффициенты полинома Λ(𝑥) локаторов ошибок
как решение системы (7.9).
Найти локаторы ошибок как величины, обратные корням
Λ(𝑥).
Найти значения ошибок как решение системы (7.8).
Исправить ошибки: 𝑐(𝑥) = 𝑣(𝑥) − 𝑒(𝑥).
Выход: Последовательность 𝑐(𝑥).
Вернемся к системе уравнений (7.5). Каждое из уравнений этой
системы получается увеличением на единицу индексов при коэффициентах предыдущего уравнения. Уравнение с номером 𝑟 имеет
вид:

𝑆𝑟 = −

𝜈
∑︁

Λ𝑗 𝑆𝑟−𝑗 = −Λ1 𝑆𝑟−1 − Λ2 𝑆𝑟−2 − ... − Λ𝜈 𝑆𝑟−𝜈 .

(7.11)

𝑗=1

Можно интерпретировать это соотношение как предсказание величины следующей компоненты синдрома по предыдущим. Если
коэффициенты предсказания Λ1 , Λ2 , ..., Λ𝜈 известны, то по ним последовательным применением рекуррентного соотношения (7.11) из
компонент синдрома 𝑆1 , ..., 𝑆𝜈 получаются компоненты 𝑆𝜈+1 , ..., 𝑆2𝜈 .
Устройство, реализующее (7.11), в цифровой обработке сигналов называют рекурсивным фильтром. Таким образом, задача вычисления коэффициентов многочлена локаторов ошибок сводится к зада-

7.2. Алгоритм Берлекэмпа–Месси

193

Таблица 7.1. Декодирование РС-кода с исправлением трех ошибок
с помощью алгоритма Питерсона–Горенстейна–Цирлера
Порождающий многочлен
𝑔(𝑥) = 𝛼6 + 𝛼9 𝑥 + 𝛼6 𝑥2 + 𝛼4 𝑥3 + 𝛼14 𝑥4 + 𝛼10 𝑥5 + 𝑥6
Кодовое слово
𝑐(𝑥) = 𝛼 + 𝛼3 𝑥 + 𝛼10 𝑥2 + 𝛼12 𝑥3 + 𝛼13 𝑥4 + 𝛼3 𝑥5 + 𝛼9 𝑥6 + 𝛼5 𝑥7 +
+𝑥8 + 𝛼10 𝑥9 + 𝛼8 𝑥10 + 𝛼𝑥11 + 𝛼𝑥12 + 𝛼13 𝑥13 + 𝛼2 𝑥14
Выход канала
𝑣(𝑥) = 𝛼 + 𝛼3 𝑥 + 𝛼7 𝑥2 + 𝛼12 𝑥3 + 𝛼13 𝑥4 + 𝛼14 𝑥5 + 𝛼9 𝑥6 + 𝛼5 𝑥7 +
+𝑥8 + 𝛼10 𝑥9 + 𝛼8 𝑥10 + 𝛼𝑥11 + 𝛼10 𝑥12 + 𝛼13 𝑥13 + 𝛼2 𝑥14
Синдромный многочлен
𝑆(𝑥) = 𝛼8 + 𝛼2 𝑥 + 𝛼10 𝑥2 + 𝑥3 + 𝛼12 𝑥5
⎞⎛ ⎞ ⎛ ⎞
⎛ 8
Система уравнений для
Λ3
𝛼
𝛼2 𝛼10
1
коэффициентов
много- ⎝ 𝛼2 𝛼10 1 ⎠ ⎝Λ2 ⎠ = ⎝ 0 ⎠
члена локаторов ошибок
𝛼10 1
0
𝛼12
Λ1
13
5
2
4
Многочлен
локаторов Λ(𝑥) = 1 + 𝛼 𝑥 + 𝛼 𝑥 + 𝛼 𝑥3
ошибок
Локаторы ошибок
𝛼2 , 𝛼5 , 𝛼12
⎞⎛ ⎞ ⎛ 8 ⎞
⎛ 2
𝑌1
𝛼
𝛼5 𝛼12
𝛼
Система уравнений для
⎝𝛼4 𝛼10 𝛼9 ⎠ ⎝𝑌2 ⎠ = ⎝ 𝛼2 ⎠
значений ошибок
𝛼6 1
𝛼6
𝛼10
𝑌3
Значения ошибок
𝛼6 , 1, 𝛼8
Вектор ошибок
𝑒(𝑥) = 𝛼6 𝑥2 + 𝑥5 + 𝛼8 𝑥12
че построения кратчайшего рекурсивного фильтра по его выходной
последовательности. Фильтр, соответствующий уравнению (7.11),
показан на рис. 7.1. Отличие рассматриваемой задачи от обычной
задачи построения рекурсивного фильтра состоит в том, что коэффициенты фильтра и наблюдаемая последовательность принимают
значения в конечном поле.
Для построения фильтра надо найти его длину 𝐿 и коэффициенты полинома Λ(𝑥). Фильтр строится шаг за шагом. Начиная
с 𝑟 = 1, строим фильтр, который порождает последовательность
𝑆1 , ..., 𝑆𝜈 . На 𝑟-й итерации, имея уже построенный на предыдущей

194

7. Декодирование БЧХ- и РС-кодов
𝑆𝑟−1

...

𝑆𝑟−2

−Λ1

×

+

−Λ2

𝑆𝑟−𝜈+1

𝑆𝑟−𝜈

×

...

−Λ𝜈−1 ×

+

...

+

𝑆1 , 𝑆2 , ...

−Λ𝜈

×

Рис. 7.1. Интерпретация вычисления многочлена локаторов ошибок
как построения БИХ-фильтра
итерации фильтр Λ(𝑟−1) (𝑥), вычисляем очередное значение

𝑆^𝑟 = −

𝑟−1
∑︁

(𝑟−1)

Λ𝑗

𝑆𝑟−𝑗

𝑗=1

(для упрощения записи мы игнорируем тот факт, что порядок
фильтра, порождающего последовательность длины 𝑟, может быть
меньше 𝑟). Это предсказанное значение 𝑆^𝑟 может не совпадать с
требуемым значением 𝑆𝑟 . В этом случае вычисляется так называемая невязка (ошибка предсказания)

Δ𝑟 = 𝑆𝑟 − 𝑆^𝑟 = 𝑆𝑟 +

𝑟−1
∑︁
𝑗=1

(𝑟−1)

Λ𝑗

𝑆𝑟−𝑗 =

𝑟−1
∑︁

(𝑟−1)

Λ𝑗

𝑆𝑟−𝑗 .

𝑗=0

Если невязка равна нулю, итерация выполнена успешно,
Λ(𝑟) (𝑥) = Λ(𝑟−1) (𝑥). Если же невязка не равна нулю, то ранее вычисленные коэффициенты должны быть подправлены, чтобы сделать
ее нулевой, сохранив нулевыми все предыдущие невязки. Положим

Λ(𝑟) (𝑥) = Λ(𝑟−1) (𝑥) + 𝐴𝑥𝑟−𝑚 Λ(𝑚−1) (𝑥),

(7.12)

где 𝐴 — элемент поля, а Λ(𝑚−1) (𝑥) — один из многочленов, полученных на предыдущих итерациях. Параметры 𝐴 и 𝑚 нужно подобрать
так, чтобы невязка стала равной нулю.
∑︀
(𝑚−1)
Выберем 𝑚 < 𝑟 таким, что Δ𝑚 = 𝑟−1
𝑆𝑟−𝑗−𝑙 ̸= 0.
𝑗=0 Λ𝑗
𝑟−𝑚
Заметим, что умножение на 𝑥
в (7.12) соответствует сдвигу содержимого регистра сдвига «вперед» на 𝑟 − 𝑚 тактов. Поэтому фильтр 𝑥𝑟−𝑚 Λ(𝑚−1) (𝑥), соответствующий второму слагаемому в

7.2. Алгоритм Берлекэмпа–Месси

195

(7.12), до такта с номером 𝑟 − 1 получает на вход те же значения,
что поступали на фильтр Λ(𝑚−1) (𝑥) до такта 𝑚 − 1. Невязка на
этих шагах была нулевой, следовательно, вклад второго слагаемого
до такта с номером 𝑟 −1 равен нулю, а на такте 𝑟 вклад равен 𝐴Δ𝑚 .
Положим 𝑙 = 𝑟 − 𝑚, 𝐴 = −Δ𝑟 /Δ𝑚 .
Тогда новая невязка равна

Δ′𝑟 = Δ𝑟 −

Δ𝑟
Δ𝑚 = 0.
Δ𝑚

Тем самым мы убедились в том, что модифицированный в соответствии с (7.12) фильтр порождает правильную последовательность синдромов.
Подсчитаем длину 𝐿𝑟 фильтра Λ𝑟 , получаемого на шаге 𝑟. Эта
длина, конечно, зависит от выбора параметра 𝑚. Для построения
фильтра, порождающего нужную последовательность, можно выбрать любое 𝑚, при котором Δ𝑚 ̸= 0, но длина фильтра зависит от
𝑚, а решаемая задача — построение фильтра минимально возможной длины (длина фильтра равна весу предполагаемой комбинации
ошибок).
Порядок 𝐿𝑟 фильтра Λ𝑟 равен степени многочлена в правой части (7.12), т.е.

𝐿𝑟 = max {𝐿𝑟−1 , 𝑟 − 𝑚 + 𝐿𝑚−1 } .

(7.13)

Отсюда видим, что порядок фильтра либо не меняется, либо растет от шага к шагу. Выберем 𝑚 равным номеру последнего шага,
на котором увеличился порядок фильтра. Следующая лемма показывает, насколько может увеличиться порядок фильтра за одну
итерацию.
Лемма 7.2. Пусть на шаге 𝑟 невязка Δ𝑟 ̸= 0, и предыдущее увели-

чение порядка фильтра произошло на шаге 𝑚 при невязке Δ𝑚 ̸= 0.
Тогда фильтр, порождающий 𝑆1 , 𝑆2 , ..., 𝑆𝑟 , задается полиномом
Λ(𝑟) (𝑥) = Λ(𝑟−1) (𝑥) −

Δ𝑟 𝑟−𝑚 (𝑚−1)
𝑥
Λ
(𝑥)
Δ𝑚

(7.14)

и имеет порядок
𝐿𝑟 = max {𝐿𝑟−1 , 𝑟 − 𝐿𝑟−1 } .

(7.15)

196

7. Декодирование БЧХ- и РС-кодов

Доказательство. Тождество (7.14) уже доказано, осталось доказать (7.15). Для этого воспользуемся индукцией по 𝑟, причем интересны только те шаги, на которых увеличивается порядок фильтра.
Положив в качестве начального значения 𝐿0 = 0, при появлении первого ненулевого элемента 𝑆𝑗 в последовательности
𝑆1 , 𝑆2 , ..., 𝑆𝑗 , ... порядок фильтра, порождающего 0, 0, ..., 𝑆𝑗 , равен
𝑗 (см. лемму 7.11 в приложении), т.е. удовлетворяет (7.15). Тем самым, мы проверили справедливость леммы для начального шага
индукции.
Предположим теперь, что на всяком шаге 𝑗 , когда увеличивалась длина фильтра, имело место равенство 𝐿𝑗 = 𝑗 − 𝐿𝑗−1 . В частности, на шаге с номером 𝑗 = 𝑚 длина фильтра увеличилась и, по
предположению леммы, стала равной 𝐿𝑚 = 𝐿𝑟−1 , следовательно,
𝐿𝑚 = 𝑚 − 𝐿𝑚−1 = 𝐿𝑟−1 .
Подстановка этого соотношения в (7.13) приводит к (7.15).
Формальное описание алгоритма, который вытекает из доказанных утверждений, сформулируем в виде теоремы.
Берлекэмпа–Месси. Пусть заданы
𝑆1 , 𝑆2 , ..., 𝑆2𝑡 и начальные условия Λ(0) (𝑥) = 1, 𝐵 (0) (𝑥) = 1, 𝐿0 = 0.
При 𝑟 = 1, 2, ..., 2𝑡 рекуррентно вычислим
7.3. Алгоритм

Теорема

𝑟−1
∑︁

Δ𝑟 =

(𝑟−1)

Λ𝑗

𝑆𝑟−𝑗 ;

(7.16)

𝑗=0

𝐿𝑟 = 𝛿𝑟 (𝑟 − 𝐿𝑟−1 ) + (1 − 𝛿𝑟 )𝐿𝑟−1 ;
)︂ (︂ (𝑟−1) )︂
)︂
(︂
1
−Δ𝑟 𝑥
Λ
(𝑥)
,
=
−‘1 𝛿
(𝑟−1)
(𝑟)
(1

𝛿
)𝑥
Δ
𝐵
(𝑥)
𝐵 (𝑥)
𝑟
𝑟
𝑟

(︂

Λ(𝑟) (𝑥)

(7.17)
(7.18)

где 𝛿𝑟 = 1, если одновременно Δ𝑟 ̸= 0 и 2𝐿𝑟−1 ≤ 𝑟 − 1, и 𝛿𝑟 = 0
в противном случае. Тогда Δ(2𝑡) (𝑥) является многочленом наименьшей степени, коэффициенты которого удовлетворяют равен(2𝑡)
ствам Λ0 = 1 и
𝑆𝑟 +

𝑟−1
∑︁
𝑗=1

(2𝑡)

Λ𝑗

𝑆𝑟−𝑗 = 0,

𝑟 = 𝐿2𝑡 + 1, ..., 2𝑡.

7.2. Алгоритм Берлекэмпа–Месси

197

Алгоритм 7.2. Алгоритм Берлекэмпа–Месси

Вычисление коэффициентов многочлена локаторов ошибок
по алгоритму Берлекэмпа-Месси
Input: Синдромный многочлен 𝑆(𝑥)
Output: Многочлен локаторов Λ(𝑥)
1. Инициализация
𝐿 = 0; % Текущая длина регистра
Λ(𝑥) = 1; % Многочлен локаторов
𝐵(𝑥) = 1; % Многочлен компенсации невязки
2. Основной цикл
for 𝑟 = 1 to 𝑑 − 1 do
∑︀
Δ= 𝐿
𝑗=0 Λ𝑗 𝑆𝑟−𝑗 ; % Невязка
𝐵(𝑥) = 𝑥𝐵(𝑥); % Сдвиг
if Δ ̸= 0 then
% ЛРОС модифицируется
𝑇 (𝑥) = Λ(𝑥) − Δ𝐵(𝑥); % Вспомогательный многочлен
if 2𝐿 ≤ 𝑟 − 1 then
% Длина увеличивается
𝐵(𝑥) = Δ−1 Λ(𝑥);
𝐿 = 𝑟 − 𝐿;
end

Λ(𝑥) = 𝑇 (𝑥);
end
end

3. Формирование результата
if deg Λ(𝑥) == 𝐿 then
Многочлен локаторов = Λ(𝑥);
end
else

Число ошибок больше 𝑡;

end

Обсуждение. В вычислениях по формуле (7.18) присутствует
обратный элемент к Δ𝑟 , который не определен при Δ𝑟 = 0. Однако этот обратный элемент востребован только при 𝛿𝑟 = 0. В этом

198

7. Декодирование БЧХ- и РС-кодов

случае принимаем Δ−1
𝑟 𝛿𝑟 = 0. Заметим также, что переменная 𝛿𝑟
играет роль переключателя: в зависимости от ее значения изменяется способ вычисления «модифицирующего многочлена» 𝐵 (𝑟) (𝑥),
который, по сути, представляет собой второе слагаемое в (7.14).
(𝑟−1) (𝑥) достаточно пересчитывать
Заметим, что выражение Δ−1
𝑟 Λ
только при изменении длины регистра, а сам регистр модифицируется всякий раз, когда невязка отлична от нуля.
Алгоритм 7.2 представляет собой псевдокод программы, реализующей формулы теоремы 7.3. Длина регистра 𝐿 неявно участвует
во всех операциях с полиномами, т.к. определяет число нетривиальных элементов в соответствующих массивах.
Доказательство. Все соотношения в формулировке теоремы
уже доказаны, за исключением того, что построенный ЛРОС является кратчайшим среди всех ЛРОС, порождающих заданную последовательность синдромных компонент. В приложении к главе
мы обсудим подробнее задачу построения регистра, порождающего
заданную последовательность, и докажем оптимальность алгоритма БМ.

7.3.

Алгоритм Форни

В предыдущем параграфе мы рассмотрели быстрый алгоритм нахождения локаторов ошибок. Быстрым он является в том смысле,
что решает задачу нахождения решения системы из 𝑡 линейных
уравнений за число операций порядка 𝑡2 , вместо числа 𝑡3 , которое
потребовалось бы для системы уравнений общего вида. Чтобы декодирование в целом имело сложность порядка 𝑡2 , нужно упростить
решение системы уравнений (7.8) для нахождения значений ошибок по известным локаторам. Эта задача была решена Форни [70]
(1965). Для описания алгоритма введем многочлен значений ошибок
Ω(𝑥) = 𝑆(𝑥)Λ(𝑥)
mod 𝑥2𝑡 .
(7.19)
Теорема 7.4. Имеет место соотношение

Ω(𝑥) =

𝜈
∑︁
𝑖=1

𝑌𝑖 𝑋𝑖

∏︁
𝑗̸=𝑖

(1 − 𝑋𝑗 𝑥).

(7.20)

7.3. Алгоритм Форни

199

Доказательство. Напомним обозначения:
2𝑡
∑︁

𝑆(𝑥) =

𝑆𝑗 𝑥

𝑗−1

=

𝑗=1
𝜈
∏︁

2𝑡 ∑︁
𝜈
∑︁

𝑌𝑖 𝑋𝑖𝑗 𝑥𝑗−1 ;

𝑗=1 𝑖=1

(1 − 𝑋𝑗 𝑥).

Λ(𝑥) =

𝑗=1

Подставим эти выражения в (7.19). Получим

⎤⎡

2𝑡 ∑︁
𝜈
𝜈
∑︁
∏︁
Ω(𝑥) = ⎣
𝑌𝑖 𝑋𝑖𝑗 𝑥𝑗−1 ⎦ ⎣ (1 − 𝑋𝑗 𝑥)⎦ .
𝑗=1 𝑖=1

(7.21)

𝑗=1

Следующий шаг использует тождество
1 − 𝑎𝑛
= 1 + 𝑎 + ... + 𝑎𝑛−1 .
1−𝑎
При 𝑎 = 𝑋𝑖 𝑥 и 𝑛 = 2𝑡
2𝑡
∑︁

𝑋𝑖𝑗−1 𝑥𝑗−1 =

𝑗=1

1 − 𝑋𝑖2𝑡 𝑥2𝑡
.
1 − 𝑋𝑖 𝑥

Подставив в (7.21), получим

Ω(𝑥) =

𝜈
∑︁

(︀
)︀ ∏︁
𝑌𝑖 𝑋𝑖 1 − 𝑋𝑖2𝑡 𝑥2𝑡
(1 − 𝑋𝑗 𝑥) .

𝑖=1

𝑗̸=𝑖

После приведения по модулю 𝑥2𝑡 получаем требуемый результат.
Теорема 7.5. Алгоритм Форни.

𝑌𝑖 = ∏︀

𝑋𝑖−1 Ω(𝑋𝑖−1 )
(︀
)︀
−1 .
𝑗̸=𝑖 1 − 𝑋𝑗 𝑋𝑖

(7.22)

Доказательство. В сумме в правой части (7.20) при подстановке
𝑥 = 𝑋𝑖−1 остается только одно ненулевое слагаемое. Поэтому из
Теоремы 7.4 имеем

200

7. Декодирование БЧХ- и РС-кодов

Ω(𝑋𝑖−1 ) = 𝑌𝑖 𝑋𝑖

∏︁ (︀

)︀
1 − 𝑋𝑗 𝑋𝑖−1 .

𝑗̸=𝑖

Отсюда следует (7.22).
Таким образом, теорема 7.5 дает нам формулу для прямого
вычисления значений ошибок. Сложность непосредственного вычисления каждого значения пропорциональна степени многочлена
значений, следовательно, общая сложность алгоритма имеет порядок 𝑡2 .

𝑣(𝑥) = 𝑣0 + 𝑣1 𝑥 + ... + 𝑣𝑛−1 𝑥𝑛−1
Вычисление
компонент
синдрома

𝑆(𝑥)

Буфер

×

Нахождение
многочлена
локаторов
ошибок

Λ(𝑥)

𝑣(𝑥)

Исправление
ошибок

Ω(𝑥) = Λ(𝑥)𝑆(𝑥) mod 𝑥2𝑡
Нахождение
позиций
ошибок

{𝑋𝑖 }

𝑐(𝑥)

{𝑌𝑖 , 𝑋𝑖 }

Нахождение
значений
ошибок

Рис. 7.2. Блок-схема декодера БЧХ-кода
Полная схема декодера БЧХ-кода приведена на рис. 7.2. Ее входом служит последовательность 𝑣(𝑥) = 𝑣0 + 𝑣1 𝑥 + ... + 𝑣𝑛−1 𝑥𝑛−1 на
выходе канала. Она хранится в буфере до тех пор, пока не будут
выполнены основные этапы декодирования: вычисление компонент
синдрома, многочлена локаторов ошибок, значений ошибок и локаторов ошибок. В случае двоичных кодов блок нахождения значений
ошибок не нужен. Выходом блока исправления ошибок служат информационные символы исправленного кодового слова либо сигнал
о неисправимой ошибке.
Блок-схема алгоритма работы модуля нахождения многочлена
локаторов ошибок показана на рис. 7.2. Алгоритм в точности следует утверждению теоремы 7.3. Участвующий в теореме и алгорит-

7.4. Исправление ошибок и стираний

201

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

примере 7.1, декодируем по алгоритму Берлекэмпа–Месси. Все промежуточные вычисления представлены в табл. 7.2.

7.4.

Исправление ошибок и стираний

Как было объяснено в главе 1, эффективность кодирования намного
повышается при использовании в декодере информации о надежности символов. Простейшей формой использования такой информации является стирание ненадежных символов. Манипулируя порогом стирания и многократно декодируя при различных значениях
порога, можно добиться эффективности декодирования, близкой к
декодированию по максимуму правдоподобия. Такое декодирование называют декодированием по минимуму обобщенного расстояния [71, 18] (Форни, 1966). Точная формулировка алгоритма будет
приведена в параграфе 7.5.
Упражнение 7.2. Докажите, что код с минимальным расстояни-

ем 𝑑 гарантированно исправляет комбинации из 𝜈 ошибок и 𝑓 стираний при условии
2𝜈 + 𝑓 + 1 ≤ 𝑑.
(7.23)

Подсказка: нужно убедиться в том, что расстояние Хэмминга,
подсчитанное по нестертым позициям, является метрикой, а затем
воспользоваться неравенством треугольника.
В случае двоичных БЧХ-кодов такая корректирующая способность достигается двукратным декодированием с исправлением
только ошибок. Для этого при первом декодировании нужно положить все стертые позиции равными нулю, а при втором — единице.
В одной из двух попыток декодирования на 𝑓 стертых позициях будет не больше 𝑓 /2 ошибок. Условием правильного декодирования
будет 2(𝑓 /2 + 𝑣) + 1 ≤ 𝑑, что эквивалентно (7.23).

202

7. Декодирование БЧХ- и РС-кодов

Таблица 7.2. Декодирование РС-кода с исправлением 3 ошибок с
помощью алгоритма Берлекэмпа–Месси
Порождающий многочлен
𝑔(𝑥) = 𝛼6 + 𝛼9 𝑥 + 𝛼6 𝑥2 + 𝛼4 𝑥3 + 𝛼14 𝑥4 + 𝛼10 𝑥5 + 𝑥6
Кодовое слово
𝑐(𝑥) = 𝛼 + 𝛼3 𝑥 + 𝛼10 𝑥2 + 𝛼12 𝑥3 + 𝛼13 𝑥4 + 𝛼3 𝑥5 + 𝛼9 𝑥6 + 𝛼5 𝑥7 +
+𝑥8 + 𝛼10 𝑥9 + 𝛼8 𝑥10 + 𝛼𝑥11 + 𝛼𝑥12 + 𝛼13 𝑥13 + 𝛼2 𝑥14
Выход канала
𝑣(𝑥) = 𝛼 + 𝛼3 𝑥 + 𝛼7 𝑥2 + 𝛼12 𝑥3 + 𝛼13 𝑥4 + 𝛼14 𝑥5 + 𝛼9 𝑥6 + 𝛼5 𝑥7 +
+𝑥8 + 𝛼10 𝑥9 + 𝛼8 𝑥10 + 𝛼𝑥11 + 𝛼10 𝑥12 + 𝛼13 𝑥13 + 𝛼2 𝑥14
Синдромный многочлен 𝑆(𝑥) = 𝛼8 + 𝛼2 𝑥 + 𝛼10 𝑥2 + 𝑥3 + 𝛼12 𝑥5
𝑟 Δ
𝐵(𝑥)
Λ(𝑥)
𝐿
0
0
1
1
0
8
7
8
1 𝛼
𝛼
1+𝛼 𝑥
1
2 𝛼5
𝛼7 𝑥
1 + 𝛼9 𝑥
1
14
10
9
6
2
3 𝛼
𝛼+𝛼 𝑥
1+𝛼 𝑥+𝛼 𝑥
2
4 𝛼10
𝛼𝑥 + 𝛼10 𝑥2
1 + 𝛼 2 𝑥 + 𝛼 9 𝑥2
2
10
5
7
14
2
2
2
2
5
3
5 𝛼
𝛼 +𝛼 𝑥+𝛼 𝑥
1+𝛼 𝑥+𝛼 𝑥 +𝛼 𝑥
3
6 𝛼9 𝛼5 𝑥 + 𝛼7 𝑥2 + 𝛼14 𝑥3 1 + 𝛼13 𝑥 + 𝛼5 𝑥2 + 𝛼4 𝑥3
3
13
5
2
4
Многочлен локаторов ошибок Λ(𝑥) = 1 + 𝛼 𝑥 + 𝛼 𝑥 + 𝛼 𝑥3
Локаторы ошибок
𝛼2 , 𝛼5 , 𝛼12
Многочлен значений ошибок
𝑆(𝑥)Λ(𝑥) = 𝛼8 + 𝛼3 𝑥 + 𝛼7 𝑥2 + 𝛼2 𝑥6 + 𝛼2 𝑥7 + 𝛼𝑥8
Ω(𝑥) = 𝑆(𝑥)Λ(𝑥)( mod 𝑥6 ) = 𝛼8 + 𝛼3 𝑥 + 𝛼7 𝑥2
Значения ошибок
𝛼6 , 1, 𝛼8
Вектор ошибок
𝑒(𝑥) = 𝛼6 𝑥2 + 𝑥5 + 𝛼8 𝑥12
В случае недвоичных кодов БЧХ или кодов РС такой метод не
годится, его непосредственное применение потребовало бы перебора
по множеству значений ошибок на стертых позициях. К счастью,
как мы увидим ниже, небольшая модификация описанных выше
декодеров ПГЦ и БМ позволяет декодировать ошибки и стирания
с вычислительной сложностью примерно того же порядка, что и
сложность декодирования с исправлением только ошибок.

7.4. Исправление ошибок и стираний

203

Рассмотрим БЧХ-код, заданный определением 6.1, при 𝑏 = 1.
Запишем кодовое слово, принятую последовательность и вектор
ошибок в виде полиномов

𝑐(𝑥) = 𝑐0 + 𝑐1 𝑥 + ... + 𝑐𝑛−1 𝑥𝑛−1 ;
𝑣(𝑥) = 𝑣0 + 𝑣1 𝑥 + ... + 𝑣𝑛−1 𝑥𝑛−1 ;
𝑒(𝑥) = 𝑒0 + 𝑒1 𝑥 + ... + 𝑒𝑛−1 𝑥𝑛−1 .
Поскольку позиции стираний известны, при вычислении позиций ошибок стертые позиции можно игнорировать (положить равными нулю). Соответствующие последовательности обозначаем как
𝑐′ (𝑥), 𝑣 ′ (𝑥) и 𝑒′ (𝑥), а соответствующие компоненты (модифицированного) синдрома — как 𝑆𝑖′ , 𝑖 = 1, 2, ..., 𝑑 − 1. Модифицированным
синдромом мы назвали синдром, вычисленный по нестертым позициям принятой последовательности.
Пусть 𝑖1 , 𝑖2 , ..., 𝑖𝑓 — номера позиций стираний, и 𝑈𝑗 = 𝛼𝑖𝑗 , 𝑗 =
= 1, 2, ..., 𝑓 . По аналогии с полиномом локаторов ошибок Λ(𝑥) вводим в рассмотрение полином локаторов стираний

Ψ(𝑥) =

𝑓
∏︁

(1 − 𝑥𝑈𝑗 ) .

(7.24)

𝑗=1

Нам потребуется также полином локаторов ошибок и стираний,
который вычисляется как

Λ̃(𝑥) = Ψ(𝑥)Λ(𝑥).

(7.25)

Очевидно, зная Λ̃(𝑥), можно построить многочлен значений
ошибок по формуле (7.19) и затем по алгоритму Форни найти значения ошибок. Многочлен локаторов стираний известен, следовательно, достаточно найти второй сомножитель в (7.25). Можно поступить иначе, предположив, что ошибок было 𝜈 + 𝑓 , но для 𝑓 из
них локаторы уже найдены. Тогда для нахождения оставшихся локаторов можно воспользоваться теоремой БМ, заменив начальные
условия Λ(0) (𝑥) = 𝐵 (0) (𝑥) = 1 на Λ(0) (𝑥) = 𝐵 (0) (𝑥) = Ψ(𝑥). Заметим, что вычисление полинома локаторов стираний по формуле
(7.24) также можно организовать в рекуррентной форме. Полностью процедура исправления ошибок и стираний представлена в
виде алгоритма. 7.3.

204

7. Декодирование БЧХ- и РС-кодов

Алгоритм 7.3. Алгоритм Берлекэмпа–Месси для исправле-

ния ошибок и стираний
Вычисление многочлена локаторов ошибок и стираний по
алгоритму Берлекэмпа–Месси
Input: Синдромный многочлен 𝑆(𝑥);
Число стираний 𝑓 ;
Локаторы стираний 𝑈1 , ..., 𝑈𝑓 ;
Output: Многочлен локаторов Λ(𝑥)
1. Инициализация
𝐿 = 𝑓 ; % Текущая длина регистра
Λ(𝑥) = 1; % Многочлен локаторов
𝐵(𝑥) = 1; % Многочлен компенсации невязки
2. Построение полинома локаторов стираний Ψ(𝑥)
for 𝑟 = 1 to 𝑓 do
Λ(𝑥) = Λ(𝑥) − 𝑈𝑟 𝑥Λ(𝑥)
end

𝐵(𝑥) = Λ(𝑥);
for 𝑟 = 𝑓 + 1 to 𝑑 − 1 do
∑︀
Δ= 𝐿
𝑗=0 Λ𝑗 𝑆𝑟−𝑗 ; % Невязка
𝐵(𝑥) = 𝑥𝐵(𝑥); % Сдвиг
if Δ ̸= 0 then
% ЛРОС модифицируется
𝑇 (𝑥) = Λ(𝑥) − Δ𝐵(𝑥); % Вспомогательный многочлен
if 2𝐿 ≤ 𝑟 + 𝑓 − 1 then
% Длина увеличивается
𝐵(𝑥) = Δ−1 Λ(𝑥);
𝐿 = 𝑟 − 𝐿 + 𝑓;
end

Λ(𝑥) = 𝑇 (𝑥);
end
end

4. Формирование результата
if deg Λ(𝑥) == 𝐿 then
Многочлен локаторов ошибок и стираний = Λ(𝑥).
end
else

Отказ от декодирования.

end

7.4. Исправление ошибок и стираний

205

Упражнение 7.3. Снова рассмотрим РС-код (15,9) над полем

𝐺𝐹 (24 ). Пример декодирования комбинации ошибок кратности 2
при наличии двух стираний подробно разобран в табл. 7.3.

Таблица 7.3. Декодирование РС-кода с исправлением 2 ошибок
и 2 стираний с помощью алгоритма Берлекэмпа–Месси
Порождающий многочлен

𝑔(𝑥) = 𝛼6 + 𝛼9 𝑥 + 𝛼6 𝑥2 + 𝛼4 𝑥3 + 𝛼14 𝑥4 + 𝛼10 𝑥5 + 𝑥6
Кодовое слово

𝑐(𝑥) = 𝛼 + 𝛼3 𝑥 + 𝛼10 𝑥2 + 𝛼12 𝑥3 + 𝛼13 𝑥4 + 𝛼3 𝑥5 + 𝛼9 𝑥6 + 𝛼5 𝑥7 +
+𝑥8 + 𝛼10 𝑥9 + 𝛼8 𝑥10 + 𝛼𝑥11 + 𝛼𝑥12 + 𝛼13 𝑥13 + 𝛼2 𝑥14
Выход канала

𝑣(𝑥) = 𝛼 + 𝛼3 𝑥 + 𝛼7 𝑥2 + 𝛼12 𝑥3 + ∅𝑥4 + 𝛼14 𝑥5 + 𝛼9 𝑥6 + 𝛼4 𝑥7 +
+𝑥8 + 𝛼10 𝑥9 + ∅𝑥10 + 𝛼𝑥11 + 𝛼𝑥12 + 𝛼13 𝑥13 + 𝛼2 𝑥14
Символ ∅ обозначает стирание
Локаторы стираний
𝛼4 , 𝛼10
12
2
Синдромный многочлен 𝑆(𝑥) = 𝛼 𝑥 + 𝑥 + 𝛼6 𝑥3 + 𝛼11 𝑥4 + 𝛼10 𝑥6
Полином локаторов стираний

Ψ(𝑥) = (1 + 𝛼4 𝑥)(1 + 𝛼10 𝑥) = 1 + 𝛼2 𝑥 + 𝛼14 𝑥2
𝑟
Δ
𝐵(𝑥)

Λ(𝑥)

𝐿

0

0

1

1

0

1

0
0

3

𝛼5
𝛼8
𝛼2
𝛼10

1 + 𝛼4 𝑥
Ψ(𝑥) = 1 + 𝛼2 𝑥 + 𝛼14 𝑥2
1 + 𝛼𝑥 + 𝛼𝑥2 + 𝛼4 𝑥3
1 + 𝛼9 𝑥 + 𝛼2 𝑥2 + 𝛼10 𝑥3
1 + 𝛼9 𝑥 + 𝛼7 𝑥2 + 𝛼11 𝑥3 + 𝛼11 𝑥4
1 + 𝛼 5 𝑥 + 𝛼 9 𝑥2 + 𝛼 7 𝑥3 + 𝛼 6 𝑥4

1

2

1 + 𝛼4 𝑥
1 + 𝛼2 𝑥 + 𝛼14 𝑥2
𝛼10 + 𝛼12 𝑥 + 𝛼9 𝑥2
𝛼10 𝑥 + 𝛼12 𝑥2 + 𝛼9 𝑥3
𝛼13 + 𝛼7 𝑥 + 𝑥2 + 𝛼8 𝑥3
𝛼13 𝑥 + 𝛼7 𝑥2 + 𝑥3 + 𝛼8 𝑥4

4
5
6

Многочлен локаторов ошибок и стираний
Локаторы ошибок

Λ(𝑥) = 1 + 𝛼5 𝑥 + 𝛼9 𝑥2 + 𝛼7 𝑥3 + 𝛼6 𝑥4
и стираний
𝛼2 , 𝛼4 , 𝛼5 , 𝛼10

Многочлен значений ошибок

𝑆(𝑥)Λ(𝑥) = 𝛼12 + 𝛼8 𝑥 + 𝛼5 𝑥2 + 𝛼14 𝑥3 + 𝛼5 𝑥6 + 𝛼10 𝑥7 + 𝛼2 𝑥8 + 𝛼𝑥9
Ω(𝑥) = 𝑆(𝑥)Λ(𝑥)( mod 𝑥6 ) = 𝛼12 𝑥 + 𝛼8 𝑥2 + 𝛼5 𝑥3 + 𝛼14 𝑥4
Значения ошибок
𝛼6 , 1
Значения стираний
𝛼13 , 𝛼8
Вектор ошибок
𝑒(𝑥) = 𝛼6 𝑥2 + 𝑥5
Вектор стираний
𝑒(𝑥) = 𝛼13 𝑥4 + 𝛼8 𝑥10

2
3
3
4
4

206

7.5.

7. Декодирование БЧХ- и РС-кодов

Декодирование по минимуму
обобщенного расстояния

В предыдущих главах мы не раз подчеркивали, что декодирование
с мягкими решениями, т.е. с учетом оценок надежности принимаемых символов, намного эффективнее декодирования с жесткими
решениями. Очевидный недостаток рассмотренных выше алгоритмов декодирования БЧХ- и РС-кодов состоит в том, что они не
могут быть непосредственно применены для декодирования с мягкими решениями. Наиболее практичным среди известных методов
учета надежности входных символов при сохранении преимуществ
алгебраического декодирования кодов является декодирование по
критерию минимума обобщенного расстояния [71, 18].
Цель метода — сведение декодирования в канале с мягкими решениями к многократным попыткам алгебраического декодирования с исправлением ошибок и стираний. В двух словах суть алгоритма в том, что сначала выполняется обычное декодирование
без стираний, с исправлением максимально возможного числа ошибок, затем декодирование с двумя стертыми наименее надежными
символами, с четырьмя, и т.д. вплоть до 𝑑 − 1 стертых символов.
Из всех результатов декодирования выбирается наиболее близкий
к полученной из канала последовательности.
Напомним некоторые обозначения, использованные в главе 4.
Предположим, что символы двоичного (𝑛, 𝑘)-кода 𝐶 = {𝑐𝑚 , 𝑚 =
= 1, ..., 2𝑘 } передаются по каналу с гауссовским шумом. Двоичные
кодовые слова 𝑐𝑚 преобразуются в кодовые слова 𝜉 𝑚 из евклидова
пространства заменой нулей и единиц на вещественные числа −1 и
+1 соответственно.
Предположим теперь, что значения последовательности 𝛼 =
= (𝛼1 , 𝛼2 , ..., 𝛼𝑛 ) на выходе демодулятора (на входе декодера) нормированы и ограничены так, что |𝛼𝑖 | ≤ 1, 𝑖 = 1, 2, ..., 𝑛.
Знаки компонент 𝛼 представляют собой жесткие решения, а их
модули — надежности принятых символов. Если 𝛼𝑖 вычислены как
логарифмы отношения правдоподобия, то, как было показано в параграфе 4.1, в отсутствие ограничения на значения компонент декодирование по максимуму скалярного произведения (𝛼, 𝜉 𝑚 ) рав-

7.5. Декодирование по минимуму обобщенного расстояния

207

носильно декодированию по максимуму правдоподобия. Введение
нормировки не влияет на результат декодирования, зато дает возможность доказать следующую теорему.
Теорема 7.6. В коде с длиной 𝑛 и минимальным расстоянием 𝑑

найдется не больше одного слова 𝜉𝑚 такого, что
(𝛼, 𝜉 𝑚 ) > 𝑛 − 𝑑,

(7.26)

если |𝛼𝑖 | ≤ 1, 𝑖 = 1, 2, ..., 𝑛.
Доказательство. Найдем слово 𝜉𝑚′ , отличающееся от 𝜉𝑚 ровно
в 𝑑 позициях, и обозначим через 𝑆 множество позиций, в которых
знаки 𝜉 𝑚 и 𝜉 𝑚′ не совпадают, |𝑆| = 𝑑. Положим
∑︁
𝐴 =
𝛼𝑖 𝜉𝑚𝑖 ;
𝑖∈𝑆
/

𝐵 =

∑︁

𝛼𝑖 𝜉𝑚𝑖 .

𝑖∈𝑆

Заметим, что 𝐴 ≤ 𝑛 − 𝑑, поскольку |𝑆 c | = 𝑛 − 𝑑 и по условию
теоремы каждое слагаемое меньше единицы. Для двух скалярных
произведений имеем

(𝛼, 𝜉 𝑚 ) = 𝐴 + 𝐵;
(𝛼, 𝜉 𝑚′ ) = 𝐴 − 𝐵.
Их сумма

(𝛼, 𝜉 𝑚 ) + (𝛼, 𝜉 𝑚′ ) = 2𝐴 ≤ 2(𝑛 − 𝑑).
Отсюда следует, что только одно из двух слагаемых может быть
строго больше 𝑛 − 𝑑.
Определение 7.1. Декодирование по минимуму евклидова рас-

стояния между вектором 𝛼 и кодовыми словами 𝜉𝑚 называется
декодированием по минимуму обобщенного расстояния (МОР).

208

7. Декодирование БЧХ- и РС-кодов

Упражнение 7.4. Докажите, что декодирование по МОР экви-

валентно декодированию по максимуму скалярного произведения
(𝛼, 𝜉 𝑚 ).
Подсказка: рассмотрите квадрат нормы ‖𝛼 − 𝜉 𝑚 ‖2 .

Упражнение 7.5. Докажите, что декодирование в ДСК по мини-

муму расстояния Хэмминга и декодирование в ДСтК по минимуму
расстояния, вычисленного по нестертым позициям, являются частными случаями декодирования по МОР. Запишите аналоги неравенства (7.26) для этих частных случаев.
Следующая теорема подсказывает способ нахождения единственного решения 𝜉 𝑚 неравенства (7.26), если такое решение существует.
Теорема 7.7. Если для некоторого 𝑚 имеет место неравенство

(𝛼, 𝜉 𝑚 ) > 𝑛 − 𝑑, то при некотором 𝑓 ∈ {0, 1, ..., 𝑑 − 1} при стирании
𝑓 наименее надежных позиций декодер, исправляющий 𝑓 стираний
и комбинации ошибок кратности до 𝑡 = ⌊(𝑑 − 𝑓 − 1)/2⌋, вынесет
решение в пользу кодового слова 𝜉𝑚 .

Доказательство. Для того чтобы упростить запись, будем считать, что перед декодированием символы упорядочены по возрастанию надежности, т.е. |𝛼1 | ≤ |𝛼2 | ≤ ... ≤ |𝛼𝑛 |. Символы кодовых
слов, конечно, должны быть соответствующим образом перенумерованы.
Предположим сначала, что 𝑓 принимает любые значения из
множества {0, 1, ..., 𝑛}. Обозначим
𝑝0

=

|𝛼1 |;

𝑝1

=

|𝛼2 | − |𝛼1 |;

... ... ...;
𝑝𝑛−1

=

|𝛼𝑛 | − |𝛼𝑛−1 |;

𝑝𝑛

=

1 − |𝛼𝑛 |.

Числа {𝑝𝑖 } неотрицательны, и их сумма равна единице, что дает
возможность рассматривать их как распределение вероятностей.

7.5. Декодирование по минимуму обобщенного расстояния
(𝑓 )

(𝑓 )

209
(𝑓 )

Введем вспомогательные векторы 𝛽 (𝑓 ) = (𝛽1 , 𝛽2 , ..., 𝛽𝑛 ), где

⎨ 0, 𝑖 ≤ 𝑓 ;
(𝑓 )
+1, 𝑖 > 𝑓, 𝛼𝑖 ≥ 0;
𝛽𝑖
=

−1, 𝑖 > 𝑓, 𝛼𝑖 < 0,
𝑓 = 0, 1, ..., 𝑛.
Нетрудно подсчитать, что

𝛼=

𝑛
∑︁

𝑝𝑓 𝛽 (𝑓 ) .

(7.27)

𝑓 =0

В то же время, скалярные произведения (𝛽 (𝑓 ) , 𝜉 𝑚 ) представляют
собой метрику декодирования с жесткими решениями при наличии
𝑓 стираний, и неравенство (𝛽 (𝑓 ) , 𝜉 𝑚 ) > 𝑛 − 𝑑 может выполняться
только для одного слова, которое и является решением при данном
𝑓 . Из (7.27) имеем

(𝛼, 𝜉) =

𝑛
∑︁

𝑝𝑓 (𝛽 (𝑓 ) , 𝜉).

(7.28)

𝑓 =0

Итак, (𝛼, 𝜉) равно среднему по всем 𝑓 значению (𝛽 (𝑓 ) , 𝜉) при
распределении вероятностей {𝑝𝑓 } на 𝑓 . Среднее значение не больше
максимального. По условию теоремы среднее значение больше 𝑛−𝑑,
а значит и одно из скалярных произведений в правой части (7.28)
больше 𝑛 − 𝑑. Следовательно, искомое решение будет вынесено при
одном из 𝑓 ∈ {0, 1, ..., 𝑛}.
С другой стороны, декодер, исправляющий ошибки и стирания,
может выносить решения только при числе стираний, меньшем 𝑑, —
отсюда следует ограничение на 𝑓 в формулировке теоремы.
Отметим, что при четной разности 𝑑−𝑓 решение декодера будет
таким же, как и при на единицу большем числе стираний. Поэтому
максимальное число попыток декодирования примерно равно 𝑑/2.
Кроме того, как только выполнено неравенство (𝛼, 𝜉 𝑚 ) > 𝑛 − 𝑑,
декодирование может быть остановлено. Поэтому среднее число попыток будет заметно меньше числа 𝑑/2.

210

7. Декодирование БЧХ- и РС-кодов

Задачи
1. Дана последовательность (0, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1) над
полем 𝐺𝐹 (2). Постройте минимальный ЛРОС, генерирующий
эту последовательность. Нарисуйте схему генератора. Продлите последовательность еще на 10 двоичных символов.
2. Какие РС-коды можно построить над полями 𝐺𝐹 (5), 𝐺𝐹 (7)?
Приведите пример кода, проверьте на нем работу алгоритмов
ПГЦ, БМ.
3. Постройте код Рида–Соломона длины 7, исправляющий двойные ошибки. Приведите пример вектора ошибок веса 2 и выполните декодирование по алгоритмам ПГЦ и БМ.
4. Для кода из задачи 3 приведите пример вектора ошибок веса
1 и вектора стираний веса 2. Примените алгоритм БМ для
нахождения кодового слова.
5. Оцените сложность в числе операций в расширении поля для
каждого из этапов декодирования при декодировании РСкодов по алгоритму ПГЦ и БМ.
6. Постройте двоичный БЧХ-код длины 31, исправляющий
3 ошибки. Приведите пример вектора, содержащего 3 ошибки.
Выполните декодирование, используя алгоритмы ПГЦ и БМ.
Убедитесь в том, что в результате декодирования действительно получено кодовое слово.
7. Используя опыт решения предыдущей задачи, предложите
упрощения, возможные при использовании описанных в разделе алгоритмов для декодирования двоичных БЧХ-кодов.
Изменится ли асимптотическое поведение сложности декодирования как функции длины кодов и числа исправляемых
ошибок для двоичных кодов по сравнению с 𝑞 -ичными?
8. БЧХ-коды и коды РС могут быть укорочены удалением информационных символов. При этом расстояние кода не уменьшается, но код теряет свойство цикличности. Как воспользо-

Приложение

211

ваться описанными в данной главе алгоритмами для декодирования укороченных циклических кодов?

Приложение. Линейная сложность
последовательностей
Пусть имеетсяпоследовательность 𝑠 = (𝑠1 , 𝑠2 , ...) конечной или бесконечной длины с элементами из конечного поля 𝐺𝐹 (𝑞), и нужно
построить линейную схему, которая ее порождает. Решением задачи
может служить линейный регистр с обратной связью (ЛРОС). Его
можно описать разностным уравнением, выражающим очередное
значение последовательности в виде линейной комбинации предыдущих значений

𝑠𝑛+1 + 𝑐1 𝑠𝑛 + ... + 𝑐𝐿 𝑠𝑛−𝐿+1 = 0,

(7.29)

где 𝐿 — длина регистра, а вектор 𝑐 = (1, 𝑐1 , ..., 𝑐𝐿 ) задает весовые
коэффициенты умножителей в цепи обратной связи (по аналогии
с рис. 7.1, с соответствующей корректировкой обозначений). Альтернативной формой описания регистра служит полином 𝑐(𝑥) =
= 1 + 𝑐1 𝑥 + ... + 𝑐𝐿 𝑥𝐿 .
Если вся последовательность может быть порождена регистром
длины 𝐿 и не может быть порождена более коротким регистром
(разностным уравнением более низкого порядка), то 𝐿 называется
линейной сложностью последовательности.
Пример 7.2. Простейшее разностное уравнение

𝑠𝑛 − 𝑐1 𝑠𝑛−1 = 0
нетривиально при 𝑐1 ̸= 0. При начальном состоянии 𝑠1 оно порождает последовательность (𝑐1 𝑠1 , 𝑐21 𝑠1 , ..., 𝑐𝑛1 𝑠1 , ...). Сложность последовательности равна 1, ей соответствует полином 𝑐(𝑥) = 1 − 𝑐1 𝑥.
Пример 7.3. Разностное уравнение

𝑠𝑛 − 𝑠𝑛−𝐿 = 0

212

7. Декодирование БЧХ- и РС-кодов

(в полиномиальной записи 𝑐(𝑥) = 1 − 𝑥𝐿 ) при начальном состоянии

( 0, 0, ..., 0 𝑎)
⏟ ⏞
𝐿−1 нулей

периодически повторяет эту последовательность. Сложность этой
бесконечной последовательности равна 𝐿 и совпадает с ее периодом.
Пример 7.4. Нетрудно проверить, что в поле 𝐺𝐹 (2) при любом

ненулевом начальном состоянии уравнение

𝑠𝑛 = 𝑠𝑛−1 + 𝑠𝑛−3
(в полиномиальной записи 𝑐(𝑥) = 1 + 𝑥 + 𝑥3 ) порождает последовательность с периодом 7. Это максимально возможный период
для последовательностей, задаваемых полиномом третьей степени,
поскольку общее число ненулевых состояний регистра равно 7.
В общем случае, если в качестве 𝑐(𝑥) выбрать примитивный многочлен степени 𝐿, получим на выходе регистра последовательность
длины 2𝐿 −1, которая представляет собой кодовое слово кода максимальной длины, двойственного коду Хэмминга (см. параграф 5.2).
Действительно, выписав соответствующее рекуррентное уравнение,
можно заметить, что сдвиги примитивного многочлена 𝑐(𝑥) являются проверочными соотношениями для любой последовательности, порождаемой данным регистром. Следовательно, проверочная
матрица линейного пространства таких последовательностей совпадает с порождающей матрицей кода Хэмминга.
В этих примерах бесконечная (периодическая) последовательность задавалась полиномом конечной степени. Нетрудно догадаться, что в общем случае при длине регистра 𝐿 период последовательности не может быть больше, чем 𝑞 𝐿 − 1 (число различных ненулевых состояний регистра).
С другой стороны, любая последовательность длины (периода)
𝑛 может быть порождена тривиальным РЛОС: достаточно записать последовательность в регистр и соединить выход регистра с
его входом.
Таким образом, сложность 𝐿 последовательности длины (периода) 𝑛 может находиться в широких пределах от 𝐿 = log𝑞 (𝑛 + 1) до
𝐿 = 𝑛.

Приложение

213

Рассмотрим задачу нахождения минимального регистра, порождающего заданную последовательность.
Предположим сначала, что 𝐿 известно и нужно только найти
коэффициенты обратной связи (коэффициенты уравнения (7.29)).
Задача решается просто. Выпишем (7.29) при 𝑛 = 1, 2, ..., 2𝐿 − 1.
Запишем полученную систему уравнений в матричном виде

⎞ ⎛
⎞⎛

−𝑠𝐿+1
𝑐𝐿
𝑠1
𝑠2
···
𝑠𝐿

⎟ ⎜

⎜ 𝑠2
𝑠3
· · · 𝑠𝐿+1 ⎟
⎟ ⎜𝑐𝐿−1 ⎟ ⎜−𝑠𝐿+2 ⎟

(7.30)
=




⎜ ..
. ⎟.
.
..
..
..
⎝.
.
.
. ⎠ ⎝ .. ⎠ ⎝ .. ⎠

𝑠𝐿 𝑠𝐿+1 · · · 𝑠2𝐿−1

𝑐1

−𝑠2𝐿

Если гипотеза о линейной сложности 𝐿 верна, то существует
единственное решение этой системы уравнений, оно и является решением этой задачи. Приходим к следующему утверждению.
Теорема 7.8. Для вычисления коэффициентов ЛРОС, описываю-

щего последовательность сложности 𝐿, достаточно иметь любые 2𝐿 последовательных значений на выходе фильтра.

Возвращаясь к примеру 7.4, заметим, что последовательность,
порожденная регистром, заданным примитивным многочленом степени 𝐿, может быть восстановлена полностью по любому отрезку длины 2𝐿. Этот факт препятствует применению таких ЛРОС в
криптографии.
То, что сложность 𝐿 неизвестна заранее, не намного усложняет
дело, поскольку можно по очереди проверять гипотезы 𝐿 = 1, 2, ...
Решение системы из 𝐿 уравнений имеет сложность не более 𝐿3 ,
поэтому общая сложность нахождения регистра не превышает 𝐿4 ,
т.е. остается в любом случае полиномиальной.
Алгоритм Берлекэмпа–Месси решает совместно обе задачи —
определение линейной сложности и нахождение коэффициентов полинома ЛРОС со сложностью порядка 𝐿2 . Это упрощение обусловлено тем, что матрица коэффициентов имеет специфический вид:
строки коэффициентов являются сдвигами предыдущих строк.
Решение задачи мы уже описали в параграфе 7.2. Остаток параграфа посвящен доказательству его оптимальности, т.е. минимальности длины регистра, получаемого по алгоритму БМ.

214

7. Декодирование БЧХ- и РС-кодов

Лемма 7.9. Пусть 𝑐(𝑟−1) длины 𝐿𝑟−1 — регистр минимальной

длины, генерирующий 𝑠𝑟−1 = (𝑠1 , 𝑠2 , ..., 𝑠𝑟−1 ), а 𝑐(𝑟) длины 𝐿𝑟 —
регистр минимальной длины, генерирующий 𝑠𝑟 = (𝑠1 , 𝑠2 , ..., 𝑠𝑟 ) и
пусть 𝑐(𝑟−1) ̸= 𝑐(𝑟) . Тогда
𝐿𝑟 ≥ max {𝐿𝑟−1 , 𝑟 − 𝐿𝑟−1 } .

Доказательство. Неравенство 𝐿𝑟 ≥ 𝐿𝑟−1 очевидно, поскольку
регистр, генерирующий некоторую последовательность, генерирует
также любую последовательность, продолжением которой эта последовательность является.
Докажем неравенство 𝐿𝑟 ≥ 𝑟 − 𝐿𝑟−1 . Для сокращения записи
обозначим 𝑎 = 𝑐(𝑟−1) , 𝑏 = 𝑐(𝑟) , 𝐿𝑎 = 𝐿𝑟−1 , 𝐿𝑏 = 𝐿𝑟 .
Доказательство от противного. Предположим, что 𝑟 > 𝐿𝑎 + 𝐿𝑏 .
Из условий леммы имеем
𝑠𝑗

= −

𝑠𝑟 ̸= −

𝑠𝑗

= −

𝐿𝑎
∑︁
𝑖=1
𝐿𝑎
∑︁
𝑖=1
𝐿𝑏
∑︁

𝑎𝑖 𝑠𝑗−𝑖 ,

𝑗 = 𝐿𝑎+1 , ..., 𝑟 − 1;

(7.32)

𝑎𝑖 𝑠𝑟−𝑖 ;

𝑏𝑘 𝑠𝑗−𝑘 ,

(7.31)

𝑗 = 𝐿𝑏+1 , ..., 𝑟,

(7.33)

𝑘=1

поскольку 𝑎 порождает последовательность длины 𝑟 − 1, но не порождает последовательность длины 𝑟, а 𝑏 порождает последовательность длины 𝑟.
Применяя (7.33) при 𝑗 = 𝑟, получаем после подстановки (7.31)

𝑠𝑟 = −

𝐿𝑏
∑︁

𝑏𝑘 𝑠𝑟−𝑘 = −

𝑘=1

𝐿𝑏
∑︁

𝐿𝑎
∑︁

𝑏𝑘

𝑎𝑖 𝑠𝑟−𝑘−𝑖 .

(7.34)

𝑖=1

𝑘=1

Здесь существенно то, что индексы при 𝑠 остаются положительными в силу предположения 𝑟 > 𝐿𝑎 + 𝐿𝑏 . С другой стороны, подстановка (7.33) в (7.32) дает

𝑠𝑟 ̸= −

𝐿𝑎
∑︁
𝑖=1

𝑎𝑖 𝑠𝑟−𝑖 = −

𝐿𝑎
∑︁
𝑖=1

𝑎𝑖

𝐿𝑏
∑︁
𝑘=1

Очевидно, (7.34) противоречит (7.35).

𝑏𝑘 𝑠𝑟−𝑖−𝑘 .

(7.35)

Приложение

215

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

Доказательство. Устройство, порождающее отдельные слагаемые и суммирующее их — неоптимальная (возможно, не самая короткая) версия минимального ЛРОС.
Лемма 7.11. Линейная сложность последовательности 𝑠 длины

𝑟 вида 𝑠 = ( 0, 0, ..., 0 𝑎) равна 𝑟.
⏟ ⏞
𝑟−1 нулей

Доказательство. Один (не единственный возможный) полином
обратной связи, генерирующий 𝑠, равен 𝑎 − 𝑥𝑟 (см. пример 7.3).
Следовательно, линейная сложность не больше 𝑟. С другой стороны, регистр длины меньше 𝑟 не может породить серию из 𝑟 − 1
нулей. Значит, сложность равна 𝑟.
Доказательство леммы 7.9. Пусть 𝑠𝑟 — последовательность
^𝑟 — последовательность длины 𝑟, порождаемая фильдлины 𝑟 и 𝑠
^𝑟 = (0, 0, ..., 0, Δ),
тром длины 𝐿𝑟−1 . По условию леммы 7.9 𝑠𝑟 − 𝑠
где Δ ̸= 0 — невязка. Сложность суммы, в соответствии с леммой
7.11, оказалась равной 𝑟. Из леммы 7.10 имеем 𝐿𝑟 + 𝐿𝑟−1 ≥ 𝑟, что
и требовалось доказать.

Из леммы 7.9 и теоремы 7.3, следует, что алгоритм Берлекэмпа–
Месси строит регистр минимально возможной длины, т.е. для заданной последовательности синдромов он отыскивает вектор ошибок минимального веса.
Пример 7.5. Предположим, что на выходе(︀ троичной линейной схе)︀

мы наблюдается последовательность 𝑥 = 2 1 0 1 2 1 0 1 2 1 0 1 ... .
Построим минимальный ЛРОС, порождающий эту последовательность. Результаты вычислений, выполняемых по алгоритму БМ шаг
за шагом, приведены в табл. 7.4, а соответствующие схемы фильтров показаны на рис. 7.3.

216

7. Декодирование БЧХ- и РС-кодов

Поскольку в алгоритме БМ (см. параграф 7.2) в качестве фильтра нулевой длины выбран фильтр Λ = 1, невязка на первом шаге
подсчитывается относительно единицы. Это разумное соглашение,
поскольку любое поле содержит единицу. Фильтр первого порядка
после первых двух итераций успешно сформировал первые два символа последовательности, но третий (он выделен жирным шрифтом
на рис. 7.3, а) неверен. На следующих итерациях в качестве исходного состояния фильтра принимаем уже аппроксимированные
элементы последовательности. На пятой итерации приходится увеличивать порядок фильтра до трех. В результате оказалось, что
заданная последовательность длины 12 описывается фильтром третьего порядка.

Таблица 7.4. Построение ЛРОС по последовательности на его выходе

𝑟
0
1
2
3
4
5
6
7

𝑠

2
1
0
1
2
1
0

Δ
0
2
0
1
2
1
0
0

𝐵(𝑥)
1
2
2𝑥
1+𝑥
𝑥 + 𝑥2
1 + 2𝑥 + 2𝑥2
𝑥 + 2𝑥2 + 2𝑥3
𝑥2 + 2𝑥3 + 2𝑥4

Λ(𝑥)
1
1+𝑥
1+𝑥
1 + 𝑥 + 𝑥2
1 + 2𝑥 + 2𝑥2
1 + 2𝑥 + 𝑥2 + 2𝑥3
1 + 2𝑥 + 𝑥2 + 2𝑥3
1 + 2𝑥 + 𝑥2 + 2𝑥3

𝐿
0
1
1
2
2
3
3
3

Приложение

217

(1),2,1,2,...

1

1

2,1,0,2...

2

× −1

× −1

× −1

+

а) 𝑟 = 1, 2

б) 𝑟 = 3

1

2

×

−2

+

в) 𝑟 = 4

2,1,0,1,1,...

× −2

0

1

2

× −2

× −1

+

+

2,1,0,1,2,1,0,...

× −2

г) 𝑟 = 5, 6, ...

Рис. 7.3. Построение фильтра по заданной последовательности

8.

Сверточные коды

Сверточные коды широко применяются в самых различных областях техники передачи и хранения информации. Примерами их эффективного применения являются системы космической связи, системы мобильной связи, модемы для телефонных каналов. В частности, протоколы V.32, V.34, ADSL, HDSL используют для защиты
от ошибок сверточные коды в сочетании с декодированием по максимуму правдоподобия по алгоритму Витерби. Часто помимо сверточного кода передаваемые данные защищаются дополнительно с
помощью циклической проверки на четность, либо применением кода Рида–Соломона. Тем самым получается код-произведение либо
каскадный код, эти коды мы кратко рассмотрим в главе 10.
Среди специалистов по теории кодирования бытует шутка: блоковые коды хороши для статей и диссертаций, а сверточные — для
надежной передачи информации. В этой шутке есть немного правды. Сверточные коды эффективны, но теория сверточных кодов
на сегодняшний день не так глубока и изящна, как теория блоковых кодов, все практически значимые коды найдены с помощью
компьютерного поиска, а декодирование имеет экспоненциальную
сложность и реализуется методами, по сути, заимствованными из
общей теории дискретного программирования. Другая возможная
интерпретация сложившейся в этой области знаний ситуации состоит в том, что теория сверточных кодов сложнее, чем блоковых,
и основные научные и практические результаты еще ждут своих
первооткрывателей.
В связи с этим изучение сверточных кодов разбито на два этапа. Сначала мы рассмотрим очень простой подход, который вполне
достаточен для понимания того, каким образом эти коды применя-

8.1. Представление сверточного кода

219

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

8.1.

Представление сверточного кода

При блоковом кодировании поступающие от источника информации данные разбиваются на блоки, и каждому блоку сопоставляется
отдельное кодовое слово, зависящее только от данных, содержащихся в данном блоке. Альтернативой такому кодированию является
сверточное кодирование, при котором блоки данных, по которым
вычисляются в каждый момент времени кодовые символы, перекрываются с предыдущими.
Слово «сверточные» в названии кодов подразумевает наличие
вычислителя свертки входных данных с некоторыми фиксированными последовательностями, определяющими код. Как мы увидим,
под сверточными кодами часто понимается более широкий класс кодов, среди которых могут быть и нелинейные. Использование термина «сверточные коды» объясняется традицией.
Проще всего пояснить понятие сверточного кода примером. Одна из возможных схем кодера двоичного сверточного кода представлена на рис. 8.1. Кодер содержит 𝑘 двоичных регистров сдвига
длин 𝜈1 , 𝜈2 , ..., 𝜈𝑘 . Входами регистров сдвига являются информационные символы. Выходы ячеек регистров соединены с многовходовыми сумматорами по модулю 2, таких сумматоров 𝑛, по числу
выходных символов, формируемых кодером на каждом такте работы.
На каждом такте на вход кодера поступает блок из 𝑘 информационных символов. Эти символы и символы, хранящиеся в данный момент в регистрах кодера, поступают на входы тех сумматоров, которые подключены к соответствующим ячейкам. Результаты сложения по модулю 2 поступают на выход схемы. После этого
в каждом из регистров происходит сдвиг, новые информационные
символы записываются в первые ячейки, а содержимое остальных
ячеек сдвигается на один разряд.
Содержимое 𝜈 = 𝜈1 + 𝜈2 + ... + 𝜈𝑘 ячеек регистров сдвига в каждый конкретный момент времени называется текущим состоянием

220

8. Сверточные коды
блок сумматоров по
модулю 2

регистры сдвига
𝑢1

0

1

...

𝜈1
+

...
...

𝑢𝑘

0

1

...
...
...

𝜈𝑘
+

𝑣1

𝑣𝑛

Рис. 8.1. Сверточный кодер со скоростью 𝑅 = 𝑘/𝑛

кодера. Предположим, что в начальный момент времени кодер находится в некотором заранее известном декодеру состоянии. Примем
для определенности это начальное состояние нулевым. Рассмотрим
процесс кодирования полубесконечной информационной последовательности. Значения на выходах сумматоров на каждом такте работы называются кодовыми символами сверточного кода. Полубесконечная последовательность кодовых символов называется кодовым
словом сверточного кода. Множество всевозможных кодовых слов
образует сверточный код.
Отношение 𝑅 = 𝑘/𝑛 называется скоростью сверточного кода.
Примеры кодеров сверточных кодов приведены на рис. 8.2.
Суммарная длина регистров сверточного кодера 𝜈 называется
длиной кодового ограничения кода, а максимальная длина регистров
𝑚 = max𝑖 {𝑚𝑖 } называется памятью или задержкой кодера. Для
кодов со скоростью 𝑅 = 1/𝑛, т.е. при 𝑘 = 1, память и кодовое
ограничение совпадают.
Относительно блоковых кодов мы знаем, что для одного и того же кода можно построить много порождающих матриц, описывающих код, или, другими словами, кодирование может быть выполнено разными кодерами. От выбора кодера зависит отображение информационных последовательностей на конкретные кодовые

8.1. Представление сверточного кода

221

𝑣1
+

𝑢1

+

𝑣1

𝑢
+
+

𝑢2

+

𝑣2

𝐺(𝐷) = 1 + 𝐷2 1 + 𝐷 + 𝐷


11
⎜ 00

𝐺 = ⎜· · ·

..
.

01
11
00
..
.

11
01
11
..
.

00 · · ·
11 00
01 11
.. ..
.
.

𝑣2

б) 𝑅 = 2/3, 𝑚 = 1, 𝜈 = 2

а) 𝑅 = 1/2, 𝑚 = 𝜈 = 2
(︀

𝑣2

)︀
2

···
· · ·⎟

· · ·⎟

..
.

𝐺(𝐷) =

(︂
)︂
1+𝐷
0
𝐷
1
1+𝐷 1+𝐷


100
⎜111


𝐺 = ⎜···
⎜···

···

101
011
100
111
..
.


000 · · · · · ·
000 · · · · · ·⎟

101 000 · · ·⎟

011 000 · · ·⎟

..
..
..
.
.
.

Рис. 8.2. Примеры сверточных кодеров
слова, а это означает, что даже при одинаковых решениях, выносимых декодером максимального правдоподобия, средняя вероятность ошибки одного бита при использовании разных кодеров может быть разной. По отношению к сверточным кодам выбор кодера,
реализующего данный код, имеет еще бо́льшее значение.
Кодеры, которые мы рассматривали до сих пор, можно рассматривать как схемы, построенные на основе КИХ-фильтров (фильтров с конечным откликом), или фильтров без обратной связи.
Альтернативные схемы могут быть построены на основе БИХфильтров, т.е. фильтров с обратной связью. В следующей главе
мы покажем, что для всякого кода, порождаемого кодером с обратной связью, может быть найден кодер без обратной связи. Поэтому многие вопросы, связанные со сверточными кодами, достаточно
изучать на примере кодеров без обратной связи.

222

8. Сверточные коды

В связи с появлением в 1990-х годах турбо-кодов кодеры с обратной связью стали привлекать к себе особенное внимание. Отчасти
потому, что при скорости кода, близкой к пропускной способности
канала, различие между характеристиками различных кодеров одного и того же кода становятся значимыми. Мы обсудим эти вопросы более подробно при изучении итеративного декодирования.
Кодеры сверточных кодов на основе регистров без обратной связи полностью описываются связями ячеек регистров сдвига с выходными сумматорами. Существует несколько общепринятых форм
представления этих связей. Начнем с двоичных кодов со скоростью 𝑅 = 1/𝑛. Связи каждого из 𝑛 сумматоров с ячейками одного регистра длины 𝜈 записываются в виде двоичного вектора
𝑔 𝑖 = (𝑔𝑖0 , 𝑔𝑖1 , ..., 𝑔𝑖𝜈 ), 𝑖 = 1, 2, ..., 𝑛. Значению 𝑔𝑖𝑗 = 0 соответствуют отсутствие связи 𝑗 -й ячейки памяти регистра сдвига регистра с
𝑖-м сумматором, 𝑔𝑖𝑗 = 1 — наличие связи.
Векторы 𝑔 𝑖 называют порождающими векторами или генераторами кода. В таблицах кодов порождающие векторы приводят в
восьмеричной форме. Например, генератор 𝑔 = (1010111) будет записан как (127). Генераторы кодера, приведенного на рис. 8.2, а, в
восьмеричной форме записываются как 5 и 7, поэтому мы будем
называть его кодом (5,7).
Порождающие векторы записывают также в виде полиномов
формальной переменной 𝐷. Например, порождающие полиномы кодера (5,7), показанного на рис. 8.2, а, имеют вид

𝑔1 (𝐷) = 1 + 𝐷2 ;
𝑔2 (𝐷) = 1 + 𝐷 + 𝐷2 .
Эту совокупность полиномов можно также записать в виде полиномиальной порождающей матрицы
(︀
)︀
𝐺(𝐷) = 1 + 𝐷2 1 + 𝐷 + 𝐷2 .
В общем случае кодер со скоростью 𝑅 = 𝑘/𝑛 задается матрицей размерности 𝑘 × 𝑛. Элементами матрицы будут полиномы, если
кодер построен на основе регистров без обратной связи. Линейный
сверточный кодер общего вида может быть описан матрицей, элементы которой — дробно-рациональные функции формальной переменной 𝐷.

8.1. Представление сверточного кода

223

Пример сверточного кода со скоростью 2/3 приведен на
рис. 8.2, б.
Матричное представление кодера позволяет записать процесс
кодирования для кода со скоростью 𝑅 = 1/𝑛 в виде умножения
информационного полинома 𝑢(𝐷) = 𝑢0 +𝑢1 𝐷 +... на матрицу 𝐺(𝐷),

𝑣(𝐷) = 𝑢(𝐷)𝐺(𝐷).
При скорости 𝑅 = 𝑘/𝑛 входом кодера служит вектор
(︀
)︀
𝑢(𝐷) = 𝑢1 (𝐷) 𝑢2 (𝐷) ... 𝑢𝑘 (𝐷) =

= 𝑢0 + 𝑢1 𝐷 + ...,

𝑢𝑖 ∈ {0, 1}𝑘

из 𝑘 информационных полиномов 𝑢1 (𝐷), ..., 𝑢𝑘 (𝐷). Через 𝑢𝑖 обозначен вектор из 𝑘 информационных бит, поступивших на вход кодера
в момент времени 𝑖. Выход кодера — кодовый вектор из 𝑛 полиномов
(︀
)︀
𝑣(𝐷) = 𝑣1 (𝐷) 𝑣2 (𝐷) ... 𝑣𝑛 (𝐷) =

= 𝑣 0 + 𝑣 1 𝐷 + ...,

𝑣 𝑖 ∈ {0, 1}𝑛 ,

вычисляемый как

𝑣(𝐷) = 𝑢(𝐷)𝐺(𝐷).

(8.1)

Порождающую матрицу 𝐺(𝐷) кодера с памятью 𝑚 можно записать также в виде разложения по степеням переменной 𝐷:

𝐺(𝐷) = 𝐺0 + 𝐺1 𝐷 + ... + 𝐺𝑚 𝐷𝑚 .

(8.2)

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

224

8. Сверточные коды

Рассмотрим сначала коды со скоростью 𝑅 = 1/𝑛. Заметим, что
информационные последовательности вида 1, 𝐷, 𝐷2 ,... образуют
в совокупности (бесконечный) базис линейного пространства входных последовательностей кодера, поскольку любая информационная последовательность может быть единственным образом представлена в виде линейной комбинации этих мономов. Умножая эти
последовательности на 𝐺(𝐷), получим базис пространства кодовых
слов. Эти базисные векторы кода являются сдвигами одной и той
же строки. Обобщая эти рассуждения на коды с произвольной скоростью, можем записать


𝐺0 𝐺1 · · · 𝐺𝑚 0𝑘,𝑛 · · ·

⎜0𝑘,𝑛 𝐺0 𝐺1 · · · 𝐺𝑚 0𝑘,𝑛 · · ·


(8.3)
𝐺=⎜
⎟,
0
𝐺
𝐺
·
·
·
𝐺
0
·
·
·
0
1
𝑚
𝑘,𝑛
𝑘,𝑛


..
..
..
..
..
..
.
.
.
.
.
.
где через 0𝑘,𝑛 обозначена нулевая матрица размерности 𝑘 × 𝑛, а
𝐺𝑚 — матричные коэффициенты разложения 𝐺(𝐷) по степеням 𝐷
в соответствии с (8.2).
При обсуждении вопросов декодирования часто используют
представление сверточных кодов с помощью графов.
Вернемся к коду (5,7), кодер которого показан на рис. 8.2, а.
Считаем, что начальное состояние кодера было нулевым. Это состояние и все следующие за ним мы будем отображать в виде узлов
дерева. Возможные переходы из состояния в состояние соответствуют ребрам дерева. Каждому такому ребру соответствует некоторый
блок из 𝑛 = 2 кодовых символов. Несколько начальных ярусов дерева, соответствующего коду (5,7), показано на рис. 8.3. Это дерево
называют кодовым деревом. В связи с такой графической интерпретацией сверточного кода параметр 𝑛 называют длиной ребра.
По кодовому дереву легко определить кодовое слово, соответствующее заданной информационной последовательности. На рис.
8.3 движение вверх соответствует информационному символу 0,
движение вниз — символу 1. Например, информационной последовательности 010. . . соответствует кодовое слово 00 11 01. . . . Соответствующие переходы показаны на дереве жирными линиями.
Обращает на себя внимание то, что число узлов дерева быстро
растет от яруса к ярусу. В то же время, каждому узлу соответству-

8.1. Представление сверточного кода

225
00

00
00

00

0

00

00

11
10

11

01
10

01

10
11

00

11

11

1

01
10

01

00

00
10

10

10
11

01

01
11

Рис. 8.3. Представление сверточного кода в виде дерева
ет некоторое состояние кодера. Число различных состояний кодера кода со скоростью 𝑅 = 1/2 и с длиной кодового ограничения
𝜈 = 2 равно 2𝜈 = 4. Следовательно, начиная с яруса с номером 3,
найдутся узлы, соответствующие одинаковым состояниям. Поддеревья, начинающиеся в этих узлах, полностью идентичны. Чтобы
сделать графическое представление кода более компактным, имеет
смысл объединить узлы, соответствующие одинаковым состояниям,
и отображать их в виде одного узла.
Полученный таким образом граф называют решетчатой диаграммой сверточного кода. Напомним, что у нас уже есть опыт
построения решетчатых диаграмм для блоковых кодов (см. главу
4). Решетчатая диаграмм кода (5,7) приведена на рис. 8.4. В общем
случае кода со скоростью 1/𝑛 и кодовым ограничением 𝜈 на ярусах
с номерами 𝑡 =1, 2, . . . , 𝜈 − 1 располагается 2𝑡 узлов, и из каждого
узла исходит 𝑞 = 2𝑘 = 2 ребра. На ярусах с номерами 𝑡 > 𝜈 число
узлов равно 2𝜈 , в каждый узел входит 2 ребра и из каждого узла
исходит 2 ребра. В случае кода со скоростью 𝑘/𝑛 и кодовым ограничением 𝜈 максимальное число состояний равно 2𝜈 , число ребер,
исходящих из каждого узла, равно 2𝑘 .
По заданной информационной последовательности легко проследить кодовое слово. Поступление на вход кодера информацион-

226

8. Сверточные коды
00

00

00

00

00

00

11
11

11

10

11

11

01

01

01

10

10

10
11

11

00

01

10

00

01

00

01

00

00

10

10
01

10

11

10
01

11

Рис. 8.4. Решетчатая диаграмма сверточного кода
ного символа 0 соответствует переходу в то из двух доступных из
данного узла состояний, номер которого меньше. Поступление единицы приводит к переходу в состояние с бо́льшим номером. На рис.
8.4 видно, что в первом случае мы двигаемся по решетке «вверх»,
во втором — «вниз».
Представление кода решетчатой диаграммой чрезвычайно удобно для анализа декодирования сверточных кодов. Для изучения характеристик сверточных кодов еще удобнее представление кодера в
виде конечного автомата. Для кода (5,7) конечный автомат показан
на рис. 8.5. Конечный автомат описывается графом, узлы которого
соответствуют состояниям кодера, а ребра — переходам из состояние в состояние. Видно, что из каждого состояния выходят ровно
два ребра, соответствующие двум возможным значениям входных
символов. Каждому ребру приписаны кодовые символы, порождаемые кодером при данном переходе. В скобках указан информационный символ, соответствующий переходу.
Рассмотрим кодер и соответствующий конечный автомат, показанные на рис. 8.6.
Воспользовавшись схемой кодера либо диаграммой его состояний, легко убедиться, что информационной последовательности
бесконечного веса 11. . . 1. . . соответствует кодовая последовательность 11 01 00 00 . . . 00 . . . веса 3. При передаче длинной после-

8.1. Представление сверточного кода

227

00(0)

11(0)

01
10(0)

00
01(0)
00(1)

11

11(1)

10
10(1)

01(1)

Рис. 8.5. Диаграмма состояний кодера сверточного кода
00(0)

𝑣1
01(0)

+

𝑢

01

+

11(0)

𝑣2

00
10(0)
10(1)

11

11(1)

10
01(1)

00(1)

Рис. 8.6. Катастрофический кодер и его диаграмма состояний
довательности нулевых информационных символов всего 2 ошибки
в канале связи достаточно для того, чтобы вместо нулевого кодового слова было принято записанное выше кодовое слово, соответствующее информационной последовательности из большого числа
единиц. Этот пример показывает, что для некоторых сверточных
кодеров небольшое число ошибок в канале связи может стать причиной большого числа ошибок декодирования.

228

8. Сверточные коды

Сверточные кодеры, содержащие кодовые слова конечного веса, соответствующие информационным последовательностям бесконечного веса, называются катастрофическими.
Сверточный кодер cо скоростью 𝑅 = 1/𝑛 является катастрофическим, если его порождающие полиномы имеют общий делитель,
не равный 1 или некоторому моному 𝐷𝑖 . Убедимся в этом.
Заметим, что интерес представляют только кодеры с порождающими матрицами 𝐺(𝐷) такими, что матрица 𝐺0 в разложении (8.2)
матрицы 𝐺(𝐷) отлична от нуля. В противном случае в регистрах
кодера начальные ячейки невостребованы и могут быть удалены
без изменения характеристик кода.
Пусть 𝑎(𝐷) = НОД(𝑔1 (𝐷), 𝑔2 (𝐷), ..., 𝑔𝑛 (𝐷)). Поскольку по меньшей мере один из генераторов не делится на 𝐷, общий делитель
имеет вид 𝑎(𝐷) = 1 + 𝐷𝑏(𝐷), где 𝑏(𝐷) ̸= 0. Тогда при кодировании
информационной последовательности бесконечного веса

𝑢(𝐷) = 1/𝑎(𝐷) = 1 + 𝐷𝑏(𝐷) + 𝐷2 𝑏2 (𝐷) + ...
будет получена последовательность кодовых блоков, полиномиальное представление которой имеет вид 𝑣(𝑑)
=
= (𝑔1 (𝐷)/𝑎(𝐷), 𝑔2 (𝐷)/𝑎(𝐷), ..., 𝑔𝑛 (𝐷)/𝑎(𝐷)). Очевидно, эта кодовая последовательность имеет конечный вес.
Кодер, представленный
на рис.)︀ 8.6, задается полиномиальной
(︀
матрицей 𝐺(𝐷) = 1 + 𝐷 1 + 𝐷2 . Оба генератора имеют делителем полином 1 + 𝐷, следовательно, кодер — катастрофический,
в чем мы уже убедились, найдя слово конечного веса для информационной последовательности бесконечного веса. Найденная последовательность имеет вид (11 01 00, ...). Порождающая матрица
может быть построена из этой последовательности и множества ее
сдвигов на 2, 4 позиции и т.д. Сравнивая с (8.3), приходим к выводу, что(︀ тот же самый
код описывается порождающей матрицей
)︀
𝐺(𝐷) = 1 1 + 𝐷 , задающей некатастрофический кодер данного
кода.
Определить, является ли катастрофическим кодер кода со скоростью 𝑅 = 𝑘/𝑛, задаваемый произвольной матрицей 𝐺(𝐷) размера
𝑘 × 𝑛, не так просто. К этой задаче мы вернемся при обсуждении
алгебраических свойств сверточных кодов.

8.2. Свободное расстояние и спектр сверточного кода

8.2.

229

Свободное расстояние и спектр
сверточного кода

Как и в случае блоковых кодов, способность сверточного кода исправлять ошибки в канале связи определяется тем, насколько «далеко» друг от друга располагаются его кодовые слова. Для многих
практических задач хорошей мерой близости служит расстояние
Хэмминга между кодовыми словами.
Минимальным расстоянием блокового кода называют минимальное из попарных расстояний между кодовыми словами. Минимальное расстояние линейного кода может быть вычислено как
минимальный вес его ненулевых кодовых слов. Особенность сверточного кода заключается в том, что его слова имеют бесконечную
длину. Тем не менее, минимальное расстояние между парами кодовых слов конечно. В этом можно убедиться, например, вычислив
вес кодового слова, порожденного информационной последовательностью веса 1.
Минимальное расстояние сверточного кода называют его свободным расстоянием. Обозначим его как 𝑑𝑓 .
При поиске пути минимального веса по решетке сверточного кода достаточно рассматривать только пути, ответвляющиеся от нулевого на начальном ярусе и затем сливающиеся с нулевым путем.
Множество таких путей называют первым неправильным поддеревом. Легко установить с помощью рис. 8.4, что свободное расстояние
кода (5,7) равно 𝑑𝑓 = 5. Слово минимального веса соответствует пути, который выходит из узла 00, затем проходит через узлы 10, 01,
00, 00, . . . Этот же путь легко проследить и по диаграмме конечного
автомата, представленной на рис. 8.5.
При анализе помехоустойчивости сверточных кодов выясняется, что на величину вероятности ошибки декодирования влияет не
только свободное расстояние кода, но и то, как много слов малого
веса содержит код. Обозначим через 𝑁𝑑 число слов веса 𝑑, соответствующих путям, ответвляющимся от нулевого пути на нулевом
ярусе (путям первого неправильного поддерева). Набор чисел {𝑁𝑑 },
𝑑 = 𝑑𝑓 , 𝑑𝑓 + 1, ... называют спектром сверточного кода. Для вычисления спектров применяют метод производящих функций.

230

8. Сверточные коды

Рассмотрим дискретное множество 𝑋 = {𝑥1 , ..., 𝑥𝑁 }, содержащее 𝑁 элементов. Пусть на этом множестве определена некоторая
функция 𝑓 (𝑥), принимающая значения из дискретного множества
𝑍 = {𝑧}, представляющего собой подмножество множества целых
чисел Z. Обозначим через 𝑁𝑧 количество элементов 𝑥 множества
𝑋 , для которых 𝑓 (𝑥) = 𝑧 . Полином вида

𝑇 (𝐷) =

∑︁

(8.4)

𝑁𝑧 𝐷𝑧

𝑧∈𝑍

называется производящей функцией для 𝑓 (𝑥).
Пример 8.1. Пусть 𝑍 = {1, ..., 6} — множество исходов бросания

игральной кости. Производящая функция числа очков при одном
бросании
𝐷7 − 𝐷
𝑇1 (𝐷) = 𝐷 + 𝐷2 + ... + 𝐷6 =
.
𝐷−1

Пример 8.2. Рассмотрим игру в орлянку, при которой выпадение

орла уменьшает капитал одного из игроков на единицу, выпадение
решетки — увеличивает капитал на единицу. В этом случае 𝑍 =
= {−1, 1} и производящая функция исходов одного бросания равна

𝑇2 (𝐷) = 𝐷−1 + 𝐷.
Главное свойство производящих функций, благодаря которому их используют для анализа сумм функций, состоит в том,
что производящая функция суммы двух функций равна произведению производящих
функций ∑︀
слагаемых. Действительно, если
∑︀
𝑇𝑈 (𝐷) = 𝑢∈𝑈 𝑁𝑢 𝐷𝑢 и 𝑇𝑉 (𝐷) = 𝑣∪𝑉 𝑁𝑣 𝐷𝑣 — две производящие
функции, то их произведением будет
∑︁ ∑︁
𝑇𝑈 (𝐷)𝑇𝑉 (𝐷) =
𝑁𝑢 𝑁𝑣 𝐷𝑢+𝑣 =
𝑢∈𝑈 𝑣∈𝑉


=

∑︁


∑︁


𝑧

𝑁𝑢 𝑁𝑣 ⎠ 𝐷𝑧 = 𝑇𝑍 (𝐷),

(𝑢,𝑣):𝑢+𝑣=𝑧

где в правой части мы получили производящую функцию суммы
𝑧 = 𝑢 + 𝑣.

8.2. Свободное расстояние и спектр сверточного кода

231

Пример 8.3. Монету бросают 10 раз. Каково число комбинаций

исходов, при котором выигрыш игрока составит 6 единиц? Для ответа на этот вопрос запишем производящую функцию суммы исходов 10 опытов в виде
(︀
)︀
1
2
9
𝑇3 (𝐷) = 𝑇2 (𝐷)10 = 𝐷−10 1 + 𝐶10
𝐷2 + 𝐶10
𝐷4 + ... + 𝐶10
𝐷18 + 𝐷20 .

8 =120, именно в таком
Поскольку коэффициент при 𝐷6 равен 𝐶10
числе исходов из общего числа 1024 всевозможных исходов игрок
получит доход в 6 единиц.

На рис. 8.7 приведен простой пример направленного графа. Числа, сопоставленные ребрам графа, интерпретируются как длины
ребер. Задача анализа графа состоит в подсчете числа путей длины 0, 1, 2, . . . из узла a в узел d. Обозначим через 𝑁𝑖 число путей
суммарной длины 𝑖. Непосредственный перебор по множеству путей показывает, что 𝑁0 = 𝑁1 = 𝑁2 = 𝑁3 = 0, 𝑁4 = 1,. . . . Для
этого простого примера нетрудно вывести общую формулу для 𝑁𝑖 ,
но понятно, что для более сложного графа задача окажется трудной. Мы используем этот простой пример для иллюстрации метода
производящих функций.
a

1

1

c

b

2

d

3

Рис. 8.7. Пример направленного графа
Обозначим через 𝑔𝑠 (𝐷) производящую функцию длины путей
из узла a в узел 𝑠. Задача состоит в нахождении 𝑔𝑑 (𝐷).
Общие правила подсчета производящих функций весов путей
графа таковы:

∙ Слиянию путей соответствует объединение двух множеств
значений, поэтому при слиянии путей производящие функции
суммируются.
∙ Последовательному соединению путей соответствует суммирование длин путей, поэтому соответствующие производящие
функции перемножаются.

232

8. Сверточные коды

Рассмотрим узел b. В этот узел ведет один путь длины 1 из узла a и множество путей, проходящих по ребру длины 3 из узла c.
Поскольку суммированию длин соответствует перемножение производящих функций, производящая функция для путей из a равна
𝐷, а для путей из c она равна 𝐷3 𝑔c (𝐷). В итоге имеем

𝑔b (𝐷) = 𝐷 + 𝐷3 𝑔c (𝐷).
Аналогично для узлов c и d имеем

𝑔c (𝐷) = 𝐷𝑔b (𝐷);
𝑔d (𝐷) = 𝐷2 𝑔c (𝐷).
Решая систему из трех уравнений, находим

𝑔d (𝐷) =

𝐷4
.
1 − 𝐷4

Чтобы найти коэффициенты производящей функции в явном
виде, воспользуемся формулой

1
= 1 + 𝑥 + 𝑥2 + ..., |𝑥| < 1.
1−𝑥
Окончательный результат имеет вид

𝑔d (𝐷) = 𝐷4 + 𝐷8 + 𝐷12 + ... .
Отсюда следует, что, как можно было предвидеть, в нашем графе есть один путь из a в d длины 4, один путь длины 8 и т.д.
Рассмотрим теперь задачу вычисления производящей функции
спектра кода на примере кода (5,7) со скоростью 1/2. На рис. 8.2, а,
показана схема кодера и на рис. 8.5 — соответствующий кодеру конечный автомат. При подсчете спектра расстояний сверточного кода для нас не важна конкретная последовательность, сопоставленная конкретному ребру графа, важен только ее вес. Поэтому граф
автомата приведен к виду, показанному на рис. 8.8, а, где ребрам
приписаны производящие функции весов соответствующих последовательностей. Помимо этого, исключен переход из состояния 0 в
состояние 0, поскольку нашей целью является анализ множества кодовых последовательностей первого неправильного поддерева, т.е.

8.2. Свободное расстояние и спектр сверточного кода

233

последовательностей, отличающихся от нулевой последовательности в первом подблоке. Как и прежде, обозначим через 𝑔𝑠 (𝐷) производящую функцию веса путей из узла 0 в узел с номером 𝑠. Задача
теперь состоит в нахождении 𝑔0 (𝐷).
𝐷2

0

𝐷2

𝐷

1

2

1
𝐷

3

𝐷

𝐷2

0
𝐷

1

𝐼
𝐷

3

𝐷2 𝐼

2

𝐷𝐼

𝐷

𝐷𝐼

а) Разметка, учитывающая
веса ребер

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

Рис. 8.8. Размеченные диаграммы состояний кода (5,7)
Аналогично рассмотренному выше примеру получаем систему
уравнений

𝑔0 (𝐷) = 𝐷2 𝑔1 (𝐷);



𝑔1 (𝐷) = 𝐷𝑔2 (𝐷) + 𝐷𝑔3 (𝐷);
𝑔 (𝐷) = 𝐷2 + 𝑔1 (𝐷);


⎩ 2
𝑔3 (𝐷) = 𝐷𝑔2 (𝐷) + 𝐷𝑔3 (𝐷).
Решением системы является производящая функция

𝑔0 (𝐷) =

𝐷5
= 𝐷5 + 2𝐷6 + 4𝐷7 + ... .
1 − 2𝐷

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

234

8. Сверточные коды

кодового слова. Таким образом, каждый путь в графе мы можем
характеризовать двумя параметрами: вес Хэмминга соответствующего кодового слова и вес Хэмминга соответствующей информационной последовательности.
Метод производящих функций, который был выше описан для
случая одного дискретного множества чисел, легко обобщается для
совместного анализа двух и большего числа множеств. В частности, если обозначить через 𝑡(𝑑, 𝑖) число кодовых слов, порождаемых информационными последовательностями веса 𝑖 и имеющих
вес Хэмминга, равный 𝑑, то производящая функция числа таких
путей определяется как функция двух формальных переменных 𝐷
и𝐼
∞ ∑︁

∑︁
𝑇 (𝐷, 𝐼) =
𝑡(𝑑, 𝑖)𝐷𝑑 𝐼 𝑖 .
(8.5)
𝑑=1 𝑖=1

Эту производящую функцию называют расширенной производящей функцией сверточного кода. Найдем 𝑇 (𝐷, 𝐼) для кода (7,5).
Для этого каждому ребру конечного автомата, описывающего работу кодера, сопоставим вычисленную для этого ребра совместную
производящую функцию веса кодового блока и веса соответствующей информационной последовательности. Размеченная таким образом диаграмма состояний приведена на рис. 8.8, б.
Пусть 𝑔𝑠 (𝐷, 𝐼) обозначает расширенную производящую функцию для путей, ведущих из состояния 0 в состояние 𝑠. Искомая
производящая функция равна 𝑇 (𝐷, 𝐼) = 𝑔0 (𝐷, 𝐼). По диаграмме
состояний кодера составляем систему уравнений для нахождения
𝑔0 (𝐷, 𝐼)

𝑔0 (𝐷, 𝐼) = 𝐷2 𝑔1 (𝐷, 𝐼);



𝑔1 (𝐷, 𝐼) = 𝐷𝑔2 (𝐷, 𝐼) + 𝐷𝑔3 (𝐷, 𝐼);
(8.6)
𝑔 (𝐷, 𝐼) = 𝐷2 𝐼 + 𝐼𝑔1 (𝐷, 𝐼);


⎩ 2
𝑔3 (𝐷, 𝐼) = 𝐷𝐼𝑔2 (𝐷) + 𝐷𝐼𝑔3 (𝐷, 𝐼).
Решив систему, получим

𝑇 (𝐷, 𝐼) = 𝑔0 (𝐷, 𝐼) =
𝐷5 𝐼
=
= 𝐷5 𝐼 + 2𝐷6 𝐼 2 + 4𝐷7 𝐼 3 + 8𝐷8 𝐼 4 ... (8.7)
1 − 2𝐷𝐼
Этот результат означает, что код содержит одно слово веса 5, порождаемое информационной последовательностью веса 1. Каждое

8.2. Свободное расстояние и спектр сверточного кода

235

из двух слов веса 6 порождается информационной последовательностью веса 2 и т.д.
Нам пригодится в дальнейшем производящая функция весов путей, не учитывающая весов соответствующих информационных последовательностей
𝑇 (𝐷) = 𝑇 (𝐷, 𝐼) |𝐼=1 .
(8.8)
Для практических расчетов вероятности ошибок часто используется производящая функция

𝐹 (𝐷) =


∑︁

𝑓𝑑 𝐷𝑑 ,

(8.9)

𝑑=1

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

∑︁
𝑓𝑑 =
𝑖𝑡(𝑑, 𝑖).
(8.10)
𝑖=1

Функцию 𝐹 (𝐷) называют производящей функцией весов для
подсчета вероятности ошибки на бит или, проще, производящей
функцией спектра ошибки на бит.
Из (8.5) и (8.10) следует формула, связывающая функции
𝑇 (𝐷, 𝐼) и 𝐹 (𝐷):

𝐹 (𝐷) =

∞ ∑︁

∑︁

𝑖𝑡(𝑑, 𝑖)𝐷𝑑 =

(8.11)

𝑑=1 𝑖=1

=

𝜕
𝑇 (𝐷, 𝐼) |𝐼=1 .
𝜕𝐼

(8.12)

Из (8.7) и (8.11) для кода с генераторами (5,7) получаем

𝐹 (𝐷) = 𝐷5 + 4𝐷6 + 12𝐷7 + 32𝐷8 + ... .
Из этого примера видно, что даже для кода с кодовым ограничением 2 применение метода производящих функций позволило
существенно упростить задачу вычисления спектральных характеристик кода по сравнению с перебором по множеству кодовых слов
кода.

236

8. Сверточные коды

Заметим, что для получения функций 𝐹 (𝐷) и 𝑇 (𝐷) мы решили
в символьном виде систему из 4 линейных уравнений. Для кода с
кодовым ограничением 𝜈 число уравнений равно 2𝜈 , где 𝜈 — кодовое ограничение кода. Для практически интересных длин кодового
ограничения задача относительно просто решается с помощью компьютера, но нужно иметь в виду, что метод Гаусса решения систем
линейных уравнений в данном применении будет иметь сложность
порядка 23𝜈 . Понятно, что даже для небольших длин кодовых ограничений данный подход неэффективен.
Нетрудно заметить, однако, что матрица коэффициентов уравнений в каждой строке содержит всего 2 значащих элемента (2𝑘
ненулевых элемента в случае кода со скоростью 𝑅 = 𝑘/𝑛). Следовательно, матрица является разреженной, что позволяет уменьшить
сложность решения системы уравнений до величины порядка 2𝜈 .
На практике применяются численные методы, позволяющие быстро найти первые коэффициенты разложения производящих функций по степеням 𝐷 без нахождения точного аналитического выражения для самих функций, т.е. без решения системы уравнений.
Сложность этих методов много ниже чем 2𝜈 , что позволяет найти
свободные расстояния и спектры некоторых кодов с кодовым ограничением свыше 70. Примерами методов быстрого анализа сверточных кодов являются алгоритмы FAST [61] и BEAST [49].

8.3.

Оценки вероятности ошибки

Рассмотрим сначала произвольный линейный код длины 𝑛 с минимальным расстоянием 𝑑 и спектром 𝑁𝑑 , 𝑁𝑑+1 , ..., 𝑁𝑛 , где 𝑁𝑤 —
число слов веса 𝑤.
Оценивая вероятность ошибки при передаче одного из слов линейного кода (например, нулевого) сверху суммой вероятностей
ошибок в пользу слов веса 𝑤 при 𝑤 = 𝑑, 𝑑 + 1, ..., 𝑛, приходим к
оценке

𝑃𝑒 =

𝑛
∑︁
𝑤=𝑑

𝑃𝑒 (𝑤) ≤

𝑛
∑︁

𝑁𝑤 𝑃 (𝑤),

(8.13)

𝑤=𝑑

где 𝑃𝑒 (𝑤) — вероятность ошибки в пользу конкретного слова веса 𝑤,

8.3. Оценки вероятности ошибки

237

а 𝑃 (𝑤) — вероятность ошибки для кода из двух слов, отличающихся
в 𝑤 позициях.
Интуитивно понятно, что 𝑃 (𝑤) в случае канала без памяти экспоненциально убывает с увеличением 𝑤. Примем как гипотезу, что
для 𝑃 (𝑤) имеет место оценка вида
(8.14)

𝑃 (𝑤) ≤ 𝐵(𝑤)𝐷0𝑤 ,

где 𝐷0 — константа,зависящая от характеристик канала, а 𝐵(𝑤) —
невозрастающая по 𝑤 функция, также зависящая от канала. Вычисления, подтверждающие эту гипотезу, для случаев ДСК и канала с
АБГШ приведены ниже. После подстановки (8.14) в (8.13) имеем

𝑃𝑒 ≤

𝑛
∑︁

𝑁𝑤 𝐵(𝑤)𝐷0𝑤 ≤ 𝐵(𝑑)

𝑤=𝑑

𝑛
∑︁

𝑁𝑤 𝐷0𝑤 .

(8.15)

𝑤=𝑑

Введя обозначение

𝑁 (𝐷) =

𝑛
∑︁

𝑁𝑤 𝐷𝑤

𝑤=𝑑

для производящей функции спектра кода, приходим к формуле

𝑃𝑒 ≤ 𝐵(𝑑)𝑁 (𝐷)|𝐷=𝐷0 .

(8.16)

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

𝑃𝑒 ≤ 𝐵(𝑑𝑓 )𝑇 (𝐷)|𝐷=𝐷0 .

(8.17)

Аналогично для сверточного кода со скоростью 𝑅 = 𝑘/𝑛 вероятность ошибки на бит 𝑃𝑒𝑏 , т.е. доля ошибок в декодированной
информационной последовательности, удовлетворяет неравенству

238

8. Сверточные коды

1
𝐵(𝑑𝑓 )𝐹 (𝐷)|𝐷=𝐷0 ,
(8.18)
𝑘
где 𝐹 (𝐷) вычисляется по 𝑇 (𝐷, 𝐼) по формуле (8.11).
Осталось указать формулы для 𝐷0 и 𝐵(𝑑).
Рассмотрим сначала двоичный симметричный канал (ДСК).
Воспользовавшись формулой биномиального распределения, мы
легко найдем вероятность половины или более половины ошибок на
𝑤 позициях. После этого нужно будет воспользоваться формулой
Стирлинга.
𝑃𝑒𝑏 ≤

Упражнение 8.1. Докажите, что в случае ДСК с переходной ве-

роятностью 𝑝0

√︂
1−𝑝
2
𝐵(𝑤) =
;
1 − 2𝑝 𝜋𝑤
√︀
𝐷0 = 2 𝑝0 (1 − 𝑝0 ).

(8.19)
(8.20)

Подсказка: воспользуйтесь формулами из приложения к главе

1.

Чуть более точная формула, чем (8.19), приведена в [100]. Еще
одно уточнение, основанное на том, что при четном 𝑤 число ошибок, равное 𝑤/2, только в половине случаев приводит к ошибке декодирования, предложено Ван де Мибергом [111]. Окончательные
формулы для ДСК имеют вид:

𝑃𝑒 <
𝑃𝑏 <
где

𝐵(𝑑𝑓 )
[(1 + 𝐷)𝑇 (𝐷) + (1 − 𝐷)𝑇 (−𝐷)] |𝐷=2√𝑝(1−𝑝) ;
2
𝐵(𝑑𝑓 )
[(1 + 𝐷)𝐹 (𝐷) + (1 − 𝐷)𝐹 (−𝐷)] |𝐷=2√𝑝(1−𝑝) ,
2𝑘


⎨ √ 2 𝑝(1−𝑝)
для нечетных 𝑤;
2𝜋(𝑤+1)(1−2𝑝)
𝐵(𝑤) =
⎩ √ 1
для четных 𝑤.

(8.21)
(8.22)

2𝜋𝑤(1−2𝑝)

Обратимся к случаю канала с аддитивным гауссовским шумом.
Как и в главе 1, считаем, что на выходе канала при передаче
нуля и единицы наблюдаются гауссовские случайные
с
√ величины

дисперсией 𝑁0 /2 и математическими ожиданиями − 𝐸 и 𝐸 соответственно.

8.3. Оценки вероятности ошибки

239

Упражнение 8.2. Докажите, что вероятность ошибки для кода

из двух слов, отличающихся в 𝑤 позициях, равна
)︃
(︃√︂
2𝑤𝐸
,
𝑃 (𝑤) = 𝑄
𝑁0

(8.23)

где использовано обозначение

1
𝑄(𝑥) = 1 − √
2𝜋

∫︁𝑥

𝑡2

𝑒− 2 𝑑𝑡.

−∞

Следующий шаг состоит в использовании неравенства
)︀
(︀√ )︀
(︀√
𝑄 𝑥 + 𝑦 ≤ 𝑄 𝑥 𝑒−𝑦/2 , 𝑥, 𝑦 > 0,
доказательство которого можно найти, например, в [25] (лемма 4.8).
Получаем формулы


𝐸

𝐷0 = 𝑒 𝑁0 ;
(︃√︂
)︃
2𝑤𝐸
𝐵(𝑤) = 𝑄
𝑒𝑤𝐸/𝑁0 .
𝑁0

(8.24)
(8.25)

Эти значения используются совместно с (8.17) и (8.18) для вычисления, соответственно, вероятности ошибочного события и вероятности ошибки на бит.
Аддитивные границы вероятности ошибки грубы и почти бесполезны при малых отношениях сигнал/шум. При сильном шуме
единственным способом анализа кодов остается компьютерное моделирование. В то же время, при высоких отношениях сигнал/шум
и, соответственно, малой вероятности ошибки (ниже 10−6 ) трудоемкость моделирования становится очень высокой, при этом аддитивные оценки, вычисленные по первым 5 . . . 10 коэффициентам
производящей функции, дают вполне приемлемые по точности результаты.
Приведенные вычисления дают возможность оценить энергетический выигрыш кодирования при больших значениях отношения
сигнал/шум на бит передаваемой информации.

240

8. Сверточные коды

Для случая ДСК переходная вероятность 𝑝0 связана с отношением сигнал/шум формулой
)︃
(︃√︂
2𝐸 ∼ −𝐸/𝑁0
,
𝑝0 = 𝑄
=𝑒
𝑁0
где знак ∼
= мы используем для обозначения асимптотического равенства при 𝐸/𝑁0 → ∞. В частности, в отсутствие кодирования
вероятность ошибки на бит 𝑃𝑒𝑏 = 𝑝0 и отношение сигнал/шум на
бит 𝐸𝑏 /𝑁0 = 𝐸/𝑁0 , поэтому

𝑃𝑒𝑏(Без кодирования) ∼
= 𝑒−𝐸𝑏 /𝑁0 .
При использовании блоковых либо сверточных кодов в аддитивной границе вероятности ошибки (8.15)—(8.16) при 𝐸/𝑁0 → ∞
имеет значение только первое слагаемое суммы, причем коэффициент при экспоненциальном члене вида 𝐷0𝑑 также не играет роли.
Имеем
(︁ √︀
)︁𝑑
−𝑑 𝐸
𝑃𝑒𝑏 ∼
= 𝐷0𝑑 = 2 𝑝(1 − 𝑝) ∼
= 𝑝𝑑/2 ∼
= 𝑒 2𝑁0 .
Напомним, что при скорости кода 𝑅 имеет место равенство
𝐸 = 𝑅𝐸𝑏 . Сопоставляя соотношения для вероятности ошибки при
наличии и отсутствии кодирования, приходим к выводу, что при использовании кодов со скоростью 𝑅 и минимальным расстоянием 𝑑
асимптотический выигрыш кодирования при больших отношениях
сигнал/шум равен
(8.26)
𝛾ДСК ∼
= 10 lg(𝑑𝑅/2).
Для сверточного кода вместо 𝑑 нужно подставить свободное расстояние 𝑑𝑓 . Для гауссовского канала из (8.16) и (8.24) сразу получаем
−𝑑 𝐸
𝑃𝑒𝑏 ∼
= 𝐷0𝑑 = 𝑒 𝑁0 ,
откуда следует, что энергетический выигрыш равен

𝛾ГК ∼
= 10 lg(𝑑𝑅),

(8.27)

и в этой формуле вместо 𝑑 подставляют 𝑑𝑓 , если код сверточный.

8.4. Декодирование по максимуму правдоподобия

241

Результаты моделирования декодирования по максимуму правдоподобия в канале с мягкими решениями для нескольких блоковых и сверточных кодов показаны на рис. 8.9. Заметим, что сложность декодирования расширенного кода Голея (24,12) соизмерима
со сложностью декодирования сверточного кода с ограничением 8,
а кода (48,24) — со сложностью декодирования сверточного кода с
ограничением 12. Из графиков видно, что при сопоставимой сложности декодирования сверточные коды выигрывают почти 2 дБ по
требуемому отношению сигнал/шум на бит по сравнению с блоковыми кодами.
Упражнение 8.3. Сравните результаты моделирования для свер-

точных кодов с аддитивной оценкой вероятности ошибки.

Упражнение 8.4. Сравните реальный энергетический выигрыш

при вероятности ошибки на бит 10−5 с асимптотическим энергетическим выигрышем и с пределом Шеннона (см. главу 1).

8.4.

Декодирование по максимуму
правдоподобия

Для декодирования сверточных кодов по максимуму правдоподобия применяется алгоритм Витерби, который применительно к блоковым кодам уже был рассмотрен в главе 4. Чтобы уяснить работу
декодера, сначала мы рассмотрим блоковый код, получаемый усечением сверточного, а уже потом обсудим декодирование бесконечной
последовательности символов на выходе канала. Усечение сверточного кода с кодовым ограничением 𝜈 на длине 𝐿 осуществляется
подачей на вход кодера после информационной последовательности
длины 𝐿 − 𝜈 серии из 𝜈 нулей. Если скорость исходного кода была
равна 𝑅 = 𝑘/𝑛, то скорость усеченного кода будет равна 𝑅′ = 𝑅 𝐿−𝜈
𝐿
и будет мало отличаться от скорости сверточного кода при большой
длине 𝐿.
Будем рассматривать декодирование сверточного кода на примере кода (7,5) с кодовым ограничением 𝜈 = 2. Фрагмент решетчатой диаграммы усеченного кода при 𝐿 = 5 показан на рис. 8.10.
Эта решетчатая диаграмма описывает множество кодовых слов
усеченного сверточного кода, получаемого при подаче на вход ко-

242

8. Сверточные коды

Рис. 8.9. Вероятность ошибки на бит в гауссовском канале для блоковых и сверточных кодов:
1: Код (24,12), 𝑑=8;
2: Код (48,24), 𝑑=12;
3: Сверточный код, 𝜈 = 4, генераторы (35,23), 𝑑𝑓 =7;
4: Сверточный код, 𝜈 = 8, генераторы (657,435), 𝑑𝑓 =12;
5: Cверточный код, 𝜈 = 12, генераторы (15521,11677), 𝑑𝑓 =16
дера некоторой последовательности информационных символов и
вслед за ней — последовательности из 𝜈 нулей, где 𝜈 — длина кодового ограничения кода. В данном примере вслед за тремя информационными символами подается два нуля, в результате получается,
по сути, линейный блоковый код длины 12 с четырьмя информационными символами. Рассмотрение усеченных сверточных кодов

8.4. Декодирование по максимуму правдоподобия
00

00

00

00

00

00

11
11

11

10

11

11

01

01

11

01

01

00

00

11

01

01

10

10
11

11

00

00

10

10

00

00

01

00

01

00

00

243

10

10
01

10

11

10

10
01

11

Рис. 8.10. Решетка усеченного сверточного кода
удобно с точки зрения описания алгоритма. Ниже будет объяснено,
как алгоритм Витерби может быть использован для декодирования
бесконечно длинных последовательностей.
Для каждого узла решетки мы называем предшествующими узлами те узлы предыдущего яруса, которые связаны ребрами с данным узлом. Путь, ведущий в данный узел на ярусе с номером 𝑡, задается последовательностью из 𝑡 информационных символов, при
подаче которой на вход кодера содержимое регистра кодера совпадет с номером узла.
При описании алгоритма мы предполагаем без потери общности, что задачей декодера является отыскание пути с минимальной метрикой. Метрикой узла мы называем метрику оптимального
пути, ведущего в узел, метрикой ребра — сумму метрик соответствующих кодовых символов. Через 𝐿 обозначим число ярусов решетчатой диаграммы, описывающей усеченный сверточный код.

244

8. Сверточные коды

Алгоритм 8.1. Алгоритм Витерби для сверточных кодов
Input: Выход канала 𝑣
Output: Информационная последовательность 𝑢

1.Инициализация;
t=0; % Номер яруса
Метрики всех узлов =0;
За каждым узлом закрепляется «пустой» путь нулевой
длины;
2. Основной цикл по ярусам решетки
for 𝑡 = 1 to 𝐿 do
2. Цикл по узлам яруса (состояниям кодера)
for 𝑠 = 0 to 2𝜈 − 1 do
∙ Находим метрику каждого из путей, ведущих в узел, как
сумму метрик предшествующих узлов и ребер, связывающих
узлы-предшественники с данным узлом.
∙ Находим путь с минимальной метрикой и эту метрику
приписываем данному узлу.
∙ Путь, ведущий в узел, вычисляется дописыванием к пути,
ведущему в выбранный предшествующий узел,
информационного символа, соответствующего переходу из
узла-предшественника в данный узел.
end

end

3. Формирование результата
Путь, соответствующий единственному узлу на ярусе 𝐿,
выдается получателю как результат декодирования.
Алгоритм Витерби 8.1 представляет собой частный случай более
общего алгоритма 4.1, использованного для декодирования блоковых кодов в главе 4.
Пути, сходящиеся в одном узле решетки, называют конкурирующими, а выбранный из их числа наилучший путь называют выжившим. Коротко говоря, алгоритм Витерби на каждом ярусе решетки
из каждого узла решетки «смотрит назад» на узлы предыдущего
яруса, находит метрики конкурирующих путей и выбирает путь с

8.4. Декодирование по максимуму правдоподобия

245

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

Реализация алгоритма Витерби

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

∙ начало работы декодера;
∙ декодирование бесконечных последовательностей;
∙ организация памяти для хранения метрик путей;
∙ организация памяти для хранения выживших путей.
Начало работы декодера

Из приведенной на рис. 8.10 решетчатой диаграммы видно, что, пока номер яруса не превысил кодового ограничения кода 𝜈 , структура решетки отличается от структуры решетки на остальных ярусах.
Эта нерегулярность усложняет как программную, так и аппаратную реализацию декодирования.
Эта проблема имеет очень простое решение. Предположим, что
декодирование производится по критерию минимальной метрики.
В начале работы декодера всем состояниям, кроме нулевого, приписываются одинаковые и достаточно большие значения метрик.
Нулевому узлу приписывается нулевая метрика. Далее выполняются точно такие же действия, как при декодировании на ярусах
с номерами, большими 𝜈 . Нетрудно убедиться, что при таком назначении начальных метрик на ярусе с номером 𝜈 декодер получит
правильные значения метрик всех узлов. «Несуществующие» пути
решетки будут отвергнуты декодером, поскольку их метрики будут
больше метрик путей, исходящих из нулевого узла.

246

8. Сверточные коды

Применение алгоритма Витерби для декодирования бесконечных последовательностей

Из описания алгоритма следует, что окончательное решение выдается декодеру только после обработки всей принятой выходной последовательности канала. Понятно, что, если длина усечения кода
велика или если используется неусеченный сверточный код, алгоритм не может быть использован из-за ограничений на задержку
декодирования и сложность реализации.
Введем параметр 𝑇 , представляющий собой максимальную задержку декодирования в числе информационных символов. Величина 𝑇 существенно превышает кодовое ограничение кода 𝜈 . На
ярусе с номером 𝑇 память путей декодера будет заполнена информационными последовательностями, соответствующими 2𝜈 узлам
решетки. Эти последовательности различны, но их число существенно меньше числа 2𝑇 различных последовательностей длины
𝑇 . На предыдущих шагах декодирования производилось сравнение
метрик конкурирующих путей и отбрасывались пути с худшими
значениями метрик. Если величина 𝑇 достаточно велика, то среди
путей, начавшихся 𝑇 ярусов назад, сохранилась лишь небольшая
доля путей, и все они имеют достаточно хорошие значения метрик.
Наиболее вероятна ситуация, когда на ярусе с номером 𝑡, 𝑡 > 𝑇 ,
все пути имеют одинаковый бит, соответствующий ярусу с номером
𝑡−𝑇 . Этот бит можно выдать получателю, стереть из памяти путей,
произвести сдвиг всех путей в регистрах памяти на одну ячейку и
тем самым освободить место для очередного информационного символа.
В принципе, при сильном шуме в канале, возможно, что старшие
биты в ячейках памяти путей различны. На этот случай нужно разработать стратегию формирования решений об информационных
символах. На практике применяют одну из следующих стратегий:

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

8.4. Декодирование по максимуму правдоподобия

247

Нетрудно упорядочить эти стратегии по надежности и по сложности реализации, но можно заранее сказать, что при больших 𝑇
разница между ними невелика. В практических схемах считается, что достаточно выбрать величину 𝑇 приблизительно в 5—6 раз
больше длины кодового ограничения кода.
Вычисление и хранение метрик путей

Основная область применения декодера Витерби — каналы с мягкими решениями, т.е. каналы, в которых значения на входе кодера — вещественные числа. Для дальнейшей обработки они должны
быть представлены в цифровой форме. От точности представления
зависит сложность аналого-цифрового преобразования, сложность
устройств, выполняющих арифметические операции над метриками ребер и путей, объем памяти для хранения метрик.
В 70-е годы, когда разрабатывались первые реализации декодера Витерби, было принято считать, что для представления метрик
символов достаточно 3 бит. По мере развития микроэлектроники
ограничения на сложность арифметических устройств становились
менее жесткими. Тем не менее, увеличение точности свыше 8 бит
(для каналов с двоичным входным алфавитом) действительно не
имеет смысла.
Итак, будем считать, что метрика одного символа записана в
виде 1 байта. Сколько бит нужно для представления метрик путей?
Если длина пути составляет 𝑁 символов канала, то максимальное значение метрики путей может достигнуть величины 28 𝑁 и для
хранения такой метрики нужно отвести (8 + log2 𝑁 ) двоичных ячеек памяти. При 𝑁 → ∞ память любого объема неизбежно переполнится.
В решении этой проблемы определяющую роль играет следующее наблюдение. Пусть 𝜈 — кодовое ограничение кода, 𝑛 — число кодовых символов, соответствующих ребру, 𝜇0 — максимальное
значение метрики символа. Тогда разница между максимальной и
минимальной метрикой путей, выживших на данном ярусе, не превышает величины 𝜈𝑛𝜇0 . Этот факт следует из того, что для любого
узла решетки существует путь, ведущий в этот узел и отличающийся от пути с наименьшей метрикой не больше чем в 𝜈𝑛 символах.

248

8. Сверточные коды

Если на некотором ярусе из всех значений метрик вычесть минимальное, это не повлияет на выбор путей в будущем, и, значит,
вероятность ошибки декодирования не изменится. Эта операция (ее
называют нормализацией метрик) может выполняться на каждом
ярусе или один раз после обработки нескольких ярусов. В результате число бит для хранения метрик каждого пути приблизительно
равно (8 + log2 (𝜈𝑛)) и при типичных значения параметров кодера
не превышает 16 бит.
Организация памяти для хранения путей

Каждый из выживших путей записывается в виде двоичной последовательности длины 𝑇 . Заметим, что декодер Витерби, обрабатывая очередной узел решетчатой диаграммы, вычисляет новый
путь, ведущий в данный узел, но не может занести его в ту же
ячейку памяти, в которой хранился предыдущий путь. Дело в том,
что предыдущий путь может понадобиться при обработке других
узлов текущего яруса. Значит, нужно хранить два массива путей:
«старые» и «новые». После обработки очередного яруса массивы
меняются названиями. Таким образом, объем памяти для хранения
путей составляет 2𝑇 2𝜈 ≈ 10𝜈2𝜈 . Именно эта память на практике
определяет основные затраты на реализацию декодера.
Существует альтернативный вариант реализации декодера, проигрывающий по скорости работы, но требующий вдвое меньше памяти для хранения путей. Этот вариант называют декодированием
с возвращениями (trace-back декодер). Декодер с возвращениями на
каждом ярусе работы после обработки узла заносит в память один
бит, указывающий, какой из двух конкурирующих путей выбран.
Для выработки решения и выдачи получателю декодер, используя «обратный кодер», из текущего узла двигается назад по решетке и вычисляет путь в данный узел. Первый бит пути (𝑘 бит при
скорости 𝑅 = 𝑘/𝑛) выдается получателю.

8.5. Высокоскоростные и переменные

8.5.

сверточные коды

249

Высокоскоростные и переменные
сверточные коды

В начале главы мы рассматривали двоичный сверточный кодер общего вида (см. рис. 8.1), получающий на свой вход 𝑘 информационных символов на каждом такте работы и формирующий 𝑛 двоичных кодовых символов. Скорость кода равна 𝑅 = 𝑘/𝑛. Прямолинейный подход к анализу и декодированию таких кодов основан
на построении решетчатой диаграммы, из каждого узла которой
выходит 2𝑘 ребер, соответствующих всевозможным комбинациям
входных символов. Такое же число ребер сходятся в каждом узле
решетки, начиная с яруса, номер которого превышает длину кодового ограничения.
Посмотрим на такую решетку с точки зрения сложности декодирования по алгоритму Витерби. При длине кодового ограничения 𝜈 и числе регистров 𝑘 сложность обработки одного яруса будет
пропорциональна 2𝑘 × 2𝜈 , а сложность декодирования в расчете на
бит передаваемой информации — 2𝜈+𝑘 /𝑘 . Множитель 2𝑘 /𝑘 — существенное увеличение сложности по сравнению с декодированием
обычных (низкоскоростных) сверточных кодов.
Опираясь на теорию минимальных решеток (см. главу 4), можно указать простое решение проблемы — привести порождающую
матрицу к минимальной спэновой форме и по ней построить побитовую или секционированную минимальную решетку кода. То, что
код имеет бесконечную длину, не является препятствием, как мы
увидим на следующем простом примере.
Пример 8.4. Рассмотрим сверточный код со скоростью 𝑅 = 2/3 с

полиномиальной порождающей матрицей вида
(︂
)︂ (︂
)︂
(︂
)︂
1+𝐷 1
0
1 1 0
1 0 0
𝐺(𝐷) =
=
+𝐷
.
0 1 1
1
𝐷 1+𝐷
1 0 1

250

8. Сверточные коды
Ей соответствует двоичная порождающая матрица

1 1 0 1 0 0 0 0 0 0 ···
⎜ 1 0 1 0 1 1 0 0 0 0 ···
⎜ 0 0 0 1 1 0 1 0 0 0 ···

𝐺=⎜
⎜ 0 0 0 1 0 1 0 1 1 0 ···
⎜ 0 0 0 0 0 0 1 1 0 1 ···

0 0 0 0 0 0 1 0 1 0 ···
··· ··· ··· ··· ··· ··· ··· ··· ··· ··· ···





⎟.




Чтобы привести эту матрицу к МСФ, достаточно прибавить
первую строку ко второй, третью к четвертой и т.д. Этот же результат можно получить, исходя из полиномиальной формы матрицы,
заменив вторую строку суммой двух строк:
(︂
)︂ (︂
)︂
(︂
)︂
1+𝐷
1
0
1 1 0
1 0 0
𝐺(𝐷) =
=
+𝐷
.
𝐷
1+𝐷 1+𝐷
0 1 1
1 1 1
В итоге получим

1 1 0 1 0 0 0 0 0 0
⎜ 0 1 1 1 1 1 0 0 0 0
⎜ 0 0 0 1 1 0 1 0 0 0

𝐺=⎜
⎜ 0 0 0 0 1 1 1 1 1 0
⎜ 0 0 0 0 0 0 1 1 0 1

0 0 0 0 0 0 0 1 1 1
··· ··· ··· ··· ··· ··· ··· ··· ··· ···

···
···
···
···
···
···
···





⎟.




Эта матрица удовлетворяет условиям МСФ. Побитовая решетка, начиная с яруса 4, имеет логарифмическую сложность 2 (число
состояний равно 4). Дополнительное упрощение можно получить,
выполнив секционирование:


1 1 0 1 0 0 0 0 0 0 ···
⎜ 0 1 1 1 1 1 0 0 0 0 ··· ⎟
⎜ 0 0 0 1 1 0 1 0 0 0 ··· ⎟



𝐺=⎜
⎜ 0 0 0 0 1 1 1 1 1 0 ··· ⎟.
⎜ 0 0 0 0 0 0 1 1 0 1 ··· ⎟


0 0 0 0 0 0 0 1 1 1 ···
··· ··· ··· ··· ··· ··· ··· ··· ··· ··· ···
Для секций с номерами 1, 3, 5, выходным символом является
сумма одного информационного символа и двух символов, хранящихся в памяти. Это эквивалентно кодированию сверточным кодом

8.5. Высокоскоростные и переменные

сверточные коды

251

со скоростью 1, с генераторным полиномом 𝑔(𝐷) = 1 + 𝐷 + 𝐷2 .
Для секций с номерами 2, 4, 6,... кодирование выполняется другим сверточным кодом, его скорость равна 1/2, а генераторы —
𝑔1 (𝐷) = 1 + 𝐷 + 𝐷2 , 𝑔2 (𝐷) = 1 + 𝐷 + 𝐷2 (уже хорошо знакомый нам
код (7,5)).
Сверточный кодер, связи регистров которого с сумматорами переключаются от такта к такту, называют переменным сверочным
кодером, соответствующий код — переменным («time-varying»).
Упражнение 8.5. Нарисуйте схему сверточного кодера и решет-

чатую диаграмму для кода из примера 8.4.

Итак, задача построения простого декодера для кода с произвольной рациональной скоростью 𝑅 = 𝑘/𝑛 имеет простое решение. Код нужно представить как 𝑘 последовательно переключае∑︀
мых сверточных кодов со скоростями 1/𝑐𝑖 , такими, что 𝑘𝑖=1 𝑐𝑖 = 𝑛.
Декодирование по сложности будет мало отличаться от сложности
декодирования двоичного кода с такой же длиной кодового ограничения.
Заметим, что числа 𝑘 и 𝑛 не обязательно должны быть взаимно
простыми. Дело в том, что, например, множество кодов со скоростью 𝑅 = 2/4 значительно шире множества кодов со скоростью
𝑅 = 1/2. Среди переменных кодов (с кратными 𝑘 и 𝑛) могут найтись коды с бо́льшим свободным расстоянием, чем у постоянных
кодов с такими же скоростью и кодовым ограничением. Известно
несколько таких примеров, их можно найти в [48].
Исторически задача построения и декодирования высокоскоростных сверточных кодов была востребована раньше, чем была
разработана теория минимальных решеток. Практичное решение
было найдено еще в 1979 году в работах Дж. Кейна с соавт. (см.
[7]), оно основано на «выкалывании» некоторых символов низкоскоростного кода для получения высокоскоростного кода.
Вернемся к примеру 8.4. Исходный код со скоростью 𝑅 = 2/3 мы
представили переменным кодом. Соответствующий переменный кодер на каждом такте переключается между постоянными кодерами
с генераторами 7 и (7,5) (в восьмеричной записи). Этот код можно
было получить из кода (7,5) следующим образом. Кодовые символы

252

8. Сверточные коды

этого кода получены применением генераторов (7, 5), (7, 5), (7, 5),...
Вычеркнув из выходной последовательности кодера символы с номерами 2, 6, 10, ..., т.е. каждый четвертый, начиная со второго, мы
получим код со скоростью 𝑅 = 2/3 (на два информационных символа теперь тратится не 4, а 3 кодовых символа). Последовательность
генераторов теперь (7), (7,5), (7), (7,5), ... , как и в примере 8.4. Этим
способом мы можем получить код с любой скоростью из заданного
кода со скоростью 1/2. Получаемые коды называются выколотыми
сверточными кодами.
Для описания правила выкалывания вводится так называемая
матрица выкалывания. Если исходный код имеет скорость 1/𝑛0 , то
матрица выкалывания 𝑃 для получения кода со скоростью 𝑅 = 𝑘/𝑛
имеет размер 𝑛0 × 𝑘 . Для каждого из 𝑘 информационных символов
одного подблока столбцы матрицы выкалывания 𝑃 указывают, какие именно из 𝑛0 генераторов использованы при его кодировании.
Для кода примера 8.4 матрица выкалывания
)︂
(︂
1 1
.
𝑃 =
1 0
Код со скоростью 𝑅 = 4/5 с кодовым ограничением 2 из таблицы
8.6 задается матрицей
)︂
(︂
1 0 0 1
.
𝑃 =
0 1 1 1
Понятно, что выколотые коды являются подмножеством кодов
общего вида, которые можно рассматривать как выколотые коды с
разрешенным числом генераторов равным 𝑛. Ограничение на число генераторов может быть полезным в некоторых задачах. Одно
из преимуществ выколотых кодов — некоторое (очень небольшое)
уменьшение сложности кодера и декодера. Еще одно проявляется
в системах, где, в зависимости от текущих характеристик канала,
меняется скорость кода. При этом ограничение на множество генераторов заметно упрощает логику работы кодера и декодера. Характеристики наборов таких «согласованных по скорости» кодов
[78] не намного хуже характеристик кодов общего вида.

8.6. Построение блоковых кодов из сверточных

8.6.
8.6.1.

253

Построение блоковых кодов усечением
сверточных кодов
Усеченные сверточные коды

Сверточные коды мы рассматриваем как линейные коды бесконечной длины. На практике, конечно, любые сеансы связи конечны.
Для передачи блоков данных конечной длины используются усеченные сверточные коды (см. параграф 8.4 и рис. 8.10).
Кодовое слово усеченного сверточного кода с кодовым ограничением 𝜈 получается подачей на вход кодера последовательности
информационных символов с дописанными к ней 𝜈 нулями. Дописывание «нулевого хвоста» приводит к некоторому снижению скорости, которое можно считать несущественным при большой длине
блока.
Заметим, что с ростом длины блока при фиксированной длине
кодового ограничения относительное расстояние соответствующего
блокового кода стремится к нулю. Это говорит о том, что на этом
пути из сверточных кодов мы получаем плохие в смысле минимального расстояния блоковые коды.
Можно ли построить хорошие блоковые коды из сверточных кодов? Ответ на этот вопрос является целью данного параграфа.
Теоретический (псимптотический) ответ на этот вопрос получен
методом случайного кодирования в [73]. При заданных параметрах
случайного переменного сверточного кода при правильной длине
усечения почти все получаемые блоковые коды удовлетворяют границе Варшамова–Гилберта.
В свете теории минимальных решеток такой результат не выглядит неожиданным, т.к. любой линейный код можно описать его
минимальной решеткой, а эту решетку можно интерпретировать
как решетку переменного сверточного кода.
К сожалению, получить описание лучших известных линейных
кодов в виде усеченных постоянных сверточных кодов не удается.
Более продуктивным в этом смысле оказался класс циклически усеченных кодов, которые рассматриваются в следующем параграфе.

254
8.6.2.

8. Сверточные коды
Циклически усеченные сверточные коды

В оригинальной работе Вулфа и Ма [91] (1986) эти коды были названы кодами с откушенными хвостами (tail-biting codes). В русскоязычной литературе за этими кодами укрепилось название циклически усеченных (ЦУ) кодов. Первооткрывателями этого класса
кодов следует считать Соломона и Ван-Тилборга [105] (1979).
Идею циклического усечения иллюстрирует рис. 8.11 на примере сверточного кода со скоростью 𝑅 = 1/𝑛0 . Подлежащие кодированию 𝑘 информационных символов записываются в циклический
регистр сдвига, последние 𝜈 ячеек которого являются регистром
сдвига сверточного кода. На каждом такте кодирования с выхода
сверточного кода считываются очередные 𝑛0 кодовых символов кодового слова. Таким образом, в результате 𝑘 тактов работы кодера
мы получим 𝑛 = 𝑘𝑛0 кодовых символов.

кодер сверточного кода
𝑢𝑘−1

𝑢𝑘

...

𝑢𝑘−𝜈+1

𝑢𝑘−𝜈 ...

𝑢1

регистр сдвига
...

...
+

1

...
...
...

...
+

блок
сумматоров

𝑛0

кодовые символы
Рис. 8.11. Кодер циклически усеченного кода со скоростью 𝑅 = 1/𝑛0
Аналогичная схема на основе сверточного кода со скоростью
𝑅 = 𝑘0 /𝑛0 после 𝐿 = 𝑘/𝑘0 тактов работы порождает кодовое слово
линейного (𝑛 = 𝐿𝑘0 , 𝑘 = 𝐿𝑛0 )-кода, который мы называем циклически усеченным (ЦУ) сверточным кодом.

8.6. Построение блоковых кодов из сверточных

255

Отметим очевидную разницу между усеченным и ЦУ кодом.
Начальное и конечное состояние кодера усеченного кода — нулевое. Чтобы привести кодер в нулевое состояние, требуются лишние
𝜈 тактов работы кодера и, соответственно, уменьшение скорости
кода по сравнению со скоростью исходного сверточного кода. Начальное состояние ЦУ кода совпадает с конечным, но оно может
быть любым, оно определяется значениями 𝜈 последних информационных символов. При этом скорость циклически усеченного кода
равна скорости исходного сверточного кода.
То, что начальное состояние неизвестно заранее, как мы увидим
ниже, сказывается на сложности декодирования.
Из схемы кодера видно, что циклическому сдвигу информационной последовательности соответствует циклический сдвиг кодового слова на 𝑛0 позиций. То же явление имеет место для кода с
произвольной скоростью. Отсюда заключаем, что для ЦУ сверточного кода сдвиг циклический любого слова на 𝑛0 позиций является
кодовым словом. Коды, обладающие таким свойством, называются
квазициклическими.
Квазициклическим кодам было посвящено много теоретических
исследований. В частности, известно, что среди них есть коды
с минимальным расстоянием, достигающим границы Варшамова–
Гилберта [84]. Среди лучших известных линейных кодов [77] много
квазициклических кодов. Как мы теперь видим, циклически усеченные сверточные коды являются одной из форм описания квазициклических кодов.

256

8. Сверточные коды

𝑚𝑛0

𝐿𝑛0
𝐿𝑘0

1

𝐿𝑛0

1

𝐿𝑘0

2

2
𝑚𝑛0

а) Усеченный код

б) Циклически усеченный код

Рис. 8.12. Структура порождающих матриц усеченных и циклически усеченных кодов
На рис. 8.12 схематично показана структура порождающей матрицы усеченных и ЦУ кодов. В затененной части матрицы могут
быть ненулевые и нулевые элементы, на остальных позициях —
только нули. Через 𝑚 обозначена память сверточного кода, которая
для кодов со скоростью 𝑅 = 1/𝑛0 совпадает с кодовым ограничением. При циклическом усечении «откусывается хвост», соответствующий нулевым информационным символам. Этот хвост копируется
в начало порождающей матрицы. Как видно из рисунка, в отличие от обычного усечения, при циклическом усечении все выходные
символы зависят от примерно одинакового числа информационных
символов.
Пример 8.5. Рассмотрим сверточный код со скоростью 𝑅 = 1/2

с генераторами (1,7) или 𝑔(𝐷) = (1, 1 + 𝐷 + 𝐷2 ). ЦУ (10, 5)-код
задается порождающей матрицей

1


𝐺=⎜

⎝0
0


0 1 0 1

1 1 0 1 0 1

1 1 0 1 0 1⎟

1
1 1 0 1⎠
1 0 1
1 1
1

(8.28)

(пустые позиции подразумевают нули, как и на рис. 8.12). Решетка,
описывающая код, приведена на рис. 8.13. Минимальное расстояние
кода равно 4.
Напомним, что начальное состояние кодера ЦУ кода совпадает
с конечным. Следовательно, кодовым словам кода соответствуют

8.6. Построение блоковых кодов из сверточных
00

00

11

01

11

01

01

11

11

11

11

11

01

11

10

11

01

01
10

00
11

01

10

01

10

00

01

10

00

10

00

00

01

10

00

10

11

01

10

00

01

10

01

01

00

00

01

10

10

00

00

01

10

11

00

00

257

00

10
11

10

11

10
11

11

Рис. 8.13. Решетка циклически усеченного сверточного кода
пути, начинающиеся и заканчивающиеся в узлах с одинаковыми
номерами.
На рис. 8.13 путь в решетке, соответствующий информационной последовательности (10110), показан жирными стрелками, ему
соответствует кодовое слово (1 0 0 1 1 0 1 1 0 0).
Упражнение 8.6. Укажите схему кодера, порождающую матри-

цу и решетку для представления кода Хэмминга (8.4) в виде ЦУ
сверточного кода.
Для решеток типа решеток ЦУ кодов можно развить теорию
аналогичную теории минимальных решеток блоковых кодов, переопределив соответствующим образом множество активных позиций
строки, спэн, минимальную спэновую форму. Этим вопросам, а также компьютерному поиску хороших блоковых (по сути, квазициклических) кодов с минимальной сложностью ЦУ решеток посвящена работа [54]. Оказалось, что для большинства лучших известных
решеток можно найти довольно простые решетки и, более того, на
этом пути были построены несколько кодов с бо́льшим минимальным расстоянием, чем известные на тот момент лучшие коды.
Сложность ЦУ решетки можно оценить без построения самой
решетки прямо по порождающей матрице кода, если она приведена
к форме аналогичной (8.28), в которой можно выделить активные
части строк и все позиции начала активных частей различны, так

258

8. Сверточные коды

же как и позиции их концов. По такой форме (минимальной ЦУ
спэновой форме) не составляет труда построить ЦУ решетку.
Пример 8.6. ЦУ решетка кода Голея (24,12)





1101110111
⎜ 1111100111



1101101111




1101110111




1
1
0
1
1
1
0
1
1
1




1111100111

𝐺=⎜


1101101111



1 1 0 1 1 1 0 1 1 1⎟


1 1 0 1 1 1 0 1⎟
⎜1 1
⎜0 1 1 1
1 1 1 1 1 0⎟


⎝1 0 1 1 1 1
1 1 0 1⎠
01110111
11

построена в [105, 59] из переменного сверточного кода со скоростью
𝑅 = 4/8 с кодовым ограничением 4.
Рассмотрим кратко способы декодирования ЦУ кодов. Поскольку код описан решеткой, мы могли бы воспользоваться алгоритмом
Витерби для поиска пути (слова) с максимальной функцией правдоподобия. Задачу декодирования усложняет то, что в отличие от
обычного представления кода решеткой, неизвестны начальный и
конечный узел решетки. Это препятствие преодолевается прямым
перебором по множеству начальных узлов.
Для декодирования по максимуму правдоподобия ЦУ кода с кодовым ограничением 𝜈 нужно выполнить 2𝜈 попыток декодирования. Каждая попытка состоит в поиске наилучшего пути из некоторого начального узла в узел с тем же номером на последнем ярусе
решетки. Сложность каждой попытки пропорциональна числу узлов 2𝜈 . Полная сложность декодирования оказалась равной 22𝜈 , что
намного больше сложности 2𝜈 декодирования обычного усеченного
сверточного кода с той же длиной кодового ограничения.
Известно несколько упрощений декодирования ЦУ кодов ([104,
40]). Если приписать всем узлам начального яруса одинаковые (нулевые) метрики, то после прохода по решетке алгоритмом Витерби
можно ожидать, что «правильный» начальный (он же конечный)

Задачи

259

узел будет иметь бо́льшую метрику, чем большинство неправильных узлов. Можно повторить попытку, приписав конечные метрики
начальным узлам и т.д. В результате нескольких итераций можно
значительно уменьшить число проверяемых кандидатов по сравнению с полным перебором.
В связи с этим интересно ответить на вопрос, помогает ли представление линейных кодов ЦУ решетками упростить задачу декодирования лучших известных линейных кодов. Ответ на этот вопрос — отрицательный. Декодирование по обычным минимальным
решеткам, описанным в главе 4, и другие описанные в главе 4 методы более эффективны, чем декодирование по ЦУ решеткам. Прийти
к такому заключению помогает следующее утверждение, называемое границей квадратного корня.
Теорема 8.1. Если для данного линейного кода логарифмическая

сложность минимальной решетки равна 𝑚, то логарифмическая
сложность представления кода ЦУ решеткой не может быть
меньше 𝑚/2.
Упражнение 8.7. Докажите теорему 8.1.

Подсказка: покажите, что при приведении порождающей матрицы представленной в минимальной ЦУ спэновой форме к обычной
минимальной спэновой форме сложность увеличится по крайней
мере вдвое.
Теорема 8.1 утверждает, что сложность ЦУ решетки в числе состояний не меньше квадратного корня из числа состояний обычной
решетки. При этом сложность декодирования равна квадрату числа
состояний. Поэтому выигрыш по сложности МП-декодирования от
ЦУ представления кода не достигается. В то же время, как уже было сказано, сам способ циклического усечения сверточных кодов —
эффективный инструмент поиска и описания хороших линейных
кодов в форме квазициклических кодов.

Задачи
1. Могут ли два кода с одинаковыми значениями свободного расстояния и одинаковой скоростью обладать различной помехоустойчивостью?

260

8. Сверточные коды

2. Могут ли два кода с одинаковой скоростью и одинаковыми
спектрами весов обладать различной помехоустойчивостью?
3. Пусть 𝑔1 (𝐷), ..., 𝑔𝑐 (𝐷) — порождающие многочлены сверточного кода со скоростью 𝑅 = 1/𝑐 и все эти генераторы имеют
четный вес. Целесообразно ли использовать такой код для передачи данных?
4. Пусть 𝑔1 (𝐷), ..., 𝑔𝑐 (𝐷) — порождающие многочлены сверточного кода со скоростью 𝑅 = 1/𝑐 и сумма весов этих генераторов четна. Что можно сказать о спектре весов кодовых слов
кода?
5. Пусть 𝑔1 (𝐷), 𝑔2 (𝐷) — порождающие многочлены сверточного
кода со скоростью 𝑅 = 1/2. Постройте дуальный код.
6. Для кода с порождающими многочленами (13,17) (в двоичновосьмеричной форме) найдите аналитическое выражение для
производящей функции его весового спектра и постройте графики зависимости аддитивной оценки вероятности ошибки на
бит от отношения сигнал/шум для ДСК и канала с АБГШ.
7. Воспользовавшись решением предыдущей задачи, найдите
первые 10 коэффициентов весового спектра. Постройте графики зависимости аддитивной оценки вероятности ошибки на
бит от отношения сигнал/шум, основываясь на усеченном до
5 и до 10 членов спектре весов. Сравните полученные результаты с решением предыдущей задачи.
8. Напишите программу моделирования декодера Витерби сверточного кода. Сопоставьте результаты решения двух предыдущих задач с оценками, полученными моделированием.
9. Постройте последовательности ЦУ кодов из лучших коротких кодов, приведенных в приложении к главе 8. Убедитесь
на примере кодов со скоростью 𝑅 = 1/2, что лучшие сверточные коды — далеко не лучшие кандидаты для построения
линейных кодов с большим минимальным расстоянием.

Приложение

261

10. Докажите, что минимальное расстояние ЦУ кода не превышает свободного расстояния исходного сверточного кода.
11. Предложите алгоритм нахождения минимального расстояния
ЦУ кода. Оцените его сложность.

Приложение. Таблицы сверточных кодов
Как справочный материал мы приводим короткие таблицы «хороших» сверточных кодов со скоростями вида 𝑅 = 1/𝑛 и 𝑅 = (𝑛−1)/𝑛.
Критерием предпочтения служит, в первую очередь, свободное расстояние. При одинаковом свободном расстоянии выбирался код с
лучшим спектром вероятности ошибки на бит. Такой выбор не гарантирует, что приведенные в таблице коды оптимальны по вероятности ошибки на бит, более того, при различных значениях отношения сигнал/шум лучшими будут разные коды. Тем не менее, при
решении практических задач выбор кодов по расстоянию и спектрам оказывается вполне оправданным.
Все коды найдены компьютерным перебором по множеству кодов. Использовалось несколько эффективных тестов для быстрого исключения неперспективных кандидатов, для оставшихся кодов выполнялся поиск расстояния и спектра. Для коротких кодов (кодов с кодовым ограничением 𝜈 ≤ 8) младшие коэффициенты производящих функций спектров кодов найдены с помощью
итеративного численного решения систем уравнений аналогичных
(8.6) (см.[48]). Для анализа длинных кодов использовался алгоритм
BEAST [49].
Генераторы кодов приведены в двоично-восьмеричной форме.
Для высокоскоростных кодов приведены два представления порождающих матриц: полиномиальное и в форме переменного кода, как
в примере 8.4. Помимо этого, дано описание кода в форме проверочной матрицы (очень простое, поскольку дуальным к коду со скоростью 𝑅 = (𝑛 − 1)/𝑛 служит код со скоростью 𝑅 = 1/𝑛).
Более подробные таблицы кодов приведены в [48], [25].

262

8. Сверточные коды

.
Таблица 8.1. Сверточные коды со скоростью 𝑅 = 1/2
𝜈

(𝑔1 , 𝑔2 )

𝑑free

2

(7, 5)

5

3

(17,13)

6

Весовой спектр кода
Спектр ошибки на бит
1,2,4,8,16,32,64,128, 256,512,...
1,4,12,32,80,192,448,1024,2304,5120,...
1,3,5,11,25,55,121,267,589,1299,...
2,7,18,49,130,333,836,2069,5060,12255,...

4

(35,23)

7

2,3,4,16,37,68,176,432,925,2156,...
4,12,20,72,225,500,1324,3680,8967,22270,...

5

(65,57)

8

1,8,7,12,48,95,281,605,1272,3334,...

6

(155,117)

10 11,0,38,0,193,0,1331,0,7275,0,...

7

(345,237)

10 1,6,12,26,52,132,317,730,1823,4446,...

8

(657,435)

12 11 0,50,0,286,0,1630,0,9639,0,...

9

(1537,1131)

12 1,7,19,28,69,185,411,1010,2492,5963,...

10

(3217,2473)

14 14,0,92,0,426,0,2595,0,15221,0,...

11

(6747,4325)

15 14,21,34,101,249,597,1373,3317,8014,19559,...

2,36,32,62,332,701,2342,5503,12506,36234,...
36,0,211,0,1404,0,11633,0,77433,0,...
2,22,60,148,340,1008,2642,6748,18312,48478,...
33,0,281,0,2179,0,15035,0,105166,0,...
2,21,100,186,474,1419,3542,9774,25950,66831,...
56,0,656,0,3708,0,27503,0,185997,0,...
66, 98,220,788,2083,5424,13771,35966,93970,
246720,...
12 (15521,11677)

16 17,39,41,143,381,894,1981,4835,11934,28474,...
76,221,378,1305,3340,8902,21688,57355,151288,
384644,...

13 (31737, 22535)

16 1,17,38,69,158,414,944,2210,5482,13372,...

14 (63057,44735)

18 26,0,165,0,845,0,4844,0,28513,0,...

2,99,234,513,1316,3890,9642,24478,65474,169616,...
133,0,1321,0,7901,0,54864,0,370057,0,...
15 (152711,126723) 19 30,67,54,167,632,1402,2812,7041,18178,43631,...
174,420,534,1712,5838,14210,32898,87786,
237228,609868,...

Приложение

263

.
Таблица 8.2. Сверточные коды со скоростью 𝑅 = 1/3
Весовой спектр кода

𝜈

(𝑔1 , 𝑔2 , 𝑔3 )

𝑑free

2

(7,7,5)

8

3

(17,15,13)

10 3,0,2,0,15,0,24,0,87,0,...

4

(37, 33 25)

12 5,0,3 ,0,13,0,62,0,108,0,...

5

(75,53,47)

13 1,3,6,4,5,12,14,33,66,106,...

6

(155,127,117)

15 3,3,6,9,4,18,35,45,77,153,...

7

(367,331,225)

18 1,0,8,0,24,0,51,0,133,0,...

8

(727,623,575)

181,4,10,9,17,14,39,56,85,207,...

9

(1545,1375,1167)

20 3,6,14,14,27,24,51,91,178,270,...

10

(3477,2531,2335)

22 7,0,27,0,55,0,161,0,413 0,...

Спектр ошибки на бит
2,0,5,0,13,0,34,0,89,0,...
3,0,15,0,58,0,201,0,655,0,...
6,0,6,0,58,0,118,0,507,0,...
12,0,12,0,56,0,320,0,693,0,...
1,8,26, 20,19,62,86,204,420,710,...
7,8,22,44,22,94,219,282,531,1104,...
1,0,24,0,113,0,287,0,898,0,...
2,10,50,37,92,92,274,402,600,1579,...
6,16,72,68,170,162,340,629,1410,2090,...
17,0,122,0,345,0,1102,0,3214 0,...

11

(6557,5175,4713)

24 13,0,32,0,78,0,202,0,614,0,...

12

(16713,11237,10655)

24 1,0,21,0,48,0,113,0,280,0,...

13

(35363,33161,24575)

26 1,8,13,24,30,43,77,138,234,372,...

14

(61675,53237,45571)

28 6,18,12,20,42,74,109,173,318,556,...

43,0,162,0,507,0,1420,0,4857,0,...
1,0,85,0,257,0,737,0,2106,0,...
2,32,58,120,172,287,546,1054,1852,3160,...
18,76,66,112,246,526,782,1275,2550,4656,...
15 (173263,156245,104737) 30 17,0,58,0,127,0,293,0,1002,0,...
73,0,373,0,922,0,2351,0,9135,0,...

264

8. Сверточные коды

.
Таблица 8.3. Сверточные коды со скоростью 𝑅 = 1/4
Весовой спектр кода

𝜈

(𝑔1 , 𝑔2 , 𝑔3 , 𝑔4 )

2

(7,7,5,5)

3

(17,15,13,13)

13 2,1,0,3,1,4,8,4,15,16,...

4

(37,33,27,25)

16 4,0,2,0,4,0,15,0,30,0,...

5

(77,67,55,51)

18 3,0,3,0,9,0,13,0,26,0,...

6

(171,165,133,117)

20 2,0,6,0,7,0,15,0,25,0,...

7

(375,327,273,231)

22 1,2,2,2,5,8,10,14,14,18,...

8

(671,645,537,473)

24 1,0,6,0,8,0,23,0,37,0,...

9

(1455,1373,1247,1157)

27 3,6,5,4,5,10,17,26,25,35,...

10

(3475,3137,2565,2233)

29 3,3,1,4,13,17,9,15,42,51,...

𝑑free

Спектр ошибки на бит

10 1,0,2,0,4,0,8,0,16,0,...
1,0,4,0,12,0,32,0,80,0,...
4,2,0,10,3,16,34,18,77,84,...
8,0,7,0,17,0,60,0,140,0,...
5,0,9,0,34,0,59,0,142,0,...
3,0,17,0,32,0,66,0,130,0,...
2,4,4,6,18,32,50,78,82,92,...
1,0,15,0,33,0,111,0,210,0,...
7,20,19,20,21,56,101,150,155,212,...
7,8,3,16,61,84,49,88,242,312,...

11

(6713,6575,5237,4731)

32 8,0,8,0,28,0,53,0,104,0,...

12

(15523,13171,11375,10727)

33 1,3,5,11,11,9,28,29,38,55,...

13

(35311,32257,27735,23433)

36 7,0,15,0,33,0,50,0,87,0,...

14

(63057,46665,45167,43765)

37 1,7,14,9,10,21,23,38,53,66,...

20,0,34,0,131,0,312,0,670,0,...
1,6,15,48,55,40,156,172,210,342,...
16,0,68,0,177,0,286,0,573,0,...
1,20,62,42,48,110,129,226,377,460,...
15 (152711,126775,121547,117363) 40 5,10,12,8,13,15,30,59,61,97,...
12,40,58,42,66,79,192,393,410,693,...

Приложение

265

.
Таблица 8.4. Сверточные коды со скоростью 𝑅 = 2/3
𝜈
2
3
4
5
6
7
8
9
10
11
12
13

14

(𝑔1 )(𝑔2 , 𝑔3 )
(ℎ1 , ℎ2 , ℎ3 )
(7)(7,5)
(3,5,7)
(13)(17,11)
(5,13,11)
(25)(35,23)
(13,33,25)
(75)(65,43)
(37,67,51)
(147)(147,135)
(51,137,163)
(373)(373,225)
(242,313,337)
(523)(775,447)
(211,577,735)
(1067)(1517,1051)
(477,1551,1745)
(2347)(3367,2515)
(1035,2761,3117)
(7713)(7255,4023)
(2411,6547,7443)
(10515)(17703,10675)
(4137,11151,16713)
(21015)(35731,21573)
(10355,33001,36263)
(45317)(65213,56341)
(36547,66477,40045)

𝐺

𝑑free

(︂

)︂
310
(︂ 2 3 3 )︂
332
(︂ 4 3 1 )︂
712
(︂ 0 7 5 )︂
3 74
16
1 5 )︂
(︂
15 5 2
(︂ 12 15 17 )︂
13 17 1
(︂ 17 26 34 )︂
27 7 12
(︂ 20 37 31 )︂
25 33 20
(︂ 70 31 15 )︂
73 27 10
(︂ 60 75 67 )︂
67 61 50
116
37 41 )︂
(︂
155 47 34
(︂ 40 117 165 )︂
45 135 134
300 57 165
(︂
)︂
321 157 32
334 201 227

3
4
5
6
6
8
8
8
10
10
11
12

12

Весовой спектр кода
Спектр ошибки на бит

1, 4, 14, 40, 115, ...
1, 10, 54, 226, 853, ...
2, 11, 34, 109, 366, ...
5, 41, 193, 808, 3299, ...
5, 18, 54, 193, 714, ...
15, 88, 370, 1640, 7116, ...
15, 0, 188, 0, 2664, ...
56, 0, 1351, 0, 27315, ...
1, 17, 59, 175, 668, ...
1, 81, 402, 1487, 6793, ...
66, 0, 706, 0, 10727, ...
395, 0, 6695, 0, 135288, ...
9, 58, 161, 566, 2251, ...
38, 416, 1404, 5994, 27194, ...
1, 27, 82, 302, 1201, ...
1, 447, 602, 2901, 13543, ...
94, 0, 1132, 0, 16955, ...
671, 0, 12125, 0, 235652, ...
16, 105, 320, 1169, 4433, ...
98, 911, 3248, 14257, 61066, ...
53, 189, 539, 2158, 8581, ...
399, 1702, 6482, 29122, ...
159, 0, 2223, 0, 32034, ...
1310, 0, 26556, 0, 488998, ...
45, 164, 557, 2221, 8298, ...
308, 1747, 6673, 30248,
127131, ...

266

8. Сверточные коды

Таблица 8.5. Сверточные коды со скоростью 𝑅 = 3/4

.
𝜈

(𝑔1 )(𝑔2 )(𝑔3 , 𝑔4 )
(ℎ1 , ℎ2 , ℎ3 , ℎ4 )

𝐺

𝑑free



2

3

4

5

6

7

8

9

10

(5)(7)(5,7)
(3,1,5,7)
(17)(13)(17,13)
(2,7,15,13)
(31)(31)(23,35)
(12,13,31,27)
(53)(53)(71,43)
(37,25,61,63)
(157)(171)(165,127)
(41,57,153,165)
(323)(241)(357,235)
(133,115,311,367)
(521)(747)(631,417)
(333,263,431,727)
(1073)(1341)(1455,1227)
(501,677,1633,1275)
(2361)(3403)(3351,2267)
(1365,1133,3301,3643)


1111
⎝2 1 0 1⎠
⎛0 2 1 1⎞
3011
⎝2 3 1 0⎠
⎛2 2 3 3⎞
1301
⎝0 1 2 3⎠
⎛6 0 3 1⎞
1232
⎝6 1 1 2⎠
⎛4 6 1 1⎞
7113
⎝4 7 3 2⎠
⎛ 6255 ⎞
7 432
⎝ 0 1 7 6⎠
⎛ 12 2 5 3 ⎞
1 5 66
⎝ 12 7 3 4 ⎠
⎛ 4 12 1 5 ⎞
15 2 0 7
⎝ 14 13 7 4 ⎠
⎛ 4 2 15 11 ⎞
7 11 2 6
⎝ 4 11 17 10 ⎠
24 2 3 17

3

4

4

5

6

6

6

7

8

Весовой спектр кода
Спектр ошибки на бит

6, 23, 80, 280, 904, ...
15, 104, 540, 2520,
9750, ...
29, 0, 532, 0, 9853, ...
124, 0, 4504, 0,
124337, ...
5, 42, 134, 662, 3643, ...
10, 290, 1188, 7174,
48976, ...
13, 71, 326, 1626, 8320, ...
51, 474, 2978, 18918,
116366, ...
45, 109, 844, 3444, 20880, ...
276, 843, 9588, 44046,
326876, ...
10, 86, 385, 1896, 10015, ...
35, 649, 3929, 23650,
147068, ...
1, 44, 216, 985, 5254, ...
1, 312, 2086, 12040,
76631, ...
11, 150, 460, 2952, 13944, ...
51, 1552, 5428, 43458,
231088, ...
53, 265, 1275, 6694, 34923, ...
429, 2700, 16850, 103690,
626769, ...

Приложение

.
𝜈

267

Таблица 8.6. Сверточные коды со скоростью 𝑅 = 4/5

(𝑔1)(𝑔2)(𝑔3)(𝑔4, 𝑔5)
(ℎ1, ℎ2, ℎ3, ℎ4, ℎ5)

𝐺

Весовой спектр кода
Спектр ошибки на бит



2

3

4

5

6

7

8

9

(7)(5)(5)(7,5)
(3,2,3,5,7)

(15)(11)(11)(17,11)
(6,7,5,13,15)

(27)(33)(27)(37,5)
(13,15,16,36,37)

(75)(75)(71)(67,41)
(37,25,31,71,43)

(153)(151)(123)(151,123)
(71,57,65,111,143)

(247)(217)(257)(361,233)
(117,147,135,331,373)

(637)(457)(767)(655,447)
(313,207,337,741,525)

(1777)(1251)(1605)(1515,1117)
(425,507,643,1355,1641)


10100
⎜0 1 0 1 1⎟


⎝2 0 1 1 0⎠
⎛2 2 0 1 1⎞
10011
⎜2 1 0 1 0⎟


⎝0 2 1 1 0⎠
⎛2 0 2 1 1⎞
10011
⎜2 1 0 1 0⎟


⎝0 2 1 1 0⎠
⎛2 0 2 1 1⎞
13110
⎜2 1 3 0 0⎟


⎝2 2 1 3 2⎠
⎛6 2 0 3 1⎞
11310
⎜2 1 2 2 3⎟


⎝4 2 1 1 2⎠
⎛6 4 0 1 1⎞
43212
⎜6 4 3 1 0⎟


⎝4 4 4 1 3⎠
⎛2 4 6 6 6⎞
72313
⎜4 5 1 2 2⎟


⎝4 6 7 3 0⎠
⎛ 64655 ⎞
7 4133
⎜ 6 3 5 2 2⎟


⎝ 6 0 1 5 4⎠
16 6 4 1 5

𝑑free

2

1, 12, 53, 228, 1007, ...
1, 36, 309, 1920,
11404, ...

3

6, 32, 185, 1019, 5440, ...
11, 184, 1627, 12063,
80054, ...

4

4

5

6

6

6

30, 126, 815, 4822,
28632, ...
159, 990, 9076,
66149, 478236, ...
4, 46, 295, 1830,
11887, ...
11, 297, 2876,
23700, 191757, ...
22, 146, 920, 5983,
39259, ...
99, 1184, 10987,
89453, 702809, ...
134, 0, 6010, 0,
262004, ...
1015, 0, 86430, 0,
5363399, ...
29, 257, 1519, 9854,
66094, ...
181, 2531, 20278,
161321, 1275983, ...
5, 130, 835, 5072,
33847, ...
18, 1361, 11127,
84038, 666455, ...

9.

Алгебраический подход
к сверточным кодам

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

9.1.

Кодер сверточного кода общего вида

Сверточный кодер общего вида показан на рис. 9.1.
Схема начинает работу в момент времени 𝑖 = 0. Входные и выходные символы мы считаем элементами некоторого конечного поля 𝐺𝐹 (𝑞). На каждом такте работы кодера на его вход поступает
блок из 𝑘 входных информационных символов 𝑢𝑖 = (𝑢𝑖,1 , ..., 𝑢𝑖,𝑘 ),
𝑖 = 0, 1, .... Кодер представляет собой линейную схему с памятью. На каждом такте с выхода схемы считывается очередной кодовый блок из 𝑛 кодовых символов 𝑣 𝑖 = (𝑣𝑖,1 , ..., 𝑣𝑖,𝑛 ). Таким образом, любой полубесконечной информационной последовательности 𝑢 = (𝑢0 , 𝑢1 , ...) сопоставляется полубесконечное кодовое слово
𝑣 = (𝑣 0 , 𝑣 1 , ...).

9.1. Кодер сверточного кода общего вида

269

Определение 9.1. Множество всевозможных последовательно-

стей на выходе схемы, приведенной на рис. 9.1, назовем сверточным кодом со скоростью 𝑅 = 𝑘/𝑛.

𝑘

Постоянная

входных

ли-

нейная схема с

информационных

...

символов

𝑢𝑖 = (𝑢𝑖1 , ..., 𝑢𝑖𝑘 )

ячейками
для

памяти

символов

𝑛

𝜈
из

...

𝐺𝐹 (𝑞)

выходных

кодовых
символов

𝑣 𝑖 = (𝑣𝑖1 , ..., 𝑣𝑖𝑛 )

Рис. 9.1. Сверточный кодер со скоростью 𝑅 = 𝑘/𝑛
При изучении линейных блоковых кодов мы убедились в том,
что произвольное линейное отображение множества последовательностей длины 𝑘 на множество последовательностей длины 𝑛, 𝑛 ≥ 𝑘
может быть задано с помощью матрицы размера 𝑘 × 𝑛. Чтобы отображение было обратимым, матрица должна иметь полный ранг (ее
строки должны быть линейно независимыми). Попробуем построить матричное описание кодера, показанного на рис. 9.1.
Для этого обозначим через 𝑠𝑖 = (𝑠𝑖1 , ..., 𝑠𝑖𝜈 ) содержимое памяти
кодера на такте 𝑖. Этот вектор будем называть состоянием кодера.
Поскольку выход кодера и следующее состояние являются линейными функциями текущего состояния и входа, то для некоторых
матриц 𝐴, 𝐵 , 𝐸 и 𝐹 над полем 𝐺𝐹 (𝑞) размерности 𝜈 × 𝑛, 𝑘 × 𝑛,
𝜈 × 𝜈 и 𝑘 × 𝜈 соответственно, имеют место соотношения

𝑣 𝑖 = 𝑠𝑖 𝐴 + 𝑢𝑖 𝐵;

(9.1)

𝑠𝑖+1 = 𝑠𝑖 𝐸 + 𝑢𝑖 𝐹.

(9.2)

Чтобы эти формулы имели смысл, нужно задать начальное состояние кодера. Примем 𝑠0 = 0. Для каждой последовательности
векторов в этих формулах можно получить полиномиальную форму записи, используя формальную переменную 𝐷, имеющую смысл
задержки на один такт. Домножив рекуррентные соотношения (9.1)
и (9.2) на 𝐷𝑖 , после суммирования по 𝑖 приходим к соотношениям

𝑣(𝐷) = 𝑠(𝐷)𝐴 + 𝑢(𝐷)𝐵;
𝐷

−1

𝑠(𝐷) = 𝑠(𝐷)𝐸 + 𝑢(𝐷)𝐹.

(9.3)
(9.4)

270

9. Алгебраический подход к сверточным кодам
Исключая из этих формул переменную 𝑠(𝐷), получаем

где

𝑣(𝐷) = 𝑢(𝐷)𝐺(𝐷),

(9.5)

𝐺(𝐷) = 𝐹 (𝐷−1 𝐼𝑛 − 𝐸)−1 𝐴 + 𝐵

(9.6)

и 𝐼𝑛 обозначает единичную матрицу порядка 𝑛. В (9.6) мы предположили существование обратной матрицы в первом слагаемом
суммы. Это предположение равносильно предположению о том, что
последовательность состояний схемы однозначно определяется последовательностью поступающих на вход схемы блоков. Заметим,
что это предположение для некоторых схем может не выполняться,
но такие линейные схемы не представляют интереса в качестве схем
сверточных кодеров.
Из формул (9.5) и (9.6) следует, что код общего вида может быть
задан матрицей 𝐺(𝐷) размера 𝑘 × 𝑛, элементами которой являются
дробно-рациональные функции формальной переменной 𝐷. Поэтому дальнейшее изучение теории сверточных кодов ограничивается
кодами, задаваемыми матрицами 𝐺(𝐷) различного вида.
Матрицу 𝐺(𝐷), описывающую линейную схему, показанную на
рис. 9.1, назовем матричной передаточной функцией. В дальнейшем мы сузим класс изучаемых передаточных функций, исключив
те, которые заведомо не могут быть использованы для помехоустойчивого кодирования. По отношению к практически значимым матрицам мы будем применять термин «порождающая матрица сверточного кода».
Множество слов одного и того же сверточного кода может
быть порождено различными кодерами или различными матрицами 𝐺(𝐷), причем некоторые матрицы могут быть предпочтительнее других по каким-то критериям. Например, при одном и том
же наборе кодовых слов вероятность ошибки на бит передаваемой
последовательности может различаться для различных реализаций
кодера. Кроме того, сложность реализации кодирования и декодирования также зависит от способа описания кода. Рассмотрим подробнее свойства матриц 𝐺(𝐷) и их связь со свойствами соответствующих кодов.

9.1. Кодер сверточного кода общего вида

271

Пусть 𝑔(𝐷) — один из элементов матрицы 𝐺(𝐷) = {𝑔𝑖𝑗 (𝐷), 𝑖 =
= 1, ..., 𝑘, 𝑗 = 1, ..., 𝑛}. В общем случае он является отношением двух
полиномов
𝑓 (𝐷)
𝑔(𝐷) =
.
(9.7)
𝑞(𝐷)
При кодировании в соответствии с (9.5) для некоторых полиномов 𝑦(𝐷) и 𝑥(𝐷) придется вычислять произведение

𝑦(𝐷) = 𝑔(𝐷)𝑥(𝐷).
Эту операцию можно интерпретировать как операцию фильтрации над конечным полем. Уместно назвать 𝑔(𝐷) передаточной
функцией фильтра, а полиномы 𝑥(𝐷) и 𝑦(𝐷) — входом и выходом
фильтра.
Определение 9.2. Фильтр с передаточной функцией 𝑔(𝐷) =

= 𝑓 (𝐷)/𝑞(𝐷) называется реализуемым, если полином 𝑞(𝐷) =
= 𝑞0 + 𝑞1 𝐷 + ... + 𝑞𝑚 𝐷𝑚 является полиномом «без задержки», т.е.
𝑞0 ̸= 0.
Смысл этого определения состоит в том, что при 𝑞0 ̸= 0 выход фильтра в каждый момент времени зависит от предыдущих
значений входной последовательности и не зависит от «будущих»
значений.
Без потери общности будем считать степени числителя 𝑓 (𝐷) =
= 𝑓0 + 𝑓1 𝐷 + ...𝑓𝑚 𝐷𝑚 и знаменателя 𝑞(𝐷) одинаковыми. Две канонические реализации фильтра с передаточной функцией 𝑔(𝐷) показаны на рис. 9.2 и 9.3. В каждом конкретном случае может быть отдано предпочтение одной из этих двух форм. Для нас существенно,
что в любом случае количество ячеек памяти равно максимальной
степени числителя и знаменателя передаточной функции фильтра.
Матрица 𝐺(𝐷) реализуема, если все ее элементы реализуемы.
Отметим, что матрица, фигурирующая в (9.6), всегда реализуема.
Заметим, что некоторые линейные преобразования над строками матрицы изменяют матрицу 𝐺(𝐷), но сохраняют неизменным
задаваемый ею код. Такие линейные преобразования над строками передаточной матрицы можно интерпретировать как изменения
информационной последовательности, подаваемой на вход кодера.

272

9. Алгебраический подход к сверточным кодам
+

𝑓0
𝑥𝑖

×

𝑓1

...

+

×

𝑓2

×

...

𝑦𝑖

+

𝑓𝑚

×

𝑞𝑚

×

...

+
𝑞1

𝑞2

×

+

×

...

...

+

+

Рис. 9.2. Каноническая форма цифрового фильтра с вынесенными
сумматорами (controller canonical form)
𝑥𝑖

...
𝑓𝑚

×

𝑓𝑚−1

+

𝑞𝑚

×

×

𝑓𝑚−2

+

𝑞𝑚−1

×

𝑞𝑚−2

×

...

+

...

×

...

𝑓1

×

+

𝑞1

𝑓0

×

+

𝑦𝑖

×

...

Рис. 9.3. Каноническая форма цифрового фильтра со встроенными
сумматорами (observer canonical form)
Определение 9.3. Матрицы 𝐺1 (𝐷) и 𝐺2 (𝐷) называют эквива-

лентными, если они порождают один и тот же код.

9.1. Кодер сверточного кода общего вида

273

Теорема 9.1. Матрицы 𝐺1 (𝐷) и 𝐺2 (𝐷) ранга 𝑘 эквивалентны,

если и только если существует невырожденная матрица 𝑇 (𝐷)
такая, что
𝐺1 (𝐷) = 𝑇 (𝐷)𝐺2 (𝐷).
(9.8)

Доказательство Пусть 𝑢(𝐷)𝐺1 (𝐷) = 𝑣(𝐷). Кодовым словом
для 𝑢′ (𝐷) = 𝑢(𝐷)𝑇 (𝐷) в коде, порожденном 𝐺2 (𝐷), будет 𝑣(𝐷).
Это означает, что код, порождаемый 𝐺2 (𝐷), содержит код, порождаемый 𝐺1 (𝐷). В силу невырожденности 𝑇 (𝐷) по аналогии доказывается обратное включение, т.е. коды совпадают и достаточность
невырожденности имеет место.
Докажем необходимость этого условия. Пусть коды эквивалентны. Найдем соответствующую преобразующую матрицу 𝑇 (𝐷) и докажем, что она невырождена. Каждая строка 𝑔 𝑖 (𝐷) матрицы 𝐺1 (𝐷)
может быть получена как некоторая линейная комбинация строк
𝐺2 (𝐷), т.е. 𝑔 𝑖 (𝐷) = 𝑢𝑖 (𝐷)𝐺2 (𝐷), где 𝑢𝑖 (𝐷) — некоторый вектор
длины 𝑘 , 𝑖 = 1, 2, ..., 𝑘 . Получим 𝐺1 (𝐷) = 𝑈 (𝐷)𝐺2 (𝐷), где строками 𝑈 (𝐷) служат 𝑢𝑖 (𝐷), 𝑖 = 1, 2, ..., 𝑘 .. Поскольку ранг произведения
матриц равен меньшему из рангов сомножителей, ранг 𝑈 (𝐷) не может быть меньше ранга 𝐺1 (𝐷). Следовательно, ранг 𝑈 (𝐷) равен 𝑘 ,
т.е. 𝑈 (𝐷) невырождена, что и требовалось доказать.
Напомним, что в определении эквивалентных блоковых кодов
допускалась перестановка кодовых символов. Сверточные коды
имеют бесконечную длину, что создает трудности с введением аналогичного понятия эквивалентности. Тем не менее, понятно, что перестановка столбцов матрицы 𝐺(𝐷) сохраняет характеристики кода
(такая перестановка эквивалентна перенумерации выходов сверточного кодера). Можно еще немного расширить понятие эквивалентности следующим образом.
Определение 9.4. Матрицы 𝐺1 (𝐷) и 𝐺2 (𝐷) слабо эквивалентны,

если для некоторой невырожденной рациональной матрицы 𝑇 (𝐷)
и полиномиальной перестановочной матрицы Π(𝐷) имеет место
𝐺1 (𝐷) = 𝑇 (𝐷)𝐺2 (𝐷)Π(𝐷).
Напомним, что перестановочной является матрица, содержащая
ровно одну единицу в каждом столбце и каждой строке. Полиномиальной перестановочной матрицей мы называем перестановочную

274

9. Алгебраический подход к сверточным кодам

матрицу, в которой единицы заменены мономами вида 𝐷𝐿 конечной степени 𝐿.
Подытожим список преобразований матрицы, сохраняющих порождаемый ею код.

∙ Строки матрицы можно переставлять.
∙ Строки матрицы можно заменять их линейными комбинациями с другими строками.
∙ Если элементы строки матрицы имеют общим делителем моном 𝑎𝐷𝑖 , 𝑖 > 0, 𝑎 ∈ 𝐺𝐹 (𝑞), 𝑎 ̸= 0, то элементы строки можно
поделить на этот моном.
∙ Если элементы столбца матрицы имеют общим делителем моном 𝐷𝑖 , 𝑖 > 0, то элементы столбца можно поделить на этот
моном.
Рассматривая матрицу 𝐺(𝐷) как кодирующую матрицу, можно
сформулировать некоторые естественные требования к ней.
Начнем с того, что матрица 𝐺(𝐷) должна быть реализуемой.
Она должна быть матрицей без задержки, т.е. в разложении
𝐺(𝐷) = 𝐺0 + 𝐺1 𝐷 + ... матрица 𝐺0 = 𝐺(0) должна быть ненулевой (поскольку матрица и ее сдвиг 𝐷𝑠 𝐺(𝐷), 𝑠 > 0, порождают один
и тот же код).
Помимо этого, матрица 𝐺(𝐷) должна иметь полный ранг, равный 𝑘 (в противном случае информационная последовательность не
может быть однозначно восстановлена по последовательности кодовых символов). Более того, потребуем, чтобы матрица 𝐺0 = 𝐺(0)
имела полный ранг.
Определение 9.5. Реализуемая передаточная матрица 𝐺(𝐷) раз-

мерности 𝑘×𝑛 такая, что 𝐺(0) имеет ранг 𝑘 , называется порождающей матрицей сверточного кода.
Поясним подробнее требование полноты ранга матрицы 𝐺(0).
Если ранг 𝐺(0) меньше 𝑘 , то линейными преобразованиями
можно привести 𝐺(𝐷) к таком виду, что в 𝐺(0) будут нулевые
строки. Соответствующие строки матрицы 𝐺(𝐷) будут иметь общим делителем моном 𝐷𝑖 . Это означает, что часть информационных символов начинает участвовать в формировании кодовых слов

9.1. Кодер сверточного кода общего вида

275

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

тической, если она имеет вид
(︁
𝐺(𝐷) = 𝐼𝑘

)︁

𝑅(𝐷) ,

где 𝐼𝑘 — единичная матрица порядка 𝑘 , а 𝑅(𝐷) — матрица из
рациональных функций от 𝐷.
Из того факта, что ранг порождающей матрицы равен 𝑘 , вытекает следующее утверждение.
Теорема 9.2. Всякая порождающая матрица слабо эквивалентна

систематической порождающей матрице.

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

рых — полиномы (а не дробно-рациональные функции), называют
полиномиальными.

Теорема 9.3. Всякий сверточный код может быть задан поли-

номиальной порождающей матрицей.

Доказательство. Пусть 𝐺(𝐷) = {𝑓𝑖𝑗 (𝐷)/𝑞𝑖𝑗 (𝐷), 𝑖 = 1, ..., 𝑘, 𝑗 =
= 1, ..., 𝑛}. Обозначим 𝑞(𝐷) = НОК({𝑞𝑖𝑗 (𝐷)}). Матрица 𝐺′ (𝐷) =
= 𝑞(𝐷)𝐺(𝐷) — полиномиальная и, по определению, эквивалентна
𝐺(𝐷).
Получается, что при поиске хороших сверточных кодов можно
ограничиться рассмотрением только полиномиальных порождающих матриц. Это не означает, что изучение рациональных матриц
не имеет смысла. Свойства кодера также важны по многим причинам, кодер хорошего кода может оказаться плохим или хорошим.

276

9. Алгебраический подход к сверточным кодам

Например, как мы увидим, среди кодеров есть такие, использование
которых нежелательно — катастрофические кодеры.
Как мы уже знаем из предыдущей главы, порождающая матрица называется катастрофической, если существует информационная последовательность бесконечного веса, которой соответствует
последовательность конечного веса.
Вопрос о том, является ли кодер катастрофическим, связан с
существованием полиномиального «обратного кодера», т.е. полиномиальной матрицы размера 𝑛 × 𝑘 , которая позволит восстановить
информационный вектор-полином умножением кодового вектораполинома на эту матрицу. Если вектор конечного веса умножается
на полиномиальную матрицу, то вес результата будет конечным.
Поэтому катастрофический кодер не может иметь полиномиального обратного кодера. Существование полиномиальной псевдообратной матрицы является достаточным условием некатастрофичности
кодера.
Отсюда видим, что систематический кодер не может быть катастрофическим, т.к. для него обратный кодер тривиален. Теорема 9.2 подсказывает, что для нахождения некатастрофического кодера данного кода достаточно привести его порождающую матрицу к систематической форме. Однако полученный таким образом
кодер может быть не самым лучшим, например, с точки зрения
сложности кодирования и декодирования.
Более формальное решение задачи определения катастрофичности кодера, включающее необходимые и достаточные условия, будет
дано ниже после обсуждения вопроса о построении минимального
кодера.

9.2.

Смитова форма и существование правой
обратной матрицы

Приведем без доказательства известную теорему линейной алгебры
о приведении матрицы к нормальной форме Смита (1861).

9.2. Смитова форма

277

Теорема 9.4. Полиномиальная матрица 𝐺(𝐷) над полем 𝐺𝐹 (𝑞)

ранга 𝑟 может быть представлена в виде

(9.9)

𝐺(𝐷) = 𝐴(𝐷)Γ(𝐷)𝐵(𝐷),

где 𝐴(𝐷) и 𝐵(𝐷) — полиномиальные квадратные матрицы порядка 𝑘 и 𝑛 соответственно, с определителями, равными 1, Γ(𝐷) —
матрица размера 𝑘 × 𝑛 вида


𝛾1 (𝐷)


𝛾2 (𝐷)




..


.


⎟ . (9.10)
𝛾𝑟 (𝐷)
Γ(𝐷) = ⎜




0




.
.


.
0 ··· 0

Диагональные элементы 𝛾𝑖 (𝐷) называются инвариантными
многочленами, 𝛾𝑖 (𝐷) являются делителями 𝛾𝑗 (𝐷) при 𝑗 > 𝑖, 𝑗 ≤ 𝑟.
Кроме того, обозначим через Δ𝑖 (𝐷) наибольший общий делитель всех миноров порядка 𝑖 матрицы 𝐺(𝐷), тогда
𝛾1 (𝐷) = Δ1 (𝐷),

𝛾𝑖 (𝐷) =

Δ𝑖 (𝐷)
,
Δ𝑖−1 (𝐷)

𝑖 = 1, 2, ..., 𝑘.

(9.11)

Доказательство теоремы можно найти в пособиях по линейной
алгебре. Применительно к сверточным кодам конструктивные доказательства, включающие алгоритм приведения к смитовой форме,
имеются в книге [25] и статье Форни [72]. В приложении приведена
МАТЛАБ-программа приведения к смитовой форме. Эта программа следует алгоритму из работы [72].
Название «инвариантные многочлены» объясняется тем, что
для всех эквивалентных матриц эти многочлены одинаковы, в отличие от матриц 𝐴(𝐷) и 𝐵(𝐷).
Пусть теперь 𝐺(𝐷) — полиномиальная матрица ранга 𝑟 над полем 𝐺𝐹 (𝑞) и 𝑞(𝐷) — наименьшее общее кратное знаменателей элементов 𝐺(𝐷). Расширение теоремы Смита на рациональную матри-

278

9. Алгебраический подход к сверточным кодам

цу 𝐺(𝐷) получается разложением по Смиту полиномиальной матрицы 𝑞(𝐷)𝐺(𝐷)

𝑞(𝐷)𝐺(𝐷) = 𝐴(𝐷)Γ𝑞 (𝐷)𝐵(𝐷).
Отсюда делением на 𝑞(𝐷) получаем

𝐺(𝐷) = 𝐴(𝐷)Γ(𝐷)𝐵(𝐷),
где Γ(𝐷) = Γ𝑞 (𝐷)/𝑞(𝐷),




𝛼1 (𝐷)
𝛽1 (𝐷)







Γ(𝐷) = ⎜







𝛼2 (𝐷)
𝛽2 (𝐷)

..

.
𝛼𝑟 (𝐷)
𝛽𝑟 (𝐷)







⎟,



0


..

.
0 ··· 0

(9.12)

(𝐷)
инвариантные факторы 𝛼𝛽𝑖𝑖(𝐷)
(после сокращения общих делителей
числителя и знаменателя) обладают следующими свойствами:

∙ 𝛼𝑖 (𝐷) являются делителями 𝛼𝑗 (𝐷) при 𝑗 > 𝑖, 𝑗 ≤ 𝑟;
∙ 𝛽𝑖 (𝐷) являются делителями 𝛽𝑗 (𝐷) при 𝑗 < 𝑖, 𝑖 ≤ 𝑟.
Определение 9.8. Правой обратной матрицей для заданной порождающей матрицы 𝐺(𝐷) назовем матрицу 𝐺−1 (𝐷) такую, что

𝐺(𝐷)𝐺−1 (𝐷) = 𝐼𝑘 .
Поскольку мы условились о том, что 𝐺(𝐷) имеет полный ранг,
псевдообратная матрица существует всегда, но она может быть
нереализуемой.
Определение 9.9. Правой псевдообратной матрицей для задан-

˜
ной порождающей матрицы 𝐺(𝐷) назовем матрицу 𝐺(𝐷)
такую,
что
˜
𝐺(𝐷)𝐺(𝐷)
= 𝐷 𝐿 𝐼𝑘 ,

где 𝐿 ≥ 0 — неотрицательное целое число.

9.2. Смитова форма

279

Теорема 9.5. Необходимое и достаточное условие некатастро-

фичности кодера, заданного порождающей матрицей 𝐺(𝐷), — су˜
ществование полиномиальной псевдообратной матрицы 𝐺(𝐷)
.
˜
Доказательство. Если полиномиальная 𝐺(𝐷)
существует, то
для некоторого 𝐿 ≥ 0 из 𝑢(𝐷)𝐺(𝐷) = 𝑣(𝐷) следует
˜
𝑢(𝐷)𝐷𝐿 = 𝑣(𝐷)𝐺(𝐷).

Это означает, что по кодовому слову конечного веса однозначно
(с задержкой 𝐿) восстанавливается информационный полином на
входе кодера, и этот полином также имеет конечный вес.
˜
Положим, напротив, что 𝐺(𝐷)
содержит рациональные элементы. Тогда найдется полином (не моном) 𝑞(𝐷) такой, что
˜
𝑞(𝐷)𝐺(𝐷)
— полиномиальная матрица и

˜
𝑢(𝐷)𝑞(𝐷)𝐷𝐿 = 𝑞(𝐷)𝑣(𝐷)𝐺(𝐷)
= 𝑧(𝐷).
Если кодовое слово 𝑣 (D) имеет конечный вес, то и 𝑧(𝐷) имеет
конечный вес, а
𝑢(𝐷)𝐷𝐿 = 𝑧(𝐷)/𝑞(𝐷)
имеет бесконечный вес, т.е. кодер — катастрофический. Таким образом, существование полиномиальной псевдообратной матрицы не
только достаточное, но и необходимое условие некатастрофичности
кодера.
Теорема Смита поможет ответить на вопрос о существовании
полиномиальной обратной или псевдообратной матрицы.
Теорема 9.6. Рациональная порождающая матрица 𝐺(𝐷) имеет

полиномиальную правую псевдообратную матрицу в том и только
в том случае, если в ее разложении Смита 𝛼𝑘 (𝐷) представляет
собой моном.
Полиномиальная порождающая матрица 𝐺(𝐷) имеет полиномиальную правую псевдообратную матрицу в том и только в том
случае, если в ее разложении Смита 𝛾𝑘 (𝐷) — моном.
В частности, полиномиальные правые обратные матрицы существуют, если 𝛼𝑘 (𝐷) (𝛾𝑘 (𝐷)) — мономы нулевой степени (ненулевые константы поля 𝐺𝐹 (𝑞) ).

280

9. Алгебраический подход к сверточным кодам

˜
Доказательство. Матрица 𝐺(𝐷)
может быть записана как
˜
𝐺(𝐷)
= 𝐷𝐿 𝐵 −1 (𝐷)Γ−1 (𝐷)𝐴−1 (𝐷),

𝐿 > 0.

(9.13)

Обратные матрицы к 𝐴(𝐷) и 𝐵(𝐷) существуют (т.к. их определители равны единице) и полиномиальные (по формуле обращения
матриц). Запишем Γ−1 (для случая рациональной порождающей
матрицы) в форме


𝛽1 (𝐷)
𝛼1 (𝐷)







−1
Γ (𝐷) = ⎜







𝛽2 (𝐷)
𝛼2 (𝐷)

..

.







𝛽𝑘 (𝐷) ⎟ .
𝛼𝑘 (𝐷) ⎟

0 ⎟

.. ⎟
. ⎠
0

(9.14)

Если 𝛼𝑘 (𝐷) = 𝑎𝑘 𝐷𝐿 , 𝑎𝑘 ∈ 𝐺𝐹 (𝑞), то 𝐷𝐿 /𝛼𝑖 (𝐷) — мономы при
всех 𝑖 ≤ 𝑘 . Поэтому 𝐷𝐿 Γ−1 (𝐷) — полиномиальная. Мы доказали,
что все три матрицы в правой части (9.13) — полиномиальные, тем
самым закончено доказательство достаточности для рациональных
матриц. Для случая полиномиальной матрицы достаточность доказывается аналогично.
Докажем необходимость, т.е. что из существования полиномиальной обратной матрицы следует, что 𝛼𝑘 (𝐷) (𝛾𝑘 (𝐷)) — моном. По
предположению,

˜
𝐷𝐿 𝐵 −1 (𝐷)Γ−1 (𝐷)𝐴−1 (𝐷) = 𝐺(𝐷)

полиномиальная матрица. Полиномиальной будет также матрица

˜
𝐷𝐿 Γ−1 (𝐷) = 𝐵(𝐷)𝐺(𝐷)𝐴(𝐷)
.
Чтобы это условие выполнялось, дроби 𝐷𝐿 /𝛼𝑖 (𝐷) (соответственно, 𝐷𝐿 /𝛾𝑖 (𝐷)) должны быть мономами. Значит, знаменатели должны быть также мономами степени не больше 𝐿, что и требовалось
доказать.

9.3. Минимальная базовая порождающая матрица

281

Следствие 9.7. (Условие Месси–Саина [93]). Правая псевдообрат-

ная матрица для полиномиальной матрицы 𝐺(𝐷) существует, если и только если наибольший общий делитель всех ее миноров порядка 𝑘 — моном переменной 𝐷.
Доказательство. Это условие напрямую вытекает из представления инвариантных множителей через миноры в теореме 9.4 и теоремы 9.6.

9.3.

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

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

если она полиномиальная и имеет правую обратную матрицу.

Такое сужение класса порождающих матриц мотивируется задачей отыскания кодеров с минимальной задержкой среди всех кодеров, порождающих код. Важно, чтобы сужение класса кодеров
не вело к потере хороших кодов.
Теорема 9.8. Всякая порождающая матрица имеет эквивалент-

ную базовую порождающую матрицу.

Доказательство. Для произвольной полиномиальной порождающей матрицы 𝐺(𝐷) выполним декомпозицию Смита. В качестве
новой порождающей матрицы выберем 𝐺b (𝐷), составленную из
первых 𝑘 строк матрицы 𝐵(𝐷), иными словами


𝑏1 (𝐷)
⎜𝑏2 (𝐷)⎟

𝐺b (𝐷) = ⎜
⎝ ... ⎠ ,
𝑏𝑘 (𝐷)
где 𝑏𝑖 (𝐷) — строки 𝐵(𝐷). Матрица 𝐺b (𝐷) эквивалентна 𝐺(𝐷), поскольку 𝑇 (𝐷) = 𝐴(𝐷)diag(𝛾1 (𝐷), 𝛾2 (𝐷), ..., 𝛾𝑘 (𝐷)) невырождена и

282

9. Алгебраический подход к сверточным кодам

𝐺(𝐷) = 𝑇 (𝐷)𝐺b (𝐷). С другой стороны, 𝐺b (𝐷) имеет правую обратную, поскольку в ее смитовой декомпозиции все инвариантные
факторы будут равны единице. Следовательно, 𝐺b (𝐷) — базовая
матрица, эквивалентная 𝐺(𝐷).
Кодер, задаваемый базовой матрицей, мы также называем базовым.
Упражнение 9.1. Докажите, что базовый кодер некатастрофи-

чен.

Подсказка: чтобы убедиться в существовании полиномиальной
правой обратной матрицы, воспользуйтесь представлением матрицы 𝐺1 (𝐷) в нормальной форме Смита.
Упражнение 9.2. Докажите, что две базовых матрицы 𝐺1 (𝐷) и

𝐺2 (𝐷) эквивалентны тогда и только тогда, когда найдется невырожденная полиномиальная 𝑇 (𝐷) такая, что 𝐺1 (𝐷) = 𝑇 (𝐷)𝐺2 (𝐷)
и определитель 𝑇 (𝐷) равен единице.

Решение: если такая матрица найдется, то эквивалентность имеет место по определению. Если матрицы эквивалентны и обе имеют полиномиальные правые обратные, то найдутся две невырожденные матрицы 𝑆(𝐷) и 𝑇 (𝐷) такие, что 𝐺1 (𝐷) = 𝑇 (𝐷)𝐺2 (𝐷)
и 𝐺2 (𝐷) = 𝑆(𝐷)𝐺1 (𝐷). Отсюда 𝑇 (𝐷) = 𝐺2 (𝐷)𝐺−1
1 (𝐷), 𝑆(𝐷) =
= 𝐺1 (𝐷)𝐺−1
(𝐷)
,
причем
𝑆(𝐷)
и
𝑇
(𝐷)

полиномиальные
по пред2
положению о том, что 𝐺1 (𝐷) и 𝐺2 (𝐷) — базовые. Перемножив тождества для 𝑆(𝐷) и 𝑇 (𝐷), получим 𝑇 (𝐷)𝑆(𝐷) = 𝐼𝑘 . Определитель
произведения матриц равен произведению определителей. Поскольку оба определителя — полиномы, det(𝑇 (𝐷)) = 1.
Теорема 9.5 не только утверждает существование базовой матрицы, но и указывает способ ее построения. Наш следующий шаг —
поиск среди базовых матриц матрицы с наименьшей сложностью,
которая определяется длиной кодового ограничения

𝜈 = max {𝜈𝑖 },
𝑖=1,...,𝑘

где

𝜈𝑖 = max deg(𝑔𝑖𝑗 (𝐷)).
𝑗=1,...,𝑛

9.3. Минимальная базовая порождающая матрица

283

Определение 9.11. Кодер называется минимальным базовым, ес-

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

Введем обозначение 𝐺ℎ для 𝑘 × 𝑛 матрицы с элементами из
𝐺𝐹 (𝑞), в которой ненулевые элементы являются коэффициентами
при 𝐷𝜈𝑖 в тех позициях каждой строки, где степень 𝑔𝑖𝑗 (𝐷) совпадает
с 𝜈𝑖 — наибольшей степенью элементов строки.
Теорема 9.9. Пусть 𝐺(𝐷) — базовая с кодовым ограничением 𝜈 .

Тогда следующие утверждения эквивалентны.
A. 𝐺(𝐷) — минимальная базовая.

B. Максимальная степень 𝜇 среди всех 𝑘×𝑘 миноров 𝐺(𝐷) равна
кодовому ограничению 𝜈 .
C. Матрица 𝐺ℎ имеет полный ранг 𝑘 .
Доказательство. Докажем сначала, что утверждения B и C эквивалентны.
Представим 𝐺(𝐷) в виде
⎛ 𝜈

𝐷 1


𝐷 𝜈2


^
^
𝐺(𝐷) = ⎜
= Λ(𝐷)𝐺ℎ + 𝐺(𝐷),
⎟ 𝐺ℎ + 𝐺(𝐷)
..


.
𝐷𝜈𝑘

(9.15)
^
где 𝐺(𝐷)
не содержит элементов степени 𝜈𝑖 в строке с номером 𝑖.
Поскольку 𝐺ℎ содержит только
∑︀𝑘 константы поля, степени миноров
𝐺(𝐷) не превышают 𝜈 = 𝑖=1 𝜈𝑖 и определяются первым слагаемым в правой части (9.15). Если 𝐺ℎ имеет полный ранг 𝑘 , то найдется минор степени 𝜇 = 𝜈 . Следовательно, из C следует B. Точно
также, из разложения (9.15) следует, что при неполном ранге 𝐺ℎ в
матрице Λ(𝐷)𝐺ℎ не найдется минора степени 𝜈 . Тем самым, если
имеет место B, то верно и C.
Докажем теперь, что из утверждения A следует C.

284

9. Алгебраический подход к сверточным кодам

Без потери общности предположим, что 𝜈1 ≤ 𝜈2 ≤ ... ≤ 𝜈𝑘 . Если
предположить, что C неверно, то найдется линейная комбинация
строк 𝐺ℎ , такая, что одна из строк, например, последняя окажется
равной нулю. Та же линейная комбинация, но с коэффициентами в
виде мономов соответствующих степеней, позволит получить эквивалентный кодер, но наибольшая степень последней строки 𝐺ℎ будет меньше 𝜈𝑘 и кодовое ограничение кода в целом станет меньше,
что противоречит предположению о минимальности. Таким образом, для минимального кодера матрица 𝐺ℎ невырождена.
Докажем теперь, что из утверждения B следует A. Предположим, что 𝜇 = 𝜈 для 𝐺(𝐷), и рассмотрим матрицу 𝐺′ (𝐷), эквивалентную 𝐺(𝐷). Тогда 𝐺′ (𝐷) = 𝑇 (𝐷)𝐺(𝐷) для некоторой полиномиальной 𝑇 (𝐷) с единичным определителем. Заметим, что все миноры 𝐺′ (𝐷) будут такими же, как и миноры 𝐺(𝐷) для всех 𝑇 (𝐷),
поскольку det(𝑇 (𝐷)) = 1. Из разложения (9.15) следует, что 𝜈 ≥ 𝜇.
Поэтому 𝐺(𝐷), имеющая кодовое ограничение 𝜈 = 𝜇, минимальна.
Поскольку утверждения B и C эквивалентны, а A эквивалентно
им обоим, теорема доказана.
Теорема 9.9 указывает прямой путь к построению минимального кодера для данного кода. Если есть некоторый кодер, заданный
порождающей матрицей, нужно сначала найти базовый кодер (привести его к полиномиальной форме, вычислить матрицу 𝐵(𝐷) в декомпозиции Смита и взять ее первые 𝑘 строк в качестве эквивалентной порождающей матрицы). Следующий шаг состоит в проверке
полноты ранга матрицы максимальных степеней. Если ранг неполон, то нужно линейными преобразованиями матрицы уменьшать
степени строк до тех пор, пока ранг 𝐺ℎ не станет полным.
Полученная матрица будет минимальной базовой для данного
кода. Подчеркнем, что минимальность тут понимается только в
смысле числа ячеек памяти кодера. Некоторая другая (например,
систематическая) форма кодера может иметь некоторые практические преимущества. Кроме того, поскольку минимальная базовая
матрица не единственна, разные ее (эквивалентные) представления
будут иметь разные характеристики в смысле, например, вероятности ошибки на бит или сложности решетки (см. главу 4).

9.4. Проверочная матрица и дуальный код

285

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

9.4.

Проверочная матрица, систематическая
форма и дуальный код

Естественным путем нахождения проверочной матрицы кажется
способ, использованный для блоковых кодов, а именно через приведение матрицы к систематической форме. Однако, как мы увидим,
декомпозиция Смита дает не только минимальную базовую матрицу, но и информацию о проверочной матрице кода.
Пусть 𝐵(𝐷) — полиномиальная матрица размера 𝑛×𝑛 с единичным определителем, найденная в результате декомпозиции Смита
заданной матрицы 𝐺(𝐷). Следуя доказательству теоремы 9.8, находим, что верхние 𝑘 строк 𝐵(𝐷) образуют базовую матрицу 𝐺′ (𝐷),
эквивалентную 𝐺(𝐷). Поэтому имеет место равенство
)︂
(︂ ′
𝐺 (𝐷)
,
𝐵(𝐷) =
𝐵0 (𝐷)
где 𝐵0 (𝐷) — матрица размера (𝑛 − 𝑘) × 𝑘 ранга 𝑛 − 𝑘 . Обратная к
𝐵(𝐷) матрица имеет вид
(︀
)︀
𝐵 −1 (𝐷) = 𝐺′ (𝐷)−1 𝐵1 (𝐷) ,
где 𝐵1 (𝐷) — матрица размера (𝑛−𝑘)×𝑘 ранга 𝑛−𝑘 , а 𝐺′ (𝐷)−1 — правая псевдообратная к 𝐺′ (𝐷). Она существует, поскольку 𝐺′ (𝐷) —
базовая.
Перемножая 𝐵(𝐷) и 𝐵 −1 (𝐷), получаем
(︂
)︂
𝐼𝑘
𝐺′ (𝐷)𝐵1 (𝐷)
𝐼𝑛 = 𝐵(𝐷)𝐵 −1 (𝐷) =
.
𝐵0 (𝐷)𝐺′ (𝐷)−1 𝐵0 (𝐷)𝐵1 (𝐷)
Отсюда заключаем, что

𝐺′ (𝐷)𝐵1 (𝐷) = 0,

286

9. Алгебраический подход к сверточным кодам

т.е., 𝐵1 (𝐷) — транспонированная проверочная матрица для кода,
задаваемого 𝐺′ (𝐷), а, следовательно, и 𝐺(𝐷). Больше того, проверочную матрицу 𝐻(𝐷) = 𝐵1T (𝐷) можно рассматривать как порождающую матрицу кода, который мы вправе назвать дуальным
к рассматриваемому коду.
Теорема 9.10. Если порождающая матрица 𝐺(𝐷) задает код,

эквивалентный минимальному базовому коду с кодовым ограничением 𝜈 , то транспонированная проверочная матрица 𝐻 T (𝐷) может быть найдена как последние правые 𝑛 − 𝑘 столбцов матрицы
𝐵 −1 (𝐷) в смитовой декомпозиции 𝐺(𝐷), причем кодовое ограничение минимального кодера для 𝐻(𝐷) равно 𝜈 .
Доказательство. Первое из двух утверждений уже доказано, и
установлено тождество
(︁
)︁
𝐵 −1 (𝐷) = 𝐺′ (𝐷)−1 𝐻 T (𝐷) .
(9.16)
В матрицах 𝐺′ (𝐷) и 𝐻(𝐷) выделим квадратные подматрицы
и 𝐻11 порядков 𝑘 и 𝑛−𝑘 соответственно, и представим матрицы
в виде
(︁
)︁
(︁
)︁
𝐺′ (𝐷) = 𝐺′00 (𝐷) 𝐺′01 (𝐷) , 𝐻(𝐷) = 𝐻10 (𝐷) 𝐻11 (𝐷) .

𝐺′00

Нетрудно убедиться в справедливости тождества
(︃
)︃
(︃
)︃
𝐼𝑘
0
𝐺′00 (𝐷) 𝐺′01 (𝐷)
−1
𝐵 (𝐷) =
.
0
𝐼𝑛−𝑘
𝐻10 (𝐷) 𝐻11 (𝐷)
Вычислив определители матриц слева и справа от знака равенства, помня, что det(𝐵(𝐷)) = 1, получаем

det(𝐺′00 (𝐷)) = det(𝐻11 (𝐷)).
Переставляя столбцы матрицы 𝐺(𝐷), получим равенства между
ее различными минорами порядка 𝑘 и соответствующими минорами
порядка 𝑛 − 𝑘 матрицы 𝐻(𝐷). Таким образом, совпадают и максимальные степени миноров, а, значит, по теореме 9.9, совпадают и
кодовые ограничения прямого и дуального кодов.

9.4. Проверочная матрица и дуальный код

287

Для кодов с низкой или высокой скоростью размеры 𝐺(𝐷) и
𝐻(𝐷) сильно разнятся. Поэтому естественно желание из двух способов описания кода выбрать то, которое имеет меньшую сложность.
Теорема 9.10 утверждает, что сложности, измеряемые как кодовое
ограничение (сумма по строкам максимальных степеней элементов
строк или суммарная длина регистров кодера), одинаковы.
Напомним, что подобное утверждение мы получили для минимальных решеток блокового кода, построенных по порождающей и
проверочной матрице. Больше того, мы знаем, что все минимальные решетки блокового кода совпадают с точностью до изоморфизма. Подход к анализу сложности решеток, использованный в главе 4, также можно было использовать для получения результата,
сформулированного в теореме 9.10.
Еще один путь получения проверочной матрицы кода основан
на приведении порождающей матрицы к систематическому виду.
Для всякой порождающей матрицы 𝐺(𝐷) можно найти перестановку столбцов, при которой квадратная подматрица 𝐺0 (𝐷) из
первых 𝑘 столбцов имеет полный ранг. Соответствующий код либо
совпадает, либо эквивалентен исходному, поэтому без потери общности будем считать, что это свойство имеет место. Умножив 𝐺(𝐷)
слева на обратную к 𝐺0 (𝐷), получим эквивалентную матрицу в систематической форме:
(︁
)︁
𝐺(𝐷) = 𝐼𝑘 𝑅(𝐷) .
(9.17)
Подматрица 𝑅(𝐷) в общем случае состоит из рациональных элементов. Учитывая некоторые практические преимущества систематических кодеров (например, некатастрофичность), можно решать
задачу поиска наилучших кодов только среди полиномиальных систематических. Оказывается, что найденные при таком ограничении коды намного уступают по своим характеристикам (например,
по свободному расстоянию) кодам общего вида.
По аналогии с блоковыми кодами, из (9.17) получаем проверочную матрицу
(︁
)︁
𝐻(𝐷) = −𝑅T (𝐷) 𝐼𝑛−𝑘 ,
(9.18)
в общем случае рациональную. Эквивалентную полиномиальную
матрицу можно получить, домножив строки 𝐻(𝐷) на наименьшее

288

9. Алгебраический подход к сверточным кодам

общее кратное элементов строк. Если полученная матрица не будет
минимальной, можно найти эквивалентную ей минимальную базовую матрицу с помощью декомпозиции Смита.

Выводы
Резюмируем основные результаты анализа алгебраических свойств
сверточных кодов.

∙ Сверточный код со скоростью 𝑅 = 𝑘/𝑛 может быть задан
линейной постоянной схемой с памятью, имеющей 𝑘 входов и
𝑛 выходов.
∙ Линейная постоянная схема может быть описана передаточной функцией, задаваемой матрицей с рациональными или полиномиальными элементами.
∙ Передаточная функция является порождающей матрицей
сверточного кода, если матрица коэффициентов при нулевой
степени формальной переменной имеет ранг 𝑘 .
∙ Всякий кодер эквивалентен полиномиальному кодеру, систематическому кодеру.
∙ Для того чтобы кодер не был катастрофическим, достаточно
существования полиномиальной правой псевдообратной матрицы по отношению к порождающей матрице кода.
∙ Для данного кода полиномиальный кодер, для которого существует полиномиальный правый обратный кодер, называется
базовым. Базовый кодер не может быть катастрофическим.
∙ Декомпозиция Смита позволяет найти базовый и минимальный базовый кодер эквивалентный данному.
∙ Базовый кодер является минимальным базовым, если матрица
коэффициентов при максимальных степенях строк невырождена.

Приложение

289

∙ Кодовое ограничение минимального базового кодера равно
максимальной степени его миноров порядка 𝑘 .
∙ Кодовое ограничение дуального кода, задаваемого проверочной матрицей, совпадает с кодовым ограничением исходного
кода.
∙ Решетка с минимальной сложностью может быть построена по
приведенной к минимальной спэновой форме порождающей
матрице минимального базового кодера.

Приложение. МАТЛАБ-программа
декомпозиции Смита
Полиномам в программах сопоставляются целые числа. Двоичным
разрядам числа соответствуют коэффициенты полиномов. Поэтому степень полиномов ограничена числом 52 — максимальной разрядностью целых чисел в МАТЛАБе. Если в процессе вычислений
промежуточные результаты выходят за пределы точности, то этот
факт обнаруживается (см. скрипт control) и программа прерывает
работу.
Программа 9.1. Приведение матрицы к канонической форме Смита
function [A ,D ,B , MSF ]= smith_form ( G )
% Represents G in the form A * D * B
% where A and B have det =1 and D is diagonal matrix
% Computes Min span form MSF of equivalent code
% Инициализация
[k , n ]= size (G ) ; A = eye ( k ) ;
B = eye ( n ) ; D = G;
% Основной цикл
for h =1: k % iterations
% Step 1. Find nonzero and put it on diagonal
i=h;
while D (h ,i ) ==0 % || i n , error ( ’ rank ( G ) h
% Permute i - th column with h - th column

290

9. Алгебраический подход к сверточным кодам

t = D (: , h ) ; D (: , h ) = D (: , i ) ;
D (: , i ) = t ;
% Modify B ( permute rows )
t = B (i ,:) ; B (i ,:) = B (h ,:) ; B (h ,:) = t ;
end ;
control ;
flag =1;
while flag ==1
flag =0;
% Обнуление h - й строки
for i = h +1: n
% along row
if D (h , i ) ~=0 ,
% Kill nonzero
a = D (h , h ) ; b = D (h , i ) ; % b to be killed
% solve ax + by = d
[d ,x , y ]= gcd_bin_pol (a , b ) ;
% find a /d , b / d ;
ad = div_bin_pol (a , d ) ;
bd = div_bin_pol (b , d ) ;
% Modify D
D (h , h ) = d ; D (h , i ) =0; % h - th row
for j = h +1: k % other rows
c = D (j , h ) ; g = D (j , i ) ;
% cx + gy =
D (j , h ) = bitxor ( mul_bin_pol (c , x ) , ...
mul_bin_pol (g , y ) );
% ( cb + ag ) /d
D (j , i ) = bitxor ( mul_bin_pol (c , bd ) , ...
mul_bin_pol (g , ad )) ;
end ;
% Modify B
% replace h - th row by lin comb
for j =1: n % along row
% B (h ,:) = B(h ,:) * a / d + B (i ,:) * b / d
t = bitxor ( mul_bin_pol ( B (h , j ) , ad ) , ...
mul_bin_pol ( B (i , j) , bd ) ) ;
% B (i ,:) = B(h ,:) * y + B (i ,:) * x
B (i , j ) = bitxor ( mul_bin_pol ( B (h , j) ,y ) , ...
mul_bin_pol ( B (i , j) ,x ) ) ;
B (h , j ) = t;
end ;
control ;
end ; % if D (h , i ) ~=0
end ; % along row
% Обнуление h - го столбца
d = D (h , h ) ;

Приложение

291

for j = h +1: k
c = D (j , h ) ;
if c >= d
[q , r ]= div_bin_pol (c , d ) ;
% A (: , h ) =A (: , h ) + A (: , j ) * q
for i =1: k
A (i , h ) = bitxor ( A (i , h ) , mul_bin_pol ( A (i , j
) ,q ) ) ;
end ;
D (j , h ) = r ;
end ;
end ;
% Check the column
col_sum = sum ( D ( h +1: k , h ) ) ;
if col_sum ~=0 ,
flag =1; % more iterations
i = h +1;
while D (i ,h ) ==0 % || i 0
t = mod (b ,2) ;
if t >0 , x = bitxor (x , a ) ; end ;
b = bitshift (b , -1) ;
a = bitshift (a ,1) ;
end ;

Программа 9.4. Деление двоичных полиномов
function [q , r ]= div_bin_pol (a , b )
if (b > a ) , q =0; r= b ; return ; end ;
q =0;
while a >= b
t = b ; d =1;
r = bitxor (a , t );
while r > t || r > a
t = bitshift (t ,1) ;
r = bitxor (a , t );
d = bitshift (d ,1) ;
end ;
a=r;
q=q+d;
end ;
r=a;

Программа 9.5. Расширенный алгоритм Евклида для двоичных полиномов
function [d ,x , y ]= gcd_bin_pol (r , s )
% returns the GCD d of r and s
% and a pair of numbers x and y such that rx + sy = d = GCD
x =1; y =0;

Приложение

293

u =0; v =1;
if s ==0 , d = r ; return ; end
while s ~=0
q = div_bin_pol (r , s ) ;
t = x ; x = u; u = bitxor (t , mul_bin_pol (q , u ) ) ;
t = y ; y = v; v = bitxor (t , mul_bin_pol (q , v ) ) ;
t=s;
s = bitxor (r , mul_bin_pol (q , s ) ) ;
r=t;
end
d=r;

Программа 9.6. Формирование минимальной базовой матрицы
function MSF = min_basic ( G )
MSF = G ;
[k , n ]= size ( MSF ) ;
flag =1; % 1 means that more iterations are possible
while flag ==1 ,
flag =0;
Starts = ones (1 , k ) ;
for i =1: k % over rows
% Find starts
a = bitand ( MSF (i ,:) ,1) ;
while a ( Starts ( i ) ) ==0 ,
Starts ( i ) = Starts ( i ) +1;
end ;
end ;
% Sort rows in order of starts
[ Starts , v ]= sort ( Starts ) ;
MSF = MSF (v ,:) ;
% Kill identical starts
% ( new bad starts can appear )
for i =1: k -1
for j = i +1: k
if Starts ( i ) == Starts (j )
MSF (j ,:) = bitxor ( MSF (i ,:) , MSF (j ,:) ) ;
flag =1;
end ;
end ;
end ;
end ;
flag =1; % 1 means that more iterations are possible
while flag ==1 ,
flag =0;
% Avoid identical ends

294

end ;

9. Алгебраический подход к сверточным кодам
Ends = ones (1 , k ) ;
Maxdegs = zeros (1 , k ) ;
for i =1: k
% find max degree for row
t =1;
while sum ( MSF (i ,:) >= t ) >0
t = bitshift (t ,1) ; Maxdegs ( i ) = Maxdegs ( i ) +1;
end ;
t = bitshift (t , -1) ;
a = bitand ( MSF (i ,:) ,t ) ;
% find end of row
Ends ( i ) = n ;
while a ( Ends ( i ) ) ==0 ,
Ends ( i ) = Ends ( i ) -1;
end ;
end ;
% Kill identical ends
for i =1: k -1
for j = i +1: k
if Ends ( i ) == Ends ( j )
flag =1;
d = Maxdegs ( i) - Maxdegs ( j ) ;
if (d >=0)
MSF (i ,:) = bitxor ( MSF (i ,:) , ...
bitshift ( MSF (j ,:) ,d ) ) ;
else
MSF (j ,:) = bitxor ( MSF (j ,:) , ...
bitshift ( MSF (i ,:) ,-d ) ) ;
end
end
end
end

10.

Длинные коды из
коротких кодов

Для обеспечения высокой эффективности кодирования корректирующие коды должны иметь большую длину, при этом с ростом
длины кода не должна уменьшаться доля корректируемых ошибок.
Алгебраические коды, такие как коды БЧХ или Рида–Соломона, не
решают этой проблемы.
Плодотворная идея, появившаяся на свет еще в 1950-х — построение длинных кодов на основе комбинаций хороших коротких
кодов. Революционными решениями на этом пути были каскадные
коды Форни (1966), обобщенные каскадные коды Блоха–Зяблова
(1976) и турбо-коды (1993).
Каскадные коды, в частности, турбо-коды, с успехом используются в настоящее время в самых различных приложениях. Воплощение турбо-кодов в решение практических задач связи потребовало астрономических усилий инженеров и исследователей. Накопленный опыт был востребован в 2000-е годы при построении современных систем на основе кодов с малой плотностью проверок на
четность (МППЧ-кодов). МППЧ-кодам посвящена отдельная глава.
Несомненные преимущества каскадных кодов — низкая сложность построения, сравнительно низкая сложность декодирования,
возможность исправления пакетов ошибок.

296

10.1.

10. Длинные коды из коротких кодов

Итеративные коды

Все рассматриваемые в данной главе методы кодирования являются
частными случаями представленной на рис. 10.1 общей схемы.
Информационные
символы

Первый

Переме-

Второй

Кодовые

кодер

житель

кодер

символы

Рис. 10.1. Общая схема итеративного или каскадного кодера
Информационная последовательность разбивается на блоки
длины, соответствующей размерности первого из двух линейных
кодов. Каждый блок кодируется, кодовые слова поступают в перемежитель и, уже в качестве информационных последовательностей
второго кода, они поступают на вход второго кодера. Последовательность на его выходе является кодером итеративного (каскадного) кода.
Еще более общая схема могла бы содержать больше двух каскадов кодирования. Такие схемы тоже используются, но, принимая во
внимание, что каждый новый каскад уменьшает скорость кода, чаще всего используют двухкаскадную схему, показанную на рис. 10.1.
Другое естественное обобщение — комбинирование нескольких разных кодов на каждой ступени кодирования.
Хотя эффективность кода в целом сильно зависит от конкретного выбора каждого из блоков, многие особенности итеративного
кодирования можно проследить на примере простейшей схемы, показанной на рис. 10.2.
Для построения кода-произведения или итеративного кода
нужны два компонентных кода: (𝑛1 , 𝑘1 ) и (𝑛2 , 𝑘2 ). Обозначим минимальные расстояния этих кодов через 𝑑1 и 𝑑2 .
Сначала 𝑘2 блоков по 𝑘1 информационных символов записываются в виде таблицы с 𝑘1 строками и 𝑘2 столбцами. Каждый столбец кодируется первым кодом, в результате получаем 𝑘2 столбцов
длины 𝑛1 . Столбцами служат кодовые слова первого кода. Затем
каждая строка длины 𝑘2 кодируется вторым кодом. В результате
получаем кодовое слово длины 𝑛 = 𝑛1 𝑛2 .

10.1. Итеративные коды

297
𝑛2
𝑘2

𝑘1

𝑘1 × 𝑘2

информа-

ционных символов

Проверочные символы второго кода
по строкам

𝑛1
Проверочные символы первого кода
по столбцам

Проверочные символы второго кода
для проверок первого кода

Рис. 10.2. Прямое произведение кодов
Понятно, что каждый кодовый символ представляет собой линейную комбинацию информационных символов. Поэтому имеем
линейный (𝑛1 𝑛2 , 𝑘1 𝑘2 )-код со скоростью

𝑅 = 𝑅1 𝑅2 ,
где 𝑅1 и 𝑅2 обозначают скорости компонентных кодов.
Упражнение 10.1. Докажите, что порождающая матрица кода-

произведения представляет собой кронекеровское произведение порождающих матриц компонентных кодов. Напомним, что кронекеровское произведение 𝐶 = 𝐴 ⊗ 𝐵 матриц 𝐴 = {𝑎𝑖𝑗 } и 𝐵 = {𝑏𝑖𝑗 }
представляет собой матрицу, состоящую из блоков 𝑎𝑖𝑗 𝐵 .
Подсчитаем минимальное расстояние кода-произведения.
Если хотя бы один из информационных символов отличен от
нуля, то по меньшей мере 𝑑1 строк в таблице, приведенной на рис.
10.2, будут ненулевыми. Вес каждой ненулевой строки не меньше
𝑑2 . Поэтому для минимального расстояния кода-произведения имеет место неравенство 𝑑 ≥ 𝑑1 𝑑2 . В действительности имеет место
равенство, поскольку всегда можно найти кодовое слово веса 𝑑2
второго кода и повторить его в строках с номерами, соответствующими номерам ненулевых позиций некоторого слова веса 𝑑1 . Итак,

298

10. Длинные коды из коротких кодов

имеем

𝑑 = 𝑑1 𝑑2 .
Этот результат нельзя назвать оптимистическим, поскольку и
скорость кода-произведения, и отношение минимального расстояния к длине меньше, чем для компонентных кодов. Тем не менее,
это ухудшение характеристик во многих случаях можно принять
как адекватную плату за простоту описания кода. Кроме того, простота структуры кода позволяет надеяться на возможность его декодирования с малой вычислительной сложностью.
Рассмотрим декодирование кода-произведения в ДСК.
Прямолинейное решение задачи декодирования состоит в том,
что принятая из канала последовательность (сумма кодового слова
и матрицы ошибок) декодируется сначала по строкам, потом по
столбцам.
Упражнение 10.2. Укажите комбинацию ошибок минимального
веса, приводящую к ошибке декодирования при использовании декодирования по строкам и столбцам.

Решение данной задачи приводит к выводу о том, что число
гарантированно исправляемых ошибок при таком декодировании
равно
⌊︂
⌋︂ ⌊︂
⌋︂
𝑑1 + 1
𝑑2 + 1
𝑡 = (𝑡2 + 1)(𝑡1 + 1) − 1 =
− 1,
2
2
⌊︁
⌋︁
где 𝑡𝑖 = 𝑑𝑖2−1 , 𝑖 = 1, 2, — кратности ошибок, исправляемых компонентными кодами. Поскольку расстояние кода-произведения равно
произведению 𝑑 = 𝑑1 𝑑2 , потенциальная кратность исправляемых
ошибок составляет
⌊︂
⌋︂
𝑑1 𝑑2 − 1
𝑡=
,
(10.1)
2
что почти вдвое больше числа ошибок, исправляемых при простом
декодировании.
Более рациональным подходом к решению задачи представляется декодирование по минимуму обобщенного расстояния (МОР)

10.1. Итеративные коды

299

(см. параграф 7.5). Иными словами, декодер, как и прежде, выполняет декодирование по строкам, но затем по результатам декодирования назначает надежности результатам декодирования строк,
например, пропорциональные числу исправленных ошибок.
Декодер столбцов сначала пробует просто декодировать столбцы, затем стирает 2 наименее надежных символа каждого столбца,
и т.д. в соответствии с алгоритмом декодирования по МОР.
Анализ такого декодирования не прост (см., например, Зяблов,
1973). Попытки придумать наихудшее для такого декодера расположение ошибок наводят на (неверную!) мысль о том, что декодер
исправляет все комбинации ошибок кратности порядка 𝑑1 𝑑2 /2, т.е.
реализует потенциальную корректирующую способность кода. На
самом деле, корректирующая способность чуть меньше.
Естественное развитие такого подхода — после декодирования
строк вернуться к декодированию столбцов. Остановимся подробнее на этой возможности.
С точки зрения практического применения модель ДСК не
очень интересна. Для гауссовского канала декодирование по алгоритму БКДР дает возможность оценить надежность каждого принятого на первом этапе решения и затем эффективно использовать эти оценки при выполнении второго этапа. На втором этапе можно снова применить БКДР и т.д. Эта продуктивная идея,
примененная к произведению двух систематических сверточных кодов, была успешно разработана в 1993 году. Коды получили название «турбо-коды», а декодирование называют итеративным турбодекодированием или принципом распространения доверия.
Отметим важную особенность кодов-произведений. Если ошибки группируются, например, по строкам, то количество исправляемых ошибок может быть очень большим. Например, может быть
исправлена комбинация из 𝑑2 /2 пакетов по 𝑛1 ошибок, что намного
превышает гарантированное их минимальным расстоянием число
исправляемых ошибок 𝑑1 𝑑2 /2. Иными словами, коды-произведения
эффективны в каналах с сильным группированием ошибок (с пакетами ошибок).
Кроме того, равномерно распределенные по всему кодовому слову ошибки довольно большого веса также могут быть исправлены.
Это означает, что истинная способность кода-произведения исправ-

300

10. Длинные коды из коротких кодов

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

10.2.

Каскадные и обобщенные каскадные
коды

Как и для итеративного кода, кодирование выполняется в соответствии со схемой, приведенной на рис. 10.1, с той разницей, что один
из кодов, назовем его внешним, выбирается недвоичным. Пусть это
будет код длины 𝑛2 с 𝑘2 информационными символами над полем
𝐺𝐹 (2𝑘1 ). Внутренний код — двоичный (𝑛1 , 𝑘1 )-код. Обозначим через
𝑑1 и 𝑑2 минимальные расстояния внешнего и внутреннего кодов.
Сначала производится кодирование 𝑘2 двоичных информационных блоков длины 𝑘1 внешним кодом. Полученные 𝑛2 символов кодового слова, каждый из которых — двоичная последовательность
длины 𝑘1 , кодируется внутренним кодом. В итоге имеем кодовое
слово длины 𝑛1 𝑛2 . Множество таких кодовых слов представляет собой каскадный код. Структура кодового слова показана на рис. 10.3.

𝑛2
𝑘2
𝑘2
𝑘1

информационных сим-

волов

РС-кода

над

𝐺𝐹 (2𝑘1 )

Проверочные
символы
РС-кода

𝑛1
Проверочные символы первого кода
по столбцам

Рис. 10.3. Каскадный код

10.2. Каскадные и обобщенные каскадные коды

301

Упражнение 10.3. Докажите, что минимальное расстояние 𝑑 и

скорость 𝑅 каскадного кода равны

𝑑 = 𝑑1 𝑑2 ,
𝑅 = 𝑅1 𝑅2 .
𝑅1 и 𝑅2 — скорости компонентных внутреннего и внешнего кодов.
Характеристики каскадного кода, на первый взгляд, в точности
такие же, как и характеристики итеративного кода. Принципиальное различие в том, что построение хороших кодов над большими
алфавитами проще, чем над двоичным алфавитом. В частности, в
нашем распоряжении есть класс кодов Рида–Соломона с минимальным расстоянием
𝑑2 = 𝑛2 − 𝑘2 + 1
при 𝑛2 ≤ 2𝑘1 − 1. (Выбрав в качестве внешнего кода расширенный
код Рида–Соломона, можно получить длину 𝑛2 ≤ 2𝑘1 + 1.)
На основе кода Рида–Соломона в качестве внешнего кода получаем каскадный код с относительным расстоянием

𝑑
𝑛2 − 𝑘2 + 1 𝑑1
=
× .
𝑛
𝑛2
𝑛1

(10.2)

Из этой границы можно получить асимптотическую границу
существования кодов с заданным относительным расстоянием. В
качестве внутреннего кода можно выбрать код, удовлетворяющий
асимптотической границе Варшамова–Гилберта (см. главу 3), согласно которой при достаточно большой длине 𝑛1 существует код
со скоростью
(︂ )︂
𝑑1
𝑅1 ≥ 1 − ℎ
, ℎ(𝑥) = −𝑥 log2 𝑥 − (1 − 𝑥) log2 (1 − 𝑥).
𝑛1
Комбинируя его с РС-кодом, из (10.2), получаем асимптотическую нижнюю границу для относительного расстояния 𝛿(𝑅)
(︂
)︂
𝑑
𝑅
𝛿(𝑅) = ≥ 1 −
ℎ−1 (1 − 𝑅1 ),
(10.3)
𝑛
𝑅1

302

10. Длинные коды из коротких кодов

где ℎ−1 (·) обозначает обратную функцию по отношению к двоичной
энтропии ℎ(·). В этой границе скорость внутреннего кода 𝑅1 играет роль параметра, который нужно выбрать так, чтобы максимизировать достижимое расстояние при заданной скорости. Поэтому
окончательная формула для границы нормированного расстояния
имеет вид
(︂
)︂
𝑅
𝛿(𝑅) ≥ max
1−
ℎ−1 (1 − 𝑅1 ).
(10.4)
𝑅1
𝑅1 ∈[𝑅,1]
Ее часто называют границей Зяблова.

Рис. 10.4. Граница Варшамова–Гилберта и асимптотическая граница на относительное расстояние каскадных кодов
На рис. 10.4 приведено сравнение достижимой корректирующей
способности произвольных линейных кодов (граница Варшамова–
Гилберта) и каскадных кодов. Хотя достижимое расстояние каскадных кодов заметно проигрывает границе Варшамова–Гилберта, оно
остается положительным при всех скоростях кодов. При этом код

10.2. Каскадные и обобщенные каскадные коды

303

имеет простую структуру и относительно простое декодирование
(с неэкспоненциально растущей с длиной кода сложностью).
Еще раз подчеркнем, что реальная помехоустойчивость каскадных кодов заметно выше, чем гарантируемая их минимальным расстоянием.
Еще один шаг вперед по пути построения длинных и эффективных корректирующих кодов — обобщенные каскадные коды (ОКК)
[31].
Поясним идею, лежащую в основе ОКК.
Начнем с того, что при использовании внешнего РС-кода над
полем 𝐺𝐹 (2𝑚 ) не обязательно выбирать в качестве внутреннего кода код с 𝑘2 = 𝑚 информационными символами. Можно, например,
выбрать 𝑘2 кратным 𝑚, 𝑘2 = ℎ𝑚, а на второй ступени кодирования
формировать ℎ кодовых слов РС-кода. За счет увеличения длины
внутреннего кода мы выиграем по надежности решений на первом
этапе декодирования, при этом сложность системы в целом увеличится незначительно.
Следующий шаг — более тонкий. Допустим, что наборы по 𝑚
бит внутреннего кода имеют разную степень защиты от ошибок.
Тогда разумно для каждого «слоя» из 𝑚-битовых блоков использовать свой РС-код, выбирая код с бо́льшим расстоянием для менее
защищенных информационных символов.
Заметим теперь, что значения 𝑚 для различных слоев не обязательно должны быть одинаковыми.
При конструировании кода мы предположили, что символы
внутреннего кода не одинаково защищены от ошибок. Как можно
добиться этого? Одно из решений задачи использует конструкцию
циклического (например, БЧХ) кода, порождающий многочлен которого представляет собой произведение нескольких минимальных
многочленов, например,

𝑔(𝑥) = 𝑀1 (𝑥)𝑀3 (𝑥)...𝑀2𝑡−1 (𝑥),
где 𝑡 — число исправляемых кодом ошибок, а 𝑀𝑖 (𝑥) — минимальный многочлен, корнем которого является 𝑡-я степень примитивного элемента. В таком коде, манипулируя числом сомножителей
в порождающем многочлене, получаем набор вложенных кодов с
разными расстояниями. Для них можно получить соответствую-

304

10. Длинные коды из коротких кодов

щие порождающие матрицы, каждая из которых получается дописыванием строк к предыдущей матрице. Эти дописываемые строки предполагаются приведенными к систематической форме таким
образом, что первые кодовые символы совпадают с информационными символами первого кода, следующая группа кодовых символов совпадает с информационными символами второго подкода,
при условии, что первые информационные символы равны нулю
и т.д. (см. пример 10.1) ниже.
Мы приходим к конструкции, показанной на рис. 10.5.
𝑛2
ℎ1
ℎ2
ℎ1
𝑚1

информационных сим-

волов
𝑚1

𝐺𝐹 (2
𝑛1

ℎ2
𝑚2

РС-кода

)

над

Проверочные
символы
кода

РС-

первой

ступени

информацион-

Проверочные сим-

ных символов РС-

волы РС-кода вто-

кода над

𝐺𝐹 (2𝑚2 )

рой ступени

Проверочные символы двоичного кода по
столбцам

Рис. 10.5. Обобщенный каскадный код
Сначала выбирается (𝑛, 𝑘)-двоичный код с минимальным расстоянием 𝑑 и с несколькими (в данном случае двумя) уровнями
вложения. Минимальное расстояние первого подкода (𝑛, 𝑚1 ) обозначим через 𝑑11 , второго подкода (𝑛, 𝑚1 + 𝑚2 ), обозначим через
𝑑12 . В примере на рис. 10.5 ступени всего две, поэтому 𝑚1 + 𝑚2 = 𝑘 ,
𝑑12 = 𝑑.
В конструкции используется несколько кодов Рида–Соломона.
В данном случае мы используем два кода: (𝑛2 , ℎ1 ) над полем
𝐺𝐹 (2𝑚1 ) с расстоянием 𝑑21 = 𝑛2 − ℎ1 + 1 и код (𝑛2 , ℎ2 ) над 𝐺𝐹 (2𝑚1 )
с расстоянием 𝑑22 = 𝑛2 − ℎ2 + 1.

10.2. Каскадные и обобщенные каскадные коды

305

Кодирование происходит следующим образом.
1. Первые ℎ1 блоков по 𝑚1 информационных символов кодируются РС-кодом первой ступени и записываются в первые 𝑚1
строк таблицы.
2. Следующие ℎ2 блоков по 𝑚2 информационных символов кодируются РС-кодом второй ступени и записываются в следующие 𝑚2 строк таблицы.
3. Выполняется кодирование по столбцам, тем самым заполняются остальные строки таблицы.
Подсчитаем минимальное расстояние кода.
Предположим сначала, что в первой группе информационных
символов были ненулевые, а во второй не было. Тогда по меньшей
мере 𝑑21 столбцов будут иметь вес не менее 𝑑11 .
Предположим теперь, что во второй группе были ненулевые информационные символы. Независимо от того, какими были символы первой группы, по меньшей мере 𝑑22 столбцов будут иметь вес
не менее 𝑑12 .
Обобщая эти рассуждения на произвольное число компонентных кодов и подсчитывая число информационных символов, получаем следующий результат.
Теорема 10.1. Число информационных символов и минимальное

расстояние ОКК порядка 𝑠 удовлетворяет следующим соотношениям
𝑠
∑︁
𝑘 =
ℎ𝑖 𝑚𝑖 ;
(10.5)
𝑖=1

𝑑 =

min {𝑑1𝑖 𝑑2𝑖 } .

𝑖∈{1,..,𝑠}

(10.6)

Пример 10.1. В качестве порождающей матрицы двоичного кода

выберем

1
⎜0
⎜0
𝐺=⎜
⎜0

0
0


0
1
0
0
0
0

0
0
1
0
0
0

0
1
1
1
0
0

1
0
1
0
1
0

1
1
0
0
0
1


1
1⎟
1⎟
⎟.
1⎟

1
1

306

10. Длинные коды из коротких кодов

Первые три строки образуют порождающую матрицу (7,3)-кода
с минимальным расстоянием 𝑑11 = 4, а вся матрица — (7,6)-код с
минимальным расстоянием 𝑑12 = 2.
В качестве внутренних кодов выберем РС-коды над полем
𝐺𝐹 (23 ): (7,5) с расстоянием 𝑑21 = 3, и (7, 2) с 𝑑22 = 6. Итоговый
ОКК — (49,21)-код с минимальным расстоянием 12.
Если в качестве внутренних кодов выбрать расширенные РСкоды над полем 𝐺𝐹 (23 ): (9,6) с расстоянием 𝑑21 = 4, и (9, 2) с
𝑑22 = 8, получим (63,24)-код с минимальным расстоянием 16. Оба
кода — коды с наибольшим расстоянием среди известных линейных
кодов соответствующей длины и размерности.
Отметим, что среди лучших известных кодов довольно много
кодов из класса ОКК.
Важная идея, лежащая в основе обобщенных каскадных кодов, — использование вложенных двоичных кодов с различной корректирующей способностью — получила дальнейшее развитие во
многих других приложениях. Наиболее важное из них, пожалуй,
построение кодов над аналоговыми сигналами. Мы рассмотрим эти
вопросы в параграфе 10.4.

10.3.

Турбо-коды

Появление на свет турбо-кодов в 1993 г. [46, 45] было неоднозначно
воспринято специалистами в области теории информации и кодирования. Было непривычно, что авторы, Берру, Главье и Тхитамайшима, в своих работах не формулируют точных результатов, не
доказывают строгих утверждений о свойствах кодов. Они просто
приводят конкретную конструкцию кода, алгоритм декодирования
и кривые зависимости вероятности ошибки от характеристик канала. Скептицизм усиливался тем, что сложность декодера казалась
довольно большой, и практическая ценность результатов на тот момент времени была далеко не очевидной.
Довольно скоро, в 1998 году, авторы турбо-кодов Берру, Главье и Тхитамайшима были удостоены золотой медали в честь 50летнего юбилея теории информации за большой вклад в развитие
технологий. Еще через несколько лет турбо-коды и алгоритм их де-

10.3. Турбо-коды

307

кодирования почти в первозданном виде стали частью стандартов
связи, они используются, например, для передачи данных в стандарте мобильной связи WiMAX [118].
Поясним конструкцию турбо-кода схемой, показанной на
рис. 10.6. Выберем два линейных систематических кода. Информационные символы кодируются первым кодером и они же, но «перемешанные» устройством перемежения Π, кодируются вторым кодером. На выход турбо-кодера поступают три потока данных: набор
информационных символов и два набора проверочных символов,
причем часть проверочных символов может быть «выколота» для
получения нужной скорости кода в целом.
Информационные
символы 𝑢

𝑣1
Первый
кодер

Выкалыватель

Π
Второй
кодер

𝑣2
𝑣3
Кодовые
символы

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

308

10. Длинные коды из коротких кодов

ственным) преимуществом турбо-кода является возможность декодирования с линейной по длине кода сложностью. Благодаря этой
возможности, можно выбрать длину кода практически любой, на
практике от сотен бит до десятков тысяч бит, и достичь рекордных уровней надежности, немыслимых при использовании многих
других классов кодов.
Предположим, что мы имеем простой декодер для каждого из
двух компонентных кодов в отдельности. Потребуем от компонентного декодера, чтобы он не только принимал решения о переданном
кодовом слове, но и вычислял надежности этих решений. Применив такой декодер к символам первого кода, мы, возможно, исправим часть ошибок. За исправлением оставшихся ошибок обратимся
к декодеру второго кода, который воспользуется невостребованными первым декодером проверочными символами второго кода. Возможно, ошибок станет еще меньше, и тогда можно еще раз попытаться исправить их первым кодом, и т.д.
Как мы знаем, декодирование с мягкими решениями эффективнее декодирования с жесткими решениями, поэтому мы выбираем в
качестве декодеров SISO-декодеры, т.е. декодеры с мягким входом
и мягким выходом (см. главу 4). Чтобы сэкономить на сложности
реализации, выберем одинаковые компонентные коды. Однако если комбинации ошибок будут одинаково опасны для обоих кодов, то
схема будет неэффективной. Проблема решается введением перемежителя. Если как следует перемешать информационные биты, то
«плохая» комбинация ошибок (близкая к одному из кодовых слов)
для одного из кодов с большой вероятностью будет безвредной для
другого кода, и наоборот.
Для понимания работы схемы в целом нужно еще иметь в виду,
что скорость компонентных кодов заметно выше скорости кода в
целом. Если скорость кода близка к пропускной способности канала, то компонентные коды работают со скоростью выше пропускной способности. Поэтому вероятность ошибки каждого конкретного кода на первых итерациях будет заведомо большой. Важно,
чтобы при этом в результате декодирования компонентного кода
не происходило увеличения числа ошибок (размножения ошибок).
Если компонентный код будет иметь большое минимальное расстояние 𝑑, то ошибка в пользу неправильного слова приведет к появле-

10.3. Турбо-коды

309

нию примерно 𝑑/2 дополнительных ошибочных символов. Отсюда
приходим к парадоксальному заключению, что компонентный код
должен быть достаточно плохим в смысле минимального расстояния.
Теперь, когда понятны эвристические предпосылки конструкции, осталось выбрать ее компоненты: код (или коды) и перемежитель. Авторы турбо-кодов остановили свой выбор на усеченных
сверточных кодах с маленькой длиной кодового ограничения.
10.3.1.

Выбор компонентных кодов

Сформулируем требования к компонентным кодам турбо-кода:

∙ Код должен иметь линейную по длине сложность SISOдекодирования.
∙ Код должен быть представлен в систематической форме.
Почти безальтернативным выбором в этих ограничениях является выбор усеченных сверточных кодов с небольшой длиной кодового ограничения. Требование возможности SISO-декодирования
выполняется применением алгоритма БКДР. При скорости кода
𝑅 = 1/2 cистематическая форма представления кода может быть
получена выбором кодов с полиномиальными порождающими матрицами вида (1, 𝑔2 (𝐷)) либо с рациональными матрицами вида
(1, 𝑔2 (𝐷)/𝑔1 (𝐷)). Пример кодера кода с генераторами (в восьмеричной форме) (1, 7/5) приведен на рис. 10.7.
Этот код получен приведением к систематической форме генераторов кода (5,7). Следовательно, свободное расстояние и спектр
будут такими же, как и для кода (5,7). Коды с той же длиной кодового ограничения, выбираемые из числа кодов в полиномиальной
форме, имеют заметно более плохие характеристики.
В оригинальной работе по турбо-кодам [46, 45] после перебора
по всем кодам с малой длиной кодового ограничения авторы выбрали код (1, 21/37) с ограничением 4. В стандартах UMTS и LTE
для мобильных сетей поколения G3 рекомендован код (1, 13/15)
с ограничением 3. В стандартах DVB-RCS (Return Channel over
Satellite) и WiMAX (IEEE 802.16) кодовое ограничение тоже 3, но
используется более сложный код, названный duo-binary кодом. Мы

310

10. Длинные коды из коротких кодов

𝑣1
𝑣2
+

𝑢

+

Рис. 10.7. Рекурсивный систематический
сверточный
кодер кода с
(︀
)︀
порождающей матрицей 1, (1 + 𝐷 + 𝐷2 )/(1 + 𝐷)
будем переводить это название как двойной код. В стандартной терминологии теории кодирования этот код — просто сверточный код
со скоростью 𝑅 = 2/4 с порождающей матрицей
(︃
)︃
1+𝐷2 +𝐷3
1+𝐷3
1 0
3
3
1+𝐷+𝐷
1+𝐷+𝐷
𝐺(𝐷) =
.
(10.7)
2 +𝐷 3
1+𝐷2
0 1 1+𝐷+𝐷
3
1+𝐷+𝐷
1+𝐷+𝐷3
Одна из возможных реализаций (далеко не очевидная) показана
на рис. 10.8.
Уменьшение вдвое (с 16 до 8) числа состояний кодера, а значит
и сложности декодирования, — существенный аргумент при выборе
кода для мобильных устройств с учетом ограничений на сложность
и потребление энергии.
10.3.2.

Турбо-декодирование

Схема декодера турбо-кода показана на рис. 10.9.
Входами декодера являются зашумленные информационные
символы и избыточные символы двух систематических кодеров. Более точно, на входе наблюдаются соответствующие логарифмы отношения правдоподобия 𝐿𝑢 , 𝐿𝑐1 и 𝐿𝑐2 . Два МАП-декодера, работающих по алгоритму БКДР (см. параграф 4.6), пересчитывают
оценки вероятностей информационных символов.
Первым обработку данных выполняет первый декодер. Новые
оценки надежностей поступают на сумматор (точнее, вычитатель),

10.3. Турбо-коды

311
𝑣1
𝑣2

𝑢1

+

+

+

𝑢2
+

𝑣3

+

𝑣4

+

H!
Рис. 10.8. Двойной рекурсивный кодер
𝐿𝑐1

+

𝐿𝑢

Декодер
БДКР 1

+


𝐿ext

Π

Π

+
𝐿𝑐2

Декодер
БДКР 2



+

𝐿ext

Π−1

Π−1
Пороговое
устройство

𝑢
^

Рис. 10.9. Декодер турбо-кода
роль которого прояснится позже. Пересчитанные оценки, переставленные перемежителем Π, с тем, чтобы восстановить порядок, в
котором символы обрабатывались вторым кодером, суммируются с
синхронно переставленными входными информационными символами и поступают на вход второго кодера.

312

10. Длинные коды из коротких кодов

Суммирование надежностей на входе второго кодера кажется разумным. По результатам работы первого кодера надежности
некоторых символов выросли, другие, подозрительные на наличие
ошибок, наоборот, уменьшились и некоторые, возможно, даже поменяли знак. Суммируя новые значения со входными, повышаем шансы на то, что второй декодер исправит еще какую-то часть ошибок.
Более формально, результатом работы декодера БКДР для информационного символа 𝑢𝑡 является его логарифм отношения правдоподобия

Pr(𝑢𝑡 = 1, 𝑦)
=
Pr(𝑢𝑡 = 0, 𝑦)
Pr(𝑢𝑡 = 1)
Pr(𝑦|𝑢𝑡 = 1)
+ log
=
= log
Pr(𝑦|𝑢𝑡 = 0)
Pr(𝑢𝑡 = 0)

𝐿𝑡 = log



= 𝐿ext + 𝐿𝑡 ,

(10.8)

где 𝑦 — последовательность на выходе канала, Pr(𝑢𝑡 = 𝑢) — апри′
орная вероятность символа, 𝐿𝑡 — логарифм отношения правдоподобия на входе декодера, а 𝐿ext — приращение логарифма отношения
правдоподобия, полученное в результате декодирования. За этим
приращением закрепилось название «extrinsic information» (внешняя или добавленная информация).
Вернемся к рис. 10.9. В соответствии с (10.8), априорные отно′
шения правдоподобия 𝐿𝑡 на выходе первого декодера в отсутствие
сумматора сложились бы на входе второго декодера с априорными
входными значениями и были бы учтены дважды. Чтобы избежать
этого, на выходе первого декодера вклад априорной информации
вычитается, и только добавленная информация 𝐿ext после перемежителя поступает на вход второго кодера. Аналогично, с выхода
второго кодера только внешняя информация передается на вход
первого кодера, и т.д.
На практике используется до 10 итераций, после которых окончательные мягкие решения поступают на пороговое устройство,
формирующее окончательные двоичные жесткие решения в соответствии со знаками мягких решений.

10.3. Турбо-коды
10.3.3.

313

Практическая реализация

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

Перечислим основные требования, которые предъявляются к перемежителю в схеме турбо-кодера. Эти требования трудно точно
формализовать, поскольку влияние тех или иных параметров на
характеристики системы связи устанавливается, в основном, компьютерным моделированием.

∙ Хорошие перемешивающие свойства. Можно, например, потребовать, чтобы символы, первоначально отстоящие друг от
друга на 𝑆 позиций, после перемешивания отстояли друг от
друга не менее, чем на 𝑆 позиций (так называемый 𝑆 -random
interleaver).
∙ Отсутствие циклов: расстояние между любыми двумя позициями должно изменяться после перестановки. В главе 11, посвященной кодам с малой плотностью проверок на четность
(МППЧ), мы остановимся подробнее на представлении кодов графами. Короткие циклы в графе соответствуют комбинациям ошибок, трудно корректируемым при использовании
итеративных алгоритмов. Причина состоит в том, что работа двух декодеров перестает быть независимой, одна и та же

314

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

∙ Сложность реализации. При аппаратной реализации желательно, чтобы адреса записи и считывания вычислялись по
простым формулам, а не хранились в виде таблиц.
∙ Бесконфликтность (contention-free). Это требование появилось относительно недавно в связи с широким распространением параллельных вычислений. Схема и алгоритм турбодекодирования проигрывают в этом отношении другому классу итеративно-декодируемых кодов — КМПЧ-кодам. Распараллеливание между по меньшей мере двумя процессорами
можно реализовать, организовав одновременную работу двух
БКДР-декодеров, при условии, что они никогда не обращаются к одним и тем же ячейкам памяти одновременно. Перемежители, удовлетворяющие этому условию, получили название
бесконфликтных.
В стандарте UMTS перемежитель выполнен в виде прямоугольной таблицы, которая сначала заполняется построчно, затем выполняются перестановки внутри строк и внутри столбцов. Считывание
выполняется по столбцам.
В более новом стандарте LTE учтено требование бесконфликтности. Пусть 𝑀 — число параллельно работающих процессоров. Достаточное условие бесконфликтности на окне длины 𝑊 для перестановки 𝜓 — следующее [101, 96]
⌊︂
⌋︂ ⌊︂
⌋︂
𝜓(𝑢1 𝑊 + 𝑛𝑢)
𝜓(𝑢2 𝑊 + 𝑛𝑢)
̸=
(10.9)
𝑊
𝑊
для любых 0 ≤ 𝜈 < 𝑊 и 0 ≤ 𝑢1 , 𝑢2 < 𝑀 , 𝑢1 ̸= 𝑢2 . Это условие
должно выполняться как для прямой перестановки 𝜋 , так и для
обратной перестановки 𝜋 −1 перемежителя.
Условию (10.9) удовлетворяет перемежитель на основе квадратичного полинома (Quadratic Permutation Polynomial (QPP), [101,
96])
𝜋(𝑖) = (𝑓1 𝑖 + 𝑓2 𝑖2 )
mod 𝐾,

10.3. Турбо-коды

315

где 𝐾 обозначает длину информационного блока, константы 𝑓1 и
𝑓2 зависят от длины блока, 𝑓1 взаимно просто с 𝐾 , и все простые
делители 𝐾 являются делителями 𝑓2 .
Выбор конкретных значений параметров 𝑓1 и 𝑓2 влияет на
вид обратной перестановки, которая, с учетом ограничений на
сложность реализации, должна описываться полиномом как можно меньшей степени. В стандарте LTE эта задача решена для всех
значений 𝐾 , предусмотренных стандартом.
Усечение кодов

Мы рассматривали обычное усечение и циклическое усечение (см.
главу 8). Оба способа применяются на практике. Укажем на особенности их использования по отношению к составляющим кодам
турбо-кода.
При обычном усечении кодов, заданных полиномиальными (не
дробно-рациональными) генераторами с кодовым ограничением 𝜇,
на вход кодера в конце подаются 𝜇 нулевых информационных символов. В результате в конце работы кодер приходит в нулевое состояние. В случае циклического усечения начальное состояние не
нулевое, оно определяется информационными символами, и в конце пакета вместо нулевых символов подаются те же символы, что
были в кодере в начале работы. Конечное состояние совпадает с
начальным. Обычное усечение, в отличие от циклического, приводит к некоторой потере скорости. Эта потеря несущественна при
кодировании блоков большой длины.
Особенность рекурсивных кодеров состоит в том, что состояние
кодера не определяется однозначно последними поступившими на
вход символами. Благодаря обратной связи каждый информационный символ влияет на все последующие символы. Тем не менее, мы
всегда можем добиться нужного состояния кодера, если каждый из
𝜈 последних бит на его входе будем выбирать с учетом символов,
формируемых в цепи обратной связи.
Еще одна особенность усечения кодов с схеме турбо-кодера состоит в том, что последними символами двух кодеров служат разные символы битовой последовательности. Это означает, что нужно заранее вычислить место расположения последних символов в

316

10. Длинные коды из коротких кодов

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

Рассмотрим проблему точности вычислений при выполнении алгоритма БКДР. Искомые функции правдоподобия формируются как
логарифмы отношения сумм произведений. Перемножаемые числа
— вероятности, представляющие собой экспоненты логарифмов отношений правдоподобия, поэтому, по сути, задача сводится к многократному вычислению функций вида

𝑓 (𝑥, 𝑦) = log(𝑒𝑥 + 𝑒𝑦 ).
В процессорах с плавающей точкой вычисления выполнялись
бы с использованием разложения в степенной ряд Тэйлора. Для
использования в мобильных устройствах и при высоких требованиях к скорости вычислений такой поход не может быть использован.
Чтобы упростить задачу, используют приближенное представление
𝑓 (𝑥, 𝑦) в виде
𝑓 (𝑥, 𝑦) ≈ max{𝑥, 𝑦} + 𝑒−|𝑦−𝑥| .
Эту задачу можно решить с помощью таблицы экспоненциальной функции. Если использование большого числа обращений к
памяти нежелательно, можно использовать кусочно-линейную аппроксимацию экспоненты.
Возможна еще более грубая аппроксимация

𝑓 (𝑥, 𝑦) ≈ max{𝑥, 𝑦} + 𝐶,
где

{︂
𝐶=

0,
|𝑦 − 𝑥| ≥ 1.5;
0.5, |𝑦 − 𝑥| < 1.5.

Наконец, самая простая аппроксимация имеет вид

𝑓 (𝑥, 𝑦) ≈ max{𝑥, 𝑦}.

10.4. Кодированная модуляция

317

Версия декодера БКДР, построенная на такой аппроксимации,
называется Max-Log MAP декодером. Считается, что потери помехоустойчивости при использовании Max-Log MAP декодера вместо
точных вычислений составляют примерно 0.25 дБ.
Подводя итоги параграфа, посвященного турбо-кодам, отметим, что на современном этапе развития теории кодирования и
программно-аппаратных средств реализации устройств кодирования и декодирования турбо-коды успешно решают широкий круг
задач передачи дискретной информации. Хотя изначально они рассматривались как длинные коды, позволяющие приблизиться к пределу Шеннона, их успешно применяют для передачи коротких пакетов сообщений, начиная примерно от 200 бит.
При скорости кодов 𝑅 > 1/2, особенно при большой длине блоков, турбо-коды все больше вытесняются кодами с малой плотностью проверок на четность, которые мы рассмотрим в главе 11.

10.4.

Кодированная модуляция

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

318

10. Длинные коды из коротких кодов

Для достижения высокой спектральной эффективности используется многопозиционная модуляция, т.е. приходится различать
много дискретных значений параметров сигналов. Содержанием
данного раздела курса является краткое обсуждение задачи защиты от ошибок в таких системах связи. Оказывается, что эта «недвоичная» задача имеет простое и эффективное решение с помощью
двоичных кодов.
10.4.1.

Коды и сигналы

Привычными методами модуляции для систем связи ХХ века были амплитудная, частотная и фазовая, их названия указывают на
параметры гармонического сигнала, изменением которых передается информация. В современной технике связи, как в радио-, так и
в проводных каналах, основным ресурсом является диапазон частот. Сегодня конкурентами в борьбе за место в стандартах будущих поколений являются OFDM (orthogonal frequency devision
multiplexing, т.е. мултиплексирование на основе ортогонального частотного разделения) и FBMC (filter bank multicarier, т.е. многочастотное разделение с помощью банков фильтров). Вместе эти два
способа организации передачи данных объединяются под названием
«multicarrier data transmission» (многочастотные системы передачи
данных), основой которых является разбиение доступной полосы
частот на большое число (например, 210 ) частотных подканалов и
использование спектрально-эффективного кодирования в каждом
подканале.
Число подканалов выбирается равным степени двойки, поскольку модуляции и демодуляция выполняются с помощью быстрого
дискретного преобразования Фурье. Высокая эффективность системы в целом достигается за счет того, что скорость передачи
в каждом подканале выбирается с учетом спектральной плотности мощности шума в соответствующем диапазоне частот. Тем самым задача построения эффективной системы связи сводится к
спектрально-эффективному кодированию для каждой отдельной
несущей частоты.
При фиксированной несущей частоте сигнала модуляции подлежат его фаза и амплитуда. Иными словами, сигнал как функция

10.4. Кодированная модуляция

319

времени записывается в форме

𝑠(𝑡) =

∞ (︁
∑︁


2𝑎𝑖 cos 𝜔0 𝑡 +



)︁
2𝑏𝑖 sin 𝜔0 𝑡 𝑔(𝑡 − 𝑖𝑇 ).

(10.10)

𝑖=−∞

В этой формуле индекс 𝑖 — номер интервала времени, 𝑇 — длительность одного сигнального интервала (1/𝑇 — скорость передачи,
измеренная как число сигналов, переданных за единицу времени),
𝜔0 — несущая частота, 𝑔(𝑡) — огибающая элементарного сигнала,
(𝑎𝑖 , 𝑏𝑖 ) — числа из дискретного множества, представляющегособой
сигнальный алфавит.
Вид огибающей 𝑔(𝑡) не играет роли в дальнейшем рассмотрении.
Сам сигнал может иметь длительность, бо́льшую, чем интервал 𝑇 ,
теоретически может быть даже бесконечным, но сдвиги сигналов
во времени на величину 𝑇 должны быть ортогональны друг другу
и образовывать ортонормированный базис пространства сигналов.
Важно также, чтобы спектр сигнала 𝑔(𝑡) не был шире отведенной
для данного частотного подканала полосы частот 𝑊 (точнее говоря, сигнал должен быть ортогонален сигналам, передаваемым на
других несущих частотах).
Сигналы вида (10.10), определяемые набором {(𝑎𝑖 , 𝑏𝑖 )}, называют в общем случае сигнальным множеством, а при определенных
ограничениях, которые мы укажем позже, — сигналами квадратурной амплитудной модуляции (КАМ, QAM). Числа (𝑎𝑖 , 𝑏𝑖 ) называют синфазной и квадратурной составляющей, либо значениями вещественной и мнимой части сигнала (это соответствует экспоненциальной форме записи гармонического сигнала в соответствии с
формулами Эйлера).
Уточним, что формула (10.10) описывает сигнал в частотном
подканале OFDM, но не в подканале FBMC. При использовании
FBMC используется только косинусная составляющая, при этом
спектральная эффективность эквивалентная OFDM (даже несколько выше) достигается за счет того, что формируется дополнительная косинусная составляющая, сдвинутая на полпериода по отношению к первой. Такую модуляцию называют КАМ со смещением (offset QAM). С точки зрения кодирования нет необходимости
различать КАМ и КАМ со смещением. Достаточно считать, что

320

10. Длинные коды из коротких кодов

кодовыми символами являются точки двумерного евклидова пространства (в дальнейшем будут рассматриваться пространства более высокой размерности).
Примеры сигнальных множеств приведены на рис. 10.10. Множество на рис. 10.10, а, представляет собой набор сигналов четверичной амплитудной модуляции (4-АМ). В этом случае используется только одна из двух ортогональных составляющих сигнала. Далее, на рис. 10.10, б, следует другое множество, состоящее из четырех так называемых биортогональных сигналов. Этот конкретный
набор можно интерпретировать как 4-КАМ или как набор из четырех сигналов фазовой модуляции (4-ФМ). На остальных рисунках
показаны ФМ и КАМ сигналы с более высокой кратностью модуляции. Черные точки соответствуют сигналам. Белые точки приведены для пояснения способа построения сигнальных множеств
требуемого размера.
В канале с АБГШ вероятность ошибки для двух сигналов, отстоящих друг от друга на евклидовом расстоянии 𝑑E , вычисляется
по формуле, аналогичной (1.7)
(︃
√︂ )︃
(︂
)︂
𝑑E
𝑑E
𝐸

𝑃𝑒2 = 𝑄 √
=𝑄
,
(10.11)
𝑁
2𝑁0
2 𝐸
0
где 𝑁0 — спектральная плотность мощности шума, 𝐸 . Отсюда видно, что при фиксированном отношении сигнал/шум 𝐸/𝑁0 предпочтительны сигнальные множества, для которых велико отношение
квадрата минимального попарного расстояния между сигналами к
средней энергии сигналов 𝑑2E /𝐸 .
Упражнение 10.4. Считая все сигналы равновероятными, под-

считайте отношение квадрата минимального попарного расстояния
между сигналами к средней энергии сигналов для сигнальных множеств а) и б) на рис. 10.10. Какое из двух множеств предпочтительнее?
При заданной полосе 𝑊 максимальная скорость передачи в
сигналах в единицу времени определяется так называемой скоростью Найквиста и соответствует длине сигнального интервала
𝑇 = 1/(2𝑊 ) (см. главу 1). Обозначим через 𝑀 мощность множества

10.4. Кодированная модуляция

321

а)

4-АМ

б)

4-КАМ

в)

8-ФМ

г)

8-КАМ

д)

16-КАМ

е)

32-КАМ

Рис. 10.10. Примеры сигнальных множеств

322

10. Длинные коды из коротких кодов

разрешенных пар {(𝑎𝑖 , 𝑏𝑖 )}, т.е. кратность КAM. Это означает, что
в полосе шириной 𝑊 Гц скорость передачи не превысит

log2 𝑀/𝑇 = 2𝑊 log2 𝑀 бит/с,
что определяет максимальную возможную спектральную эффективность (1.9)
𝛽 = 2 log2 𝑀 бит/с/Гц.
Конечно, при наличии шума необходимо использование избыточных кодов, при этом спектральная эффективность уменьшается.
Поучительные графики достижимой спектральной эффективности в зависимости от отношения сигнал/шум на бит приведены
на рис. 10.11. Пропускная способность канала (предел Шеннона)
достигается при бесконечном алфавите и гауссовском распределении вероятностей на входных значениях. Практические системы кодирования строятся на основе линейных кодов, поэтому сигнальные точки выбираются кодером практически с одинаковой вероятностью. Принимая во внимание это ограничение, пересчитана предельно достижимая спектральная эффективность для 4, 16 и 64 сигнальных точек. Это соответствует применению двоичных кодов в
сочетании с 4-КАМ, 16-КАМ, 64-КАМ соответственно.
Из приведенных графиков заключаем, что при использовании
двоичных кодов уточненная минимальная энергия на бит при скорости 𝑅 = 1/2 (𝛽 = 1) равна 0.19 дБ (без учета ограничения на
входной алфавит она оценивалась как 0 дБ , см. главу 1). Для достижения спектральной эффективности 𝛽 = 1.5 нужен двоичный
код со скоростью 𝑅 = 3/4. Тогда согласно графику потребуется
не менее 1.62 дБ. Альтернативным решением является использование 16-КАМ, что позволит передавать информацию при 1.04 дБ.
Предел Шеннона составляет 0.86 дБ, следовательно теоретические
потери от использования неоптимальных сигналов 16-КАМ не превышают 0.2 дБ. Попытка обойтись двоичными кодами обходится
намного дороже, примерно в 1.62 − 0.86 = 0.76 (дБ) на каждый
переданный по каналу бит.

10.4. Кодированная модуляция

323

Рис. 10.11. Спектральная эффективность как функция отношения
сигнал/шум на бит при различных значениях кратности модуляции

Из этих примеров понятно, что для достижения предельной
спектральной эффективности нужны хорошие коды над сигнальными алфавитами больших размеров.
Прежде чем перейти к построению кодов, рассмотрим модель
демодулятора сигналов, описываемых формулой (10.10). На выходе
канала с АБГШ наблюдается зашумленная версия сигнала

𝑟(𝑡) = 𝑠(𝑡) + 𝑛(𝑡),

(10.12)

где 𝑛(𝑡) — шум со спектральной плотностью мощности 𝑁0 /2 . Одна
из возможных реализаций приемника для сигнала одной несущей
показана на рис. 10.12.

324

10. Длинные коды из коротких кодов



2 cos 𝑤0 𝑡

×

НЧ фильтр

𝑔(𝑡)

𝑎
^𝑖

×

НЧ фильтр

𝑔(𝑡)

^𝑏𝑖

𝑟(𝑡)


2 sin 𝑤0 𝑡
Рис. 10.12. Демодулятор сигналов КАМ
Сначала, с помощью умножения на синфазную и квадратурную гармоники с последующей фильтрацией, происходит выделение оценок низкочастотных составляющих

𝑟c (𝑡) =
𝑟s (𝑡) =


∑︁
𝑖=−∞

∑︁

𝑎𝑖 𝑔(𝑡 − 𝑖𝑇 ) + 𝑛c (𝑡);

(10.13)

𝑏𝑖 𝑔(𝑡 − 𝑖𝑇 ) + 𝑛s (𝑡).

(10.14)

𝑖=−∞

Поскольку {𝑔(𝑡 − 𝑖𝑇 )} образует ортонормированный базис, коэффициенты разложения {𝑎𝑖 } и {𝑏𝑖 } можно оценить, вычисляя проекции на сдвиги импульса вида 𝑔(𝑡). Эта операция выполняется с
помощью показанных на схеме согласованных фильтров. Выходом
фильтров служат оценки

𝑟c𝑖 = 𝑎𝑖 + 𝑛c𝑖 ;

(10.15)

𝑟s𝑖 = 𝑏𝑖 + 𝑛s𝑖 .

(10.16)

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

10.4. Кодированная модуляция

325

В силу линейности и ортонормированности выполняемых приемником преобразований АБГШ непрерывного времени в формуле
(10.12) преобразуется в пары дискретных отсчетов (𝑛c𝑖 , 𝑛s𝑖 ), с гауссовским распределением, нулевым математическим ожиданием и
дисперсией 𝑁0 /2. Пара (𝑟c𝑖 , 𝑟s𝑖 ) интерпретируется как точка в сигнальной плоскости, а оценки координат сигнальной точки (^
𝑎𝑖 , ^𝑏𝑖 )
вычисляются как координаты ближайшей сигнальной точки в евклидовом пространстве.
Как и в случае каналов с дискретными алфавитами, прием каждого сигнала в отдельности неэффективен. Мы должны построить
достаточно длинные коды, словами которых будут последовательности пар сигналов. В кодах должна быть предусмотрена некоторая избыточность для возможности исправления ошибок, а декодер
должен совместно обрабатывать всю принятую последовательность
для вынесения решения о кодовом слове.
Зададим любое отображение информационных последовательностей на множество КАМ сигналов. Конкретное правило отображения, даже безызбыточное, определяет код, обладающий естественной неравномерной защищенностью информационных символов. Рассмотрим, например сигналы 16-КАМ, показанные на рис.
10.13. Все множество точек (белых и черных) содержит 16 точек,
отстоящих друг от друга на расстоянии не меньше 𝑑0 , этим точкам можно сопоставить информационные последовательности из
четырех бит. Разбиение этого множества на два подмножества по
8 точек (белых и черных) порождает подмножества с минимальным расстоянием 𝑑1 . На рис. 10.13, б, показано множество черных
точек, разбитое, в свою очередь, на два подмножества с минимальным расстоянием 𝑑2 . Дальнейшее разбиение дает пары точек на
расстоянии 𝑑3 .
Если выбор подмножества при каждом разбиении описывать
двоичным символом (например, 0 — черное, 1 — белое подмножество), то получим нумерацию точек, в которой инверсия одного из
битов в номере соответствует переходу в подмножество, отстоящее
на расстоянии 𝑑𝑖 , где 𝑖 — номер бита. Пример нумерации, обладающей такими свойствами, показан на рис. 10.13, г.

326

10. Длинные коды из коротких кодов
Расстояния 𝑑𝑖 связаны соотношениями
(10.17)

𝑑21 = 2𝑑20 ; 𝑑22 = 4𝑑20 ; 𝑑23 = 8𝑑20 ;

𝑑1

𝑑0

а)

16-КАМ = (8-КАМ) + (8-КАМ)

б)

8-КАМ = (4-КАМ) + (4-КАМ)

0000

0001

0100

0101

0010

0011

0110

0111

1100

1101

1000

1001

1110

1111

1010

1011

𝑑3

𝑑2

в)

4-КАМ = (2-КАМ) + (2-КАМ)

г)

16-КАМ

Рис. 10.13. Разбиение сигнального множества на подмножества
Нетрудно видеть, что эта конструкция — идеальный пример вложенных кодов, которые были востребованы для построения обобщенных каскадных кодов в параграфе 10.2. Идея совмещения разбиения сигнальных множеств на подмножества с последующим применением каскадных и обобщенных каскадных кодов принадлежит
В.В. Гинзбургу [33]. Более подробное описание конструкций кодов
приведено в [36].

10.4. Кодированная модуляция

327

Блоковые коды над сигнальными множествами весьма эффективны, но, также как и блоковые коды над конечными алфавитами,
проигрывают сверточным аналогам при заданных ограничениях на
сложность декодирования в каналах с мягкими решениями. Во многих современных стандартах применяют сверточные коды над сигнальными алфавитами, полученные как развитие конструкции Унгербоека [108] (1982), рассматриваемой в следующем параграфе.
Если говорить о приоритетах в разработке принципов кодовой
модуляции, то правильно считать, что два класса кодов, блоковые
коды Гинзбурга и сверточные коды Унгербоека появились на свет
одновременно и независимо друг от друга. Первый черновик работы Унгербоека был представлен в редакцию в 1977 году, но был
отправлен автору на доработку, которая длилась более 5 лет. Коды
Гинзбурга докладывались на конференциях задолго до его журнальной публикации 1984 года.
10.4.2.

Сигнально-кодовые конструкции

В этом параграфе мы опишем простую конструкцию сверточных
кодов над сигнальными множествами. Наше описание не повторяет
в точности описание Унгербоека [108], но для большинства конкретных примеров коды получаются эквивалентными.
Общий вид схемы, включающей как частный случай кодер Унгербоека, показан на рис. 10.14. Предполагается, что сигнальное
множество КАМ содержит 𝑀 = 2𝑚+1 точек. В каждый элемент
времени 𝑖 на вход системы поступает блок 𝑢𝑖 из 𝑚 двоичных информационных символов. Сверточный код со скоростью 𝑅c = 𝑚/(𝑚+1)
и с некоторым кодовым ограничением 𝜈 преобразует последовательность блоков 𝑢1 , 𝑢2 ,... длины 𝑚 в избыточную последовательность
𝑣 1 , 𝑣 2 ,... блоков длины 𝑚 + 1. Далее следует устройство, отображающее каждый блок 𝑣 𝑖 в соответствующий КАМ-сигнал (𝑎𝑖 , 𝑏𝑖 ).
Точное описание модуляционного кода требует указания, вопервых, сверточного кода, во вторых — правила отображения.
Прежде чем мы конкретизируем выбор кода, поясним, какой и за
счет чего можно получить выигрыш.
Заметим, что скорость передачи составляет 𝑚 бит/сигнал. Такую же скорость передачи можно получить без кодирования, отоб-

10. Длинные коды из коротких кодов

𝑢1𝑖
𝑢2𝑖

...

𝑢𝑚𝑖

Сверточный
кодер

𝑣1𝑖
𝑣2𝑖

Выбор

...

328

𝑣𝑚𝑖

сигнальной
точки

𝑎𝑖
𝑏𝑖

𝑣𝑚+1,𝑖
Рис. 10.14. Кодер системы с кодированной модуляцией на основе
сверточного кода
ражая блоки 𝑢 длины 𝑚 прямо на точки множества из 𝑀 ′ = 2𝑚 .
При одинаковой средней энергии такое множество будет иметь
бо́льшее минимальное расстояние, чем множество из 𝑀 = 2𝑚+1 ,
применяемое при наличии кодирования. В каждый конкретный момент времени может быть использована любая из 𝑀 > 𝑀 ′ точек,
поэтому вероятность неправильного приема одного сигнала в системе с кодированием больше, чем в системе без кодирования. Однако, благодаря кодированию, далеко не любая последовательность
сигналов является «кодовой». Вероятность ошибки — вероятность
принятия решения в пользу неправильного кодового слова. Эта вероятность при правильном выборе кода будет намного меньше, чем
вероятность ошибки в системе без кодирования.
Воспользуемся теперь тем фактом, что не все биты в двоичной
записи номера сигнальной точки одинаково критичны к шуму в
канале. Рисунок 10.13 и формула (10.17) показывают, что разница
в защищенности битов очень велика: квадрат следующего расстояния вдвое больше предыдущего. Напомним, что энергетический
выигрыш кодирования при больших отношениях сигнал/шум определяется кодовым расстоянием (см. (8.27)). Если сравниваются два
кода с расстояниями (или свободными расстояниями) 𝑑𝑎 и 𝑑𝑏 , то,
поскольку энергия пропорциональна квадрату евклидовой метрики, энергетический выигрыш одного кода по отношению к другому
оценивается как
𝑑2
𝜂 = 10 lg 𝑎2 дБ.
(10.18)
𝑑𝑏
Это означает, что каждый следующий бит защищен от шума на

10.4. Кодированная модуляция

329

10 lg 2 = 3.01 дБ сильнее предыдущего. Отсюда следует, что нет
необходимости защищать избыточными кодами те биты, которые
обладают достаточной надежностью без кодирования.
Пример схемы, учитывающей эту возможность, приведен на
рис. 10.15. В данном частном случае предполагается, что защищены избыточностью два младших бита. Обратимся к примеру КАМ
на рис. 10.13, г. Нетрудно убедиться простым перебором по всем
сигналам, что любые два сигнала с номерами, отличающимися в
младшем бите, отстоят друг от друга на расстояние не меньше 𝑑0 ,
а различие в двух
√ младших разрядах соответствует расстоянию не
меньше 𝑑1 = 2𝑑0 . При фиксированных двух защищенных младших битах расстояние между сигналами, отличающимся в одном из
двух старших битах, не меньше 𝑑2 = 2𝑑0 .

𝑣1𝑖 = 𝑣1𝑖
𝑢2𝑖 = 𝑣2𝑖
Выбор

...

𝑢𝑚−1,𝑖 = 𝑣𝑚−1,𝑖

сигнальной

𝑢𝑚𝑖

Сверточный
кодер

𝑣𝑚𝑖

точки

𝑎𝑖
𝑏𝑖

𝑣𝑚+1,𝑖

Рис. 10.15. Кодер системы с кодированной модуляцией с разделением битов на кодируемые и некодируемые
Предположим, что требуемая скорость передачи составляет
3 бита на один сигнал КАМ. При такой скорости можно воспользоваться 8-КАМ, получим минимальное расстояние между сигнальными точками равное 𝑑1 . Если добиться с помощью кода, чтобы
ошибок в младших разрядах не было, то схема с кодированием обеспечит расстояние 𝑑2 . Следовательно, предельный энергетический
выигрыш для этого примера

𝜂 = 10 log10

𝑑22
= 3.01 дБ.
𝑑21

Предположим теперь, что для кодирования выбран сверточный

330

10. Длинные коды из коротких кодов

код со скоростью 𝑅c = 1/2 с кодовым ограничением 1 с генераторами (1, 1 + 𝐷) (в двоично-восьмеричной форме (1,3)). Свободное
расстояние кода в метрике Хэмминга равно 3 и соответствует слову
минимального веса (10 11). Нетрудно догадаться, что две ближайшие друг к другу сигнальные последовательности отличаются по
меньшей мере в двух КАМ-сигналах, причем в одном сигнале не
меньше чем на 𝑑0 (подблок 10) и другом сигнале на 𝑑1 (подблок
11). Итак, евклидово расстояние всего кода не меньше
√︁

𝑑𝑓 = min{ 𝑑20 + 𝑑21 , 𝑑2 } = 3𝑑0 .
Энергетический выигрыш по отношению к 8-КАМ равен

𝜂 = 10 log10

3𝑑0
= 1.76 дБ.
2𝑑0

Подсчитаем выигрыш, который можно получить при использовании кода с кодовым ограничением 2. В коде (5,7) слову минимального веса 5 соответствует последовательность (11 01 11), которой
соответствует евклидово расстояние
√︁
𝑑𝑓 = min{ 𝑑21 + 𝑑20 + 𝑑21 , 𝑑2 } = 2𝑑0 .
Энергетический выигрыш равен 3.01 дБ, следовательно, использование более мощного сверточного кода в данной конструкции
нецелесообразно.
Если потребуется бо́льший выигрыш при той же скорости, можно применить код со скоростью 𝑅c = 2/3, защищающий 3 бита из
четырех. Изучив на рис. 10.13, г, все пары сигналов, отличающиеся
только в первом бите, убеждаемся, что ошибка в незащищенном бите соответствует расстоянию 𝑑3 , следовательно потенциальный выигрыш в сравнении с некодированной 8-КАМ равен 6 дБ. Согласно
подсчетам Унгербоека [108], кодовое ограничение сверточного кода
должно быть не меньше 7. Нужно отметить, что ни один из примеров классической работы [108] не был заметно улучшен, несмотря
на то, что прогресс в области вычислительной техники дает намного больше возможностей для поиска хороших кодов.
Рассмотрим кратко декодирование сверточных модуляционных
кодов.

10.4. Кодированная модуляция

331

Как и для сверточных кодов над конечными полями, подходящим алгоритмом декодирования является алгоритм Витерби. Чтобы применить его, нужно построить описание кода с помощью решетки и сформулировать правило вычисления метрик путей в решетке кода.
«Классическое» решетчатое описание кода, приведенное в [108],
задается решеткой с параллельными ребрами. Узлы решетки соответствуют состояниям сверточного кодера, переходы между узлами
решетки определяются кодированными битами, параллельные ребра соответствуют всевозможным значениям некодированных битов,
для которых возможен данный переход из состояния в состояние.
Для уменьшения сложности практической реализации можно упростить описание кода.
Рассмотрим пример, иллюстрирующий вычисление метрик для
одного такта работы декодера Витерби, т.е. для вычисления метрик ребер на одном ярусе решетки. На рис. 10.16 через 𝑟 обозначена точка, соответствующая принятому на данном такте сигналу
КАМ, через 𝑑𝑖𝑗 , 𝑖, 𝑗 = 1, 2, — евклидовы расстояния до ближайших точек решетки. Мы знаем, что декодирование в евклидовой
метрике в канале с АБГШ эквивалентно декодированию по максимуму правдоподобия. Отсюда видно, что для декодирования младших битов номера сигнальной точки можно временно игнорировать
старшие биты и тогда декодирование по максимуму правдоподобия
можно выполнять практически точно так же, как в обычном канале с АБГШ. После того, как для данного ребра будет принято
решение относительно младших битов, декодер сформирует решение о старших битах. В данном случае скорее всего (но совсем не
обязательно!) победителем станет точка 𝑠11 , и тогда результатом
декодирования будет индекс 0011.
Отметим, что для декодирования нужны не расстояния, а их
квадраты, причем эти квадраты расстояний вычисляются как суммы квадратов расстояний по каждой координате. Детальный анализ показывает, что вычисление метрик ребер не требует операций
умножения.
Упражнение 10.5. Сформулируйте правило вычисления метрик

декодера Витерби для кода над сигнальным алфавитом 16-КАМ.

332

10. Длинные коды из коротких кодов

𝑠01
0000

𝑠00

0001 𝑑
01

𝑟
𝑠11 𝑑11
0010

0011

𝑑00 0100
𝑑10

0101

𝑠10
0110

0111

1100

1101

1000

1001

1110

1111

1010

1011

Рис. 10.16. Вычисление метрик при декодировании сверточных модуляционных кодов
Схема на рис. 10.15 предполагает использование одного избыточного бита на каждый двумерный сигнал КАМ. Для некоторых
приложений такое снижение спектральной эффективности является слишком большим. Чтобы уменьшить его, можно рассматривать
не одну, а несколько пар сигналов совместно. Соответственно, вместо одного дополнительного бита на двумерный сигнал, применяя
код со скоростью 𝑅c = 3/4, затратим один дополнительный бит на
два двумерных сигнала, иначе говоря, на четырехмерный сигнал.
Коды для такой многомерной модуляции построены Веем [114]. Эти
коды стали основой стандартов проводной связи V.34, ADSL. Кроме
энергетического выигрыша, многомерные коды Вея обеспечивают
так называемую инвариантность к повороту (rotational invariance),
что делает их устойчивыми по отношению к сбоям синхронизации
фазы.
Еще одно, почти очевидное, обобщение конструкции Унгербоека состоит в том, что биты индексов сигнальных точек могут быть

10.4. Кодированная модуляция

333

распределены в несколько битовых потоков и к ним можно применить корректирующие коды, избыточность которых согласована с
надежностью передачи битов [82]. Потенциально такая конструкция эффективнее кодов Унгербоека или Вея, но, из-за более высокой сложности, она не нашла до настоящего времени практического
применения.
10.4.3.

Кодированная модуляция с перемешиванием
битов

Мы рассмотрели несколько классов весьма эффективных кодов над
сигнальными алфавитами. Эти коды допускают относительно простое декодирование по максимуму правдоподобия с помощью алгоритма Витерби. Можно ли на этом пути приблизиться к пределам
Шеннона на скорость передачи при заданной вероятности ошибки?
Ответ, к сожалению, отрицательный. На практике декодер Витерби
может быть реализован только для относительно небольших длин
кодовых ограничений (обычно 4–5, в любом случае, не больше 10).
При этом системы на основе сверточных модуляционных кодов или
каскадные коды на их основе при требуемой вероятности ошибки
порядка 10−5 затрачивают на передачу каждого бита не меньше
2–2.5 дБ сверх предела Шеннона.
Почти сразу после «турбо-революции» середины 1990-х годов
возникла идея применить турбо-коды, а позднее и коды с малой плотностью проверок на четность, для построения модуляционных кодов. Наиболее плодотворной оказалась идея совмещения итеративно-декодируемых кодов с так называемой кодированной модуляцией с перемешиванием битов (КМПБ) (bit-interleaved
coded modulation, BICM) [58].
Блок-схема системы с КМПБ показана на рис. 10.17. Блок информационных символов 𝑢 поступает на вход кодера (например,
кодера турбо-кода), где преобразуется в кодовое слово 𝑣 . Далее следует перемежитель, выполняющий псевдослучайную перестановку
𝜋 . В КАМ-модуляторе с числом сигналов 𝑀 = 2𝑚 кодовые символы
разбиваются на подблоки длины 𝑀 = 2𝑚 и отображаются на точки
сигнального множества. Способ отображения важен для обеспечения эффективности системы в целом, ниже мы опишем его подроб-

334

10. Длинные коды из коротких кодов

𝑢

Кодер

𝑣

Π 𝜋(𝑣)

КАМмодулятор

𝑠

𝑛

^
𝑢

Декодер

Π−1 𝜋(𝜆)
𝜆

Канал

Демодулятор

𝑟 =𝑠+𝑛

Рис. 10.17. Структурная схема системы на основе кодированной модуляции с перемешиванием битов
нее. На приемной стороне зашумленная последовательность сигналов поступает в демодулятор, формирующий мягкие решения по
каждому биту индекса сигнала КАМ. Последовательность оценок
значений отношений логарифмов правдоподобия символов кодовых
слов обозначена на схеме через 𝜆. Выходом демодулятора является
переставленная последовательность 𝜋(𝜆). После обратной перестановки последовательность 𝜆 поступает на вход декодера, который
^ переданной информационной последовательвычисляет оценку 𝑢
ности 𝑢.
Заметим, что, хотя в системе используется двоичный линейный
код, после отображения кодовых блоков на точки сигнального множества код становится нелинейным. Отсюда следует, что вероятность ошибки может зависеть от передаваемой последовательности
и может быть большой для некоторых информационных последовательностей. Смысл перестановки (перемешивания) двоичных символов кодовых слов состоит в том, чтобы устранить такую зависимость.
Эффективность КМПБ определяется отображением кодовых
подблоков на сигнальные точки и правилом вычисления оценок надежностей двоичных кодовых символов. Рассмотрим сначала отображение или, что то же самое, правило назначения индексов сигнальным точкам. Идея состоит в применении кода Грэя.
Код Грэя — безызбыточный код длины 𝑚 объема 𝑀 = 2𝑚 , со-

10.4. Кодированная модуляция

335

стоящий из всевозможных последовательностей длины 𝑚, упорядоченных таким образом, что каждое слово отличается от соседей не
более, чем в одной позиции. Общее правило построения кода Грэя
произвольной длины можно найти в учебниках по комбинаторике и
алгоритмам, например, в [1]. Коды небольших длин легко построить «вручную».
Смысл использования кода Грея в системе КМПБ состоит в том,
что типичная ошибка при передаче сигнала КАМ переводит сигнал
в соседнюю точку. При последующем использовании двоичного кода желательно, чтобы такая ошибка искажала как можно меньше
кодовых символов. Пример такой индексации для 16-КАМ показан
на рис. 10.18.
11𝑦1 𝑦2

10𝑦1 𝑦2

00𝑦1 𝑦2

01𝑦1 𝑦2

1110

1010

0010

0110

1111

1011

0011

0111

1101

1001

0001

0101

1100

1000

0000

0100

Пример:

𝑥1 𝑥2 10

𝑥1 𝑥2 11

𝑥1 𝑥2 01

𝑥1 𝑥2 00

(𝑥1 , 𝑥2 , 𝑦1 , 𝑦2 ) = (1, 0, 0, 1)

Рис. 10.18. Отображение кодовых символов на сигналы 16-КАМ с
использованием кода Грея

336

10. Длинные коды из коротких кодов

Для построения отображения использованы два кода Грэя длины 2. Индекс из четырех битов составляется из двух частей. Первая — код Грэя координаты точки по оси 𝑋 , вторая часть — код
Грэя координаты по оси 𝑌 . Прямой проверкой убеждаемся, что
переход в соседнюю точку соответствует изменению одного бита
в индексе. Это свойство не выполнялось для отображения, выбранного для модуляционного кодирования сверточными кодами на
рис. 10.16. В том отображении соседствовали точки с индексами,
отличающимися в трех битах.
Рассмотрим теперь вычисление надежностей кодовых символов.
Обозначим через 𝑝(𝑟|𝑠) двумерное условное распределение на точках плоскости при передаче сигнальной точки 𝑠. Поскольку положение сигнальной точки 𝑀 -КАМ, 𝑀 = 2𝑚 , определяется индексом
или подблоком 𝑐 = (𝑐1 , 𝑐2 , ..., 𝑐𝑚 ), то вместо 𝑝(𝑟|𝑠) можно рассматривать вероятности 𝑝(𝑟|𝑐). Надежность элемента 𝑐𝑖 задается логарифмом отношения правдоподобия

𝜆𝑖 = log

𝑝(𝑟|𝑐𝑖 = 1)
𝑝(𝑟, 𝑐𝑖 = 1)
= log
.
𝑝(𝑟|𝑐𝑖 = 0)
𝑝(𝑟, 𝑐𝑖 = 0)

(10.19)

Последнее равенство верно, поскольку при использовании линейных кодов мы считаем значения кодовых символов 0 и 1 равновероятными. Совместные вероятности в этой формуле вычисляются
как суммы вида
∑︁
𝑝(𝑟, 𝑐𝑖 = 𝑎) =
𝑝(𝑟, 𝑐).
(10.20)
𝑐: 𝑐𝑖 =𝑎

В правой части (10.20) имеем 𝑀/2 = 2𝑚−1 слагаемых, каждое из
которых — экспоненциальная функция квадрата евклидова расстояния между принятым сигналом-вектором 𝑟 и сигнальной точкой,
определяемой комбинацией 𝑐. Реализация такого правила вычисления надежностей требует выполнения арифметических операций с
плавающей точкой и вычисления экспонент и логарифмов.
Можно упростить вычисления, используя те же способы, что
и при декодировании турбо-кодов. В частности, можно оставить в
сумме (10.20) одно наибольшее слагаемое. При последующей подстановке вероятности в (10.19) отпадет необходимость в вычислении
логарифмов и экспонент. Разумеется, такое упрощение приведет к

Задачи

337

некоторой погрешности в вычислениях и может сказаться на предельной эффективности кодирования.
В целом, предельная спектральная эффективность КМПБ ниже
спектральной эффективности кодированной модуляции на основе
сверточных кодов. Типичная разница составляет порядка 0.2 дБ,
что является адекватной платой за возможность применения длинных кодов с итеративным декодированием. В итоге КМПБ является
почти безальтернативным кандидатом на использование в телекоммуникационных стандартах будущих поколений для тех систем связи, где требуется предельно высокая эффективность использования
спектра сигнала.

Задачи
1. Можно ли улучшить минимальное расстояние итеративного
кода, если для кодирования по строкам и столбцам использовать вместо одного фиксированного кода несколько разных
кодов с одинаковой скоростью?
2. В продолжение предыдущей задачи: можно ли получить выигрыш по расстоянию, если при кодировании использовать наборы эквивалентных кодов? Можно ли добиться положительного эффекта, изменяя способ перемежения символов после
кодирования первым кодом?
3. Как повлияют модификации кода, указанные в первых двух
задачах на эффективность простого декодирования итеративного кода по строкам и по столбцам?
4. Приведите примеры кодов, полученных итерацией циклических кодов длины 7. Сравните их с лучшими известными кодами.
5. Приведите примеры каскадных кодов, получаемых с помощью
РС-кодов длин 7,..., 15. Сравните их с лучшими известными
кодами.

338

10. Длинные коды из коротких кодов

6. Приведите примеры кодов, полученных итерацией циклических кодов длины 7. Сравните их с лучшими известными кодами.
7. Приведите примеры обобщенных каскадных кодов на основе
циклических кодов длины 15. Сравните их с лучшими известными кодами.

11.

Коды с малой
плотностью проверок
на четность

Коды с малой плотностью проверок на четность (МППЧ-коды) были введены Галлагером в 1962 году [76, 5], примерно полвека назад.
Не только сами коды, но и метод декодирования, описанный в диссертации и статье Галлагера, являются прототипом кодов и методов
декодирования, ставших объектом огромного интереса теоретиков
и практиков кодирования в последнее десятилетие.
Интерес к МППЧ-кодам возобновился на рубеже веков благодаря работе Мак-Кея [92], в которой было показано, что их характеристики близки к характеристикам турбо-кодов, при том, что декодирование проще и хорошо поддается распараллеливанию.
В данной главе мы рассмотрим алгоритм декодирования
МППЧ-кодов, обсудим некоторые классы кодов и приведем их характеристики.

11.1.

Проверочная матрица МППЧ-кода

Линейный двоичный код может быть задан его проверочной матрицей 𝐻 . Теоремы случайного кодирования говорят, что если элементы матрицы выбраны случайно и независимо, то с большой вероятностью параметры кода будут хорошими (удовлетворять границе
Варшамова–Гилберта на минимальное расстояние).

340

11. Коды с малой плотностью проверок на четность

Очевидные проблемы на пути воплощения случайных кодов в
практику связи — высокая сложность кодирования и декодирования для матриц произвольного вида.
Идея Галлагера, которую он подкрепил анализом с использованием метода случайного кодирования, состоит в том, чтобы выбрать
матрицу 𝐻 разреженной: в ней должно быть мало единиц, строки
и столбцы должны содержать мало общих элементов. Не вдаваясь
в детали математического анализа МППЧ-кодов, попытаемся пояснить, как требование малой плотности влияет на характеристики
(минимальное расстояние) кода и на сложность его декодирования.
Прежде всего, заметим, что для получения хорошей асимптотической оценки минимального расстояния важно, чтобы линейные
комбинации столбцов образовывали последовательности случайных
независимых символов. Это свойство может быть выполнено при
плотности единиц проверочной матрицы много меньшей, чем 1/2.
Чтобы понять, как плотность единиц в 𝐻 связана со сложностью декодирования, рассмотрим случай ДСК. Предположим, что
по принятой из канала последовательности вычислен синдром 𝑠 и
его вес Хэмминга равен 𝑤(𝑠). При низкой плотности матрицы 𝐻
можно ожидать, что вес синдрома растет пропорционально числу
ошибок, и что декодировать можно методом проб и ошибок, пытаясь подобрать последовательность столбцов 𝐻 , при сложении которых с синдромом вес синдрома уменьшается от попытки к попытке.
Похожую стратегию декодирования называют декодированием подбрасыванием монеты (coin flipping). Интуиция подсказывает, что
при низкой плотности единиц можно рассчитывать на декодирование с линейной или почти с линейной сложностью, и что при высокой плотности единиц в проверочной матрице такой метод заведомо
неэффективен.
Практически более значимый алгоритм, рассмотренный в следующем параграфе, внешне далек от подбрасывания монеты, но он
тоже неявно использует возможность судить о влиянии конкретного столбца проверочной матрицы на синдром независимо от других
столбцов. Основанием для таких независимых решений служит то,
что столбцы не имеют или почти не имеют общих единиц.

11.1. Проверочная матрица МППЧ-кода

341

Определение 11.1. Двоичный линейный (𝑛, 𝑘)-код, заданный про-

верочной матрицей 𝐻 , называется (𝐽, 𝐾)-регулярным кодом с малой плотностью проверок на четность, если каждый столбец
матрицы 𝐻 содержит ровно 𝐽 единиц, а каждая строка — 𝐾 единиц.
В этом определении подразумевается, что числа 𝐽 и 𝐾 малы по
сравнению с длиной и размерностью кода. Если рассматривается
последовательность кодов c фиксированной скоростью 𝑅 = 𝑘/𝑛 и
с возрастающей длиной 𝑛 и размерностью 𝑘 , то параметры 𝐽 и 𝐾
остаются неизменными.
В основополагающих работах Галлагера рассматривались регулярные коды. В исследованиях последних лет, напротив, много внимания уделяется иррегулярным МППЧ-кодам, для которых фиксируется не вес столбцов и строк, а наборы весов, из которых разрешено выбирать значения в соответствии с некоторыми предопределенными вероятностями.
Считается установленным факт, что среди иррегулярных кодов
есть коды, позволяющие приблизиться весьма близко к пропускной
способности канала. К сожалению, гипотезы, принятые при доказательстве таких результатов (методом эволюции плотностей), могут выполняться только при астрономически больших длинах кодов
(см. параграф 11.4.3). При приемлемых для практических приложений длинах кодов регулярные и иррегулярные коды конкурируют
друг с другом.
Почти без потери общности проверочная матрица МППЧ-кода
(регулярного или иррегулярного) может быть записана в виде
⎛ ⎞
𝐻1
⎜ 𝐻2 ⎟
⎜ ⎟
𝐻 = ⎜ . ⎟,
⎝ .. ⎠

𝐻𝐽
где подматрицы 𝐻𝑖 содержат не более одной единицы в каждом
столбце. Галлагер изучал ансамбль МППЧ-кодов, в котором полосы, начиная со второй, являются перестановками столбцов первой
полосы.

342

11. Коды с малой плотностью проверок на четность

Следующий шаг на пути придания матрице 𝐻 некоторой структуры состоит в разбиении полос проверочной матрицы на подматрицы, т.е.


𝐻11 𝐻12 · · · 𝐻1𝐿1
⎜ 𝐻21 𝐻22 · · · 𝐻2𝐿 ⎟
1⎟

(11.1)
𝐻=⎜ .
..
..
.. ⎟ ,
⎝ ..
.
.
. ⎠

𝐻𝐽1 𝐻𝐽2 · · · 𝐻𝐽𝐿1
где 𝐿1 ≥ 𝐾 , а матрицы 𝐻𝑖𝑗 содержат не больше одной единицы
в каждой строке и каждом столбце. Можно дополнительно сузить
класс кодов, допустив использование в качестве 𝐻𝑖𝑗 только нулевых либо перестановочных матриц. Такое множество проверочных
матриц является основным объектом изучения в классе регулярных
МППЧ-кодов.
Заметим, что при построении или случайном выборе матриц,
удовлетворяющих указанным выше ограничениям на структуру,
очень часто оказывается, что ранг матрицы 𝐻 меньше числа строк
𝑟. В этом случае скорость кода оказывается несколько больше «конструктивной» скорости, т.е. в общем случае для кода с матрицей 𝐻
размера 𝑟 ×𝑛 скорость кода удовлетворяет неравенству 𝑅 ≥ 1−𝑟/𝑛.
Пример 11.1. Проверочная матрица

1
⎜0
⎜1
𝐻=⎜
⎜0

1
0


0
1
0
1
0
1

1
0
1
0
0
1

0
1
0
1
1
0

1
0
0
1
1
0

0
1
1
0
0
1

1
0
0
1
0
1


0
1⎟
1⎟

0⎟

1
0

задает (𝐽 = 3.𝐾 = 4)-регулярный МППЧ-код. Плотность единиц в
данном конкретном случае велика, но ее можно сделать меньше, если в качестве подматриц выбрать перестановочные матрицы более
высокого порядка. Поскольку строки линейно зависимы, строки с
номерами 4 и 6 можно удалить, скорость кода 𝑅 = 1/2 > 1 − 6/8.

11.2. Декодирование по принципу распространения доверия

11.2.

343

Декодирование по принципу
распространения доверия

Нам предстоит по известным значениям компонент синдрома для
символов, входящих в соответствующие этим компонентам проверки, принимать решение об их надежности в зависимости от надежности остальных символов. Для решения этой непростой задачи нам
понадобятся решения простых вспомогательных задач.
Лемма 11.1. Пусть в последовательности из 𝑛 двоичных независимых символов вероятность единицы в любой позиции равна 𝑝.
Тогда вероятность четного числа единиц в последовательности
равна
1 + (𝑞 − 𝑝)𝑛
𝑃even =
, 𝑞 = 1 − 𝑝.
(11.2)
2
Вероятность появления 𝑖 единиц равна
(︀𝑛)︀ Доказательство.
𝑖
𝑛−𝑖
. Поэтому
𝑖 𝑝 𝑞

𝑃even + 𝑃odd = (𝑞 + 𝑝)𝑛 = 1;
𝑃even − 𝑃odd = (𝑞 − 𝑝)𝑛 .
Полусумма этих соотношений дает (11.2).
Усложним задачу, предположив, что вероятности единиц на разных позициях могут быть разными.
Лемма 11.2. Пусть в последовательности из 𝑛 двоичных незави-

симых символов вероятность единицы в позиции 𝑖 равна 𝑝𝑖 . Тогда
вероятность четного числа единиц в последовательности равна
∏︀
1 + 𝑛𝑖=1 (𝑞𝑖 − 𝑝𝑖 )
𝑃even =
, 𝑞𝑖 = 1 − 𝑝𝑖 .
(11.3)
2
Доказательство. Рассмотрим произведение
𝑛
∏︁

(𝑞𝑖 − 𝑝𝑖 ).

𝑖=1

Если записать это произведение в виде суммы, то из общего
числа 2𝑛 слагаемых отрицательные слагаемые будут соответствовать вероятностям последовательностей с нечетным числом единиц,

344

11. Коды с малой плотностью проверок на четность

положительные — с четным числом единиц. Заметив это и повторив те же действия, что и в доказательстве леммы 11.1, получим
(11.3).
Предположим, что по каналу с двоичным входом и дискретным
выходом для передачи сообщений используется (𝐽, 𝐾)-регулярный
МППЧ-код, заданный проверочной матрицей. Предположения о
регулярности кода и дискретности выхода канала на самом деле
не нужны, мы принимаем их только для простоты записи (чтобы
иметь постоянными пределы суммирования в суммах и записывать
вероятности вместо плотностей).
Рассмотрим одно из проверочных соотношений, вычисленных
по принятой последовательности. Предположим, что в число 𝐾 его
ненулевых позиций входит позиция с номером 𝑖. Кодовый символ,
соответствующий этой позиции, можно выбрать равным 0 или 1.
Для того чтобы проверка выполнялась (была равна нулю), в зависимости от выбора 𝑥𝑖 = 0 или 1, мы должны предположить суммарное
число единиц (ошибок) на остальных 𝐾 −1 позициях, накрываемых
проверкой, соответственно, четным или нечетным.
Обозначим через 𝑦 принятую последовательность, через 𝑝𝑖 —
вероятность единицы на позиции с номером 𝑖, 𝑝𝑖 = Pr (𝑥𝑖 = 1 |𝑦),
вычисленную по 𝑦 ; под 𝑆 понимается событие, состоящее в том,
что проверка выполняется. То, что жесткие решения должны удовлетворять проверкам, определяемым проверочной матрицей кода,
дает возможность пересчитать апостериорные вероятности 𝑝𝑖 , в новые вероятности Pr (𝑥𝑖 = 0 |𝑦, 𝑆 ).
Теорема 11.3. Если результаты различных проверок, в которые
входит данный символ — независимые события, а 𝑝𝑗ℎ , ℎ = 1,...,
𝐾 − 1, 𝑗 = 1, ..., 𝐽 — вероятность единицы для ℎ-го символа
𝑗 -й проверки при заданной последовательности 𝑦 , то
∏︀
𝐽
Pr (𝑥𝑖 = 0 |𝑦, 𝑆 )
1 − 𝑝𝑖 ∏︁ 1 + 𝐾−1
ℎ=1 (1 − 2𝑝𝑗ℎ )
=
.
(11.4)
∏︀𝐾−1
Pr (𝑥𝑖 = 1 |𝑦, 𝑆 )
𝑝𝑖
ℎ=1 (1 − 2𝑝𝑗ℎ )
𝑗=1 1 −

Доказательство. По формуле апостериорной вероятности запишем
Pr (𝑆 |𝑦, 𝑥𝑖 = 0 ) Pr (𝑥𝑖 = 0 |𝑦)
Pr (𝑥𝑖 = 0 |𝑦, 𝑆 ) =
.
(11.5)
Pr (𝑆|𝑦)

11.2. Декодирование по принципу распространения доверия

345

Пусть 𝑆𝑗 представляет собой событие, состоящее в том, что 𝑗 -я
из 𝐽 проверок выполнена. В силу независимости проверок

Pr (𝑆 |𝑦, 𝑥𝑖 = 0 ) =

𝐽
∏︁

Pr (𝑆𝑗 |𝑦, 𝑥𝑖 = 0 ) .

(11.6)

𝑗=1

При 𝑥𝑖 = 0 проверка выполняется, если сумма остальных символов, входящих в проверку, четна. Это дает возможность использовать лемму 11.2 для вычисления сомножителей в правой части
(11.6).
Записав формулы аналогичные (11.5) и (11.6) для 𝑥𝑖 = 1 после
подстановки вычисленных условных вероятностей Pr (𝑥𝑖 = 0 |𝑦, 𝑆 )
и Pr (𝑥𝑖 = 1 |𝑦, 𝑆 ) в дробь в левой части (11.4), получаем требуемый
результат.
Обсудим теорему.
Сформулированное утверждение является основой для итеративной процедуры декодирования, поскольку все вероятности в
правой части мы считаем известными, и по ним находим одну из
вероятностей, которая будет востребована при подсчете апостериорных вероятностей (точнее, их отношений) для других символов.
Нетрудно заметить, что в формулировке теоремы есть подводный камень — предположение о независимости проверок. Поскольку все вероятности 𝑝𝑗ℎ в правой части относятся к несовпадающим
позициям кодового слова, и мы рассматриваем канал без памяти,
то предположение кажется реалистичным. С другой стороны, значения 0 и 1 в кодовых символах не могут быть выбраны произвольно — некоторые ограничения накладываются кодом. С этой точки
зрения может показаться неубедительной ссылка на лемму 11.2 в
доказательстве теоремы. Еще одна, более серьезная, проблема состоит в том, что после применения теоремы для получения оценки
одного из символов эта оценка появится в правой части при вычислении оценок других символов. Это означает, что вычисленная
оценка будет влиять на несколько сомножителей в произведении по
𝑗 , т.е. предположение о независимости результатов проверки вызывает сомнения.
Мы вернемся к этим проблемам позже при анализе характеристик кодов с применением графов Таннера. Перечисленные контр-

346

11. Коды с малой плотностью проверок на четность

аргументы не мешают применять теорему 11.3, осознавая, что соотношение (11.4) на самом деле — приближенное и выполняется
с тем большей точностью, чем менее зависимы проверки, т.е. чем
ниже плотность единиц в проверочной матрице кода.
Чтобы сделать формулы удобнее для применения напрактике,
переформулируем их в терминах логарифмов отношений правдоподобия. Для этого введем обозначение 𝛼 для знака логарифма отношения правдоподобия и 𝛽 для его абсолютной величины, т.е. при
вероятности единицы равной 𝑝 = 1 − 𝑞 получаем

ln

1−𝑝
𝑞
= ln = 𝛼𝛽.
𝑝
𝑝

(11.7)

(В соответствии с обозначениями предыдущих глав, следует логарифмом отношения правдоподобия считать ln(𝑝/𝑞). В данной главе
мы следуем общепринятым для МППЧ-кодов обозначениям, введенным Галлагером.) Введем функцию

𝑓 (𝛽) = ln

𝑒𝛽 + 1
,
𝑒𝛽 − 1

𝛽 > 0.

Заметим, что

𝑓 (𝛽) = − ln

𝑒𝛽/2 − 𝑒−𝛽/2
= − ln tanh(𝛽/2),
𝑒𝛽/2 + 𝑒𝛽/2

где

tanh(𝑥) =

(11.8)

𝑒𝑥 − 𝑒−𝑥
𝑒2𝑥 − 1
=
𝑒𝑥 + 𝑒−𝑥
𝑒2𝑥 + 1

гиперболический тангенс.
Из (11.7) и (11.8) получаем

𝑞/𝑝 − 1
1 − 2𝑝 =
= tanh
𝑞/𝑝 + 1

(︂

𝛼𝛽
2

)︂

= 𝑒−𝛼𝑓 (𝛽) .

Эти тождества позволяют переписать (11.4), затратив некоторые усилия, в форме
[︃(︃𝐾−1
)︃ (︃𝐾−1
)︃]︃
𝐽−1
∑︁
∏︁
∑︁
𝛼𝑖′ 𝛽𝑖′ = 𝛼𝑖 𝛽𝑖 +
𝛼𝑗ℎ 𝑓
𝑓 (𝛽𝑗ℎ )
,
(11.9)
𝑗=1

ℎ=1

ℎ=1

11.2. Декодирование по принципу распространения доверия

347

где 𝛼𝑖′ 𝛽𝑖′ и 𝛼𝑖 𝛽𝑖 — знаки и модули логарифмов отношения правдоподобия 𝑖-го символа до и после модификации, учитывающей знаки
и надежности символов, входящих в общие проверки с этим символом. Суммирование и перемножение в (11.9) выполняется так, что
𝛼𝑖 𝛽𝑖 участвует только в виде первого слагаемого, именно поэтому
значение индексов ограничено 𝐽 −1 по столбцам и 𝐾 −1 по строкам.
Алгоритм декодирования теперь понятен: при инициализации
нужно вычислить все 𝛼𝑖 𝛽𝑖 по принятым из канала мягким решениям. Затем поочередно для всех символов нужно выполнять вычисления по формуле (11.9), тем самым обновляя знаки и надежности
символов. Окончательно решение принимается после выполнения
заданного числа итераций либо когда синдром, вычисленный по
жестким решениям, окажется равным нулю.
Этот алгоритм примерно одинаково часто называют алгоритмом распространения доверия (belief propagation или BP) либо
алгоритм суммирования произведений (sum-product algorithm или
SPA).
Для программной реализации вычислений по формуле (11.9)
следует ввести массив ненулевых индексов строк 𝑉 размера 𝑟 × 𝐾
и массив ненулевых индексов столбцов 𝐶 размера 𝑛 × 𝐽 . Для
вре́менного хранения слагаемых в квадратных скобках в сумме по 𝑗
вводим вспомогательный массив 𝑍 , а для хранения величин 𝛼𝑗ℎ 𝛽𝑗ℎ )
используем массив 𝐿. Массивы 𝑍 и 𝐿 могут быть выбраны размера равного числу ненулевых элементов проверочной матрицы, т.е.
линейного по длине кода. Для простоты записи алгоритма и программы мы выбрали 𝑍 и 𝐿 того же размера, что и проверочная
матрица 𝐻 .
Полностью декодирование по принципу распространения доверия представлено в виде алгоритма 11.1 и реализовано на
МАТЛАБе в виде программы 11.1. Обратите внимание, что вход
программы декодирования нормализован так, что значения входной
последовательности равны логарифмам отношений правдоподобия
кодовых символов при передаче противоположными сигналами по
каналу с гауссовским шумом.

348

11. Коды с малой плотностью проверок на четность

Алгоритм 11.1. Алгоритм распространения доверия
Input: Логарифмы отношений правдоподобия кодовых

символов 𝑦 = (𝑦1 , ..., 𝑦𝑛 ), максимальное число
итераций ITER, массивы ненулевых позиций столбцов
𝐶𝑖 𝑖 = 1, ..., 𝑛, и строк 𝑉𝑗 , 𝑗 = 1, ..., 𝑟
Output:
Жесткие решения 𝑥 = (𝑥1 , ..., 𝑥𝑛 )
1. Инициализация
for 𝑖 = 1 to 𝑛 do
for 𝑗 = 1 to 𝑟 do
𝐿(𝑗, 𝑖) = 𝑍(𝑗, 𝑖) = 0;
end
end

2. Основной цикл
for 𝑖𝑡𝑒𝑟 = 1 to 𝐼𝑇 𝐸𝑅 do
for 𝑖 = 1 to 𝑛 do
for 𝑗 = 1 to 𝑟 do
∑︁
𝐿(𝑗, 𝑖) = 𝑦𝑖 +

𝑍(ℎ, 𝑖)

ℎ∈𝐶𝑖 ,ℎ̸=𝑗

end
end
for 𝑖 = 1 to 𝑛 do
for 𝑗 = 1 to 𝐽 do

𝛼ℎ𝑗 = sign(𝐿(ℎ,
𝑗)), ⎞ ⎛

∏︁
∑︁
𝑍(𝑗, 𝑖) = ⎝
𝛼ℎ𝑗 ⎠ 𝑓 ⎝
ℎ∈𝑉𝑗 ,ℎ̸=𝑖


𝑓 (|𝐿(ℎ, 𝑗)|)⎠

ℎ∈𝑉𝑗 ,ℎ̸=𝑖

end
end
for 𝑖 = 1 to 𝑛 do

𝑦^𝑖 = 𝑦𝑖 +

∑︁

𝑍(ℎ, 𝑖) % Мягкие решения

ℎ∈𝐶𝑖

𝑥𝑖 = 𝑦^𝑖 < 0 % Жесткие решения
end

𝑠 = 𝑥𝐻 . % Синдром
if 𝑠 = 0 then return 𝑥
% Декодирование закончено
end
return 𝑥;

11.2. Декодирование по принципу распространения доверия

349

Заметим, что вычисление произведения переменных 𝛼 не требует умножения чисел. Таким образом, единственная затратная операция — вычисление функции логарифма гиперболического тангенса 𝑓 (·). При реализации в реальных системах эти вычисления
выполняются таблично либо применяются аппроксимации (см. параграф 10.3.3).
Программа 11.1. Декодирование по принципу распространения доверия
function [ hard , soft , iter ]= bp_decod (y ,V ,C ,H , MAXITER )
% Вход :
%
y - последовательность на выходе канала
%
V - ненулевые позиции проверок по строкам
%
C - ненулевые позиции проверок по столбцам
%
H - проверочная матрица
%
MAXITER -- максимальное число итераций
% Выход
%
hard - жесткие решения
%
soft - мягкие решения
%
iter - число итераций до принятия решения .
% Пример вызова
%
[V , C ]= bp_prepare ( H ) ;
% подготовка массивов
%
noise = sigma * randn (1 , n ); % формирование шума
%
out =(2* code_word -1) + noise ;
% выход канала ;
%
out = -2* out / sigma ^2:
% нормализация
%
[ hard , soft , iter ]= bp_decod ( out , V , C , H ) ;
% Инициализация
if nargin ==4 , MAXITER =50; end ;
[r , n ]= size (H ) ;
Z = zeros (r , n) ;
L = zeros (r , n) ;
hard =y