convenc

Сверточно закодируйте двоичное сообщение

Описание

пример

codedout = convenc(msg,trellis) кодирует вход двоичное сообщение с помощью сверточного энкодера, представленного решетчатой структурой. Для получения дополнительной информации о решетчатых структурах в MATLAB®, см. Trellis Description of a Convolutional Code. Входное сообщение содержит один или несколько символов, каждый из которых состоит из лог2 (trellis. numInputSymbols) биты. Кодированный выход, codedout, содержит один или несколько символов, каждый из которых состоит из лог2 (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]

Сгенерируйте случайные двоичные данные. Сверточно закодируйте данные с помощью указанной структуры шпалеры. Декодируйте закодированные данные с помощью алгоритма Viterbi с заданной структурой решетки 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]

Сгенерируйте случайные двоичные данные. Сверточно закодируйте данные с помощью указанной структуры шпалеры. Декодируйте закодированные данные с помощью алгоритма Viterbi с заданной структурой решетки 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

свернуть все

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

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

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

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

Подробнее о

свернуть все

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

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

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

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

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

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

Ссылки

[1] Clark, George C., and J. Bibb Cain. Кодирование с исправлением ошибок для цифровых коммуникаций. Приложения теории связи. Нью-Йорк: Пленум Пресс, 1981.

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

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

[4] Haccoun, D., and G. Begin. «Высокоскоростные прокалываемые сверточные коды для Viterbi и последовательного декодирования». Транзакции IEEE по сообщениям 37, № 11 (ноябрь 1989 года): 1113-25. https://doi.org/10.1109/26.46505.

[5] Begin, G., D. Haccoun, and C. Paquin. «Дальнейшие результаты высокоскоростных прокалываемых сверточных кодов для Viterbi и последовательного декодирования». Транзакции IEEE по коммуникациям 38, № 11 (ноябрь 1990 года): 1922-28. https://doi.org/10.1109/26.61470.

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

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