exponenta event banner

poly2trellis

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

Описание

пример

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

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

Примечание

При использовании с полиномом обратной связи, 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]

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

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

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]

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

Можно вручную создать решетчатую структуру, а затем использовать ее в качестве входной решетчатой структуры для кодера и декодера. Блоки сверточного кодера и декодера Витерби, используемые в сверточном кодере с некодированными битами и моделью обратной связи, загружают решетчатую структуру, созданную здесь с помощью 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 Матрица

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 Матрица

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

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

Настройка системы

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

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

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, квантуют шумное сообщение для декодирования с мягким решением. Выполнять декодирование Витерби с использованием решетки, сгенерированной с помощью 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-by-K строки, определяющий задержку для каждого из K входных битовых потоков в кодер.

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

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

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

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

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

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

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

свернуть все

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

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

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

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

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

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

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

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

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