exponenta event banner

convenc

Сверточное кодирование двоичного сообщения

Описание

пример

codedout = convenc(msg,trellis) кодирует входное двоичное сообщение с использованием сверточного кодера, представленного решетчатой структурой. Для получения подробной информации о решетчатых структурах в MATLAB ® см. Описание сверточного кода. Входное сообщение содержит один или несколько символов, каждый из которых состоит из log2 (trellis.numInputSymbols) бит. Закодированный выход, codedout, содержит один или несколько символов, каждый из которых состоит из log2 (trellis.numOutputSymbols) бит.

пример

codedout = convenc(msg,trellis,puncpat)задает образец прокола, puncpat, чтобы обеспечить кодирование с более высокой скоростью, чем некунктированное кодирование.

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

пример

codedout = convenc(___,istate) позволяет регистрам кодера начинаться в состоянии, указанном istate. Определить istate как последний входной параметр, которому предшествует любая из комбинаций входных аргументов в предыдущих синтаксисах.

пример

[codedout,fstate] = convenc(___) также возвращает конечное состояние кодера. При звонке convenc итеративно, fstate обычно используется для установки istate для последующих вызовов convenc функция.

Примеры

свернуть все

Создание сверточных кодов с помощью решетчатой структуры. Можно определить решетку с помощью poly2trellis или путем задания решетчатой структуры вручную. В примере показаны оба метода.

Определение решетки с помощью poly2trellis функция

Определите решетчатую структуру, которая будет использоваться для конфигурирования кодировщика с помощью poly2trellis функция.

trellis_a = poly2trellis([5 4],[23 35 0; 0 5 13])
trellis_a = struct with fields:
     numInputSymbols: 4
    numOutputSymbols: 8
           numStates: 128
          nextStates: [128x4 double]
             outputs: [128x4 double]

Используйте решетчатую структуру для конфигурирования convenc функция. Кодирование пяти двухразрядных символов для K/N скорость 2/3 сверточный код с использованием convenc функция.

K = log2(trellis_a.numInputSymbols) % Number of input bit streams
K = 2
N = log2(trellis_a.numOutputSymbols) % Number of output bit streams
N = 3
numReg = log2(trellis_a.numStates) % Number of coder registers
numReg = 7
numSymPerFrame = 5; % Number of symbols per frame
data = randi([0 1],K*numSymPerFrame,1);
[code_a,fstate_a] = convenc(data,trellis_a);

Убедитесь, что кодированный выходной сигнал равен 15 битам, что равно 3/2 (N/K) умноженное на длину входной последовательности, data.

code_a'
ans = 1×15

     1     1     1     0     0     1     1     1     1     1     0     1     0     1     0

length(data)
ans = 10
length(code_a)
ans = 15

Определение решетки вручную

Вручную определите решетчатую структуру для K/N скорость 1/2 сверточного кода.

trellis_b = struct('numInputSymbols',2,'numOutputSymbols',4, ...
'numStates',4,'nextStates',[0 2;0 2;1 3;1 3], ...
'outputs',[0 3;1 2;3 0;2 1])
trellis_b = struct with fields:
     numInputSymbols: 2
    numOutputSymbols: 4
           numStates: 4
          nextStates: [4x2 double]
             outputs: [4x2 double]

Используйте решетчатую структуру для конфигурирования convenc функция при кодировании 10 однобитовых символов.

K = log2(trellis_b.numInputSymbols) % Number of input bit streams
K = 1
N = log2(trellis_b.numOutputSymbols) % Number of output bit streams
N = 2
numReg = log2(trellis_b.numStates) % Number of coder registers
numReg = 2
numSymPerFrame = 10; % Number of symbols per frame
data = randi([0 1],K*numSymPerFrame,1);
code_b = convenc(data,trellis_b);

Убедитесь, что кодированный выходной сигнал равен 20 битам, что равно 2/1 (N/K) умноженное на длину входной последовательности, data.

code_b'
ans = 1×20

     0     0     1     1     0     0     1     0     1     0     1     1     0     1     1     1     0     0     0     1

length(data)
ans = 10
length(code_b)
ans = 20

Используйте прокалывание для регулировки K/N кодовая скорость сверточного кодера от 1/2 до 3/4.

Инициализация параметров для операции кодирования.

trellis = poly2trellis(7,[171 133])
trellis = struct with fields:
     numInputSymbols: 2
    numOutputSymbols: 4
           numStates: 64
          nextStates: [64x2 double]
             outputs: [64x2 double]

puncpat = [1;1;0];

Вычислите скорость кода без и с проколом.

K = log2(trellis.numInputSymbols); % Number of input streams
N = log2(trellis.numOutputSymbols); % Number of output streams
unpunc_coderate = K/N; % Unpunctured code rate
punc_coderate = (K/N)*length(puncpat)/sum(puncpat); % Punctured code rate
fprintf('K is %d and N is %d. The unpunctured code rate is %3.2f and the punctured code rate is %3.2f.\n',K,N,unpunc_coderate,punc_coderate)
K is 1 and N is 2. The unpunctured code rate is 0.50 and the punctured code rate is 0.75.

Сверточное кодирование трехбитового сообщения всех 1s без прокола, применяемого к кодированному выходу. Затем сверточно закодируйте то же самое сообщение с прокалыванием.

msg = ones(length(puncpat),1);
unpuncturedcode = convenc(msg,trellis);
puncturedcode = convenc(msg,trellis,puncpat);

Отображение сообщения, кода без замены, проколотого кода и шаблона прокола.

msg'
ans = 1×3

     1     1     1

unpuncturedcode'
ans = 1×6

     1     1     0     1     1     0

puncpat'
ans = 1×3

     1     1     0

puncturedcode'
ans = 1×4

     1     1     1     1

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

length(msg)/length(unpuncturedcode)
ans = 0.5000

При прокалывании передают биты в положениях 1 и 2 входного сообщения, в то время как бит в положении 3 удаляется. Для каждых трех битов входного сигнала проколотый код генерирует четыре бита выходного сигнала. Подтвердите, что результирующая кодовая скорость соответствует ожидаемой кодовой скорости 3/4.

length(msg)/length(puncturedcode)
ans = 0.7500

Используйте решетчатую структуру для конфигурирования сверточного кода передачи 1/2 на этой схеме.

Создайте решетчатую структуру, установив длину ограничения равной 3 и указав генератор кода как вектор восьмеричных значений. Диаграмма показывает двоичные значения и полиномиальную форму, указывая, что самый левый бит является самым значащим битом (MSB). Двоичный вектор [1 1 0] представляет восьмеричное число 6 и соответствует верхней строке двоичных цифр на диаграмме. Двоичный вектор [1 1 1] представляет восьмеричный 7 и соответствует нижней строке двоичных цифр на диаграмме. Эти двоичные цифры указывают соединения от выходов регистров к двум сумматорам на диаграмме.

trellis = poly2trellis(3,[6 7])
trellis = struct with fields:
     numInputSymbols: 2
    numOutputSymbols: 4
           numStates: 4
          nextStates: [4x2 double]
             outputs: [4x2 double]

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

data = randi([0 1],70,1);
codedData = convenc(data,trellis);
tbdepth = 34;
decodedData = vitdec(codedData,trellis,tbdepth,'trunc','hard');

Убедитесь, что декодированные данные содержат ошибки нулевого бита.

biterr(data,decodedData)
ans = 0

Создайте решетчатую структуру, чтобы представить систематический сверточный кодер скорости 1/2 с обратной связью, показанной на этой диаграмме.

Этот кодер имеет 5 для своей длины ограничения, [37 33] для своей матрицы полинома генератора и 37 для своего полинома соединения обратной связи.

Первый генераторный многочлен - восьмеричный 37. Второй генераторный многочлен - восьмеричный 33. Полином обратной связи - восьмеричный 37. Первый полином генератора соответствует полиному соединения обратной связи, поскольку первый выходной сигнал соответствует систематическим битам.

Двоичный вектор [1 1 1 1 1] представляет восьмеричное число 37 и соответствует верхней строке двоичных цифр на диаграмме. Двоичный вектор [1 1 0 1 1] представляет восьмеричное число 33 и соответствует нижней строке двоичных цифр на диаграмме. Эти двоичные цифры указывают соединения от выходов регистров к двум сумматорам на диаграмме. Начальный 1 соответствует входному биту.

Преобразование многочлена в решетчатую структуру с помощью poly2trellis функция. При использовании с полиномом обратной связи poly2trellis осуществляет обратную связь с входом решетки.

trellis = poly2trellis(5,[37 33],37)
trellis = struct with fields:
     numInputSymbols: 2
    numOutputSymbols: 4
           numStates: 16
          nextStates: [16x2 double]
             outputs: [16x2 double]

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

data = randi([0 1],70,1);
codedData = convenc(data,trellis);
tbdepth = 34; % Traceback depth for Viterbi decoder
decodedData = vitdec(codedData,trellis,tbdepth,'trunc','hard');

Убедитесь, что декодированные данные содержат ошибки нулевого бита.

biterr(data,decodedData)
ans = 0

Сравнение сверточного кодирования полного сообщения со сверточным кодированием сообщения в двух сегментах.

Эта диаграмма показывает кодер скорости 2/3 с двумя входными потоками, тремя выходными потоками и семью сдвиговыми регистрами.

Определите решетчатую структуру на диаграмме с помощью poly2trellis функция. Установите для длины ограничения верхнего контура значение 5, а для длины ограничения нижнего контура значение 4. Восьмеричное представление матрицы генератора кода соответствует отводам от верхнего и нижнего регистров сдвига.

trellis = poly2trellis([5 4],[23 35 0; 0 5 13]);

Проверьте конфигурацию кодера.

K = log2(trellis.numInputSymbols) % Number of input bit streams
K = 2
N = log2(trellis.numOutputSymbols) % Number of output bit streams
N = 3
coderate = K/N
coderate = 0.6667
numReg = log2(trellis.numStates) % Number of coder registers
numReg = 7

Определите сообщение с пятью двухразрядными входными символами.

numSymPerFrame = 5; % Number of symbols per frame
msg = randi([0 1],K*numSymPerFrame,1);

Закодируйте полное сообщение с помощью решетки для конфигурирования convenc функция.

[code_a,fstate_a] = convenc(msg,trellis);

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

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

[code_a1,fstate_a1] = convenc(msg(1:6),trellis);

Закодируйте остальную часть сообщения, используя конечное состояние, fstate_a1, в качестве входного аргумента начального состояния.

[code_a2,fstate_a2] = convenc(msg(7:end),trellis,fstate_a1);

Убедитесь, что закодированное сообщение полностью, code_a, соответствует соединенному кусочно-кодированному сообщению, [code_a1; code_a2].

isequal(code_a,[code_a1; code_a2])
ans = logical
   1

Убедитесь, что конечное состояние, fstate_aкодера после того, как полное кодирование сообщения соответствует конечному состоянию, fstate_a2кодера после кодирования кусочного сообщения.

isequal(fstate_a,fstate_a2)
ans = logical
   1

Входные аргументы

свернуть все

Двоичное сообщение, указанное как вектор двоичных значений. msg должен содержать один или несколько символов. Каждый символ должен состоять из log2 (trellis.numInputSymbols) бит.

Пример: [1 1 0 1 0 0 1 1] задает сообщение как двоичный вектор строки с восемью элементами.

Типы данных: double | logical

Описание решетки, указанное как структура MATLAB, которая содержит описание решетки для кода скорости K/N. K представляет количество входных битовых потоков, а N представляет количество выходных битовых потоков.

Решетчатая структура содержит эти поля. Вы можете либо использовать poly2trellis создать решетчатую структуру или создать ее вручную. Дополнительные сведения об этой структуре см. в разделе Описание сверточного кода и istrellis функция.

Число символов, вводимых в кодер, указанное как целое число, равное 2K, где K - количество входных битовых потоков.

Типы данных: double

Число символов, выводимых из кодера, указанное как целое число, равное 2N, где N - количество выходных битовых потоков.

Типы данных: double

Количество состояний в кодере, указанное как мощность 2.

Типы данных: double

Следующие состояния для всех комбинаций текущих состояний и текущих входов, заданных как матрица целых чисел. Размер матрицы должен быть numStates-by-2K.

Типы данных: double

Выходы для всех комбинаций текущих состояний и токовых входов, заданных как матрица восьмеричных чисел. Размер матрицы должен быть numStates-by-2K.

Типы данных: double

Типы данных: struct

Образец прокола, заданный как вектор двоичных значений. Указать проколотые биты с помощью 0s и необработанные биты с 1с. Длина puncpat вектор должен быть целочисленным делителем длины вектора входного сообщения, length(msg).

Типы данных: double

Начальное состояние, используемое для регистров кодера, задается как целое скалярное число в диапазоне [0, (trellis.numStates – 1)].

Типы данных: double

Выходные аргументы

свернуть все

Сверточно закодированное сообщение, возвращаемое как вектор двоичных значений. Этот выходной вектор имеет тот же тип данных и ориентацию, что и входной msg. Каждый символ в codedout состоит из log2 (trellis.numOutputSymbols) бит.

Типы данных: double | logical

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

Типы данных: double

Подробнее

свернуть все

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

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

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

Для декодирования сверточно закодированного выходного сигнала можно использовать:

  • vitdec функции или comm.ViterbiDecoder Системный object™ - использует алгоритм Витерби с декодированием с жестким и мягким решением

  • comm.APPDecoder Системный объект - использует декодер апостериорной вероятности для мягкого декодирования выходных данных сверточных кодов

Ссылки

[1] Кларк, Джордж К. и J. Затвор Каин. Кодирование с исправлением ошибок для цифровой связи. Приложения теории коммуникаций. Нью-Йорк: Пленум Пресс, 1981.

[2] Гитлин, Ричард Д., Иеремия Ф. Хейз и Стивен Б. Вайнштейн. Принципы передачи данных. Приложения теории коммуникаций. Нью-Йорк: Пленум Пресс, 1992.

[3] Ясуда, Я., К. Кашики и Я. Хирата. «Высокоскоростные проколотые сверточные коды для декодирования Витерби с мягким решением». IEEE Transactions on Communications 32, No. 3 (март 1984 года): 315-19. https://doi.org/10.1109/TCOM.1984.1096047.

[4] Haccoun, D. и G. Начать. «Высокоскоростные проколотые сверточные коды для Витерби и последовательного декодирования». IEEE Transactions on Communications 37, No. 11 (ноябрь 1989 года): 1113-25. https://doi.org/10.1109/26.46505.

[5] Бегин, Г., Д. Хаккун и К. Пакин. «Дальнейшие результаты по высокоскоростным проколотым сверточным кодам для Витерби и последовательного декодирования». IEEE Transactions on Communications 38, No. 11 (ноябрь 1990 года): 1922-28. https://doi.org/10.1109/26.61470.

Расширенные возможности

.
Представлен до R2006a