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