Пред.
След.
Макеты страниц
Распознанный текст, спецсимволы и формулы могут содержать ошибки, поэтому с корректным вариантом рекомендуем ознакомиться на отсканированных изображениях учебника выше Также, советуем воспользоваться поиском по сайту, мы уверены, что вы сможете найти больше информации по нужной Вам тематике ДЛЯ СТУДЕНТОВ И ШКОЛЬНИКОВ ЕСТЬ
ZADANIA.TO
6.4.13. Энтропийное кодированиеСинтаксические элементы выше уровня слоев кодируются двоичными кодами фиксированной или переменной длины. Элементы слоев и последующие элементы кодируются или с помощью кодов переменной длины VLC, или по схеме контекстно-адаптивного кодирования переменной длины CAVLC. Все остальные единицы переменной длины кодируются с использованием экспоненциальных кодов Голомба. Параметры, которые необходимо закодировать и передавать, представлены в табл. 6.8.
Таблица 6.9. Экспоненциальные коды Голомба.
6.4.13.1. Кодирование экспоненциальными кодами ГоломбаЭкспоненциальные коды Голомба [5] представляют собой коды переменной длины весьма регулярной конструкции. Изучив первые несколько кодовых слов (табл. 6.9), становится ясно, что эти коды строятся следующим образом: , где INFO — поле из M бит, несущих информацию. Первое кодовое слово не имеет нулей в начале и в конце. Кодовые слова 1 и 2 имеют однобитовое поле INFO, кодовые слова 3 - 6 имеют двухбитовое поле INFO и т.д. Длина каждого кодового слова экспоненциального кода Голомба равна (2М + 1) бит, и каждое кодовое слово может быть построено кодером на основе его индекса code_num по правилу:
Кодовое слово декодируется следующим образом. 1. Сосчитать М начальных нулей идущих до 1. 2. Прочитать поле INFO длины М. 3. . (Для кодового слова 0 переменные INFO и М равны нулю.) Параметр k кодируется отображением в code_num одним из следующих способов.
Таблица 6.10. Отображение со знаком se.
Таблица 6.11. Часть таблицы для coded_block_pattern.
Каждое из этих отображений (ue, te, se и me) разработано в целях построения коротких кодовых слов для часто возникающих значений параметров и более длинных для более редких. Например, типу inter-макроблока P_L0_16х16 (прогноз блока яркости 16x16 по предыдущему снимку) присваивается code_num 0, поскольку он встречается весьма часто; типу макроблока P_L0_8x8 (прогноз блока яркости 8x8 по предыдущему снимку) присваивается code_num 3, так как он встречается реже. Часто возникающее значение 0 разности векторов движения (MVD) отображается в code_num 0, а более редкому значению MVD = -3 ставится в соответствие code_num 6. 6.4.13.2. Контекстно-адаптивные коды переменной длины (CAVLC)Этот метод используется при кодировании остаточных блоков 4x4 (или 2x2) коэффициентов преобразования, просканированных по зигзагу. Схема кодирования CAVLC (Context-Based Adaptive Variable Length Coding) разработана с учетом нескольких характеристик квантованных блоков 4x4. 1. Обычно после прогноза, преобразования и квантования блоки становятся весьма разреженными (в них содержится много нулевых коэффициентов). CAVLC использует схему кодирования "серия-значение» для компактного представления серий нулевых коэффициентов. 2. При сканировании зигзагом завершающими ненулевыми элементами часто выступают числа ±1. Поэтому CAVLC подает сигналы о количестве таких элементов («остаточных единиц» Trailing Ones) в сжатом виде. 3. Числа ненулевых коэффициентов соседних блоков являются кoррелированными величинами. Эти числа кодируются с помощью поисковой таблицы, и выбор этой таблицы зависит от числа ненулевых коэффициентов соседних блоков. 4. Амплитуда (Level) ненулевых коэффициентов обычно является высокой только в начале переупорядоченного массива (около коэффициентов DC), а далее она снижается в области высоких частот. CAVLC учитывает это свойство, приспосабливая выбор поисковой таблицы VLC для амплитуды параметров в зависимости от недавно закодированных амплитуд соседних блоков. Процесс кодирования CAVLC блоков коэффициентов преобразования происходит следующим образом.
1. Кодирование числа коэффициентов и "серий единиц» (coeff_token). Первый код VLC, coeff_token, одновременно кодирует общее число ненулевых коэффициентов (TotalCoeff) и число остаточных единиц ±1 (TrailingOnes). Переменная TotalCoeff может принимать любое значение от 0 (нет ни одного коэффициента в блоке 4 х 4) до 16 (16 ненулевых коэффициентов). Переменная (TrailingOnes) может быть любой от 0 до 3. Если имеется более трех элементов ±1, то лишь последние три из них рассматриваются в этом виде, а все прочие кодируются как обычные коэффициенты. Таблица 6.12. Выбор поисковой таблицы для coeff_token.
Всего имеется четыре способа выбора поисковой таблицы, которая используется при кодировании coeff_token для блоков 4x4: три таблицы кодов переменной длины и одна таблица кодов фиксированной длины. Выбор таблицы зависит от числа ненулевых коэффициентов ( и ), ранее закодированных, блоков слева и выше (А и В соответственно) от текущего блока С. Параметр вычисляется по следующему правилу. Если блоки А и В оба доступны (т.е. находятся в том же слое), то . Если доступен только верхний блок, то , если только левый, то , и, наконец, если оба недоступны, то . Параметр выбирает таблицу кодов VLC (см. табл. 6.12) в зависимости от числа закодированных коэффициентов соседних блоков (в этом заключается контекстная адаптация метода). Таблица 1 смещена в сторону малого числа коэффициентов так, чтобы малым значениям TotalCoeff присваивались короткие коды, а большим — длинные. Таблица 2 построена из расчета промежуточного числа коэффициентов (величинам TotalCoeff в районе 2 - 4 присваиваются короткие коды). Таблица 3 применяется для кодирования большого числа коэффициентов, а таблица 4 присваивает фиксированный код длины 6 каждой паре значений TotalCoeff и TrailingOnes. 2. Кодирование знака каждой переменной TrailingOne. Для каждого TrailingOne (элемент ±1), указанного в coeff_token, его знак кодируется единственным битом (0 = +, 1 = -) в обратном порядке, начиная с самого высокочастотного TrailingOne. 3. Кодирование амплитуды остальных ненулевых коэффициентов. Амплитуда (знак и модуль) каждого из оставшихся ненулевых коэффициентов блока кодируется в обратном порядке, начиная с высоких частот и двигаясь назад в сторону коэффициента DC. Код для каждого значения состоит из префикса (level-prefix) и суффикса (level_suffix). Длина суффикса (suffixLength) может быть от 0 до 6 бит, suffixLength выбирается в зависимости от амплитуды каждого последующего кодового уровня («адаптация к контексту»). Малая suffixLength подходит для уровней с низкой амплитудой, а большая величина suffixLength приспособлена для высокой амплитуды. Выбор suffixLength делается по следующим правилам. а) Инициализировать suffixLength нулевым значением (кроме случая, когда имеется более 10 ненулевых элементов и меньше трех серий единиц и переменной suffixLength присваивается значение 1). б) Кодировать самый высокочастотный ненулевой коэффициент. в) Если амплитуда этого коэффициента больше, чем предопределенный порог, то увеличить suffixLength на 1. (Если это первый уровень кодирования и величина suffixLength была равна 0, то присвоить suffixLength значение 2.) Таблица 6.13. Пороги для определения, надо ли повышать suffixLength.
Таким образом, выбор суффикса (а следовательно, и полного кода VLC) согласован с амплитудой недавно закодированных коэффициентов. Пороги перечислены в табл. 6.13. Первый порог равен нулю, что означает обязательное увеличение suffixLength после того, как первый уровень коэффициентов будет закодирован. 4. Кодирование общего числа нулей перед последним ненулевым коэффициентом. Число всех нулевых коэффициентов, предшествующих самому старшему ненулевому коэффициенту, в упорядоченном массиве кодируется кодом VCR. Причина отправки отдельного кода VLC для обозначения этого числа нулей заключается в том, что многие блоки имеют несколько ненулевых коэффициентов в начале массива (как это будет скоро видно) и при таком подходе не нужно кодировать серию нулей, стоящую в начале массива. 5. Кодирование каждой серии нулей. Число нулей, предшествующее каждому ненулевому коэффициенту (run_before), кодируется в обратном порядке. Кодируется параметр run_before для каждого ненулевого коэффициента, начиная с самого старшего (высокочастотного). При этом имеется два исключения: 1. если уже не осталось нулей для кодирования (т.е. выполнено соотношение ), то уже не надо кодировать величины run_before; 2. не нужно кодировать run_before для последнего (самого высокочастотного) ненулевого коэффициента. Выбор кода VLC для каждой серии нулей делается в зависимости от числа нулей, которые еще не были закодированы (ZerosLeft), и от run_before. Например, если осталось закодировать только два нуля, переменная run_before может принимать только три значения (0, 1 или 2), и, следовательно, длина кода VLC не превышает двух бит. Если осталось закодировать шесть нулей, то run_before может принимать семь значений (от 0 до 6) и таблица VLC не будет, соответственно, длиннее. Приведем несколько примеров кодирования и декодирования по схеме CAVLC.
Рассмотрим еще два примера кодирования и декодирования блоков с разными параметрами. При этом следует обратить внимание на то, как меняется параметр TrailingOnes.
|
1 |
Оглавление
|