Convolutionally декодируют использование двоичных данных алгоритм Viterbi
decoded = vitdec(code,trellis,tblen,opmode,dectype)
decoded = vitdec(code,trellis,tblen,opmode,'soft',nsdec)
decoded = ...
vitdec(code,trellis,tblen,opmode,dectype,puncpat)
decoded = ...
vitdec(code,trellis,tblen,opmode,dectype,puncpat,eraspat)
decoded = ...
vitdec(...,'cont',...,initmetric,initstates,initinputs)
[decoded,finalmetric,finalstates,finalinputs] = ...
vitdec(...,'cont',...)
decoded = vitdec(code,trellis,tblen, декодирует векторный opmode,dectype)code с помощью алгоритма Viterbi. trellis структуры MATLAB® задает сверточный энкодер, который произвел code; формат trellis описан в Описании Решетки Сверточного кода и страницы с описанием для функции istrellis. code содержит один или несколько символов, каждый из которых состоит из битов log2(trellis.numOutputSymbols). Каждый символ в векторном decoded состоит из битов log2(trellis.numInputSymbols). tblen является положительным целочисленным скаляром, который задает traceback глубину. Если уровень кода является 1/2, типичное значение для tblen является приблизительно пять раз продолжительностью ограничения кода.
opmode указывает на режим работы декодера и его предположения о работе соответствующего энкодера. Выбор находится в приведенной ниже таблице.
Значения Входа opmode
| Значение | Значение |
|---|---|
'cont'
| Энкодер принят, чтобы запуститься во все-нулевом состоянии. Декодер прослеживает от состояния с лучшей метрикой. Задержка, равная символам tblen, протекает, прежде чем первый декодируемый символ появляется в выводе. Этот режим является соответствующим, когда вы неоднократно вызываете эту функцию и хотите сохранить непрерывность между последовательными вызовами. Смотрите непрерывные синтаксисы режима работы ниже. |
'term' | Энкодер принят, чтобы и запуститься и закончиться во все-нулевом состоянии, которое верно для синтаксиса по умолчанию функции convenc. Декодер прослеживает от все-нулевого состояния. Этот режим не подвергается никакой задержке. Этот режим является соответствующим, когда незакодированное сообщение (то есть, вход к convenc) имеет достаточно нулей в конце, чтобы заполнить все регистры памяти энкодера. Если энкодер имеет потоки входа k и вектор продолжительности ограничения constr (использующий полиномиальное описание энкодера), “достаточно” означает k*max(constr-1). |
'trunc'
| Энкодер принят, чтобы запуститься во все-нулевом состоянии. Декодер прослеживает от состояния с лучшей метрикой. Этот режим не подвергается никакой задержке. Этот режим является соответствующим, когда вы не можете принять энкодер, законченный во все-нулевом состоянии и когда вы не хотите сохранять непрерывность между последовательными вызовами этой функции. |
Для режима 'term' и 'trunc' traceback глубина (tblen) должна быть положительным значением целочисленного скаляра, не больше, чем количество вводимых символов в code.
dectype указывает на тип решения, которое декодер принимает и влияет на тип данных, которые декодер ожидает в code. Выбор находится в приведенной ниже таблице.
Значения Входа dectype
| Значение | Значение |
|---|---|
'unquant' | code содержит действительные входные значения, где 1 представляет логический нуль, и-1 представляет логическую единицу. |
'hard'
| code содержит значения двоичного входа. |
'soft' | Для декодирования мягкого решения используйте синтаксис ниже. nsdec требуется для декодирования мягкого решения. |
decoded = vitdec(code,trellis,tblen, декодирует векторный opmode,'soft',nsdec)code с помощью декодирования мягкого решения. code состоит из целых чисел между 0 и 2^nsdec-1, где 0 представляет самый уверенный 0, и 2^nsdec-1 представляет самый уверенный 1. Существующая реализация функциональности поддерживает до 13 битов квантования, означая, что nsdec может быть установлен до 13. Для ссылки 3 бита квантования на приблизительно 2 дб лучше, чем декодирование трудного решения.
decoded = ...
vitdec(code,trellis,tblen, обозначает, что вход проколол opmode,dectype,puncpat)code, где puncpat является вектором шаблона прокола, и где 0 s указывает на проколотые биты во входном коде.
decoded = ...
vitdec(code,trellis,tblen, позволяет вектору шаблона стирания, opmode,dectype,puncpat,eraspat)eraspat, быть заданным для входа code, где 1 s указывает на соответствующие стирания. eraspat и code должны иметь ту же длину. Если прокалывание не используется, задайте puncpat, чтобы быть []. В векторе eraspat 1 s указывает на стирания во входном коде.
Непрерывный режим работы позволяет вам сохранить информацию внутреннего состояния декодера для использования в последующем вызове этой функции. Повторные вызовы этой функции полезны, если ваши данные разделены в серию меньших векторов, которые вы обрабатываете в цикле, например.
decoded = ...
vitdec(...,' совпадает с более ранними синтаксисами, за исключением того, что декодер запускается со своих метрик состояния, traceback состояния и входные параметры traceback, заданные cont',...,initmetric,initstates,initinputs) initmetric, initstates и initinputs, соответственно. Каждое вещественное число в initmetric представляет метрику начального состояния соответствующего состояния. initstates и initinputs совместно задают начальную букву traceback память о декодере; оба - trellis.numStates-by-tblen матрицы. initstates состоит из целых чисел между 0 и trellis.numStates-1. Если схематичный энкодер имеет больше чем один входной поток, сдвиговый регистр, который получает первый входной поток, обеспечивает младшие значащие биты в initstates, в то время как сдвиговый регистр, который получает последний входной поток, обеспечивает старшие значащие биты в initstates. Векторный initinputs состоит из целых чисел между 0 и trellis.numInputSymbols-1. Чтобы использовать значения по умолчанию для всех последних трех аргументов, задайте их как [],[],[].
[decoded,finalmetric,finalstates,finalinputs] = ...
vitdec(...,' совпадает с более ранними синтаксисами, за исключением того, что итоговые три выходных аргумента возвращают метрики состояния, traceback состояния и входные параметры traceback, соответственно, в конце процесса декодирования. cont',...)finalmetric является вектором с элементами trellis.numStates, которые соответствуют метрикам конечного состояния. finalstates и finalinputs являются оба матрицами размера trellis.numStates-by-tblen. Элементы finalstates имеют тот же формат как те из initstates.
t th столбец P 1 показывает t - 1th временной шаг утверждает, учитывая входные параметры, перечисленные во входной матрице. Например, значение в i th строка показывает состояние во время t-1 что переходы к i-1 состояние во время t. Вход, требуемый для этого изменения состояния, дан в i th строку t th столбец входной матрицы.
P 1 вывод является состояниями traceback матрицы. Это [количество состояний x traceback длина] матрица. Следующий пример использует (7,5), уровень 1/2 код. Этому коду легко следовать:
t = poly2trellis (3, [7 5]);
k = log2 (t.numInputSymbols);
обменивайтесь сообщениями = [1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0];
код = convenc (сообщение, t); tblen = 15; [d1 m1 p1 in1] =vitdec (код (1:end/2), t, tblen, 'продолжение следует', 'трудно')
m1 =
0 3 2 3
p1 =
0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
2 3 3 2 2 3 3 2 2 3 3 2 2 3 3
0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
2 3 3 2 2 3 3 2 2 3 3 2 2 3 3
in1 =
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
В этом примере сообщение заставляет состояния энкодера следовать за следующей последовательностью:
0 2 3 1 / 0 2 3 1 / ...
Поскольку лучшим состоянием является 0 (индекс столбца самой маленькой метрики в m 1 - 1), traceback матрица начинает с 0 состояния, смотря на первую строку (0 th состояние) последнего столбца P 1, ([1; 3; 1; 3]), который является 1. Это указывает на 1 для предыдущего состояния.
Затем, traceback матрица проверяет in1 ([0; 0; 1; 1]), который указывает на 0 для входа. Вторая строка (1-е состояние) 14-го столбца P 1 ([1; 3; 1; 3]), 3. Это указывает на 3 для предыдущего состояния.
traceback матрица проверяет in1 ([0; 0; 1; 1]), который указывает, что вход был 0. Четвертая строка (3-е состояние) 13-го столбца P 1 ([0; 2; 0; 2]), 2. Это указывает на 2 для предыдущего состояния.
traceback матрица проверяет in1 ([0; 0; 1; 1]), который указывает, входом был 1. Третья строка (2-е состояние) 12-го столбца P 1 ([0; 2; 0; 2]), 0. Это указывает на 0 для предыдущего состояния.
traceback матрица проверяет in1 ([0; 0; 1; 1]), который указывает, входом был 1. Первая строка (0th состояние) 11-го столбца P 1 ([1; 3; 1; 3]), 1. Это указывает на 1 для предыдущего состояния. Затем матрица проверяет in1 ([0; 0; 1; 1]), который указывает на 0 для входа.
Чтобы определить лучшее состояние в течение данного времени, используйте m 1. Самый маленький номер в m 1 представляет лучшее состояние.
В порядке улучшать производительность кода C/C++, сгенерированного MATLAB, целостность и проверки скорости отклика должны быть отключены прежде, чем запустить функцию codegen. Смотрите Конструктивные соображения кода MATLAB для Генерации кода (Simulink) для получения дополнительной информации.
Например, учитывая следующую функцию:
function y = vitdec_hard(x,t,tb) %# codegen y = vitdec(x,t,tb,'trunc','hard');
Выполните эти команды для оптимальной производительности.
cf = coder.config; cf.IntegrityChecks = false; cf.ResponsivenessChecks = false; codegen('vitdec_hard','-args',{x,coder.Constant(t),tb})
Закодированные данные, x, структура решетки, t, и traceback длина, tb, должны быть заданы в базовом рабочем пространстве.
[1] Кларк, G. C. Младший и J. Затвор Каин., кодирование с коррекцией ошибок для цифровой связи, Нью-Йорка, нажатия пленума, 1981.
[2] Gitlin, Ричард Д., Иеремия Ф. Хейз, и Стивен Б. Вайнштейн, Дэта-Коммуникэйшнс-Принкиплс, Нью-Йорк, пленум, 1992.
[3] Хеллер, J. A. и я. М. Джейкобс, “Viterbi, Декодирующий для Спутника и Космической связи”, Транзакции IEEE на Коммуникационной технологии, Издании COM-19, октябрь 1971, стр 835–848.
[4] Yasuda, Y., и. al., “Высокий показатель проколол сверточные коды для мягкого решения декодирование Viterbi”, Транзакции IEEE на Коммуникациях, издании COM-32, № 3, стр 315–319, март 1984.
[5] Haccoun, D. и G. Начните, “Высокий показатель проколол сверточные коды для Viterbi и последовательного декодирования”, Транзакции IEEE на Коммуникациях, издании 37, № 11, стр 1113–1125, ноябрь 1989.
[6] G. Начните, et.al., “Дальнейшие результаты на высоком показателе прокололи сверточные коды для Viterbi и последовательного декодирования”, Транзакции IEEE на Коммуникациях, издании 38, № 11, стр 1922–1928, ноябрь 1990.