Преобразуйте полиномы сверточного кода в описание решетки
trellis = poly2trellis(ConstraintLength,CodeGenerator)
trellis = poly2trellis(ConstraintLength,CodeGenerator,FeedbackConnection)
возвращает описание структуры решетки, соответствующее преобразованию для уровня K / N feedforward энкодер. K является количеством входных потоков битов к энкодеру, и N является количеством выходных связей. trellis
= poly2trellis(ConstraintLength
,CodeGenerator
)ConstraintLength
задает задержку входных потоков битов к энкодеру. CodeGenerator
задает выходные связи для входных потоков битов к энкодеру.
Функция poly2trellis принимает полиномиальное описание сверточного энкодера и возвращает соответствующее описание структуры решетки. Этот вывод может использоваться в качестве входа к функциям vitdec
и convenc
. Это может также использоваться в качестве значения параметров маски для Сверточного Энкодера, Декодера Витерби и блоков Декодера APP.
Когда используется с полиномом обратной связи, poly2trellis устанавливает связь обратной связи с входом решетки.
возвращает описание структуры решетки, соответствующее преобразованию для уровня K / энкодер обратной связи N. K является количеством входных потоков битов к энкодеру, и N является количеством выходных связей. trellis
= poly2trellis(ConstraintLength
,CodeGenerator
,FeedbackConnection
)ConstraintLength
задает задержку входных потоков битов к энкодеру. CodeGenerator
задает выходные связи для входных потоков битов к энкодеру. FeedbackConnection
задает связь обратной связи для каждого из потоков битов входа K к энкодеру.
Создайте структуру решетки для уровня 1/2 систематический сверточный энкодер с обратной связью, которую показывают. Используйте решетку, чтобы закодировать и декодировать случайный поток битов.
Этот энкодер имеет продолжительность ограничения 5, матрицу полинома генератора [37 33], и полином связи обратной связи 37.
Первый полином генератора совпадает с полиномом связи обратной связи, потому что первый вывод соответствует систематическим битам. Полином обратной связи представлен бинарным вектором [1 1 1 1 1], соответствуя верхней строке двоичных цифр в схеме. Эти цифры указывают на связи от выходных параметров регистров к сумматору. Начальный 1 соответствует входному биту. Восьмеричное представление двоичного числа 11111 равняется 37.
Второй полином генератора представлен бинарным вектором [1 1 0 1 1], соответствуя более низкой строке двоичных цифр в схеме. Восьмеричное число, соответствующее двоичному числу 11011, равняется 33.
Используйте poly2trellis
, чтобы преобразовать полином в структуру решетки. Когда используется с полиномом обратной связи, poly2trellis
устанавливает связь обратной связи с входом решетки.
trellis = poly2trellis(5, [37 33], 37)
trellis = struct with fields:
numInputSymbols: 2
numOutputSymbols: 4
numStates: 16
nextStates: [16x2 double]
outputs: [16x2 double]
Сгенерируйте случайные двоичные данные, convolutionally закодируйте данные и декодируйте данные с помощью алгоритма Viterbi.
data = randi([0 1],70,1); codedData = convenc(data,trellis); decodedData = vitdec(codedData,trellis,34,'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
.
Отобразите первые пять строк 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 feedforward сверточный код. Используйте решетку, чтобы закодировать и декодировать случайный поток битов.
Создайте структуру решетки. Установите продолжительность ограничения на 7 и задайте генератор кода как массив ячеек полиномиальных векторов символов.
trellis = poly2trellis(7,{'1 + x^3 + x^4 + x^5 + x^6', ... '1 + x + x^3 + x^4 + x^6'})
trellis = struct with fields:
numInputSymbols: 2
numOutputSymbols: 4
numStates: 64
nextStates: [64x2 double]
outputs: [64x2 double]
Сгенерируйте случайные двоичные данные, convolutionally закодируйте данные и декодируйте данные с помощью алгоритма Viterbi.
data = randi([0 1],70,1); codedData = convenc(data,trellis); decodedData = vitdec(codedData,trellis,34,'trunc','hard');
Проверьте, что декодируемые данные не имеют никаких битовых ошибок.
biterr(data,decodedData)
ans = 0
Этот пример демонстрирует создание нестандартной структуры решетки для сверточного энкодера с незакодированными битами и обратной связью. Энкодер не может быть создан с помощью poly2trellis
, потому что специфические спецификации для энкодера не совпадают с входными требованиями poly2trellis
.
Даже при том, что poly2trellis
не используется, чтобы создать структуру решетки, можно вручную создать структуру, затем использовать ту структуру решетки в качестве входной структуры решетки для энкодера и декодера. Сверточные блоки Энкодера и Декодера Витерби, используемые в модели Convolutional Encoder with Uncoded Bits и Feedback, загружают структуру решетки, созданную здесь с помощью коллбэка PreLoadFcn
.
Сверточный энкодер
Создайте уровень 3/4 сверточный энкодер со связью обратной связи, бит MSB которой остается незакодированным.
Объявите переменные согласно спецификациям.
k = 3; n = 4; constraintLength = 4;
Создайте структуру решетки
Решетка представлена структурой со следующими полями:
numInputSymbols
– Количество вводимых символов
numOutputSymbols
– Количество выходных символов
numStates
– Количество состояний
nextStates
– Следующая матрица состояния
выходные параметры
Выходная матрица
Для получения дополнительной информации об этих полях структуры, смотрите 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 Matrix
Матрица 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. Если ваше приложение требует лучшей производительности декодирования, совершенствуйте раздел, чтобы получить более прекрасное квантование.
Пример декодирует код и вычисляет частоту ошибок по битам. При сравнении декодируемых данных с исходным сообщением пример должен принять задержку декодирования во внимание. Непрерывный режим работы Декодера Витерби вызывает задержку, равную traceback длине, таким образом, msg(1)
соответствует decoded(tblen+1)
, а не decoded(1)
.
Системный Setup
Инициализируйте динамические переменные для данных о сообщении, решетки, вычислений частоты ошибок по битам и traceback длины.
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, Системный объект Декодера Витерби и Системный объект калькулятора коэффициента ошибок. Объясните получить задержку, вызванную traceback длиной Декодера Витерби.
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);
Запустите кодирование и декодирование
Convolutionally кодируют сообщение, передачу в через фильтр 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 к энкодеру.
Для получения дополнительной информации смотрите Символьное представление Полиномов.
Типы данных: double
| char
| string
FeedbackConnection
— Связь обратной связиСвязь обратной связи, заданная как 1 K вектором - строкой из восьмеричных чисел, задающих связь обратной связи для каждого из потоков битов входа K к энкодеру.
Типы данных: double
trellis
— Описание решеткиОписание решетки, возвращенное как структура с этими полями. Для больше об этой структуре, смотрите, что istrellis
функционирует.
numInputSymbols
— Количество вводимых символовКоличество вводимых символов, возвращенных как скаляр со значением 2K. Это значение представляет количество вводимых символов к энкодеру.
numOutputSymbols
— Количество выходных символовКоличество выходных символов, возвращенных как скаляр со значением 2N. Это значение представляет количество выходных символов от энкодера.
numStates
— Количество состоянийКоличество состояний в энкодере, возвращенном как скаляр.
nextStates
— Следующие состоянияСледующие состояния для всех комбинаций текущих состояний и текущих входных параметров, возвращенных как numStates
-by-2K матрица.
выходные параметры
Выходные параметры Выходные параметры для всех комбинаций текущих состояний и текущих входных параметров, возвращенных как numStates
-by-2K матрица. Элементы этой матрицы являются восьмеричными числами.
Входные параметры должны быть константами, , которых может быть самое большее 3 (ConstraintLength
, CodeGenerator
, FeedbackConnection
).
1. Если смысл перевода понятен, то лучше оставьте как есть и не придирайтесь к словам, синонимам и тому подобному. О вкусах не спорим.
2. Не дополняйте перевод комментариями “от себя”. В исправлении не должно появляться дополнительных смыслов и комментариев, отсутствующих в оригинале. Такие правки не получится интегрировать в алгоритме автоматического перевода.
3. Сохраняйте структуру оригинального текста - например, не разбивайте одно предложение на два.
4. Не имеет смысла однотипное исправление перевода какого-то термина во всех предложениях. Исправляйте только в одном месте. Когда Вашу правку одобрят, это исправление будет алгоритмически распространено и на другие части документации.
5. По иным вопросам, например если надо исправить заблокированное для перевода слово, обратитесь к редакторам через форму технической поддержки.