Преобразование многочленов сверточного кода в описание решетки
возвращает описание решетчатой структуры, соответствующее преобразованию для кодера скорости передачи K/N. K - количество входных битовых потоков в кодер, а N - количество выходных соединений. trellis = poly2trellis(ConstraintLength,CodeGenerator)ConstraintLength определяет задержку для входных битовых потоков в кодер. CodeGenerator определяет выходные соединения для входных битовых потоков с кодером.
Функция poly2trellis принимает полиномиальное описание сверточного кодера и возвращает соответствующее описание решетчатой структуры. Эти выходные данные могут использоваться в качестве входных данных для convenc и vitdec функции. Он также может использоваться в качестве значения параметра маски для блоков сверточного кодера, декодера Витерби и декодера APP.
Примечание
При использовании с полиномом обратной связи, poly2trellis делает обратную связь с входом решетки.
возвращает описание решетчатой структуры, соответствующее преобразованию для кодера K/N обратной связи скорости. K - количество входных битовых потоков в кодер, а N - количество выходных соединений. trellis = poly2trellis(ConstraintLength,CodeGenerator,FeedbackConnection)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, поскольку три битовых потока вырабатывают восемь различных выходных символов. Поскольку кодер имеет семь регистров полного сдвига, число возможных состояний равно 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);

Создать 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 подтверждает действительность шпалерной структуры.
Декодируйте с помощью 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);
ConstraintLength - Длина ограниченияДлина ограничения, заданная как вектор 1-by-K строки, определяющий задержку для каждого из K входных битовых потоков в кодер.
Типы данных: double
CodeGenerator - Генератор кодовГенератор кода, определяемый как матрица K-на-N восьмеричных чисел, массив ячеек K-на-N векторов многочленов или массив строк K-на-N. CodeGenerator определяет N выходных соединений для каждого из K входных битовых потоков к кодеру.
При использовании символьного представления для задания генератора кода можно указать многочлен в порядке возрастания или убывания, но poly2trellis функция всегда назначает регистры в порядке убывания с самым левым регистром для самого значащего бита (MSB). Дополнительные сведения см. в разделе Задание генераторов кода в полиномиальной форме.
Типы данных: double | char | string
FeedbackConnection - Подключение обратной связиСоединение обратной связи, указанное как вектор 1-by-K строки восьмеричных чисел, определяющий соединение обратной связи для каждого из K входных битовых потоков к кодеру.
Типы данных: double
trellis - Описание шпалерыОписание решетки, возвращаемое как структура с этими полями. Дополнительные сведения об этой структуре см. в разделе istrellis функция.
numInputSymbols - Количество входных символовКоличество входных символов, возвращаемых в виде скаляра со значением 2K. Это значение представляет количество входных символов для кодера, а K представляет количество входных битовых потоков.
numOutputSymbols - Количество выходных символовКоличество выходных символов, возвращаемых в виде скаляра со значением 2N. Это значение представляет количество выходных символов от кодера, а N представляет количество выходных битовых потоков.
numStates - Количество состоянийЧисло состояний в кодере, возвращаемое как скаляр.
nextStates - Следующие состоянияСледующие состояния для всех комбинаций текущих состояний и токовых входов, возвращаемые в виде numStates-by-2K матрица, где K представляет количество входных битовых потоков.
outputs - ВыходыВыходы для всех комбинаций текущих состояний и токовых входов, возвращаемые в виде numStates-by-2K матрице K представляет количество входных битовых потоков. Элементы этой матрицы - восьмеричные числа.
Входами должны быть константы, из которых может быть не более 3 (ConstraintLength, CodeGenerator, FeedbackConnection).
Имеется измененная версия этого примера. Открыть этот пример с помощью изменений?
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.