convenc

Convolutionally кодируют двоичное сообщение

Описание

пример

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 функция. Закодируйте пять двухбитовых символов для KN уровень 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 (NK) времена длина входной последовательности, 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

Задайте решетку вручную

Вручную задайте структуру решетки для KN уровень 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 (NK) времена длина входной последовательности, 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

Используйте прокалывание, чтобы настроить KN уровень кода сверточного энкодера от 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.

Convolutionally кодируют всю 1 с, трехбитное сообщение, не прокалывая применилось к закодированному выходу. Затем convolutionally закодируйте то же сообщение с прокалыванием.

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]

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

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]

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

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- 2K.

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

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

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

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

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

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

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

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

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

свернуть все

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

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

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

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

Больше о

свернуть все

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

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

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

Чтобы декодировать convolutionally закодированный выход, можно использовать:

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

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

Ссылки

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

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

[3] Yasuda, Y., К. Кэшики и И. Хирэта. “Высокий показатель Проколотые Сверточные коды для Мягкого Решения Декодирование Viterbi”. Транзакции IEEE на Коммуникациях 32, № 3 (март 1984): 315–19. https://doi.org/10.1109/TCOM.1984.1096047.

[4] Haccoun, D. и G. Начало. “Высокий показатель Проколотые Сверточные коды для Viterbi и Sequential Decoding”. Транзакции IEEE на Коммуникациях 37, № 11 (ноябрь 1989): 1113–25. https://doi.org/10.1109/26.46505.

[5] Начните, G., Д. Хэккун и К. Пакуин. “Дальнейшие Результаты на Высоком показателе Проколотые Сверточные коды для Viterbi и Sequential Decoding”. Транзакции IEEE на Коммуникациях 38, № 11 (ноябрь 1990): 1922–28. https://doi.org/10.1109/26.61470.

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

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