Введение

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

Сжатие данных (или кодирование источника)
Контроль ошибок (или кодирование канала)
Криптографическое кодирование
Линейное кодирование

Сжатие данных стремится удалить нежелательную избыточность из данных источника для более эффективной передачи. Например, сжатие данных ZIP уменьшает размер файлов данных, например, для снижения интернет-трафика. Сжатие данных и коррекция ошибок могут изучаться совместно. Коррекция ошибок добавляет полезную избыточность к данным источника, чтобы сделать передачу более устойчивой к помехам, присутствующим на канале передачи. Обычный пользователь может не знать о многих приложениях, использующих коррекцию ошибок. Типичный музыкальный компакт-диск (CD) использует код Рида-Соломона для исправления царапин и пыли. В этом приложении каналом передачи является сам CD. Мобильные телефоны также используют методы кодирования для коррекции затухания и шума высокочастотной радиосвязи. Модемы передачи данных, телефонная связь и сеть NASA Deep Space Network используют методы кодирования канала для обеспечения прохождения битов, например, турбо-коды и коды LDPC.

История теории кодирования

В 1948 году Клод Шеннон опубликовал статью "Математическая теория связи" в двух частях в июльском и октябрьском выпусках технического журнала Bell System. Эта работа посвящена проблеме наиболее эффективного кодирования информации, которую отправитель хочет передать. В этой основополагающей работе он использовал инструменты теории вероятностей, разработанные Норбертом Винером, которые в то время только начинали применяться к теории связи. Шеннон разработал информационную энтропию как меру неопределенности сообщения, по сути, заложив основы теории информации. Бинарный код Голея был разработан в 1949 году. Это код коррекции ошибок, способный исправлять до трех ошибок в каждом 24-битном слове и обнаруживать четвертую. Ричард Хамминг получил премию Тьюринга в 1968 году за свою работу в Bell Labs в области численных методов, автоматических систем кодирования, а также обнаружения и исправления ошибок. Он изобрел понятия, известные как коды Хамминга, окна Хамминга, числа Хамминга и расстояние Хамминга. В 1972 году Насир Ахмед предложил дискретное косинусное преобразование (DCT), которое он разработал совместно с Т. Натараджаном и К. Р. Рао в 1973 году. DCT является наиболее широко используемым алгоритмом сжатия с потерями и лежит в основе мультимедийных форматов, таких как JPEG, MPEG и MP3.

Кодирование источника

Цель исходного кодирования — уменьшить объем исходных данных.

Свойства

не является однозначным, если инъективен. Уникально декодируем, если инъективен. Является мгновенным, если не является префиксом другого кода (и наоборот).

Принцип

Энтропия источника – это мера информации. По сути, исходные коды стремятся уменьшить избыточность, присущую источнику, и представить источник меньшим количеством бит, несущих больше информации. Сжатие данных, которое явно пытается минимизировать среднюю длину сообщений в соответствии с определенной предполагаемой вероятностной моделью, называется энтропийным кодированием. Различные методы, используемые схемами кодирования источника, направлены на достижение предела энтропии источника. C(x) ≥ H(x), где H(x) – энтропия источника (скорость передачи данных), а C(x) – скорость передачи данных после сжатия. В частности, ни одна схема кодирования источника не может превзойти энтропию источника.

Пример

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

Кодирование каналов

Целью теории кодирования каналов является поиск кодов, обеспечивающих быструю передачу, содержащих большое количество допустимых кодовых слов и способных исправлять или, по крайней мере, обнаруживать множество ошибок. Хотя эти характеристики не являются взаимоисключающими, повышение эффективности в одной из них обычно достигается за счет ухудшения в другой. Таким образом, различные коды оптимальны для разных приложений. Требуемые свойства кода в основном зависят от вероятности возникновения ошибок при передаче. В типичном CD повреждения в основном вызваны пылью или царапинами. CD используют перекрестно-переставленное кодирование Рида — Соломона для распределения данных по диску. Хотя это и не самый эффективный код, простой код повторения может служить наглядным примером. Предположим, мы берем блок битов данных (представляющих звук) и отправляем его три раза. На приемной стороне мы побитово сравниваем три повторения и принимаем значение, за которое проголосовало большинство. Однако мы не отправляем биты последовательно, а переставляем их. Блок битов данных сначала делится на 4 меньших блока. Затем мы последовательно берем по одному биту из первого, второго и так далее, и отправляем их. Это повторяется три раза, чтобы распределить данные по поверхности диска. В контексте простого кода повторения это может показаться неэффективным. Однако существуют более мощные коды, которые при использовании этой техники перестановки очень эффективно корректируют ошибки типа "всплеска", вызванные царапиной или пылью. Другие коды более подходят для различных задач. Связь в дальнем космосе ограничена тепловым шумом приемника, который носит более непрерывный характер, чем импульсный. Аналогично, узкополосные модемы ограничены шумом в телефонной сети, который также лучше моделируется как непрерывное возмущение. Мобильные телефоны подвержены быстрому затуханию сигнала. Высокие частоты, используемые в них, могут вызывать быстрое затухание сигнала даже при перемещении приемника на несколько сантиметров. Существует класс канальных кодов, разработанных для борьбы с затуханием сигнала.

Коды линейных блоков

Коды линейных блоков обладают свойством линейности, то есть сумма любых двух кодовых слов также является кодовым словом, и они применяются к исходным битам блоками, отсюда и название – коды линейных блоков. Существуют блочные коды, которые не являются линейными, но без этого свойства сложно доказать, что код является хорошим. Другое свойство кода – это число соседей, которые может иметь отдельное кодовое слово. Рассмотрим снова пример с монетами. Сначала мы располагаем монеты в прямоугольной сетке. У каждой монеты будет 4 ближайших соседа (и 4 в углах, которые находятся дальше). В гексагональной сетке у каждой монеты будет 6 ближайших соседей. При увеличении размерности количество ближайших соседей очень быстро возрастает. В результате растет и число способов, которыми шум может заставить приемник выбрать соседнее кодовое слово (а значит, произойдет ошибка). Это фундаментальное ограничение блочных кодов, и вообще любых кодов. Возможно, вызвать ошибку в соседнее кодовое слово сложнее, но количество соседей может быть достаточно велико, чтобы общая вероятность ошибки фактически увеличилась. Это один из наиболее известных кодов формирования.

Коды свертывания

Идея сверточного кода заключается в том, чтобы каждый символ кодового слова являлся взвешенной суммой различных символов входного сообщения. Это аналогично свертке, используемой в LTI-системах для определения выходного сигнала, когда известны входной сигнал и импульсная характеристика. Таким образом, мы обычно определяем выходной сигнал сверточного кодировщика, который представляет собой свертку входного бита с состояниями кодировщика – регистрами. В основе своей, сверточные коды не обеспечивают большей защиты от шума, чем эквивалентный блочный код. Во многих случаях они, как правило, проще в реализации, чем блочный код с аналогичной мощностью. Кодировщик обычно представляет собой простую схему с памятью состояния и некоторой логикой обратной связи, чаще всего на основе элементов XOR. Декодер может быть реализован программно или в прошивке. Алгоритм Витерби является оптимальным алгоритмом для декодирования сверточных кодов. Существуют упрощения для снижения вычислительной нагрузки, основанные на поиске только наиболее вероятных путей. Хотя они и не являются оптимальными, как правило, они демонстрируют хорошие результаты в условиях низкого уровня шума. Сверточные коды используются в голосовых модемах (V.32, V.17, V.34) и в мобильных телефонах GSM, а также в спутниковых и военных системах связи.

Криптографическое кодирование

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

Кодирование линий

Линейный код (также называемый цифровой базовой модуляцией или цифровым методом передачи в базовой полосе) – это код, выбранный для использования в системе связи с целью передачи в базовой полосе. Линейное кодирование часто применяется для передачи цифровых данных. Линейное кодирование заключается в представлении цифрового сигнала, предназначенного для передачи, дискретным по амплитуде и времени сигналом, оптимально настроенным для специфических характеристик физического канала (и принимающего оборудования). Форма сигнала напряжения или тока, используемая для представления 1 и 0 цифровых данных на линии связи, называется линейным кодированием. Распространенные типы линейного кодирования включают однополярное, полярное, биполярное и кодирование Манчестера.

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

Еще одна задача теории кодирования — разработка кодов, обеспечивающих синхронизацию. Код может быть спроектирован таким образом, чтобы фазовый сдвиг можно было легко обнаружить и исправить, а также чтобы по одному каналу можно было передавать несколько сигналов. Другим применением кодов, используемых в некоторых системах мобильной связи, является множественный доступ с кодовым разделением (CDMA). Каждому телефону назначается кодовая последовательность, слабо коррелированная с кодами других телефонов. При передаче кодовое слово используется для модуляции битов данных, представляющих голосовое сообщение. На приемной стороне выполняется процесс демодуляции для восстановления данных. Свойства этого класса кодов позволяют множеству пользователей (с разными кодами) одновременно использовать один и тот же радиоканал. Для приемника сигналы других пользователей будут восприниматься демодулятором как низкоуровневый шум. Другим распространенным классом кодов являются коды автоматического повторного запроса (ARQ). В этих кодах отправитель добавляет избыточность к каждому сообщению для проверки на ошибки, обычно путем добавления контрольных битов. Если контрольные биты не соответствуют остальной части сообщения при получении, приемник запросит повторную передачу сообщения. Все протоколы сетей передачи данных, кроме самых простых, используют ARQ. Распространенные протоколы включают SDLC (IBM), TCP (Интернет), X.25 (Международный) и многие другие. Эта тема является предметом обширных исследований из-за проблемы сопоставления отклоненного пакета с новым. Является ли это новым пакетом или повторной передачей? Обычно используются схемы нумерации, как в TCP.

Групповое тестирование

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

Аналоговое кодирование

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

Нейронный код

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