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