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

Описание решетки в виде MATLAB® структура, которая содержит описание решетки для уровня K/N код. K представляет количество входных потоков битов, и N представляет количество выходных потоков битов.

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

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

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

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

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

Количество состояний в энкодере в виде степени 2.

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

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

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

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

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

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

Глубина 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. Входная разрядность кода, разделенная на число единиц во времена шаблона прокола длина шаблона прокола, должна быть целочисленным кратным количество битов во вводимом символе.

Типы данных: 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