В телекоммуникациях сверточный код — это тип кода с исправлением ошибок , который генерирует символы четности посредством скользящего применения булевой полиномиальной функции к потоку данных. Скользящее применение представляет собой «свертку» кодера по данным, что приводит к появлению термина «сверточное кодирование». Скользящая природа сверточных кодов облегчает декодирование решетчатой структуры с использованием инвариантной во времени решетки. Инвариантное во времени декодирование решетчатой структуры позволяет декодировать сверточные коды с помощью мягкого решения с максимальным правдоподобием и разумной сложностью.
Способность выполнять экономичное декодирование мягкого решения с максимальным правдоподобием является одним из основных преимуществ сверточных кодов. Это контрастирует с классическими блочными кодами, которые обычно представлены решеткой, изменяющейся во времени, и поэтому обычно декодируются с жестким решением. Сверточные коды часто характеризуются базовой скоростью кода и глубиной (или памятью) кодера . Базовая скорость кода обычно задается как , где n — это скорость необработанных входных данных, а k — скорость данных выходного канала кодированного потока. n меньше k , поскольку канальное кодирование вставляет избыточность во входные биты. Память часто называется «длиной ограничения» K , где выход является функцией текущего входа, а также предыдущих входов. Глубина также может быть задана как количество элементов памяти v в полиноме или максимально возможное количество состояний кодера (обычно: ).
Сверточные коды часто описываются как непрерывные. Однако можно также сказать, что сверточные коды имеют произвольную длину блока, а не являются непрерывными, поскольку большая часть реального сверточного кодирования выполняется на блоках данных. Сверточно кодированные блочные коды обычно используют завершение. Произвольную длину блока сверточных кодов можно также противопоставить классическим блочным кодам , которые обычно имеют фиксированную длину блока, определяемую алгебраическими свойствами.
Скорость кода сверточного кода обычно изменяется посредством прокалывания символов . Например, сверточный код с «материнской» скоростью кода может быть проколот до более высокой скорости, например, просто не передавая часть кодовых символов. Производительность проколотого сверточного кода обычно хорошо масштабируется с объемом передаваемой четности. Возможность выполнять экономичное мягкое декодирование решений на сверточных кодах, а также длина блока и гибкость скорости кода сверточных кодов делают их очень популярными для цифровой связи.
Сверточные коды были введены в 1955 году Питером Элиасом . Считалось, что сверточные коды могут быть декодированы с произвольным качеством за счет вычислений и задержки. В 1967 году Эндрю Витерби определил, что сверточные коды могут быть декодированы с максимальным правдоподобием с разумной сложностью с использованием декодеров на основе инвариантной во времени решетки — алгоритма Витерби . Позже были разработаны другие алгоритмы декодирования на основе решетки, включая алгоритм декодирования BCJR .
Рекурсивные систематические сверточные коды были изобретены Клодом Берру около 1991 года. Эти коды оказались особенно полезными для итеративной обработки, включая обработку каскадных кодов, таких как турбокоды . [1]
Используя «сверточную» терминологию, классический сверточный код можно рассматривать как фильтр с конечной импульсной характеристикой (КИХ), в то время как рекурсивный сверточный код можно рассматривать как фильтр с бесконечной импульсной характеристикой (БИХ).
Сверточные коды широко используются для достижения надежной передачи данных в многочисленных приложениях, таких как цифровое видео , радио, мобильная связь (например, в сетях GSM, GPRS, EDGE и 3G (до 3GPP Release 7) [3] [4] ) и спутниковая связь . [5] Эти коды часто реализуются в конкатенации с кодом жесткого решения, в частности, Рида-Соломона . До турбокодов такие конструкции были наиболее эффективными, приближаясь к пределу Шеннона .
Для сверточного кодирования данных начните с k регистров памяти , каждый из которых содержит один входной бит. Если не указано иное, все регистры памяти начинаются со значения 0. Кодер имеет n сумматоров по модулю 2 (сумматор по модулю 2 может быть реализован с помощью одного логического вентиля XOR , где логика следующая: 0+0 = 0 , 0+1 = 1 , 1+0 = 1 , 1+1 = 0 ) и n генераторных полиномов — по одному для каждого сумматора (см. рисунок ниже). Входной бит m 1 подается в самый левый регистр. Используя генераторные полиномы и существующие значения в оставшихся регистрах, кодер выводит n символов. Эти символы могут быть переданы или проколоты в зависимости от желаемой скорости кода. Теперь сдвигаем биты всех значений регистров вправо ( m 1 перемещается в m 0 , m 0 перемещается в m −1 ) и ждем следующего входного бита. Если входных битов не осталось, кодер продолжает сдвиг до тех пор, пока все регистры не вернутся в нулевое состояние (завершение сброса бита).
На рисунке ниже показан кодер со скоростью 1 ⁄ 3 ( m ⁄ n ) и длиной ограничения ( k ) 3. Полиномы генератора: G 1 = (1,1,1), G 2 = (0,1,1) и G 3 = (1,0,1) . Таким образом, выходные биты вычисляются (по модулю 2) следующим образом:
Сверточные коды могут быть систематическими и несистематическими:
Несистематические сверточные коды более популярны из-за лучшей помехоустойчивости. Это связано со свободным расстоянием сверточного кода. [6]
Кодировщик на картинке выше — нерекурсивный кодировщик. Вот пример рекурсивного кодировщика, и как таковой он допускает структуру обратной связи:
Пример кодера является систематическим , поскольку входные данные также используются в выходных символах (Выход 2). Коды с выходными символами, которые не включают входные данные, называются несистематическими.
Рекурсивные коды обычно систематические, а нерекурсивные коды, наоборот, обычно несистематические. Это не строгое требование, но обычная практика.
Пример кодера на рис. 2. является кодером с 8 состояниями, поскольку 3 регистра создадут 8 возможных состояний кодера (2 3 ). Соответствующая решетка декодера обычно также будет использовать 8 состояний.
Рекурсивные систематические сверточные коды (RSC) стали более популярными из-за их использования в турбокодах. Рекурсивные систематические коды также называются псевдосистематическими кодами.
Другие коды RSC и примеры приложений включают в себя:
Полезно для реализации кода LDPC и в качестве внутреннего составного кода для последовательных конкатенированных сверточных кодов (SCCC).
Полезно для SCCC и многомерных турбокодов.
Полезно как составной код в турбокодах с низкой частотой ошибок для таких приложений, как спутниковые каналы связи. Также подходит как внешний код SCCC.
Сверточный кодер называется так потому, что он выполняет свертку входного потока с импульсными откликами кодера :
где x — входная последовательность, y j — последовательность из выхода j , h j — импульсный отклик для выхода j и обозначает свертку.
Сверточный кодер — это дискретная линейная система, инвариантная ко времени . Каждый выход кодера может быть описан собственной передаточной функцией , которая тесно связана с полиномом генератора. Импульсная характеристика связана с передаточной функцией через Z-преобразование .
Передаточные функции для первого (нерекурсивного) кодера следующие:
Передаточные функции для второго (рекурсивного) кодера следующие:
Определим m как
где для любой рациональной функции ,
Тогда m — это максимальная из степеней полинома
, а длина ограничения определяется как . Например, в первом примере длина ограничения равна 3, а во втором — 4.
Сверточный кодер — это конечный автомат . Кодер с n двоичными ячейками будет иметь 2 n состояний.
Представьте, что кодер (показан на рис. 1 выше) имеет «1» в левой ячейке памяти ( m 0 ), а «0» в правой ( m −1 ). ( m 1 на самом деле не является ячейкой памяти, поскольку представляет текущее значение). Мы обозначим такое состояние как «10». Согласно входному биту кодер на следующем ходу может перейти либо в состояние «01», либо в состояние «11». Видно, что не все переходы возможны для (например, декодер не может перейти из состояния «10» в «00» или даже остаться в состоянии «10»).
Все возможные переходы можно показать следующим образом:
Фактическая закодированная последовательность может быть представлена как путь на этом графике. Один действительный путь показан красным в качестве примера.
Эта диаграмма дает нам представление о декодировании : если полученная последовательность не вписывается в этот график, то она была получена с ошибками, и мы должны выбрать ближайшую правильную (вписывающуюся в график) последовательность. Реальные алгоритмы декодирования используют эту идею.
Свободное расстояние [7] ( d ) — это минимальное расстояние Хэмминга между различными закодированными последовательностями. Корректирующая способность ( t ) сверточного кода — это количество ошибок, которые может исправить код. Ее можно вычислить как
Поскольку сверточный код не использует блоки, обрабатывая вместо этого непрерывный поток битов, значение t применяется к количеству ошибок, расположенных относительно близко друг к другу. То есть, несколько групп ошибок t обычно могут быть исправлены, когда они находятся относительно далеко друг от друга.
Свободное расстояние можно интерпретировать как минимальную длину ошибочного «всплеска» на выходе сверточного декодера. Тот факт, что ошибки появляются как «всплески», следует учитывать при проектировании конкатенированного кода с внутренним сверточным кодом. Популярным решением этой проблемы является чередование данных перед сверточным кодированием, так что внешний блочный код (обычно код Рида–Соломона ) может исправить большинство ошибок.
Существует несколько алгоритмов для декодирования сверточных кодов. Для относительно небольших значений k алгоритм Витерби используется повсеместно, поскольку он обеспечивает максимальную производительность правдоподобия и обладает высокой степенью параллелизации. Таким образом, декодеры Витерби легко реализуются в аппаратном обеспечении VLSI и в программном обеспечении на процессорах с наборами инструкций SIMD .
Коды с большей длиной ограничения более практично декодируются любым из нескольких последовательных алгоритмов декодирования , из которых наиболее известен алгоритм Фано . В отличие от декодирования Витерби, последовательное декодирование не является максимальным правдоподобием, но его сложность увеличивается лишь незначительно с длиной ограничения, что позволяет использовать сильные коды с большой длиной ограничения. Такие коды использовались в программе Pioneer начала 1970-х годов для Jupiter и Saturn, но уступили место более коротким кодам, декодированным по Витерби, обычно конкатенированным с большими кодами коррекции ошибок Рида-Соломона , которые делают общую кривую частоты ошибок по битам круче и производят чрезвычайно низкие остаточные необнаруженные частоты ошибок.
Как алгоритм Витерби, так и алгоритм последовательного декодирования возвращают жесткие решения: биты, которые формируют наиболее вероятное кодовое слово. Приблизительная мера уверенности может быть добавлена к каждому биту с помощью алгоритма мягкого вывода Витерби . Максимальные апостериорные (MAP) мягкие решения для каждого бита могут быть получены с помощью алгоритма BCJR .
Фактически в промышленности используются предопределенные структуры сверточных кодов, полученные в ходе научных исследований. Это связано с возможностью выбора катастрофических сверточных кодов (вызывает большее количество ошибок).
Особенно популярный сверточный код, декодируемый по Витерби, используемый по крайней мере со времен программы «Вояджер» , имеет длину ограничения K , равную 7, и скорость r, равную 1/2. [12]
Mars Pathfinder , Mars Exploration Rover и зонд Cassini к Сатурну используют K = 15 и скорость 1/6; этот код работает примерно на 2 дБ лучше, чем более простой код, при стоимости в 256 раз большей сложности декодирования (по сравнению с кодами миссии Voyager).
Сверточный код с длиной ограничения 2 и скоростью 1/2 используется в GSM как метод исправления ошибок. [13]
Сверточный код с любой скоростью кода может быть разработан на основе полиномиального выбора; [15] однако на практике для достижения требуемой скорости кода часто используется процедура прокалывания. Прокалывание — это метод, используемый для создания кода со скоростью m / n из «базового» кода с низкой скоростью (например, 1 / n ). Это достигается путем удаления некоторых битов на выходе кодера. Биты удаляются в соответствии с матрицей прокалывания . Наиболее часто используются следующие матрицы прокалывания:
Например, если мы хотим создать код со скоростью 2/3, используя соответствующую матрицу из приведенной выше таблицы, мы должны взять базовый выход кодера и передать каждый первый бит из первой ветви и каждый бит из второй. Конкретный порядок передачи определяется соответствующим стандартом связи.
Перфорированные сверточные коды широко используются в спутниковой связи , например, в системах Intelsat и цифровом видеовещании .
Перфорированные сверточные коды также называют «перфорированными».
Простые сверточные коды, декодированные по Витерби, теперь уступают место турбокодам , новому классу итерированных коротких сверточных кодов, которые близко приближаются к теоретическим ограничениям, налагаемым теоремой Шеннона, с гораздо меньшей сложностью декодирования, чем алгоритм Витерби на длинных сверточных кодах, которые потребовались бы для той же производительности. Конкатенация с внешним алгебраическим кодом (например, Рида–Соломона ) решает проблему пороговых значений ошибок, свойственных конструкциям турбокодов.