exponenta event banner

vitdec

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

Описание

пример

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

decodedout = vitdec(codedin,trellis,tbdepth,opmode,'soft',nsdec) конфигурирует алгоритм Витерби для декодирования с мягким решением для 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соответственно.

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

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

Примеры

свернуть все

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

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

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

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

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

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

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

Примените декодирование Витерби к проколотому сигналу. При прокалывании скорость кода изменяется с 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

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

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

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

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

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

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

Укажите глубину отслеживания декодера Витерби.

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.

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

свернуть все

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Дополнительные сведения см. в разделах Задержки трассировки и декодирования и Оценки глубины трассировки.

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

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

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

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

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

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

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

Зависимости

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

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

Образец прокола, заданный как вектор двоичных значений. Указать проколотые биты с помощью 0s и необработанные биты с 1Длина входного кода, деленная на число 1 с в шаблоне прокола, умноженное на длину шаблона прокола, должна быть целым числом, кратным числу битов во входном символе.

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

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

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

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

Зависимости

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

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

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

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

Зависимости

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

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

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

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

Зависимости

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

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

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

свернуть все

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

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

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

Зависимости

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

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

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

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

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

Зависимости

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

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

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

Продукция fstate и finput совместно задают конечную память отслеживания декодера.

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

Зависимости

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

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

Подробнее

свернуть все

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

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

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

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

Оценки глубины отслеживания

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

K - количество входных символов, N - количество выходных символов, а PuncurePattern - вектор прокола.

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

  • Код скорости 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™, когда необходимы последовательные вызовы алгоритма Витерби. Объект System упрощает требуемую операцию сохранения состояния за счет сохранения метрик состояния, состояний отслеживания и входов между вызовами.

Ссылки

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

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

[3] Хеллер, J. и я. Джейкобс. «Декодирование Витерби для спутниковой и космической связи». IEEE Transactions on Communication Technology 19, No. 5 (октябрь 1971 года): 835-48. https://doi.org/10.1109/TCOM.1971.1090711.

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

[5] Хаккун, Д. и Г. Бегин. «Высокоскоростные проколотые сверточные коды для Витерби и последовательного декодирования». IEEE Transactions on Communications 37, No. 11 (ноябрь 1989 года): 1113-25. https://doi.org/10.1109/26.46505.

[6] Бегин, Г., Д. Хаккун и К. Пакин. «Дальнейшие результаты по высокоскоростным проколотым сверточным кодам для Витерби и последовательного декодирования». IEEE Transactions on Communications 38, No. 11 (ноябрь 1990 года): 1922-28. https://doi.org/10.1109/26.61470.

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

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

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