Viterbi Decoder

Декодируйте сверточно закодированные данные с использованием алгоритма Viterbi

  • Библиотека:
  • Беспроводной HDL Toolbox/Обнаружение и коррекция ошибок

  • Viterbi Decoder block

Описание

Блок Viterbi Decoder декодирует сверточно закодированные данные с помощью реализации отслеживания на основе ОЗУ. Декодирование Viterbi широко используется в стандарте LTE TS 36.212 [1] и других приложениях прямой коррекции ошибок (FEC), таких как беспроводные сети (802.11a/b/g/n/ac), цифровая спутниковая связь, цифровая видеотрансляция (DVB), IEEE 802.16 и HiperL Чтобы поддержать любой из этих стандартов, блок принимает коды свертки с длинами ограничений от 3 до 9, скоростями кода от 1/2 до 1/7 и обеспечивает непрерывный, оконечный и усеченный режимы. Блок обеспечивает архитектуру и интерфейс, подходящие для генерации HDL-кода.

Блок поддерживает декодирование проколотых кодов путем предоставления опционального erasure входного порта. Можно использовать блок Depuncturer, чтобы вставить нейтральные значения в проколотый поток сэмплирования и сгенерировать сигнал erasure.

Блок Viterbi Decoder принимает входные выборки как двоичные значения с твердым решением или коэффициенты логарифмической вероятности мягкого решения (LLR). Каждая выборка является вектором-столбцом, длина которой зависит от схемы кодирования. Первая форма волны показывает непрерывный режим работы с входными выборками подписанных 4-битных данных, используя параметры блоков по умолчанию. Это Traceback depth 32. Блок возвращает первую декодированный выход данных после 148 тактов. Задержка декодирования составляет 4 × Traceback depth + Constraint length + 13 допустимых входных циклов.

Вторая форма волны показывает три системы координат в режиме завершения операции. Этот вход представляет собой беззнаковые 4-битные выборки, и блок использует шпалеру (7, [171 133 112]). Это Traceback depth 32. Входная и выходная шины ctrl расширены, чтобы показать свои три управляющих сигнала. Задержка от каждого входа ctrl start. для вывода ctrl. start также 148 тактов.

Сигналы управления в шине указывают валидность каждой выборки и контуров системы координат. Чтобы преобразовать матрицу в поток сэмплирования и соответствующие сигналы управления, используйте блок Frame To Samples или whdlFramesToSamples функция. Полное описание потокового примера интерфейса смотрите в Потоковый пример интерфейса.

Порты

Вход

расширить все

Входная выборка, заданная как n-на-1 вектор-столбец, где n - длина полинома генератора. Блок выполняет декодирование с мягким решением, когда тип входных данных является фиксированной точкой или целым числом, и декодирование с жестким решением, когда тип входных данных Boolean или fixdt(0,1,0). Блок выполняет неквантованное декодирование с мягким решением для single и double типы данных, но эти типы данных не поддерживаются для генерации HDL-кода.

Для входных выборок с мягким решением блок поддерживает размеры слова до 16 бит. Для генерации HDL-кода размер слова более 8 бит не рекомендуется из-за использования аппаратных ресурсов. Входные данные должны иметь длину дроби 0.

Типы данных: int8 | int16 | uint8 | uint16 | Boolean | fixdt(0,1,0) | fixdt(S,WL,0) | single | double

Управляющий сигнал, который указывает, когда выборка от data входного порта действительна. Когда valid входной порт 1 (true), блок захватывает значения data входного порта. Когда valid входной порт 0 (false), блок игнорирует вход выборки.

Зависимости

Чтобы включить этот порт, установите Operation mode равным Continuous.

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

Нейтральные положения символов, заданные как вектор-столбец с двоичными значениями того же размера, что и входной вектор data. Когда элемент erasure 1 (true), соответствующий вход data является депункционированным нейтральным значением, и декодер не обновляет метрику ветви. Когда элемент erasure 0 (false), блок использует соответствующий элемент входного data, чтобы обновить метрику ветви. Для управления этим портом можно использовать блок Depuncturer.

Зависимости

Чтобы включить этот порт, выберите Enable erasure input port.

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

Очистить внутреннее состояние, заданное как Boolean скаляр. Когда reset 1 (true), после одного цикла, блок останавливает текущее вычисление и очищает внутренние метрики ветви и состояния.

Зависимости

Чтобы включить этот порт, установите Operation mode равным Continuous и выберите Enable reset input port.

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

Сигналы управления, сопровождающие поток дискретизации, заданные как samplecontrol bus. Шина включает в себя start, end, и valid управляющие сигналы, которые указывают контуры системы координат и валидность входных выборок.

Зависимости

Чтобы включить этот порт, установите Operation mode равным Terminated или Truncated.

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

Выход

расширить все

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

Типы данных: int8 | int16 | uint8 | uint16 | Boolean | fixdt(0,1,0) | fixdt(S,WL,0) | single | double

Управляющий сигнал, который указывает, когда выборка от data выходного порта действительна. Блок устанавливает valid порт равным 1 (true), когда существует допустимый образец на выход data порте.

Зависимости

Активируйте этот порт, установите Operation mode на Continuous.

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

Управляющие сигналы, сопровождающие поток дискретизации, возвращаются как samplecontrol bus. Шина включает в себя start, end, и valid управляющие сигналы, которые указывают контуры системы координат и валидность выборок.

Зависимости

Чтобы включить этот порт, установите Operation mode равным Terminated или Truncated.

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

Параметры

расширить все

Длина ограничения Trellis, заданная в виде целого числа в области значений [3, 9].

Полином генерации кода, заданный как 1-бай- n вектор октальных значений, где n - длина полинома. Блок принимает полиномы от 2 до 7 элементов длиной.

Выберите этот параметр, чтобы включить erasure порт.

Количество ветвей решетки, используемых для построения каждого пути трассировки, заданное в виде целого числа. Блок поддерживает глубину трассировки в области значений [3, 128]. Для непункционированных выборок рекомендуемая глубина 5 × constraintLength. Для проколотых выборок рекомендуемая глубина 10 × constraintLength. Эти значения балансируют точность декодирования с объемом используемой памяти.

Конец поведения системы координат, заданный как один из следующих режимов:

  • Continuous - Блок не очищает метрику внутреннего состояния. Сигнал входа valid определяет вход отсчета.

  • Truncated - Блок сбрасывает метрики состояния после каждой системы координат, и путь трассировки начинается в состоянии с лучшей метрики и заканчивается в состоянии всех нулей. Входная шина ctrl определяет входные выборки и помечает контуры системы координат.

    Примечание

    Этот режим требует минимального пространства Constraint length -1 циклов между системами координат.

  • Terminated - Блок сбрасывает метрики состояния после каждой системы координат, и путь трассировки всегда начинается и заканчивается в состоянии «все нули». Входная шина ctrl определяет входные выборки и помечает контуры системы координат.

Выберите этот параметр, чтобы включить reset порт. Когда reset 1 (true), после одного цикла, блок останавливает текущее вычисление и очищает внутренние метрики ветви и состояния.

Зависимости

Чтобы включить этот параметр, установите Operation mode равным Continuous.

Алгоритмы

расширить все

Блок Viterbi Decoder реализует трассировку на основе ОЗУ, используя K-указатель нечетный алгоритм [2]. Параметром K является количество указателей на чтение, необходимых в алгоритме. Эта реализация имеет K значение двух и обращается к трём памятям с помощью двух указателей чтения и одной записи. Три типа операций:

  • Write (Wr): Сохраните информацию о пути выжившего в памяти.

  • Traceback (TB): Чтение информации о пути выжившего из памяти и вычисление предыдущего состояния на основе текущего состояния и ветви выжившего. Самое раннее состояние, прослеженное этим процессом, затем используется как начальное состояние для декодирования предыдущего блока памяти данных.

  • Декодирование (Dec): Считайте информацию о пути выжившего из памяти и декодируйте вход.

Каждое из трёх памятей имеет размер Traceback depth (tbd). Алгоритм K-указателя принимает 4 × Traceback depth циклов, чтобы декодировать данные.

Схема показывает, как три операции используют три банка памяти. Для двух кратных Traceback depth запишите метрики выжившего в прямом направлении к Mem # 1 и Mem # 2. Затем, продолжая записывать в Mem # 3, отслеживайте из Mem # 2, чтобы найти минимальный индекс. Используйте этот индекс как указатель на трассировку из Mem # 1 и получите декодированное значение. После чтения декодированного значения блок записывает новый входной путь выжившего в то же место. Эта запись начинает следующий цикл декодирования.

В алгоритме Viterbi логика add-compare может вызвать переполнение метрики состояния. Эти переполнения ухудшают эффективность декодера. Modulo normalization используется для смягчения последствий переполнения [3]. Блок реализует модульную арифметику, используя сумматоры и вычитатели двух комплементов, как показано на схеме. Вместо компаратора используется вычитатель. Переполнение обнаруживается путем проверки самого значимого бита (MSB) (m1-m2), где m1 m2 являются метриками нормализации. При обнаружении переполнения m1 и m2 обеспечивают обернутое значение.

Ссылки

[1] 3GPP TS 36.212. «Мультиплексирование и канальное кодирование». 3rd Генерация Partnership Project; Группа технических спецификаций Radio Доступа Network; Evolved Universal Terrestrial Radio Access (E-UTRA). URL-адрес: https://www.3gpp.org.

[2] Хорвиц, М. и Р. Браун. «Обобщенный метод проекта для управления памятью выжившего после трассировки в декодерах Viterbi». Материалы Южноафриканского симпозиума 1997 года по связи и обработке сигналов: 63-68. Piscataway, NJ: IEEE, 1997.

[3] Shung, C.b., P.H. Зигель, Г. Унгербоек и Х.К. Тапар. «VLSI Архитектур для метрической нормализации в Алгоритм Viterbi». Международная конференция IEEE по коммуникациям, включая технические сеансы суперкомм: том 4. 1726-728. Нью-Йорк, Нью-Йорк: IEEE, 1990.

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

.

См. также

Блоки

Введенный в R2018b