poly2trellis

Преобразуйте полиномы сверточного кода в описание шпалеры

Описание

пример

trellis = poly2trellis(ConstraintLength,CodeGenerator) возвращает описание структуры решетки, соответствующее преобразованию для энкодера скорости K/ N с feedforward. K - количество входных битовых потоков к энкодеру, а N - количество выходных соединений. ConstraintLength задает задержку для входа битовых потоков к энкодеру. CodeGenerator задает выход соединения для входа битовых потоков к энкодеру.

Функция poly2trellis принимает полиномиальное описание сверточного энкодера и возвращает соответствующее описание структуры шпалеры. Этот выход может использоваться как вход в convenc и vitdec функций. Он также может использоваться как маска- значение параметров для блоков Convolutional Encoder, Viterbi Decoder и APP Decoder.

Примечание

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

trellis = poly2trellis(ConstraintLength,CodeGenerator,FeedbackConnection) возвращает описание структуры решетки, соответствующее преобразованию для энкодера обратной связи со скоростью K/ N. K - количество входных битовых потоков к энкодеру, а N - количество выходных соединений. ConstraintLength задает задержку для входа битовых потоков к энкодеру. CodeGenerator задает выход соединения для входа битовых потоков к энкодеру. FeedbackConnection задает соединение с обратной связью для каждого из K входных битовых потоков к энкодеру.

Примеры

свернуть все

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

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

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

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

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

Поле структуры numInputSymbols равен 4, потому что два потока битов могут производить четыре различных входных символа. Поле структуры numOutputSymbols равен 8, потому что три потока битов производят восемь различных выходных символов. Поскольку энкодер имеет семь общих регистров сдвига, количество возможных состояний 27=128, как показано на nextStates поле.

Отображение первых пяти строк trellis.nextStates 128 на 4 матрица.

trellis.nextStates(1:5,:)
ans = 5×4

     0    64     8    72
     0    64     8    72
     1    65     9    73
     1    65     9    73
     2    66    10    74

Создайте решетчатую структуру, чтобы представлять систематический сверточный энкодер скорости 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

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

Используйте структуру шпалеры, чтобы сконфигурировать сверточный код скорости 1/2 с прямой связью в этой схеме. Схема указывает двоичные значения и полиномиальную форму, указывая, что самый левый бит является самым значимым-битом (MSB).

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

trellis_poly = poly2trellis(4,{'x3 + x','x3 + x2 + 1'})
trellis_poly = struct with fields:
     numInputSymbols: 2
    numOutputSymbols: 4
           numStates: 8
          nextStates: [8x2 double]
             outputs: [8x2 double]

Двоичный вектор [1 0 1 0] представляет восьмеричный 12 и соответствует верхней строке двоичных цифр в схеме. Двоичный вектор [1 1 0 1] представляет восьмиугольный 15 и соответствует нижней строке двоичных цифр в схеме. Используйте восьмеричное представление, чтобы задать генераторы кода для эквивалентной структуры шпалеры.

trellis = poly2trellis(4,[12 15])
trellis = struct with fields:
     numInputSymbols: 2
    numOutputSymbols: 4
           numStates: 8
          nextStates: [8x2 double]
             outputs: [8x2 double]

Использование isequal чтобы подтвердить, что две решетки равны.

isequal(trellis,trellis_poly)
ans = logical
   1

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

Можно вручную создать структуру шпалеры, а затем использовать ее как вход шпалеры для энкодера и декодера. Блоки Convolutional Encoder и Viterbi Decoder, используемые в модели Convolutional Encoder с незакодированными битами и обратной связью, загружают решетчатую структуру, созданную здесь с помощью PreLoadFcn коллбэк.

Сверточный энкодер

Создайте сверточный энкодер скорости 3/4 с обратным соединением, бит MSB которого остается незакодированным.

Объявить переменные согласно спецификациям.

K = 3;
N = 4;
constraintLength = 4;

Создайте решетчатую структуру

Решетка представлена структурой со следующими полями:

  • numInputSymbols - Количество входа символов

  • numOutputSymbols - Количество выхода символов

  • numStates - Количество состояний

  • nextStates - Матрица следующего состояния

  • outputs - Выходная матрица

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

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

clear myTrellis;

Задайте поля структуры шпалеры.

myTrellis.numInputSymbols = 2^K;
myTrellis.numOutputSymbols = 2^N;
myTrellis.numStates  = 2^(constraintLength-1);

Создание nextStates Матрица

The nextStates матрица является [numStates x numInputSymbols] матрица. Элемент (i, j) следующей матрицы состояний является полученным индексом конечного состояния, который соответствует переходу от начального состояния i для входа, равного j.

myTrellis.nextStates = [0  1  2  3  0  1  2  3; ...
                        6  7  4  5  6  7  4  5; ...
                        1  0  3  2  1  0  3  2; ...
                        7  6  5  4  7  6  5  4; ...
                        2  3  0  1  2  3  0  1; ...
                        4  5  6  7  4  5  6  7; ...
                        3  2  1  0  3  2  1  0; ...
                        5  4  7  6  5  4  7  6]    
myTrellis = struct with fields:
     numInputSymbols: 8
    numOutputSymbols: 16
           numStates: 8
          nextStates: [8x8 double]

График nextStates Матрица

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

commcnv_plotnextstates(myTrellis.nextStates);

Figure contains 2 axes. Axes 1 with title Plot of {\itNextStates} Matrix contains 8 objects of type line. Axes 2 is empty.

Создание outputsМатрица

The outputs матрица является [numStates x numInputSymbols] матрица. Элемент (i, j) выходной матрицы является выходным символом в восьмеричном формате, заданном текущим состоянием i для входа, равного j.

outputs =  [0  2  4  6  10  12  14  16; ...
            1  3  5  7  11  13  15  17; ...
            0  2  4  6  10  12  14  16; ...
            1  3  5  7  11  13  15  17; ...
            0  2  4  6  10  12  14  16; ...
            1  3  5  7  11  13  15  17; ...
            0  2  4  6  10  12  14  16; ...
            1  3  5  7  11  13  15  17]
outputs = 8×8

     0     2     4     6    10    12    14    16
     1     3     5     7    11    13    15    17
     0     2     4     6    10    12    14    16
     1     3     5     7    11    13    15    17
     0     2     4     6    10    12    14    16
     1     3     5     7    11    13    15    17
     0     2     4     6    10    12    14    16
     1     3     5     7    11    13    15    17

Использование oct2dec отображение этих значений в десятичном формате.

outputs_dec = oct2dec(outputs)
outputs_dec = 8×8

     0     2     4     6     8    10    12    14
     1     3     5     7     9    11    13    15
     0     2     4     6     8    10    12    14
     1     3     5     7     9    11    13    15
     0     2     4     6     8    10    12    14
     1     3     5     7     9    11    13    15
     0     2     4     6     8    10    12    14
     1     3     5     7     9    11    13    15

Скопируйте матрицу выходов в myTrellis структура.

myTrellis.outputs = outputs
myTrellis = struct with fields:
     numInputSymbols: 8
    numOutputSymbols: 16
           numStates: 8
          nextStates: [8x8 double]
             outputs: [8x8 double]

График outputs Матрица

Используйте commcnv_plotoutputs вспомогательная функция для построения графика outputs матрица для иллюстрации возможных выходных символов для заданного состояния в зависимости от входного символа.

commcnv_plotoutputs(myTrellis.outputs, myTrellis.numOutputSymbols);

Figure contains 2 axes. Axes 1 with title Plot of {\itOutputs} Matrix contains 8 objects of type line. Axes 2 is empty.

Проверяйте полученную структуру шпалеры

istrellis(myTrellis)
ans = logical
   1

А возврат значение 1 подтверждает действительность структуры шпалеры.

Декодируйте с 3-битными мягкими решениями, разделенными так, чтобы значения около 0 сопоставлялись с 0, и значения около 1 сопоставлялись с 7. Если вашему приложению требуется лучшая эффективность декодирования, улучшите раздел, чтобы получить более мелкое квантование.

Пример декодирует код и вычисляет вероятность битовой ошибки. При сравнении декодированных данных с исходным сообщением в примере должна учитываться задержка декодирования. Непрерывный режим работы декодера Viterbi вызывает задержку, равную длине обратного вызова, так msg(1) соответствует decoded(tblen+1) вместо того, чтобы decoded(1).

Setup системы

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

stream = RandStream.create('mt19937ar', 'seed',94384);
prevStream = RandStream.setGlobalStream(stream);
msg = randi([0 1],4000,1); % Random data

trellis = poly2trellis(7,[171 133]); % Define trellis

ber = zeros(3,1); % Store BER values
tblen = 48; % Traceback length

Создайте Системный объект канала AWGN, Системного объекта декодера Viterbi и Системного объекта калькулятора частоты ошибок. Учитывайте задержку приема, вызванную длиной обратного вызова декодера Viterbi.

awgnChan = comm.AWGNChannel('NoiseMethod','Signal to noise ratio (SNR)','SNR',6);
vitDec = comm.ViterbiDecoder(trellis,'InputFormat','Soft', ...
    'SoftInputWordLength',3,'TracebackDepth',tblen,'TerminationMethod','Continuous');
errorCalc = comm.ErrorRate('ReceiveDelay', tblen);

Запуск кодирования и декодирования

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

code = convenc(msg,trellis);
awgnChan.SignalPower = (code'*code)/length(code);
ncode = awgnChan(code);

Использование quantiz сопоставить значения зашумленных данных с соответствующими целыми числами решающего значения в диапазоне от 0 до 7. Второй аргумент в quantiz вектор секционирования, который определяет, какие значения данных сопоставлены с 0, 1, 2 и т.д.

qcode = quantiz(ncode,[0.001,0.1,0.3,0.5,0.7,0.9,0.999]);
decoded = vitDec(qcode);

Вычислите вероятность битовой ошибки.

ber = errorCalc(msg,decoded);
ratio = ber(1)
ratio = 0.0013
number = ber(2)
number = 5
RandStream.setGlobalStream(prevStream);

Входные параметры

свернуть все

Длина ограничения, заданная как 1-байтовый K вектор-строка, определяющий задержку для каждого из K входных битовых потоков в энкодер.

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

Генератор кода, заданный как K -by- N матрица октальных чисел, K -by- N массив ячеек полиномиальных символьных векторов или K -by- N строковые массивы. CodeGenerator задает N выходов соединения для каждого из K входных битовых потоков к энкодеру.

При использовании символа представления для задания генератора кода можно задать полином в порядке возрастания или убывания, но poly2trellis функция всегда присваивает регистры в порядке убывания с самым левым регистром для самого значимого бита (MSB). Для получения дополнительной информации см. «Установка генераторов кода в полиномиальной форме».

Типы данных: double | char | string

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

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

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

свернуть все

Описание Trellis, возвращаемое как структура с этими полями. Для получения дополнительной информации об этой структуре смотрите istrellis функция.

Поля структуры Trellis для кода скорости K/ N

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

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

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

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

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

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

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