vitdec

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

Описание

пример

decodedout = vitdec(codedin,trellis,tbdepth,opmode,dectype) декодирует каждый символ codedin входной параметр при помощи алгоритма Viterbi. Все другие входы определяют сверточную решетку кодирования, глубину отслеживания, режим работы и тип решения, соответственно и совместно конфигурируют алгоритм 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 для любого из предыдущих синтаксисов. Декодер начинает с его начальных метрик состояния, состояний трассировки и входов трассировки, заданных imetric, istate, и iinput, соответственно.

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

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

Примеры

свернуть все

Сверточно закодируйте вектор на 1с с помощью convenc и декодируйте его при помощи vitdec функция.

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

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

При декодировании закодированного сообщения сконфигурируйте декодер Viterbi, чтобы использовать решетчатую структуру, заданную ранее, глубину следа 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

Сверточно закодируйте все 1s битовое сообщение с проколом, приложенным к кодированному выходу.

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);

Сверточно закодируйте входные данные.

codedout = convenc(dataIn,trellis);

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

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

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

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

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

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

Задайте глубину трассировки декодера Viterbi.

tbdepth = 16;

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

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.

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

свернуть все

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Зависимости

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

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

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

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

Зависимости

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

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

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

свернуть все

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

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

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

Зависимости

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

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

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

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

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

Зависимости

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

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

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

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

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

Зависимости

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

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

Подробнее о

свернуть все

Задержка отслеживания и декодирования

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

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

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

Оценка глубины следа

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

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

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

  • Код скорости 1/2 имеет глубину обратного вызова 5 (ConstraintLength - 1).

  • Код скорости 2/3 имеет глубину трассировки 7,5 (ConstraintLength - 1).

  • Код скорости 3/4 имеет глубину обратного вызова 10 (ConstraintLength - 1).

  • Код скорости 5/6 имеет глубину трассировки 15 (ConstraintLength - 1).

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

Совет

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

Ссылки

[1] Clark, George C., and J. Bibb Cain. Кодирование с исправлением ошибок для цифровых коммуникаций. Приложения теории связи. Нью-Йорк: Пленум Пресс, 1981.

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

[3] Хеллер, Дж., и И. Джейкобс. Viterbi Decoding for Satellite and Space Communication (неопр.) (недоступная ссылка). Транзакции IEEE по коммуникационным технологиям 19, № 5 (октябрь 1971 года): 835-48. https://doi.org/10.1109/TCOM.1971.1090711.

[4] Ясуда, Я., К. Касики, и Я. Хирата. «Высокоскоростные проколотые сверточные коды для мягкого декодирования Viterbi». Транзакции IEEE по коммуникациям 32, № 3 (март 1984 года): 315-19. https://doi.org/10.1109/TCOM.1984.1096047.

[5] Haccoun, D., and G. Begin. «Высокоскоростные прокалываемые сверточные коды для Viterbi и последовательного декодирования». Транзакции IEEE по сообщениям 37, № 11 (ноябрь 1989 года): 1113-25. https://doi.org/10.1109/26.46505.

[6] Begin, G., D. Haccoun, and C. Paquin. «Дальнейшие результаты высокоскоростных прокалываемых сверточных кодов для Viterbi и последовательного декодирования». Транзакции IEEE по коммуникациям 38, № 11 (ноябрь 1990 года): 1922-28. https://doi.org/10.1109/26.61470.

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

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

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