Создание, валидация и тестирование определяемой пользователем структуры решетки

Создайте определяемую пользователем структуру решетки

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

Даже при том, что poly2trellis не используется, чтобы создать структуру решетки, можно вручную создать структуру, затем использовать ту структуру решетки в качестве входной структуры решетки для энкодера и декодера. Сверточные блоки Энкодера и Декодера Витерби, используемые в модели Convolutional Encoder with Uncoded Bits и Feedback, загружают структуру решетки, созданную здесь с помощью PreLoadFcn 'callback'.

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

Создайте уровень 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);

Create 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);

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

istrellis(myTrellis)
ans = logical
   1

Возвращаемое значение 1 подтверждает, что структура решетки допустима.

Сверточный энкодер с незакодированными битами и обратной связью

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

Структура сверточного кода

Этот рисунок показывает сверточный код.

Структура примера

Главные компоненты в этом примере включают:

  • Путь к передаче, который создает представление сверточного энкодера с помощью дискретной низкоуровневой задержки и суммы (XOR) блоки. Это представление выглядит очень похожим на фигуру, показывающую структуру сверточного кода.

  • Передача - получает путь, который создает представление того же сверточного энкодера с помощью блока Convolutional Encoder. В этом случае описание энкодера в параметре структуры Решетки блока. Этот фрагмент модели также включает блок Viterbi Decoder, который декодирует сверточный код.

  • Оба пути вычисляют количество битовых ошибок.

Открытая модель в качестве примера и исследует свое содержимое

Откройте модель slex_commcnvencoder в качестве примера.

Результаты и отображения

Когда вы запускаете симуляцию, блок пометил Compare Encoder проверки, что два представления энкодера дают к тому же результату. Блок пометил Compare Encoder - Decoder проверки, что энкодер и декодер работают правильно парой. Каждый блок Display в модели показывает коэффициент ошибок нуля, как ожидалось.

Error rate for Compare Encoder signal: 0.000
Error rate for Compare Encoder-Decoder signal: 0.000