vitdec

Сверточное декодирование двоичных данных при помощи алгоритма Viterbi

Описание

пример

decodedout = vitdec(codedin,trellis,tbdepth,opmode,dectype) декодирует каждый символ codedin введите при помощи алгоритма Viterbi. Все другие входные параметры задают сверточную решетку кодирования, traceback глубина, рабочий режим и тип решения, соответственно и коллективно конфигурируют алгоритм Viterbi во времени выполнения.

decodedout = vitdec(codedin,trellis,tbdepth,opmode,'soft',nsdec) конфигурирует алгоритм Viterbi для декодирования мягкого решения для dectype и с nsdec биты квантования.

пример

decodedout = vitdec(codedin,trellis,tbdepth,opmode,dectype,puncpat) декодирует каждый символ проколотого codedin введите, где puncpat шаблон прокола.

decodedout = vitdec(codedin,trellis,tbdepth,opmode,dectype,puncpat,eraspat) задает шаблон стирания, eraspat. Чтобы не использовать прокалывание, задайте puncpat как [].

decodedout = vitdec(codedin,trellis,tbdepth,'cont',dectype,___,imetric,istate,iinput) задает непрерывный режим работы для opmode для любого из предыдущих синтаксисов. Декодер запускается со своих метрик начального состояния, traceback состояния и входные параметры traceback, заданные imetric, istate, и iinput, соответственно.

Непрерывный режим работы позволяет вам сохранить информацию внутреннего состояния декодера для использования в последующих вызовах этой функции. Повторные вызовы этой функции могут быть полезными, если ваши данные разделены в серию векторов, которые вы обрабатываете в цикле. Для рабочих процессов, которые требуют повторных вызовов Viterbi, декодирующего алгоритм, смотрите Советы.

[decodedout,fmetric,fstate,finput] = vitdec(codedin,trellis,tbdepth,'cont',___) также возвращает метрики конечного состояния, traceback состояния и входные параметры traceback в конце процесса декодирования при использовании непрерывного режима работы для любого из предыдущих синтаксисов. Используйте fmetric, fstate, и finput как начальные установки imetric, istate, и iinput, соответственно, в последующих вызовах этой функции. Для рабочих процессов, которые требуют повторных вызовов Viterbi, декодирующего алгоритм, смотрите Советы.

Примеры

свернуть все

Convolutionally кодируют вектор 1 с при помощи convenc функция, и декодирует его при помощи vitdec функция.

Задайте структуру решетки, при помощи poly2trellis функция. Используйте структуру решетки, чтобы сконфигурировать convenc функционируйте при кодировании вектора из единиц.

trellis = poly2trellis([4 3],[4 5 17;7 4 2]);
x = ones(100,1);
code = convenc(x,trellis);

При декодировании закодированного сообщения сконфигурируйте Декодер Витерби, чтобы использовать структуру решетки, заданную ранее, traceback глубина 2, усеченный рабочий режим и трудные решения.

tb = 2;
decoded = vitdec(code,trellis,tb,'trunc','hard');

Проверьте, что декодируемое сообщение является вектором 100 1 с.

isequal(decoded,ones(100,1))
ans = logical
   1

Примените Viterbi, декодирующий к проколотому сигналу. Прокалывание изменяет уровень кода от 1/2 до 3/4.

Инициализируйте параметры для кодирования и декодирования операций.

trellis = poly2trellis(7,[171 133])
trellis = struct with fields:
     numInputSymbols: 2
    numOutputSymbols: 4
           numStates: 64
          nextStates: [64x2 double]
             outputs: [64x2 double]

puncpat = [1;1;0;1;1;0];
tbdepth = 96;
opmode = 'trunc';
dectype = 'hard';

Вычислите непроколотые и проколотые уровни кода.

K = log2(trellis.numInputSymbols); % Number of input streams
N = log2(trellis.numOutputSymbols); % Number of output streams
unpunc_coderate = K/N % Unpunctured code rate
unpunc_coderate = 0.5000
punc_coderate = (K/N)*(length(puncpat)/sum(puncpat)) % Punctured code rate
punc_coderate = 0.7500

Convolutionally кодируют все 1 сообщение бита с с прокалыванием, применился к закодированному выходу.

msg = ones(100*length(puncpat),1);
puncturedcode = convenc(msg,trellis,puncpat);

Покажите длины сообщения, проколотого кода и шаблона прокола.

length(msg)
ans = 600
length(puncturedcode)
ans = 800
length(puncpat)
ans = 6

Примените Viterbi, декодирующий к проколотому закодированному сообщению. Сравните декодируемый выход с исходным сообщением. Даже с прокалыванием применился к закодированному сообщению, декодирование Viterbi восстановило сообщение с нулевой ошибкой.

codedin = puncturedcode;
decodedout = vitdec(codedin,trellis,tbdepth,opmode,dectype,puncpat);
isequal(msg,decodedout)
ans = logical
   1

Оцените симуляцию частоты ошибок по битам (BER) для ссылки, которая использует уровень 2/3 сверточный код, применяет 16-QAM модуляцию и передает данные через канал AWGN. Эта схема показывает уровень 2/3 энкодер с двумя входными потоками, тремя потоками вывода и семью сдвиговыми регистрами.

Задайте сверточную решетку кодирования, представленную схемой.

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]

K = log2(trellis.numInputSymbols); % Number of input bit streams
N = log2(trellis.numOutputSymbols); % Number of output bit streams
coderate = K/N;

fprintf('K is %d and N is %d. The code rate is %3.2f.\n', ...
    K,N,coderate)
K is 2 and N is 3. The code rate is 0.67.

Установите порядок модуляции и вычислите количество битов на символ модуляции. Сгенерируйте случайные двоичные данные. Входной поток битов должен быть кратным количеству входных потоков битов (K) для операции кодирования и должен быть кратным количеству битов на символ модуляции (bps) для операции модуляции.

M = 16; % Modulation order
bps = log2(M); % Bits per modulation symbol
numSymPerFrame = 5000;
dataIn = randi([0 1],K*bps*numSymPerFrame,1);

Convolutionally кодируют входные данные.

codedout = convenc(dataIn,trellis);

Примените 16-QAM модуляцию к закодированным символам.

txSig = qammod(codedout,M,'InputType','bit');

Используя количество битов на символ (бит/с) и уровень кода (coderate), преобразуйте отношение энергии на бит к шумовой степени спектральная плотность (EbNo) к сигналу к шуму (snr) значение для использования awgn функция. Преобразуйте Eb/No на 10 дБ в эквивалентное отношение ОСШ. Передайте сигнал через канал AWGN.

EbNo = 9;
snr = EbNo + 10*log10(bps*coderate);
rxSig = awgn(txSig,snr,'measured');

Демодулируйте полученный сигнал.

demodSig = qamdemod(rxSig,M,'OutputType','bit');

Задайте traceback глубину Декодера Витерби.

tbdepth = 16;

Декодируйте двоичный файл демодулируемый сигнал при помощи Декодера Витерби, действующего в непрерывном режиме завершения.

dataOut = vitdec(demodSig,trellis,tbdepth,'cont','hard');

Вычислите задержку через декодер и объясните задержку декодирования при вычислении BER. Сравните закодированный BER с теоретическим незакодированным BER, чтобы видеть улучшенный BER для закодированных данных.

decDelay = K*tbdepth;
berCoded = biterr(dataIn(1:end-decDelay),dataOut(decDelay+1:end))/length(dataOut(decDelay+1:end));
berUncoded = berawgn(EbNo,'qam',M);
fprintf('  The coded BER is %6.5f.\nThe uncoded BER is %6.5f.\n', ...
    berCoded,berUncoded)
  The coded BER is 0.00060.
The uncoded BER is 0.00439.

Входные параметры

свернуть все

Convolutionally закодировал сообщение в виде вектора двоичных или числовых значений. Каждый символ в codedin состоит из log2 (trellis.numOutputSymbols) биты.

Типы данных: double | logical

Описание решетки в виде структуры с этими полями для уровня K/N код. K представляет количество входных потоков битов, и N представляет количество выходных потоков битов. Можно или использовать poly2trellis функция, чтобы создать структуру решетки или создать его вручную. Для больше об этой структуре, см. Описание Решетки Сверточного кода и istrellis функция.

Поля структуры решетки для уровня K/N код

Количество вводимых символов в виде целого числа со значением 2K. Это значение представляет количество входа символов к энкодеру.

Типы данных: double

Количество выходных символов в виде целого числа со значением 2N. Это значение представляет количество символов выход от энкодера.

Типы данных: double

Количество состояний в энкодере в виде целого числа. numStates должна быть степень 2.

Типы данных: double

Следующие состояния для всех комбинаций текущих состояний и текущих входных параметров в виде numStates- 2N матрица целочисленных значений.

Типы данных: double

Выходные параметры для всех комбинаций текущих состояний и текущих входных параметров в виде numStates- 2N матрица целочисленных значений. Элементами этой матрицы должны быть восьмеричные числа.

Типы данных: double

Глубина Traceback в виде положительного целого числа. Для получения дополнительной информации см. Оценки Глубины Traceback.

Типы данных: double

Рабочий режим в виде 'cont', 'term', или 'trunc'. Этот вход указывает на рабочий режим декодера и этих предположений, сделанных о работе соответствующего энкодера.

  • 'cont' — Задает непрерывный рабочий режим. В непрерывном рабочем режиме энкодер принят, чтобы запуститься во все-нулевом состоянии. Декодер прослеживает от состояния с лучшей метрикой. Задержка, равная входу tbdepth символы протекают, прежде чем первый декодируемый символ появляется в выходе. Этот режим является соответствующим, когда вы неоднократно вызываете эту функцию и хотите сохранить непрерывность между последовательными вызовами. Для рабочих процессов, которые требуют повторных вызовов Viterbi, декодирующего алгоритм, смотрите Советы.

  • 'term' — Задает отключенный рабочий режим. В отключенном рабочем режиме энкодер принят, чтобы запуститься и закончиться во все-нулевом состоянии, которое верно для синтаксиса по умолчанию convenc функция. Декодер прослеживает от все-нулевого состояния. Этот режим подвергается нулевой задержке.

    Этот режим является соответствующим, когда сообщение вводило к convenc функция имеет достаточно нулей в своем конце, чтобы заполнить все регистры памяти энкодера. Биты хвоста с нулевым знаком сбрасывают все биты данных сообщения из энкодера. Используя полиномиальное описание энкодера, для энкодера с битами входа K и вектором продолжительности ограничения ConstraintLength, количеством нулей, требуемых сбросить энкодер, является K × макс. (ConstraintLength – 1). Вектор продолжительности ограничения является первым входным параметром к poly2trellis функция.

  • 'trunc' — Задает усеченный рабочий режим. В усеченном рабочем режиме энкодер принят, чтобы запуститься во все-нулевом состоянии. Декодер прослеживает от состояния с лучшей метрикой. Этот режим подвергается нулевой задержке. Этот режим является соответствующим, когда вы не можете принять энкодер, законченный во все-нулевом состоянии и когда вы не хотите сохранять непрерывность между последовательными вызовами этой функции.

Для 'term' и 'trunc' режимы, traceback глубина, tbdepth, должно быть положительное целое число, меньше чем или равное количеству вводимых символов во входе codedin.

Для получения дополнительной информации смотрите Traceback и Decoding Delay и Оценки Глубины Traceback.

Типы данных: char | string

Декодирование типа в виде 'unquant', 'hard', или 'soft'. Этот параметр указывает на тип декодирования решения, что декодер делает и влияет на тип данных, которые декодер ожидает, как введено в codedin.

  • 'unquant' — Декодер ожидает подписанные числовые входные значения, где положительные значения сопоставляют с логическим 0 и отрицательные величины сопоставляют с логическим 1.

  • 'hard' — Декодер ожидает значения двоичного входа 0 или 1.

  • 'soft' — Декодер ожидает целочисленные входные значения в области значений [0, (2nsdec – 1)]. Критерии решения алгоритма Viterbi рассматривают 0 как самый уверенный 0 и 2nsdec – 1 как самый уверенный 1.

Типы данных: char | string

Количество мягких битов квантования решения в виде целого числа в области значений [1, 13]. Для ссылки мягкое декодирование решения с 3 битами квантования улучшает ошибку, декодирующую восстановление приблизительно на 2 дБ по сравнению с декодированием трудного решения.

Зависимости

Чтобы включить этот входной параметр устанавливает dectype входной параметр к 'soft'.

Типы данных: double

Проколите шаблон в виде вектора двоичных значений. Укажите на проколотые биты с 0s и непроколотые биты с 1s. Входная разрядность кода, разделенная на номер 1 с во времена шаблона прокола длина шаблона прокола, должна быть целочисленным кратным количество битов во вводимом символе.

Типы данных: double

Шаблон стирания в виде вектора двоичных значений. Укажите на стертые биты с 1s и нестертые биты с 0s. Длина шаблона стираний должна совпасть с входной разрядностью кода.

Типы данных: double

Метрики состояния декодера в виде целого числа или вектора целочисленных значений. Каждое значение в imetric представляет метрику начального состояния соответствующего состояния декодера. Когда вы устанавливаете imetric к вектору длиной должен быть trellis.numStates. Чтобы использовать метрики состояния декодера по умолчанию, задайте imetric как [].

Зависимости

Чтобы включить этот входной параметр устанавливает opmode входной параметр к 'cont'.

Типы данных: double

Начальная буква декодера traceback утверждает в виде trellis.numStates- tbdepth матрица целочисленных значений в области значений [0, (trellis.numStates – 1)]. Чтобы использовать начальную букву декодера по умолчанию traceback состояния, задайте istate как [].

Входные параметры istate и iinput совместно задайте начальную букву traceback память о декодере. Если схематичный энкодер имеет больше чем один входной поток, сдвиговый регистр, который получает первый входной поток, обеспечивает младшие значащие биты в istate, и сдвиговый регистр, который получает последний входной поток, обеспечивает старшие значащие биты в istate.

Зависимости

Чтобы включить этот входной параметр устанавливает opmode входной параметр к 'cont'.

Типы данных: double

Начальная буква декодера traceback вводит в виде trellis.numStates- tbdepth матрица целочисленных значений в области значений [0, (trellis.numStates – 1)]. Чтобы использовать начальную букву декодера по умолчанию traceback входные параметры, задайте iinput как [].

Входные параметры istate и iinput совместно задайте начальную букву traceback память о декодере.

Зависимости

Чтобы включить этот входной параметр устанавливает opmode входной параметр к 'cont'.

Типы данных: double

Выходные аргументы

свернуть все

Декодируемое сообщение, возвращенное как вектор двоичных значений. Каждый символ в векторном decodedout состоит из log2 (trellis.numInputSymbols) биты.

Метрики конечного состояния декодера, возвращенные как вектор целочисленных значений с trellis.numStates элементы. Каждое значение в fmetric представляет метрику конечного состояния соответствующего состояния декодера.

При вызове vitdec в непрерывном режиме, fmetric обычно используется, чтобы установить imetric для последующих вызовов vitdec функция.

Зависимости

Этот выход применяется когда opmode параметр устанавливается на 'cont'.

Типы данных: double

Финал декодера traceback состояния, возвращенные как trellis.numStates- tbdepth матрица целочисленных значений в области значений [0, (trellis.numStates – 1)].

Выходные параметры fstate и finput совместно опишите финал traceback память о декодере. Если схематичный энкодер имеет больше чем один входной поток, сдвиговый регистр, который получает первый входной поток, обеспечивает младшие значащие биты в fstate, и сдвиговый регистр, который получает последний входной поток, обеспечивает старшие значащие биты в fstate.

При вызове vitdec в непрерывном режиме, fstate обычно используется, чтобы установить istate для последующих вызовов vitdec функция.

Зависимости

Этот выход применяется когда opmode параметр устанавливается на 'cont'.

Типы данных: double

Финал декодера traceback входные параметры, возвращенные как trellis.numStates- tbdepth матрица целочисленных значений в области значений [0, (trellis.numStates – 1)].

Выходные параметры fstate и finput совместно задайте финал traceback память о декодере.

При вызове vitdec в непрерывном режиме, finput обычно используется, чтобы установить iinput для последующих вызовов vitdec функция.

Зависимости

Этот выход применяется когда opmode параметр устанавливается на 'cont'.

Типы данных: double

Больше о

свернуть все

Traceback и Decoding Delay

traceback глубина влияет на задержку декодирования. Задержка декодирования является количеством нулевых символов, которые предшествуют первому декодируемому символу в выходе.

  • Для непрерывного рабочего режима задержка декодирования равна количеству traceback символов глубины.

  • Для усеченного или отключенного рабочего режима задержка декодирования является нулем. В этом случае traceback глубина должна быть меньше чем или равна количеству символов в каждом входе.

Оценки глубины Traceback

Как общая оценка, типичное traceback значение глубины приблизительно два - три раза (ConstraintLength – 1) / (1 – coderate). Продолжительность ограничения кода, ConstraintLength, равна (log2 (trellis.numStates) + 1). coderate равен (K / N) × (длина (PuncturePattern) / сумма (PuncturePattern).

K является количеством вводимых символов, N является количеством выходных символов, и PuncturePattern является вектором шаблона прокола.

Например, применяя эту общую оценку, результаты в них аппроксимируют traceback глубины.

  • Уровень 1/2 код имеет traceback глубину 5 (ConstraintLength – 1).

  • Уровень 2/3 код имеет traceback глубину 7,5 (ConstraintLength – 1).

  • Уровень 3/4 код имеет traceback глубину 10 (ConstraintLength – 1).

  • Уровень 5/6 код имеет traceback глубину 15 (ConstraintLength – 1).

Для получения дополнительной информации см. [7].

Советы

  • Рассмотрите использование comm.ViterbiDecoder Система object™, когда последовательные вызовы алгоритма Viterbi необходимы. Системный объект упрощает необходимую операцию задержания состояния путем свойственного сохранения метрик состояния, traceback состояния, и вводит между вызовами.

Ссылки

[1] Кларк, Джордж К. и J. Затвор Каин. Кодирование с коррекцией ошибок для цифровой связи. Приложения коммуникационной теории. Нью-Йорк: нажатие пленума, 1981.

[2] Gitlin, Ричард Д., Иеремия Ф. Хейз и Стивен Б. Вайнштейн. Принципы передачи данных. Приложения коммуникационной теории. Нью-Йорк: нажатие пленума, 1992.

[3] Хеллер, J. и я. Джейкобс. “Viterbi, Декодирующий для Спутника и Космической связи”. Транзакции IEEE на Коммуникационной технологии 19, № 5 (октябрь 1971): 835–48. https://doi.org/10.1109/TCOM.1971.1090711.

[4] Yasuda, Y., К. Кэшики и И. Хирэта. “Высокий показатель Проколотые Сверточные коды для Мягкого Решения Декодирование Viterbi”. Транзакции IEEE на Коммуникациях 32, № 3 (март 1984): 315–19. https://doi.org/10.1109/TCOM.1984.1096047.

[5] Haccoun, D. и G. Начало. “Высокий показатель Проколотые Сверточные коды для Viterbi и Sequential Decoding”. Транзакции IEEE на Коммуникациях 37, № 11 (ноябрь 1989): 1113–25. https://doi.org/10.1109/26.46505.

[6] Начните, G., Д. Хэккун и К. Пакуин. “Дальнейшие Результаты на Высоком показателе Проколотые Сверточные коды для Viterbi и Sequential Decoding”. Транзакции IEEE на Коммуникациях 38, № 11 (ноябрь 1990): 1922–28. https://doi.org/10.1109/26.61470.

[7] Moision, B. "Эмпирическое правило глубины усечения для сверточных кодов". В теории информации и семинаре приложений (27 января 2008 - 1 февраля 2008, Сан-Диего, Калифорния), 555-557. Нью-Йорк: IEEE, 2008.

Расширенные возможности

Представлено до R2006a