148
if (quantizer_change == 0) && (counted_bits > available_bits) quantizer_change = 1;
end if
while (quantizer_change != 0)
Из-за выбора start_common_scalefac, вычисленного в В.7.2.1, после первой итерации внутреннего цикла число необходимых битов обычно превышает число доступных битов, и поэтому common_scalefac будут увеличены на quantizer_change.
В.8Кодирование без потерь
В.8.1 Введение
В кодере AAC на вход модуля кодирования без потерь поступают 1024 квантованных спектральных коэффициента. Так как кодирование без потерь выполняется внутри квантователя внутреннего цикла, это является частью итеративного процесса, который сходится, когда полное число битов (из которых на кодирование без потерь приходится большинство) находится в пределах некоторого интервала в окрестности выделенного числа битов. В этом разделе описан процесс кодирования для одного вызова модуля кодирования без потерь.
Кодирование без потерь выполняется по следующим шагам:
- клиппирование спектра,
- предварительное кодирование методом Хаффмана с использованием максимального количества разделов,
- объединение разделов для достижения минимального количества битов.
В.8.2 Клиппирование спектра
На первом шаге кодирования без потерь реализуется метод ограничения динамического диапазона. До четырех коэффициентов с амплитудами, превышающими 1, может быть кодировано отдельно со значением ±1, оставленным в квантованном массиве коэффициентов для сохранения знака. Индекс полосы масштабных коэффициентов, содержащей самые низкочастотные, «усеченные» коэффициенты, отправляется в поток битов. Каждый из «усеченных» коэффициентов кодируется как амплитуда (сверх 1) и смещение по отношению к предыдущей полосе. Для этого длинные блоки полос масштабных коэффициентов и порядок коэффициентов в этих полосах используются независимо от последовательности окон. Одна из стратегий применения клиппирования спектра состоит в том, чтобы отсечь высокочастотные коэффициенты, абсолютные амплитуды которых превышают единицу. Так как служебная информация для усеченных коэффициентов требует несколько битов, то компрессия без потерь применяется, только если это приводит к сокращению битов.
В.8.3 Разделы
При кодировании без потерь набор из 1024 квантованных спектральных коэффициентов сегментируется на разделы так, что для каждого раздела используется одна кодовая книга Хаффмана (метод кодирования по Хаффману объясняется ниже). По причинам эффективности кодирования границы раздела должны соответствовать границам полос масштабных коэффициентов так, чтобы для каждого раздела спектра передавать его размер в полосах масштабных коэффициентов и номер кодовой книги Хаффмана, используемой для раздела.
Сегментирование на разделы является динамичным и обычно изменяется от блока к блоку, чтобы минимизировать количество битов, необходимое для представления набора квантованных спектральных коэффициентов. Это выполняется при помощи специального алгоритма, начиная с максимально возможного числа разделов, каждый из которых использует кодовую книгу Хаффмана с наименьшим индексом. Разделы объединяются, если результирующий объединенный раздел приводит к меньшему общему количеству битов, при этом объединению подлежат в первую очередь разделы с наибольшим количеством требуемых битов. Если объединяемые разделы не используют одну и ту же кодовую книгу Хаффмана, то должна использоваться кодовая книга с более высоким индексом.
Разделы часто содержат только коэффициенты с нулевыми значениями. Например, если входной звуковой сигнал ограничен в полосе 20 кГц или ниже, то самые высокие коэффициенты имеют нулевые значения. Такие разделы кодируются нулевой кодовой книгой Хаффмана, которая указывает, что все коэффициенты являются нулями и передача кодовых комбинаций Хаффмана для этого раздела не требуется.
В.8.4 Группировка и чередование
Если последовательность окон состоит из восьми коротких окон, то набор из 1 024 коэффициентов представляет собой матрицу 8х128 частотных коэффициентов, представляющих частотно-временное развитие сигнала на протяжении восьми коротких окон. Несмотря на то, что механизм разделения достаточно гибок, чтобы эффективно представить 8 нулевых разделов, группировка и чередование обеспечивают большую эффективность кодирования. Как было объяснено ранее, коэффициенты, связанные с непрерывными короткими окнами, могут быть сгруппированы для совместного использования масштабных коэффициентов несколькими полосами в пределах группы. Кроме того, коэффициенты в пределах группы чередуются, обмениваясь порядком следования полос масштабных коэффициентов и окон. Перед чередованием набор из 1024 коэффициентов c индексируется как c [g][w][b][k], где:
g — индекс группы;
w — индекс окна в пределах группы;
b — индекс полосы масштабных коэффициентов в пределах окна;
k — индекс коэффициента в пределах полосы масштабных коэффициентов (самый правый индекс изменяется наиболее быстро).
После чередования коэффициенты индексируются как c [g][b][w][k].