Сверточное декодирование двоичных данных с помощью алгоритма 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. Структура MATLAB® trellis
задает сверточный энкодер, который произвел 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
- 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
- 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.