1.2.2. Назначение инструментов декодирования
Общая структура системы MPEG-2 AAC приведена на рисунках 1 и 2. В соответствии с таблицей 1 структура декодера состоит из необходимых и опциональных инструментов. Направление потока данных в этой схеме слева направо, сверху вниз. В задачи декодера входят обнаружение описания квантованных спектральных значений в потоке битов, декодирование квантованных значений и другой информации для восстановления, восстановление квантованных спектральных значений, обработка восстановленных спектральных значений соответствующими инструментами, активными для данного потока битов, с целью достигнуть исходного спектра входного звукового сигнала и, наконец, преобразование спектральных значений во временные отсчеты с (или без) дополнительным инструментом регулирования усиления. После начального восстановления и масштабирования восстановленных спектральных значений может применяться множество дополнительных инструментов, используемых для обеспечения более эффективного кодирования. Для каждого из дополнительных инструментов, которые работают в спектральном пространстве, предусмотрена опция отключения, и во всех случаях, когда обработка в спектральном пространстве не используется, входные спектральные значения поступают непосредственно на выход инструмента без изменений.
![]() Рисунок 1. Блок-схема кодера MPEG-2 AAC
1.2.3. Вход и выход инструментов демультиплексирования
На вход инструмента демультиплексирования поступает поток битов MPEG-2 AAC. Демультиплексор разделяет поток данных MPEG-AAC на части, предназначенные для каждого инструмента, и предоставляет для каждого из инструментов информацию о потоке битов, относящуюся к этому инструменту.
На выходе инструмента демультиплексирования потока битов содержится:
- информация о разделении для прозрачного кодирования;
- прозрачно-кодированные спектральные значения;
- информация о M/S (опционально);
- информация о состоянии предсказывающего устройства (опционально);
- информация для управления intensity stereo и информация для управления спаренным каналом (опциональные);
- информация о временном формировании шума (TNS) (опционально);
- информация для управления банком фильтров;
- информация о регулировании усиления (опционально).
1.2.4. Инструмент прозрачного декодирования
Информация потока битов с демультиплексора поступает на инструмент прозрачного декодирования, который анализирует ее, декодирует коды Хаффмана и восстанавливает квантованные спектральные значения, а также кодированные с помощью кодов Хаффмана и ДИКМ масштабные коэффициенты.
На вход инструмента прозрачного декодирования поступают информация о разделении для прозрачного кодирования и прозрачно-кодированные спектральные значения.
Выход инструмента прозрачного декодирования содержит декодированное целочисленное представление масштабных коэффициентов и квантованные спектральные значения.
1.2.5. Инструмент деквантования
Квантованные спектральные сигналы поступают на вход инструмента деквантования, который преобразует целочисленные значения в восстановленные деквантованные спектральные значения. Этот деквантователь является неоднородным.
1.2.6. Инструмент перемасштабирования
Инструмент перемасштабирования преобразует целочисленное представление масштабных коэффициентов в их фактические значения и умножает восстановленные, деквантованные спектральные значения на соответствующие масштабные коэффициенты.
На вход инструмента перемасштабирования поступает декодированное целочисленное представление масштабных коэффициентов и восстановленные, деквантованные спектральные значения.
На выходе инструмента перемасштабирования содержатся масштабированные, деквантованные спектральные значения.
1.2.7. Инструмент M/S
На вход инструмента поступает информация о M/S (середина/сторона) и масштабированные, деквантованные спектральные значения, относящиеся к парам каналов. Инструмент M/S преобразует пары спектральных значений из M/S в L/R под управлением информации о M/S с целью улучшения кодирования.
На выходе инструмента M/S присутствуют масштабированные, деквантованные спектральные значения сигналов, относящиеся к парам каналов после декодирования M/S.
Следует учитывать, что масштабированные, деквантованные спектральные значения индивидуально кодированных каналов не обрабатываются блоком M/S и передаются непосредственно на выход инструмента M/S без изменений. Если инструмент M/S не является активным, все спектральные значения проходят через этот блок без изменений.
1.2.8. Инструмент предсказания
Этот инструмент обращает процесс предсказания, выполненный в кодере. Обратный процесс предсказания добавляет избыточность, которая была устранена инструментом предсказания в кодере, под управлением информации о состоянии предсказывающего устройства. Данный инструмент представляет собой обратное адаптивное предсказывающее устройство второго порядка. На вход инструмента предсказания поступают информация о состоянии предсказывающего устройства и масштабированные, деквантованные спектральные значения. На выходе инструмента предсказания - масштабированные, деквантованные спектральные значения после предсказания.
Если предсказание не используется, масштабированные, деквантованные спектральные значения поступают непосредственно на выход блока без изменений.
1.2.9. Инструмент intensity stereo
Данный инструмент реализует декодирование intensity stereo спектральных пар. На вход инструмента intensity stereo поступают деквантованные спектральные значения и управляющая информация intensity stereo.
На выходе инструмента intensity stereo - деквантованные спектральные значения после декодирования канала интенсивности.
Масштабированные, деквантованные спектральные значения индивидуально кодированных каналов поступают непосредственно на выход этого инструмента без изменений, если intensity stereo не используется. Инструмент intensity stereo и инструмент M/S располагаются так, чтобы работа M/S и intensity stereo была взаимоисключающей для любой полосы масштабных коэффициентов и группы одной пары спектральных значений.
1.2.10. Инструмент спаривания для зависимо коммутируемых каналов
Инструмент добавляет соответствующие данные от зависимо коммутируемых каналов к спектральным значениям в соответствии с информацией для управления спариванием каналов. На входе инструмента спаривания - деквантованные спектральные значения и информация для управления спариванием каналов. На выходе инструмента - деквантованные спектральные значения вместе с зависимо коммутируемыми каналами.
Масштабированные, деквантованные спектральные значения поступают непосредственно на выход этого инструмента без изменений, если спаривание каналов не применяется. В зависимости от информации для управления спариванием каналов зависимо коммутируемые каналы могут быть спарены до или после обработки TNS.
1.2.11. Инструмент спаривания для независимо коммутируемых каналов
Инструмент добавляет соответствующие данные от независимо коммутируемых каналов к временному сигналу в соответствии с информацией для управления спариванием каналов. На вход инструмента спаривания поступает временной сигнал, аналогичный сигналу на выходе набора фильтров, и информация для управления спариванием каналов.
На выходе инструмента - временной сигнал вместе с независимо коммутируемыми каналами.
Временной сигнал поступает непосредственно на выход этого инструмента без изменений, если спаривание каналов не используется.
1.2.12. Инструмент временного формирования шума (TNS)
С помощью данного инструмента реализуется управление точной временной структурой шума кодирования. В кодере в результате процесса TNS сглаживается временная огибающая сигнала, к которому это было применено. В декодере происходит обратный процесс для восстановления фактической временной огибающей(их) под управлением информации о TNS. Это выполняется фильтрацией частей спектральных данных. На входе инструмента TNS присутствуют деквантованные спектральные значения и информация о TNS, на выходе - деквантованные спектральные значения.
Если этот блок отключен, деквантованные спектральные значения поступают на его выход без изменений.
1.2.13. Банк фильтров/инструмент переключения окон
Банк фильтров реализует обратное спектральное преобразование. Обратное дискретное косинусное преобразование (ОДКП) используется в качестве банка фильтров. ОДКП может поддерживать либо один набор из 128 или 1024, или четыре набора из 32 или 256 спектральных коэффициентов.
На вход банка фильтров поступают деквантованные спектральные значения и информация для управления банком фильтров, на выход(ы) банка фильтров - восстановленные временные отсчеты звукового сигнала(ов).
1.2.14. Инструмент регулирования усиления
При использовании данного инструмента осуществляется отдельное регулирование усиления временных отсчетов в каждой из четырех частотных полос, которые были получены регулированием усиления PQF-банка фильтров кодера. Далее инструмент собирает четыре частотных полосы и восстанавливает форму временного сигнала с помощью банка фильтров инструмента регулирования усиления. При этом на вход инструмента регулирования усиления поступают восстановленные временные отсчеты звукового сигнала(ов) и информация о регулировании усиления, а на выход(ы) инструмента регулирования усиления - восстановленные временные отсчеты звукового сигнала(ов).
Если инструмент регулирования усиления не используется, восстановленные временные отсчеты звукового сигнала(ов) поступают непосредственно из банка фильтров на выходе декодера. Этот инструмент используется в профиле масштабируемой частоты дискретизации (SSR).
В настоящем стандарте использованы нормативные ссылки на следующие стандарты:
ГОСТ Р 52742-2007 Каналы и тракты звукового вещания. Типовые структуры. Основные параметры качества. Методы измерений
ГОСТ Р 53537-2009 Звуковое вещание. Основные электрические параметры каналов и трактов студийного качества (с полосой частот 20...20000 Гц)
ГОСТ 27667-88 Система цифровая звуковая "Компакт-диск". Параметры
ГОСТ 28376-89 Компакт-диск. Параметры и размеры.
Примечание. При пользовании настоящим стандартом целесообразно проверить действие ссылочных стандартов в информационной системе общего пользования - на официальном сайте Федерального агентства по техническому регулированию и метрологии в сети Интернет или по ежегодно издаваемому информационному указателю "Национальные стандарты", который опубликован по состоянию на 1 января текущего года, и по соответствующим ежемесячно издаваемым информационным указателям, опубликованным в текущем году. Если ссылочный стандарт заменен (изменен), то при пользовании настоящим стандартом следует руководствоваться заменяющим (измененным) стандартом. Если ссылочный стандарт отменен без замены, то положение, в котором дана ссылка на него, применяется в части, не затрагивающей эту ссылку.
Основные звуковые каналы: все каналы, представленные либо single_channel_element() (см. 6.2.1), либо channel_pair_element() (см. 6.2.1).
Программа: набор основных звуковых каналов, coupling_channel_element() (см. 6.2.1), lfe_channel_element() (см. 6.2.1) и сопутствующих потоков данных, требующих одновременного декодирования и воспроизведения.
Примечание. Программа может быть определена по умолчанию (см. 6.5.3.1 и 6.5.3.3) или указана program_config_element() (см. 6.5.3.2). Данные single_channel_element() (см. 6.2.1), channel_pair_element() (см. 6.2.1), coupling_channel_element(), lfe_channel_element() или канал передачи данных могут сопровождать одну или несколько программ в любом потоке битов.
Синтаксический анализатор: функциональный элемент декодера, который извлекает из кодированного потока битов серию битов, представляющих кодированные элементы.
Спектральные коэффициенты: дискретные значения в частотном пространстве на выходе набора фильтров анализа.
Стерео избыточность: часть стереофонического звукового сигнала обладает стерео избыточностью, если она не способствует пространственному восприятию сигнала.
Число учитываемых каналов; NCC: число каналов, представленных SCE элементами, независимо переключаемых CCE и CPE, т.е. единожды взятое количество SCE плюс единожды взятое количество независимо коммутируемых CCE плюс дважды взятое число CPE, в соответствии с соглашением о присвоении имен в декодерах и потоках битов MPEG-AAC, NCC = A + I.
Примечание. Число учитываемых каналов используется для получения требуемого размера входного буфера декодера (см. 6.2.2).
Математические операторы, используемые в этом стандарте, аналогичны используемым в языке программирования C. Однако целочисленное деление с усечением и округление определены особым образом. Побитные операторы определяются с учетом представления чисел в дополнительном коде. Нумерация и счетчики циклов обычно начинаются с нуля.
3.2.1. Арифметические операторы
+ - Сложение.
- - Вычитание (как бинарный оператор) или отрицание (как унарный оператор).
++ - Инкремент.
- - Декремент.
* - Умножение.
/ - Целочисленное деление с округлением к меньшему по модулю целому. Например, 7/4 и -7/4 округляются до 1, а -7/4 и 7/-4 округляются до -1.
// - Целочисленное деление с округлением к ближайшему целому числу. Полуцелые числа округляются в сторону ближайшего большего по модулю числа, если не указано другое. Например, 3//2 округляется до 2, а -3//2 округляется до -2.
DIV - Целочисленное разделение с округлением результата в сторону
|| - Абсолютное значение. |x| = x, когда x > 0
|x| = 0, когда x == 0
|x| = -x, когда x < 0
% - Деление с остатком. Операция определена только для положительных чисел.
Sign () - Sign (x) = 1, когда x > 0
Sign (x) = 0, когда x == 0
Sign (x) = -1, когда x < 0
NINT () - Округление до ближайшего целого. Возвращает самое близкое к вещественному аргументу целочисленное значение. Полуцелые числа округляются в сторону от нуля.
sin - Синус.
cos - Косинус.
exp - Экспонента.
log 10 - Логарифм по основанию 10.
3.2.2. Логические операторы
|| - Логическое ИЛИ.
&& - Логическое И.
! - Логическое НЕТ.
3.2.3. Операторы сравнения
> - Больше
>= - Больше или равно
< - Меньше
<= - Меньше или равно
== - Равно
!= - Не равно
max [,...,] - максимальное значение.
min [,...,] - минимальное значение.
3.2.4. Побитные операторы
Использование побитных операций подразумевает представление чисел в дополнительном коде.
& - Побитное И.
| - Побитное ИЛИ.
>> - Сдвиг вправо со знаком.
<< - Сдвиг влево с нулевым заполнением.
3.2.5. Присвоение
= - Оператор присвоения.
3.2.6. Мнемоники
Следующие мнемоники подлежат определению для описания различных типов данных, используемых в кодированном потоке битов.
bslbf - Битовая строка, младший бит слева. Битовые строки пишутся как
строка единиц и нулей внутри одинарных кавычек, например
'1000 0001'. Пробелы внутри битовой строки вводятся для удобства
чтения и не имеют никакого значения.
L, C, R, LS, RS - Аудиосигналы: левый, центральный, правый, левый
окружения, правый окружения.
M/S - Середина/сторона M = (L + R)/2 и S = (L - R)/2.
rpchof - Коэффициенты остатка от деления на порождающий полином, сначала
следует коэффициент высшего порядка. (Аудио).
uimsbf - Целое число без знака, старший бит первый.
vlclbf - Код с переменной длиной слова, левый бит первый, где левый
относится к порядку, в котором пишутся коды с переменной длиной.
window - Номер фактического временного слота в случае block_type == 2,
0 <= window <= 2. (Аудио).
В многобайтовых словах старший байт является первым.
3.2.7. Константы
e - 2,71828182845...
Поток битов на входе декодера описывается в разделе 4. Каждый элемент данных выделен жирным. При описании элемента указываются:
- его имя;
- его длина в битах, где X.. Y указывает, что количество битов принадлежит диапазону от X до Y, включая X и Y. {X; Y} означает, что количество битов равно X или Y в зависимости от значения других элементов данных в потоке битов;
- мнемоника для его типа и порядок передачи.
Действие, вызванное декодируемым элементом данных в потоке битов, зависит от значения того элемента данных и на элементах данных, ранее декодируемых. Декодирование элементов данных и определение параметров состояния, используемых в их декодировании, описываются в пунктах, следующих за описанием синтаксиса. Следующие конструкции используются, чтобы выразить условия, когда элементы данных присутствуют, и указаны обычным шрифтом.
Следует обратить внимание, что в этом синтаксисе используется принятое в языке C соглашение о том, что переменная или выражение, возвращающие ненулевое значение, эквивалентны результату "истина":
Следует обратить внимание на следующие наиболее распространенные варианты использования этой конструкции:
Как отмечено, группа элементов данных может содержать вложенные условные конструкции. Для компактности {} может быть опущен, когда следует только один элемент данных:
Знание самого синтаксиса потока битов в разделе 4 не следует считать достаточным для декодирования. В частности, это лишь определяет корректный и свободный от ошибок входной поток битов. Реальные декодеры для того, чтобы правильно начать декодирование, должны иметь средства обнаружения стартовых последовательностей.
Определение функции nextbits
Функция nextbits() реализует сравнение строки битов со строкой битов на входе декодера.
Описание синтаксиса потока битов представлено в таблицах 2 - 30.
Таблица 2
Таблица 3
Таблица 4
Таблица 5
Таблица 6
??????????????????????????????????????????????????????????????????????????????
? Синтаксис ?Количест-?Мнемо-?
? ?во битов ?ника ?
??????????????????????????????????????????????????????????????????????????????
?adts header error check () ? ? ?
?{ ? ? ?
?if (protection_absent == '0') { ? ? ?
?for (i = 1; i <= number of raw data blocks in frame; i++) {? ? ?
?raw data block position[i]; ? 16 ?Uimsfb?
?} ? ? ?
?crc check; ? 16 ?rpchof?
?} ? ? ?
?} ? ? ?
??????????????????????????????????????????????????????????????????????????????
Таблица 7
???????????????????????????????????????????????????????????????????????????
? Синтаксис ? Количество битов ? Мнемоника ?
???????????????????????????????????????????????????????????????????????????
?adts raw data block error check() ? ? ?
?{ ? ? ?
?if (protection absent == '0') ? ? ?
?crc check; ? 16 ? rpchof ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
4.2.1. Фиксированный заголовок ADTS
Таблица 8
4.2.2. Переменный заголовок ADTS
Таблица 9
???????????????????????????????????????????????????????????????????????????
? Синтаксис ?Количество битов ? Мнемоника ?
???????????????????????????????????????????????????????????????????????????
?adts_variable_header() ? ? ?
?{ ? ? ?
?copyright_identification_bit; ? 1 ? bslbf ?
?copyright_identification_start; ? 1 ? bslbf ?
?aac_frame_length; ? 13 ? bslbf ?
?adts_buffer_fullness; ? 11 ? bslbf ?
?number_of_raw_data_blocks_in_frame; ? 2 ? uimsfb ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
4.2.3. Обнаружение ошибок
Таблица 10
???????????????????????????????????????????????????????????????????????????
? Синтаксис ?Количество битов ? Мнемоника ?
???????????????????????????????????????????????????????????????????????????
?adts_error_check() ? ? ?
?{ ? ? ?
?if (protection absent == '0') ? ? ?
?crc check; ? 16 ? rpchof ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 11
Таблица 12
Таблица 13
???????????????????????????????????????????????????????????????????????????
? Синтаксис ?Количество битов ? Мнемоника ?
???????????????????????????????????????????????????????????????????????????
?single_channel_element() ? ? ?
?{ ? ? ?
?element_instance_tag; ? 4 ? uimsbf ?
?individual_channel_stream(0); ? ? ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 14
???????????????????????????????????????????????????????????????????????????
? Синтаксис ?Количество битов ? Мнемоника ?
???????????????????????????????????????????????????????????????????????????
?channel_pair_element() ? ? ?
?{ ? ? ?
?element_instance_tag; ? 4 ? uimsbf ?
?common_window; ? 1 ? uimsbf ?
?if (common_window) { ? ? ?
? ics_info(); ? ? ?
?ms_mask_present; ? 2 ? uimsbf ?
?if (ms_mask_present == 1) { ? ? ?
?for (g = 0; g < num_window_groups; g++) { ? ? ?
?for (sfb = 0; sfb < max_sfb; sfb++) { ? ? ?
? ms_used[g][sfb]; ? 1 ? uimsbf ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
?individual_channel_stream(common_window); ? ? ?
?individual channel stream(common window); ? ? ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 15
???????????????????????????????????????????????????????????????????????????
? Синтаксис ? Количество ? Мнемоника ?
? ? битов ? ?
???????????????????????????????????????????????????????????????????????????
?ics_info() ? ? ?
?{ ? ? ?
?ics_reserved_bit; ? 1 ? bslbf ?
?window_sequence; ? 2 ? uimsbf ?
?window shape; ? 1 ? uimsbf ?
?if (window sequence == EIGHT SHORT SEQUENCE) { ? ? ?
?max sfb; ? ? ?
? scale factor grouping; ? 4 ? uimsbf ?
?} ? 7 ? uimsbf ?
?else { ? ? ?
?max sfb; ? 6 ? uimsbf ?
?predictor data present; ? 1 ? uimsbf ?
?if (predictor data present) { ? ? ?
?predictor reset; ? 1 ? uimsbf ?
?if (predictor reset) { ? ? ?
?predictor reset group number; ? 5 ? uimsbf ?
?} ? ? ?
?for (sfb = 0; sfb < min(max sfb, ? ? ?
?PRED SFB MAX); sfb++) { ? ? ?
?prediction used[sfb]; ? 1 ? uimsbf ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 16
???????????????????????????????????????????????????????????????????????????
? Синтаксис ? Количество ? Мнемоника ?
? ? битов ? ?
???????????????????????????????????????????????????????????????????????????
?individual_channel_stream(common_window) ? ? ?
?{ ? ? ?
?global_gain; ? 8 ? uimsbf ?
?if (!common_window) ? ? ?
? ics_info(); ? ? ?
? section_data(); ? 1 ? uismbf ?
? scale_factor_data(); ? ? ?
?pulse_data_present; ? ? ?
?if (pulse_data_present) { ? ? ?
? pulse data(); ? 1 ? uimsbf ?
?} ? ? ?
?tns_data_present; ? ? ?
?if (tns_data_present) { ? ? ?
?tns data(); ? 1 ? uimsbf ?
?} ? ? ?
?gain_control_data_present; ? ? ?
?if (gain_control_data_present) { ? ? ?
?gain control data(); ? ? ?
?} ? ? ?
?spectral data(); ? ? ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 17
???????????????????????????????????????????????????????????????????????????
? Синтаксис ? Количество ? Мнемоника ?
? ? битов ? ?
???????????????????????????????????????????????????????????????????????????
?section data() ? ? ?
?{ ? ? ?
?if (window_sequence == EIGHT_SHORT_SEQUENCE) ? ? ?
?sect_esc_val = (1<<3) -1; ? ? ?
?else sect_esc_val = (1<<5) -1; ? ? ?
?for (g = 0; g < num window groups; g++) { ? ? ?
?k = 0; ? ? ?
?i = 0; ? ? ?
? while (k < max_sfb) { ? ? ?
?sect_cb[g][i]; ? ? ?
?sect_len = 0; ? ? ?
?while (sect_len_incr == sect_esc_val) { ? 4 ? uimsbf ?
?sect_len += sect_esc_val; ? ? ?
?} ? {3; 5} ? uismbf ?
?sect_len += sect_len_incr; ? ? ?
?sect_start[g][i] = k; ? ? ?
?sect_end[g][i] = k+sect_len; ? ? ?
?for (sfb = k; sfb < k+sect_len; sfb++) ? ? ?
?sfb_cb[g][sfb] = sect_cb[g][i]; ? ? ?
?k += sect_len; ? ? ?
?l++; ? ? ?
?num_sec[g] = i; ? ? ?
?} ? ? ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 18
???????????????????????????????????????????????????????????????????????????
? Синтаксис ? Количество ? Мнемоника ?
? ? битов ? ?
???????????????????????????????????????????????????????????????????????????
?scale_factor_data() ? ? ?
?{ ? ? ?
?for (g = 0; g < num_window_groups; g++) { ? ? ?
?for (sfb = 0; sfb < max sfb; sfb++) { ? ? ?
?if (sfb_cb[g][sfb] != ZERO_HCB) { ? ? ?
?if (is_intensity(g,sfb)) ? ? ?
?hcod_sf[dpcm_is_position[g][sfb]]; ? 1..19 ? vlclbf ?
?else ? ? ?
?hcod_sf [dpcm_sf [g] [sfb]]; ? 1..19 ? vlclbf ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 19
???????????????????????????????????????????????????????????????????????????
? Синтаксис ? Количество ? Мнемоника ?
? ? битов ? ?
???????????????????????????????????????????????????????????????????????????
?tns_data() ? ? ?
?{ ? ? ?
?for (w = 0; w < num windows; w++) { ? 1..2 ? uimsbf ?
?n filt[w]; ? ? ?
?if (n_filt[w]) ? ? ?
?coef res[w]; ? 1 ? uimsbf ?
?for (filt = 0; filt < n filt[w]; filt++) { ? ? ?
?length[w][filt]; ? {4;6} ? uimsbf ?
?order[w][filt]; ? {3;5} ? uimsbf ?
?if (order[w][filt]) { ? ? ?
?direction[w][filt]; ? ? ?
?coef_compress[w][filt]; ? 1 ? uimsbf ?
?for (i = 0; i < order[w][filt]; i++) ? 1 ? uimsbf ?
?coef[w][filt][i]; ? 2..4 ? uimsbf ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 20
???????????????????????????????????????????????????????????????????????????
? Синтаксис ? Количество ? Мнемоника ?
? ? битов ? ?
???????????????????????????????????????????????????????????????????????????
?spectral_data() ? ? ?
?{ ? ? ?
?for (g = 0; g < num window groups; g++) { ? ? ?
?for (i = 0; i < num sec[g]; i++) { ? ? ?
?if (sect cb[g][i] != ZERO HCB && ? ? ?
?sect_cb[g][i] <= ESC_HCB) { ? ? ?
?for (k = sect_sfb_offset[g][sect_start[g][i]]; ? ? ?
?k < sect sfb offset[g][sect end[g][i]];) { ? ? ?
?if (sect cb[g][i]<FIRST PAIR HCB){ ? ? ?
?hcod[sect_cb[g][i]][w][x][y][z]; ? 1..16 ? vlclbf ?
?if (unsigned_cb[sect_cb[g][i]]) ? ? ?
?quad sign bits; ? 0..4 ? bslbf ?
?k += QUAD_LEN; ? ? ?
?} else { ? ? ?
?hcod[sect_cb[g][i]][y][z]; ? ? ?
?if (unsigned_cb[sect_cb[g][i]]) ? 1..15 ? vlclbf ?
?pair_sign_bits; ? ? ?
?k += PAIR_LEN; ? 0..2 ? bslbf ?
?if (sect cb[g][i] == ESC_HCB) { ? ? ?
?if (y == ESC_FLAG) ? ? ?
?hcod_esc_y; ? ? ?
?if (z == ESC_FLAG) ? 5..21 ? vlclbf ?
?hcod_esc_z; ? ? ?
?} ? 5..21 ? vlclbf ?
? } ? ? ?
? } ? ? ?
? } ? ? ?
? } ? ? ?
? } ? ? ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 21
???????????????????????????????????????????????????????????????????????????
? Синтаксис ? Количество ? Мнемоника ?
? ? битов ? ?
???????????????????????????????????????????????????????????????????????????
?pulse_data() ? ? ?
?{ ? ? ?
?number_pulse; ? 2 ? uimsbf ?
?pulse_start_sfb; ? 6 ? uimsbf ?
?for (i = 0; i < number_pulse+1; i++) { ? ? ?
?pulse_offset[i]; ? 5 ? uimsbf ?
?pulse_amp[i]; ? 4 ? uimsbf ?
?} ? ? ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 22
???????????????????????????????????????????????????????????????????????????
? Синтаксис ? Количество ? Мнемоника ?
? ? битов ? ?
???????????????????????????????????????????????????????????????????????????
?coupling_channel_element() ? ? ?
?{ ? ? ?
?element_instance_tag; ? 4 ? uimsbf ?
?ind_sw_cce_f l ag; ? 1 ? uimsbf ?
?num_coupled_elements; ? 3 ? uimsbf ?
?num_gain_element_lists = 0; ? ? ?
?for (c = 0; c < num_coupled_elements+1; c++) { ? ? ?
?num_gain_element_lists++; ? ? ?
?cc_target_is_cpe[c]; ? 1 ? uimsbf ?
?cc_target_tag_select[c]; ? 4 ? uimsbf ?
?if (cc target is cpe[c]) { ? ? ?
?cc_l[c]; ? 1 ? uimsbf ?
?cc_r[c]; ? ? ?
?if (cc_l[c] && cc_r[c]) ? 1 ? uimsbf ?
?num gain element lists++; ? 1 ? uimsbf ?
?} ? ? ?
?} ? ? ?
?cc_domain; ? ? ?
?gain_element_sign; ? 1 ? uimsbf ?
?gain_element_scale; ? 2 ? uimsbf ?
?individual_channel_stream(0); ? 1 ? uimsbf ?
?for (c = 1; c < num_gain_element_lists; c++) { ? ? ?
?if (ind_sw_cce_flag) { ? ? ?
?cge = 1; ? ? ?
?} else { ? ? ?
?common_gain_element_present[c]; ? 1..19 ? vlclbf ?
?cge = common_gain_element_present[c]; ? ? ?
?} ? ? ?
? if (cge) ? ? ?
?hcod_sf[common_gain_element[c]]; ? 1..19 ? vlclbf ?
?else{ ? ? ?
?for (g = 0; g < num_window_groups; g++) { ? ? ?
?for (sfb = 0; sfb < max_sfb; sfb++) { ? ? ?
?if (sfb_cb[g][sfb] != ZERO_HCB); ? ? ?
?hcod sf[dpcm_gain_element[c][g][sfb]]; ? ? ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 23
???????????????????????????????????????????????????????????????????????????
? Синтаксис ? Количество ? Мнемоника ?
? ? битов ? ?
???????????????????????????????????????????????????????????????????????????
?lfe_channel_element() ? ? ?
?{ ? ? ?
?element_instance_tag; ? 4 ? uimsbf ?
?individual_channel_stream(0); ? ? ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 24
???????????????????????????????????????????????????????????????????????????
? Синтаксис ? Количество ? Мнемоника ?
? ? битов ? ?
???????????????????????????????????????????????????????????????????????????
?data_stream_element() ? ? ?
?{ ? ? ?
?element_instance_tag; ? 4 ? uimsbf ?
?data_byte_align_flag; ? 1 ? uimsbf ?
?cnt = count; ? 8 ? uimsbf ?
?if (cnt == 255) { ? ? ?
?cnt += esc_count; ? 8 ? uimsbf ?
?if (data_byte_align_flag) { ? ? ?
?byte_alignment(); ? ? ?
?for (i = 0; i < cnt; i++) { ? ? ?
?data_stream_byte[element_instance_tag][i]; ? 8 ? uimsbf ?
?} ? ? ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 25
???????????????????????????????????????????????????????????????????????????
? Синтаксис ?Количество?Мнемоника ?
? ? битов ? ?
???????????????????????????????????????????????????????????????????????????
?program_config_element() ? ? ?
?{ ? ? ?
?element_instance_tag; ? 4 ? uimsbf ?
?profile; ? 2 ? uimsbf ?
?sampling_frequency_index; ? 4 ? uimsbf ?
?num_front_channel_elements; ? 4 ? uimsbf ?
?num_side_channel_elements; ? 4 ? uimsbf ?
?num_back_channel_elements; ? 4 ? uimsbf ?
?num_lfe_channel_elements; ? 2 ? uimsbf ?
?num_assoc_data_elements; ? 3 ? uimsbf ?
?num_valid_cc_elements; ? 4 ? uimsbf ?
?mono_mixdown_present; ? 1 ? uimsbf ?
?if (mono_mixdown_present ==1) ? ? ?
?mono_mixdown_element_number; ? 4 ? uimsbf ?
?stereo_mixdown_present; ? 1 ? uimsbf ?
?if (stereo_mixdown_present ==1) ? ? ?
?stereo_mixdown_element_number; ? 4 ? uimsbf ?
?matrix_mixdown_idx_present; ? 1 ? uimsbf ?
?if (matrix_mixdown_idx_present == 1) { ? ? ?
?matrix_mixdown_idx; ? 2 ? uimsbf ?
?pseudo_surround_enable; ? 1 ? uimsbf ?
?} ? ? ?
?for (i = 0; i < num_front_channel_elements; i++) { ? 1 ? bslbf ?
?front_element_is_cpe[i]; ? 4 ? uimsbf ?
?front_element_tag_select[i]; ? ? ?
?} ? 1 ? bslbf ?
?for (i = 0; i < num_side_channel_elements; i++) { ? 4 ? uimsbf ?
?side_element_is_cpe[i]; ? ? ?
?side_element_tag_select[i]; ? 1 ? bslbf ?
?} ? 4 ? uimsbf ?
?for (i = 0; i < num_back_channel_elements; i++) { ? ? ?
?back_element_is_cpe[i]; ? 4 ? uimsbf ?
?back_element_tag_select[i]; ? ? ?
?} ? 4 ? uimsbf ?
?for (i = 0; i < num_lfe_channel_elements; i++) ? ? ?
?lf e_element_tag_select[i]; ? 1 ? uimsbf ?
?for (i = 0; i < num_assoc_data_elements; i++) ? ? ?
?assoc_data_element_tag_select[i]; ? 4 ? uimsbf ?
?for (i = 0; i < num_valid_cc_elements; i++) { ? 8 ? uimsbf ?
?cc_element_is_ind_sw[i]; ? ? ?
?valid_cc_element_tag_select[i]; ? 8 ? uimsbf ?
?} ? ? ?
?byte_alignment(); ? ? ?
?comment_field_bytes; ? ? ?
?for (i = 0; i < comment_field_bytes; i++) ? ? ?
?comment field data[i]; ? ? ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 26
???????????????????????????????????????????????????????????????????????????
? Синтаксис ? Количество ? Мнемоника ?
? ? битов ? ?
???????????????????????????????????????????????????????????????????????????
?fill_element() ? ? ?
?{ ? ? ?
?cnt = count; ? 4 ? uimsbf ?
?if (cnt== 15) ? ? ?
?cnt += esc count -1; ? 8 ? uimsbf ?
?while (cnt > 0) { ? ? ?
?cnt -= extension_payload(cnt); ? ? ?
?} ? ? ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 27
???????????????????????????????????????????????????????????????????????????
? Синтаксис ?Количество ?Мнемоника ?
? ? битов ? ?
???????????????????????????????????????????????????????????????????????????
?gain_control_data() ? ? ?
?{ ? ? ?
?max_band; ? 2 ? uimsbf ?
?if (window_sequence == ONLY_LONG_SEQUENCE) { ? ? ?
?for (bd = 1; bd <= max_band; bd++) { ? ? ?
?for (wd = 0; wd < 1; wd++) { ? ? ?
?adjust_num[bd][wd]; ? 3 ? uimsbf ?
?for (ad = 0; ad < adjust_num[bd][wd]; ad++) { ? ? ?
?alevcode[bd][wd][ad]; ? 4 ? uimsbf ?
?aloccode[bd][wd][ad]; ? 5 ? uimsbf ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
?} ? 3 ? uimsbf ?
?else if (window_sequence == LONG_START_SEQUENCE) ? ? ?
?{ ? 4 ? uimsbf ?
?for (bd = 1; bd <= max_band; bd++) { ? ? ?
?for (wd = 0; wd < 2; wd++) { ? 4 ? uimsbf ?
?adjust_num[bd][wd]; ? ? ?
?for (ad = 0; ad < adjust_num[bd][wd]; ad++) { ? 2 ? uimsbf ?
?alevcode[bd] [wd] [ad]; ? ? ?
?if(wd == 0) ? ? ?
?aloccode[bd] [wd] [ad]; ? ? ?
?else ? ? ?
?aloccode[bd][wd][ad]; ? ? ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
?else if (window sequence == ? ? ?
?EIGHT_SHORT_SEQUENCE) { ? ? ?
?for (bd = 1; bd <= max_band; bd++) { ? ? ?
?for (wd = 0; wd < 8; wd++) { ? ? ?
?adjust_num[bd][wd]; ? 3 ? uimsbf ?
?for (ad = 0; ad < adjust_num[bd][wd]; ad++) { ? ? ?
?alevcode[bd] [wd] [ad]; ? 4 ? uimsbf ?
?aloccode[bd] [wd] [ad]; ? 2 ? uimsbf ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
?else if (window_sequence == LONG_STOP_SEQUENCE) { ? ? ?
?for (bd = 1; bd <= max_band; bd++) { ? ? ?
?for (wd = 0; wd < 2; wd++) { ? ? ?
?adjust_num[bd][wd]; ? 3 ? uimsbf ?
?for (ad = 0; ad < adjust_num[bd][wd]; ad++) { ? ? ?
?alevcode[bd][wd][ad]; ? 4 ? uimsbf ?
?if (wd == 0) ? ? ?
?aloccode[bd][wd][ad]; ? 4 ? uimsbf ?
?else ? 5 ? uimsbf ?
?aloccode[bd][wd][ad]; ? ? ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 28
???????????????????????????????????????????????????????????????????????????
? Синтаксис ? Количество ? Мнемоника ?
? ? битов ? ?
???????????????????????????????????????????????????????????????????????????
?extension_payload(cnt) ? ? uimsbf ?
?{ ? ? ?
?extension_type; ? 4 ? ?
?switch (extension type) { ? ? ?
?case EXT_DYNAMIC_RANGE: ? ? ?
?n = dynamic_range_info(); ? ? ?
?return n; ? ? Note 1 ?
?case EXT_SBR_DATA: ? ? ?
?return_sbr_extension_data(id aac, 0); ? ? Note 1 ?
?case EXT_SBR_DATA_CRC: ? ? ?
?return_sbr_extension_data(id aac, 1); ? ? Uimsbf ?
?case EXT FILL DATA: ? ? ?
?fill_nibble; /* равен "0000" */ ? 4 ? Uimsbf ?
?for (i = 0; i < cnt-1; i++) ? ? ?
?fill_byte[i]; /* равен "10100101" */ ? 8 ? ?
?return cnt; ? ? ?
?case default: ? ? uimsbf ?
?for(i = 0; i<8*(cnt-1)+4;i++) ? ? ?
?other_bits[i]; ? 1 ? ?
?return cnt; ? ? ?
?} ? ? ?
?} ? ? ?
???????????????????????????????????????????????????????????????????????????
Примечание. 1. id_aac является id_syn_ele соответствующего элемента AAC (ID_SCE или ID_CPE) или SCE ID в случае CCE.
Таблица 29
???????????????????????????????????????????????????????????????????????????
? Синтаксис ? Количество ? Мнемоника ?
? ? битов ? ?
???????????????????????????????????????????????????????????????????????????
?dynamic range info() ? ? ?
?{ ? ? ?
?n = 1; drc_num_bands = 1; ? ? ?
?pce_tag_present; if ? 1 ? uimsbf ?
?(pce_tag_present == 1) { ? ? ?
?pce_instance_tag; ? 4 ? uimsbf ?
?drc_tag_reserved_bits; ? 4 ? uimsbf ?
?excluded_chns_present; ? 1 ? Uimsbf ?
?if (excluded_chns_present == 1) { ? ? ?
?n += excluded_channels(); ? ? ?
?drc_bands_present; if ? 1 ? Uimsbf ?
?(drc_bands_present == 1) { ? ? ?
?drc_band_incr; ? 4 ? uimsbf ?
?drc_bands_reserved_bits; ? 4 ? uimsbf ?
?drc_num_bands = drc_num_bands + drc_band_incr; ? ? ?
?for (i = 0; i < drc_num_bands; i++) { ? ? ?
?drc_band_top[i]; ? 8 ? uimsbf ?
?prog_ref_level_present; if ? 1..7 ? uimsbf ?
?(prog_ref_level_present == 1) { ? ? ?
?prog_ref_level; ? 1 ? uimsbf ?
?prog_ref_level_reserved_bits; ? 1 ? uimsbf ?
?for (i = 0; i < drc_num_bands; i++) ? ? uimsbf ?
?{ dyn_rng_sgn[i]; dyn_rng_ctl[i]; ? 7 ? uimsbf ?
?return n; ? ? ?
???????????????????????????????????????????????????????????????????????????
Таблица 30
???????????????????????????????????????????????????????????????????????????
? Синтаксис ?Количество ?Мнемоника ?
? ? битов ? ?
???????????????????????????????????????????????????????????????????????????
?excluded_channels() ? ? ?
?{ ? ? ?
?n = 0; ? ? ?
?num_excl_chan = 70; ? ? ?
?for (i = 0; i < 7; i++) ? ? ?
?exclude_mask[i]; ? 1 ? uimsbf ?
?while (additional_excluded_chns[n-1] == 1) { ? 1 ? uimsbf ?
?for (i = num_excl_chan; i < num_excl_chan+7; i++) ? ? ?
?exclude_mask[i]; ? 1 ? uimsbf ?
?num_excl_chan += 7; ? ? ?
?return n; ? ? ?
???????????????????????????????????????????????????????????????????????????
Стандартом устанавливаются три профиля (таблица 31):
Основной профиль
Профиль пониженной сложности
Профиль с масштабируемой частотой дискретизации
В program_config_element() и adts_fixed_header() поле из двух битов указывает на используемый профиль:
Таблица 31
5.1.1. Основной профиль
Основной профиль используется тогда, когда затраты в памяти не имеют особого значения и доступны существенные вычислительные ресурсы. Для обеспечения лучшего возможного сжатия могут использоваться все инструменты, за исключением инструмента регулирования усиления. В потоке битов основного профиля должна содержаться только одна программа (program_config_element()). Программа в потоке битов основного профиля не должна содержать никаких элементов моно или стерео сведения.
5.1.2. Профиль с пониженной сложностью
Профиль с пониженной сложностью используется тогда, когда ресурс RAM вычислительных мощностей и требования сжатия ограничены определенными рамками. В профиле с пониженной сложностью не используются предсказание и инструмент регулирования усиления, кроме того, порядок TNS ограничен. В потоке битов профиля с пониженной сложностью должна содержаться только одна программа (program_config_element()). Программа в потоке битов профиля с пониженной сложностью не должна содержать никаких элементов моно или стерео сведения.
5.1.3. Профиль с масштабируемой частотой дискретизации
В профиле с масштабируемой частотой дискретизации требуется инструмент регулирования усиления. Предсказание и спаривание каналов не разрешены, порядок TNS и ширина канала ограничены. Для самого низкого из 4 PQF диапазонов регулирование усиления не используется. В случае сокращения полосы частот звукового сигнала профиль SSR масштабируется соответственно сложности. В потоке битов профиля с масштабируемой частотой дискретизации должна содержаться только одна программа (program_config_element()). Программа в потоке битов профиля с масштабируемой частотой дискретизации не должна содержать никаких элементов моно или стерео сведения.
5.1.4. Соглашение о присвоении имен для декодеров и потоков битов MPEG-2 AAC
Декодер или поток битов могут быть определены как A.L.I.D <Имя профиля> MPEG-2 AAC декодер или поток битов, где A - число основных звуковых каналов, L - число каналов LFE, I - число независимо переключаемых каналов, D - число зависимо переключаемых каналов и <Имя профиля> - фактическое имя профиля. Пример: название "декодер 5.1.1.1 основного профиля MPEG-2 AAC" соответствует декодеру, способному декодировать 5 основных звуковых каналов, один канал LFE и по одному из независимо и зависимо переключаемых CCE, используя с каждым из каналов определенный профиль. Это может быть сокращено как M.5.1.1.1, где M указывает на основной профиль декодера. Точно так же декодер с профилем пониженного уровня сложности может быть определен как L, а профиль SSR - S.
5.1.5. Соглашение о присвоении имен для декодеров и потоков битов MPEG-2 AAC + MPEG 4 SBR
Декодер или поток битов, дополнительно соответствующий MPEG-4 AOT SBR, на определенном уровне может быть обозначен аналогично путем добавления "+ SBR / X [HQ/LP]" к имени декодера, где X - уровень декодера/потока битов профиля HE-AAC с характеристиками, определенными в ИСО/МЭК 14496-3 [3]. Пример: декодер 5.1.1.1 основного профиля MPEG-2 AAC + SBR / 5 HQ.
5.1.6. Минимальное количество основных звуковых каналов и профилей, поддерживаемых декодером
Чтобы обеспечить определенный уровень функциональной совместимости, определяются следующие минимальные возможности декодеров для данного профиля и числа основных звуковых каналов (таблица 32).
Таблица 32
Минимальные возможности декодера
с точки зрения конфигурации каналов
5.1.7. Параметры инструментов, зависящие от профиля
В соответствии с используемым профилем значение константы TNS_MAX_ORDER устанавливается для длинных окон следующим образом: TNS_MAX_ORDER==20 для основного профиля, TNS_MAX_ORDER==12 для профиля с пониженной сложностью и профиля с масштабируемой частотой дискретизации. Для коротких окон константа TNS_MAX_ORDER==7 для всех профилей.
Согласно частоте дискретизации и используемому профилю значение константы TNS_MAX_BANDS устанавливается в соответствии с таблицей 33.
Таблица 33
Значения TNS_MAX_BANDS в зависимости
от профиля и частоты дискретизации
Любой поток битов данного профиля (таблица 34), число основных звуковых каналов, каналов LFE, независимых и зависимых каналов которого меньше или равно соответствующему числу каналов, поддерживаемых декодером того же самого профиля, может быть декодирован этим декодером.
Таблица 34 и рисунок 3 описывают функциональную совместимость трех профилей.
Таблица 34
![]() Блок raw_data_block() содержит все данные, относящиеся к аудио (включая вспомогательные данные). Кроме того, дополнительная информация, такая как sampling_frequency, необходима, чтобы полностью описать аудио последовательность. Формат обмена аудиоданными (ADIF) содержит все элементы, которые необходимы для описания потока битов согласно этому стандарту.
В определенных приложениях некоторые или все элементы синтаксиса, подобно тем, которые определены в заголовке ADIF, например sampling_rate, могут быть известны декодеру за счет других средств и, следовательно, не появляются в потоке битов.
Кроме того, может требоваться дополнительная информация, которая изменяется от блока до блока (например, для улучшения считывания или устойчивости к ошибкам). Поэтому транспортные потоки могут быть разработаны для определенного приложения и не определяются в этом стандарте. Однако здесь описывается один нестандартный транспортный поток под названием Транспортный поток аудиоданных (ADTS). Он может использоваться для приложений, в которых декодер может считать этот поток.
6.1.2.1. Краткий обзор
Формат обмена аудиоданными (ADIF) содержит один заголовок в начале последовательности, сопровождаемый raw_data_stream(). raw_data_stream() может не содержать дальнейших program_config_element () элементов.
ADIF применим только для систем с определенной точкой начала декодирования, не подразумевающих начало процесса декодирования с заранее неизвестной позиции потока аудиоданных. Он может использоваться в качестве формата обмена, в котором содержится вся информация, необходимая для декодирования и воспроизведения аудиоданных.
6.1.2.2. Определения
6.1.2.2.1. Функции данных
6.1.2.2.3. Элементы справки
6.1.3.1. Краткий обзор
Транспортный поток аудиоданных (ADTS) будет распознан декодерами как "Уровень 4" потока битов.
Фиксированный заголовок ADTS содержит синхрослово плюс все части заголовка, которые необходимы для декодирования и которые не изменяются от фрейма к фрейму. Переменный заголовок ADTS содержит данные заголовка, которые изменяются от фрейма к фрейму.
6.1.3.2. Определения
6.1.3.2.1. Функции данных
6.1.3.2.2. Элементы данных
Таблица 35
от sampling_frequency_index
6.2.1.1. Функции данных
6.2.1.2. Элементы данных
Таблица 36
Идентификация синтаксических элементов
6.2.2.1. Минимальный входной буфер декодера
Следующие правила используются для вычисления максимального количества битов во входном буфере как для потока битов в целом для любой данной программы, так и для любого данного SCE/CPE/CCE:
Входной размер буфера составляет 6144 бита на SCE или независимо переключаемого CCE плюс 12288 битов на CPE (6144*NCC). Размеры общего буфера и отдельного буфера ограничиваются так, чтобы предел буферизации мог быть вычислен для всего потока битов, всей программы или для отдельного audio_channel_element(), позволяя декодеру разбивать многоканальный поток битов на отдельные моно и стерео потоки битов, которые декодируются отдельными моно и стерео декодерами соответственно. Все биты для LFE или зависимого CCE должны выделяться исходя из общих требований к буферу, основанных на независимых CCE, SCE и CPE. Кроме того, все биты, требуемые для любых DSE, PCE, FIL, фиксированных заголовков, переменных заголовков, byte_alignment и CRC, должны быть также выделены исходя из тех же самых общих требований к буферу.
Управление резервуаром битов осуществляется в кодере. Максимальный резервуар битов в кодере зависит от NCC и средней скорости передачи. Максимальный размер резервуара битов для каналов с постоянной скоростью передачи может быть вычислен путем вычитания среднего числа битов на блок из минимального входного размера буфера декодера. Например, при 96 кбит/с для сигнала стерео на частоте дискретизации 44,1 кГц среднее число битов на блок (mean_framelength) (96000 bit/s/44100 1/s* 1024) = 2229,1156.... Это приводит к максимальному размеру резервуара битов (max_bit_reservoir) INT (12288 битов - 2229,1156...) = 10058. Для каналов с переменной скоростью передачи кодер должен работать так, чтобы требования к входному буферу не превышали минимальный входной буфер декодера.
Состояние резервуара битов (bit_reservoir_state) передается в поле buffer_fullness либо как состояние резервуара битов, округленного до целого значения (adif_buffer_fullness), либо как состояние резервуара битов, разделенного на NCC, разделенного на 32 и округленного до целого значения (adts_buffer_fullness).
bit_reservoir_state последующих фреймов может быть получен следующим образом:
bit reservoir_state[frame] = bit_reservoir_state[frame - 1] + mean_framelength - framelength[frame].
Framelengths должны быть выбраны так, чтобы следующее условие выполнялось:
0 <= bit_reservoir_state[frame] <= max_bit_reservoir.
6.2.2.3. Максимальная скорость передачи
Максимальная скорость передачи зависит от частоты дискретизации звука. Она может быть вычислена по минимальному размеру входного буфера согласно формуле
.В таблице 37 содержится несколько примеров максимальных скоростей передачи на канал в зависимости от используемой частоты дискретизации.
Таблица 37
Максимальная скорость передачи
в зависимости от частоты дискретизации
Предполагая, что начало raw_data_block() известно, он может быть декодирован без использования дополнительной информации транспортного уровня и содержит 1024 отсчета звукового сигнала на один выходной канал. Частота дискретизации звукового сигнала, sampling_frequency_index, может быть указана в program_config_element() или специальным образом в зависимости от приложения. В последнем случае sampling_frequency_index должен быть обнаружен в потоке битов.
Так как данная частота дискретизации связана только с одной таблицей частот дискретизации и так как максимальная гибкость требуется в диапазоне возможных частот дискретизации, следующая таблица должна использоваться, чтобы связать требуемую частоту дискретизации с желаемой.
Таблица 38
Соответствие частот дискретизации
raw_data_stream поддерживает кодирование каналов как с постоянной скоростью, так и с переменной. В каждом случае структура потока битов и работа декодера идентичны, за исключением некоторых незначительных отличий.
Для каналов с постоянной скоростью передачи кодер может добавлять элемент FIL, чтобы увеличить скорость до требуемого уровня. Декодер, считывающий данные канала с постоянной скоростью передачи, должен накопить минимальное число битов в его входном буфере до начала декодирования так, чтобы не произошло переполнение выходного буфера. В случае переменной скорости каждый raw_data_block() может обладать минимальной длиной (скоростью) так, чтобы достигалось требуемое качество звучания и в декодере отсутствовали минимальные входные требования к данным до начала декодирования.
Примеры самых простых потоков битов:
где угловые скобки (<>) используются, чтобы разграничить синтаксические элементы. Для моно сигнала у каждого SCE должно быть то же самое значение в его element_instance_tag, и точно так же для сигнала стерео у каждого CPE должно быть то же самое значение в его element_instance_tag. Для сигналов 5.1 у каждого SCE должно быть то же самое значение в его element_instance_tag, каждый CPE, связанный с фронтальной парой каналов, должен иметь то же самое значение в его element_instance_tag, и каждый CPE, связанный с последней парой каналов, должен иметь то же самое значение в его element_instance_tag.
Если эти потоки битов должны быть переданы по каналу с постоянной скоростью передачи, то они могут включать в себя элемент fill_element() для подстройки мгновенной скорости передачи. В этом случае пример кодированного сигнала стерео
<CPE> <FIL> <TERM> <CPE> <FIL> <TERM>....
Если потоки битов должны переносить вспомогательные данные при передаче по каналу с постоянной скоростью, то пример кодированного сигнала стерео
<CPE><DSE><FIL><TERM><CPE><DSE><FIL><TERM>....
Все элементы data_stream_element() имеют одинаковый element_instance_tag, если они - часть одного потока данных.
6.3. Элемент одиночного канала (SCE), элемент парного канала (CPE) и поток индивидуального канала (ICS)
6.3.1.1. Элементы данных
6.3.1.2. Функции данных
6.3.1.3. Элементы справки
6.3.2.1. Декодирование single_channel_element () и channel_pair_element ()
Элемент single_channel_element () составляется из element_instance_tag и individual_channel_stream. В этом случае ics_info () всегда располагается в individual_channel_stream.
Элемент channel_pair_element () начинается с element_instance_tag и флага common_window. Если common_window равен '1', то ics_info() используется совместно для двух individual_channel_stream элементов, и информация о MS передается. Если common_window равен '0', то ics_info() существует в каждом individual_channel_stream и информация MS не представлена.
6.3.2.2. Декодирование individual_channel_stream ()
В individual_channel_stream используется следующий порядок декодирования:
- получить global_gain;
- получить ics_info () (искать в потоке битов, если общая информация не присутствует);
- получить section_data ();
- получить scalefactor_data (), если есть;
- получить pulse_data (), если есть;
- получить tns_data (), если есть;
- получить gain_control_data (), если есть;
- получить spectral_data (), если есть.
Процесс восстановления pulse_data описан в разделе 7, tns_data - в разделе 12, gain_control данных - в разделе 14. Краткий обзор декодирования ics_info() (см. 6.3), данных раздела 7, масштабных коэффициентов (разделы 7 и 9) и спектральных данных (раздел 7) дается ниже.
6.3.2.3. Восстановление ics_info ()
Для элементов single_channel_element () ics_info () всегда располагается непосредственно после global_gain в inidividual_channel_stream (). Для channel_pair_element () есть два возможных расположения ics_info (). Если оба отдельных канала в парном окне переключаются вместе, то ics_info () располагается непосредственно после common_window в channel_pair_element () и common_window устанавливается в 1. Иначе ics_info () присутствует сразу после global_gain в каждом из двух individual_channel_stream () в channel_pair_element (), и common_window устанавливается в 0.
ics_info () содержит информацию об окне, связанную с ICS, и таким образом позволяет каналам в channel_pair переключаться при необходимости независимо. Кроме того, ics_info () содержит max_sfb, который определяет верхнюю границу количества ms_used [] и predictor_used [] бит, которые должны быть переданы. Если window_sequence является EIGHT_SHORT_SEQUENCE, то scale_factor_grouping передается. Если ряд коротких окон образует группу, то они совместно используют масштабные коэффициенты так же, как и позиции intensity stereo, и их спектральные коэффициенты чередуются. Первое короткое окно всегда является новой группой, таким образом, группировка битов не передается. Последующие короткие окна находятся в той же самой группе, если соответствующий бит группировки равен 1. Новая группа начинается, если соответствующий бит группировки равен 0. Предполагается, что сгруппированные короткие окна обладают подобной сигнальной статистикой. Следовательно, их спектральные значения чередуются для размещения коррелированных коэффициентов друг с другом. Способ чередования показан на рисунке 6. ics_info () также содержит данные предсказания для отдельного канала или пары каналов (см. раздел 11).
6.3.2.4. Восстановление данных разделения
В ICS восстанавливается информация об одном длинном окне или восьми коротких окнах. Данные разделения являются первым полем, которое должно быть декодировано, и описывают коды Хаффмана, которые применяются к полосам масштабных коэффициентов в ICS (см. разделы 7 и 9). Форма данных разделения: sect_cb кодовая книга для раздела и sect_len длина раздела.
Эта длина восстанавливается путем последовательного считывания разделов из потока битов с добавлением символа escape к разделу до тех пор, пока значение, отличное от escape, не будет найдено и добавлено к разделу. Этот процесс ясно объясняется при использовании C-подобного описания синтаксиса. Следует учесть, что в пределах каждой группы разделы должны формировать полосы масштабных коэффициентов от нуля до max_sfb так, чтобы первый раздел в пределах каждой группы начинался с нулевой полосы, а последний раздел заканчивался на полосе max_sfb.
Данные разделения описывают кодовую книгу и затем длину раздела, использующего эту кодовую книгу, начинающегося с первой полосы масштабных коэффициентов и продолжающегося, пока не будет достигнуто полное количество полос масштабных коэффициентов.
После того, как это описание предоставлено, все масштабные коэффициенты и спектральные данные, соответствующие нулевой кодовой книге, обнуляются, и значения, соответствующие этим масштабным коэффициентам или спектральным данным, не будут переданы. Масштабные коэффициенты любых полос масштабных коэффициентов, кодовая книга Хаффмана которых является нулем, будут отброшены. Точно так же все спектральные данные, относящиеся к нулевой кодовой книге Хаффмана, исключаются (см. разделы 7 и 9).
Кроме того, спектральные данные, относящиеся к полосам масштабных коэффициентов, у которых есть сборник интенсивностных кодов, не будут переданы, однако управляющие интенсивностные коэффициенты будут переданы вместо масштабных коэффициентов, как описано в 10.2.
6.3.2.5. Поиск данных о масштабных коэффициентах и декодирование
Для каждой полосы масштабных коэффициентов, которая не находится в разделе, кодированном с помощью нулевой кодовой книги (ZERO_HCB), передается масштабный коэффициент. Такие полосы будут обозначены как "активные" полосы масштабных коэффициентов, а соответствующие масштабные коэффициенты - как "активные" масштабные коэффициенты. Глобальное усиление, первый элемент данных в ICS, обычно является значением первого активного масштабного коэффициента. Все масштабные коэффициенты (и управляющие коэффициенты) передаются с помощью кодированных Хаффманом ДИКМ значений относительно предыдущего "активного" масштабного коэффициента (см. разделы 9 и 11). Первый активный масштабный коэффициент дифференциально кодируется относительно значения глобального усиления. Следует учесть, что неэффективно использовать global_gain, отличный от первого активного масштабного коэффициента, и затем ненулевое значение ДИКМ для первого ДИКМ значения масштабного коэффициента. Если какие-либо управляющие интенсивностные коэффициенты получены вперемешку с ДИКМ масштабными коэффициентами, они отправляются в модуль intensity stereo и не включаются в ДИКМ-кодирование значений масштабных коэффициентов (см. 10.2). Значение первого активного масштабного коэффициента обычно передается как global_gain с первым ДИКМ масштабным коэффициентом, имеющим нулевое значение. Как только масштабные коэффициенты декодируются и их целые значения получены, фактические значения находятся через степенную функцию (см. раздел 9).
6.3.2.6. Поиск спектральных данных и декодирование
Спектральные данные восстанавливаются как последняя часть анализа ICS. Они состоят из всех ненулевых коэффициентов, оставшихся в спектре или спектрах, упорядоченных, как описано в ICS_info. Для каждой ненулевой, неинтенсивностной кодовой книги данные восстанавливаются с помощью Хаффмана декодированием четверок или пар, как показано в инструменте прозрачного кодирования (см. раздел 7). Если спектральные данные связываются с беззнаковой кодовой книгой Хаффмана, необходимые знаковые биты следуют за кодовым словом Хаффмана (см. 7.3). В случае сборника кодов ESCAPE при получении значения escape соответствующая escape-последовательность появится после указанного кода Хаффмана. Может встречаться от нуля до двух escape-последовательностей для каждой кодовой комбинации в сборнике кодов ESCAPE в соответствии с наличием escape-значений в декодируемой кодовой комбинации. Для каждого раздела декодирование Хаффмана продолжается до тех пор, пока все спектральные значения в этом разделе не будут декодированы. Как только все разделы декодированы, данные умножаются на декодированные масштабные коэффициенты и в случае необходимости устраняется чередование.
Квантование и кодирование выполняются в частотном пространстве. С этой целью временной сигнал в кодере трансформируется в частотное пространство. Декодер выполняет обратное преобразование (см. раздел 13). В зависимости от сигнала кодер может варьировать частотно-временное разрешение путем использования двух различных окон: LONG_WINDOW и SHORT_WINDOW. Для переключения между окнами используются промежуточные окна перехода LONG_START_WINDOW и LONG_STOP_WINDOW. В таблице 43 даны окна, соответствующая длина преобразования и форма окон. Используются 2 размера преобразования: 1024 (называемое длинным преобразованием) и 128 коэффициентов (называемое коротким преобразованием).
Последовательности окон образуются из окон исходя из того, что raw_data_block () всегда содержит данные, соответствующие 1024 выходным отсчетам. Элемент данных window_sequence определяет используемую последовательность окон. В таблице 44 показано, как последовательности окон образуются из отдельных окон.
Множество инструментов декодера выполняют операции над группами последовательных спектральных значений, называемыми полосами масштабных коэффициентов (сокращенно 'sfb'). Ширина полос масштабных коэффициентов выбирается так, чтобы имитировать критические полосы слуховой системы человека. По этой причине число полос масштабных коэффициентов и их ширина зависят от длины преобразования и частоты дискретизации. В таблицах 45 - 57 приведены смещения начала каждой полосы масштабных коэффициентов для длин преобразования 1024 и 128 и различных частот дискретизации соответственно.
Чтобы уменьшить количество служебной информации в случае использования последовательностей, которые содержат SHORT_WINDOWS, соседние SHORT_WINDOWS могут быть сгруппированы (см. рисунок 4). Информация о группировке содержится в элементе данных scale_factor_grouping. Группировка означает, что передается только один набор масштабных коэффициентов для всех сгруппированных окон, как будто это одно окно. Масштабные коэффициенты в этом случае применяются к соответствующим спектральным данным всех сгруппированных окон. Чтобы увеличить эффективность прозрачного кодирования (см. раздел 7), спектральные данные группы передаются в порядке чередования (см. 6.3.5). Чередование выполняется по полосам масштабных коэффициентов так, чтобы спектральные данные могли быть сгруппированы, чтобы сформировать виртуальную полосу масштабных коэффициентов, к которой может быть применен общий масштабный коэффициент. В пределах этого документа выражение "полоса масштабных коэффициентов" (сокращенно 'sfb') означает эти виртуальные полосы масштабных коэффициентов. Если речь идет о полосах масштабных коэффициентов отдельных окон, используется выражение "оконная полоса масштабных коэффициентов" (сокращенно 'sfb'). Из-за влияния на полосы масштабных коэффициентов группировка сказывается на section_data, порядке следования спектральных данных (см. 6.3.5) и общем количестве полос масштабных коэффициентов. Для LONG_WINDOW полосы масштабных коэффициентов и оконные полосы масштабных коэффициентов окна идентичны, так как на одно окно приходится только одна группа.
Чтобы уменьшить количество информации, необходимой для передачи служебных данных, относящихся к каждой полосе масштабных коэффициентов, передается элемент данных max_sfb. Его значение превышает на единицу самую высокую активную полосу масштабных коэффициентов во всех группах. max_sfb влияет на интерпретацию данных раздела (см. раздел 7), передачу масштабных коэффициентов (см. разделы 7 и 9), передачу данных предсказывающего устройства (см. раздел 11) и передачу ms_mask (см. 10.1).
Так как полосы масштабных коэффициентов являются основным элементом алгоритма кодирования, необходимы некоторые справочные переменные и массивы для описания процесса декодирования во всех инструментах с использованием полос масштабных коэффициентов. Эти справочные переменные зависят от sampling_frequency, window_sequence, scalefactor_grouping и max_sfb и должны быть созданы для каждого raw_data_block (). Псевдокод, показанный ниже, описывает:
- как определить число окон в window_sequence num_windows;
- как определить число window_groups num_window_groups;
- как определить число окон в каждой группе window_group_length [g];
- как определить общее количество оконных полос масштабных коэффициентов num_swb для фактического типа окна;
- как определить swb_offset[swb], смещение первого коэффициента в оконной полосе масштабных коэффициентов swb используемого окна;
- как определить sect_sfb_offset [g][section], смещение первого коэффициента в разделе section.
Это смещение зависит от window_sequence и scale_factor_grouping и требуется, чтобы декодировать spectral_data ().
Длинное окно преобразования всегда описывается как window_group, содержащая единственное окно. Так как число полос масштабных коэффициентов и их ширина зависят от частоты дискретизации, зависимые переменные индексируются с sampling_frequency_index для выбора соответствующей таблицы.
fs_index =
sampling_frequency_index;
switch (window_sequence) {
case
ONLY_LONG_SEQUENCE:
case
LONG_START_SEQUENCE:
case LONG_STOP_SEQUENCE:
num_windows = 1;
num_window_groups = 1;
window_group_length [num_window_groups-1] = 1;
num_swb = num_swb_long_window[fs_index];
/* preparation of sect_sfb_offset for long blocks */
/* also copy the last value! */
for (i = 0; i < max_sfb + 1; i++) {
sect_sfb_offset[0][i] = swb_offset_long_window[fs_index][i];
swb_offset[i] = swb_offset_long_window[fs_index][i];
}
break;
case
IGHT_SHORT_SEQUENCE:
num_windows = 8;
num_window_groups = 1;
window_group_length [num_window_groups-1] = 1;
num_swb = num_swb_short_window[fs_index];
for (i = 0; i < num_swb_short_window[fs_index] + 1;
i++)
swb_offset[i] = swb_offset_short_window[fs_index][i];
for (i = 0; i < num_windows-1; i + +) {
if (bit_set (scale_factor_grouping,6-i)) == 0) {
num_window_groups += 1;
window_group_length [num_window_groups-1] = 1;
} else
{
window_group_length [num_window_groups-1] += 1;}
/* preparation of sect_sfb_offset for short blocks */
for (g = 0; g < num_window_groups; g+ +) {
sect_sfb = 0;
offset = 0;
for (i = 0; i < max_sfb; i++) {
width = swb_offset_short_window[fs_index][i+1] -
swb_offset_short_window[fs_index][i];
width *= window_group_length [g];
sect_sfb_offset[g][sect_sfb++] = offset;
offset += width;
}
sect_sfb_offset[g][sect_sfb] = offset;
}
b
reak;
d
efault:
b
reak;
Для окон ONLY_LONG_SEQUENCE (num_window_groups = 1, window_group_length [0] = 1) спектральные данные расположены в порядке возрастания их номеров, как показано на рисунке 5.
Для окна EIGHT_SHORT_SEQUENCE порядок спектральных составляющих зависит от группировки следующим способом:
- группы следуют друг за другом;
- в пределах группы полоса масштабных коэффициентов состоит из спектральных данных всех сгруппированных SHORT_WINDOW окон соответствующей оконной полосы масштабных коэффициентов. Для примера, пусть длина группы находится в диапазоне от первого до восьмого окна SHORT_WINDOW;
- если есть восемь групп с единичной длиной каждая (num_window_groups - 8, window_group_length [0] = 1), результатом является последовательность их восьми спектральных значений, расположенных в порядке возрастания;
- если есть только одна группа с длиной восемь (num_window_group = 1, window_group_length [0] = 8), в результате спектральные данные всех восьми SHORT_WINDOW окон чередуются оконными полосами масштабных коэффициентов;
- на рисунке 6 показано расположение составляющих спектра для EIGHT_SHORT_SEQUENCE с группировкой SHORT_WINDOW согласно рисунку 4 (num_window_groups = 4);
- в пределах оконной полосы масштабных коэффициентов, коэффициенты расположены в порядке возрастания.
Глобальное усиление для каждого звукового канала масштабируется так, чтобы целочисленная часть выхода ОМДКП могла использоваться непосредственно в качестве 16-разрядных выходных ИКМ аудиоданных, поступающих в цифро-аналоговый преобразователь (D/A). Это является режимом по умолчанию и обеспечивает корректные уровни громкости. Если декодер обладает цифро-аналоговым преобразователем, имеющим разрешение больше 16 разрядов, то выход ОМДКП может быть усилен так, чтобы сформировать требуемый размер слова. В этом случае уровень на выходе преобразователя будет соответствовать случаю с 16-разрядным D/A, однако будет обладать большим динамическим диапазоном и меньшим уровнем шумов квантования. Аналогичным образом обстоит ситуация с более короткими словами.
Для совместимости с обычной структурой декодера lfe_channel_element() определяется как стандартный individual_channel_stream (0) элемент, равный single_channel_element (). Таким образом, декодирование может быть выполнено с помощью стандартной процедуры декодирования single_channel_element ().
Чтобы достичь большей скорости передачи и эффективности аппаратной реализации декодера LFE, требуется применить несколько ограничений к опциям, используемым для кодирования этого элемента:
- поле window_shape всегда устанавливается в 0, синусное окно (см. 4.3, таблица 15);
- поле window_sequence всегда устанавливается в 0 (ONLY_LONG_SEQUENCE) (см. 4.3, таблица 15);
- только самые нижние 12 спектральных коэффициентов любого LFE могут быть ненулевыми;
- временное формирование шума не используется, т.е. tns_data_present устанавливается в 0 (см. 4.3, таблица 16);
- предсказание не используется, predictor_data_present устанавливается в 0 (см. 4.3, таблицу 15).
Наличие каналов LFE зависит от используемого профиля.
Элемент program_config_element () может присутствовать как вне данных AAC, например в adif_header(), так и внутри AAC как синтаксический элемент в raw_data_block ().
Обращение к элементам SCE или CPE в пределах PCE происходит с помощью двух элементов синтаксиса. Во-первых, элемент синтаксиса is_cpe выбирает, поэтому происходит обращение к SCE или CPE. Во-вторых, элемент синтаксиса tag_select выбирает instance_tag SCE/CPE. Обращение к элементам LFE, CCE и DSE осуществляется непосредственно по их instance_tag.
Аудио синтаксис AAC обеспечивает три способа передачи соответствия каналов физическим расположениям динамиков.
Соответствия каналов по умолчанию определяются в таблице 42 (значения больше 0).
Любая возможная конфигурация каналов может быть определена при помощи program_config_element (). Существует 16 доступных элементов PCE, каждый из которых может указывать на отдельную программу, которая присутствует в потоке необработанных данных. Все доступные PCE в пределах raw_data_block() должны следовать перед всеми другими синтаксическими элементами. Программы могут совместно использовать некоторые общие аудио синтаксические элементы, например общий channel_pair_element () и различные каналы комментариев на различных языках. Данный program_config_element () содержит информацию, имеющую отношение только к одной программе из тех, которые могут быть включены в raw_data_stream (). Включенный в PCE "список передних каналов" организован по принципу сначала центральный, затем остальные, левый и правый. В этом списке SCE центрального канала, если имеется, должен следовать первым, а любые другие SCE должны появляться в парах, составляя пару LR. Если указаны только два SCE, это соответствует одной стереофонической паре LR.
После списка передних каналов имеется "список боковых каналов", состоящих из CPE или из пар SCE. Они перечисляются в порядке от переднего к тыловому. Снова в случае пары SCE первым идет левый канал, вторым - правый канал.
После списка боковых каналов следует список тыловых каналов, перечисляемых снаружи внутрь. Любой SCE, кроме последнего, должен быть спарен, и наличие двух SCE (отдельных или после CPE) указывает, что два SCE являются левым и правым тыловым центром соответственно.
Конфигурация, обозначенная PCE, вступает в силу в raw_data_block (), содержащем PCE. Количество передних, боковых и задних каналов, указанное в PCE, должно присутствовать в том блоке и всех последующих raw_data_block () блоках, пока не будет передан raw_data_block(), содержащий новый PCE.
Также определяются другие элементы. Список одного или нескольких LFE, список одного или нескольких (зависимых от профиля) CCE для осуществления управления диалогами и различными спаренными интенсивностными потоками различных каналов при использовании тех же основных каналов. Список потоков данных, связанных с программой, также может связывать один или более потоков данных с программой. Элемент конфигурации программы также позволяет описать один монофонический и один стереофонической каналы, объединенные в канал сведения для одновременной передачи.
Элемент PCE не предназначен для быстрого изменения программы. В любой момент времени, когда данный PCE в соответствии с его element_instance_tag определяет новую (в противоположность повторному) программу, декодер не обязан обеспечивать непрерывность звукового сигнала.
Если нет явного соответствия каналов, следующие методы описывают неявное соответствие каналов:
1) Любое количество SCE может появиться (до тех пор, пока разрешено другими ограничивающими факторами, например профилем). Если это количество SCE нечетное, то первый SCE представляет передний центральный канал, и другой SCE представляет пары каналов UR, следуя от центра в стороны и назад, к тыловому каналу.
Если количество SCE четное, то SCE интерпретируются как пары L/R, от переднего центра в стороны и назад, к тыловому каналу.
2) Может присутствовать любое количество CPE или пар SCE. Каждый CPE или пара SCE представляют одну пару L/R, после первых наборов SCE элементы следуют попарно до достижения тыловой центральной пары.
3) Может присутствовать любое количество SCE. Если это количество является четным, L/R пары распределены от 2) до тылового центра. Если это количество нечетное, оно распределяется по L/R парам, за исключением последнего SCE, который присваивается тыловому центру.
4) Может присутствовать любое количество LFE. Для случая, когда имеется несколько LFE, соответствие громкоговорителям не определено.
В случае такого неявного соответствия каналов число и порядок SCE, CPE и LFE и получающаяся конфигурация не должны меняться в пределах потока битов без отправления program_config_element (), неявная смена конфигурации не разрешена.
Другие синтаксические аудио элементы, которые не подразумевают наличия дополнительных громкоговорителей, такие как спаренный channel_element, могут следовать за перечисленным набором синтаксических элементов. Очевидно синтаксические элементы, не относящиеся к звуковым, могут быть получены в дополнение к перечисленных синтаксическим элементам в произвольном порядке.
6.5.4.1. Описание
Метод матричного сведения применяется только для сведения конфигурации громкоговорителей 3 передних/2 задних, 5-канальной программы, в стерео или моно программу. Это не применимо к любой другой программе, кроме конфигурации 3/2.
6.5.4.2. Процесс матричного сведения
Требуемый сигнал стерео может быть сгенерирован матричным декодером при помощи одного из двух наборов уравнений.
![]() ![]() ![]() ,где L, C, R,
L' и R' - полученные сигналы стерео,
A - матричный коэффициент, обозначенный matrix_mixdown_idx. Каналы LFE исключаются из сведения.
Если флаг pseudo_surround_enable не установлен, то используется только набор уравнений 1. Если pseudo_surround_enable установлен, то могут использоваться как набор 1, так и набор 2 в зависимости от наличия в ресивере средств пространственного синтеза.
Можно получить моно сигнал, используя следующее уравнение
.6.5.4.3. Рекомендация
Матричные сведения позволяют организовать режим, выгодный для некоторых операторов при определенных обстоятельствах. Однако рекомендуется не использовать этот метод. Психоакустические принципы, на которых базируется кодирование звука, нарушаются этим методом пост-процессинга, и перцепционно верное восстановление сигнала не может быть гарантировано. В синтаксисе AAC рекомендуется использовать стерео или моно сведение для обеспечения стерео или моно, созданного в стандартной студии.
Стерео и моно каналы сведения дополнительно позволяют провайдеру контента отдельно улучшать стерео и многоканальные программы - это невозможно при использовании матричного метода.
Из-за алгоритмов, используемых для многоканального и стерео кодирования, лучшая комбинация качества и скорости передачи обычно обеспечивается при использовании стерео.
Таблица 39
6.6.1. Функции данных
6.6.2. Элементы данных
Элемент данных содержит любые дополнительные данные, например вспомогательную информацию, которая не является непосредственно частью аудиоинформации. Возможно любое количество элементов данных с одинаковым element_instance_tag или до 16 элементов данных с различным element_instance_tags. Процесс расшифровки элемента данных описывается в этом пункте.
6.6.3. Процесс декодирования
Первым считывается синтаксический элемент data_byte_align_flag размером 1 бит. Затем считывается 8-битное значение count. Он содержит начальный размер потока данных в байтах. Если count равен 255, его значение инкрементируется вторым 8-битным значением, esc_count, и это заключительное значение соответствует количеству байт в элементе потока данных. Если data_byte_align_flag установлен, выполняется выравнивание. Далее следуют байты потока данных.
6.7.1. Элементы данных
6.7.2. Процесс декодирования
Элементы fill_element () могут быть добавлены для учета различных расширений. Разрешено любое количество элементов fill_element ().
Синтаксический элемент count дает начальное значение длины данных заполнения. Если count равен 15, его значение инкрементируется значением esc_count, и это заключительное значение соответствует количеству fill_bytes, которое будет считано.
1. Элементы данных
2. Процесс декодирования
Разрешено любое количество extension_payload ().
Следующие символьные сокращения для значений поля extension_type определены в таблице 40.
Таблица 40
Значения элемента данных extension_type
Зарезервированные значения могут использоваться для дальнейшего расширения синтаксиса.
6.8.2.1. Элементы данных
6.8.2.2. Процесс декодирования
Данные заполнения должны быть добавлены, если общее количество битов всех аудиоданных вместе со всеми дополнительными данными меньше, чем минимальное допустимое количество битов во фрейме, необходимое для достижения целевой скорости передачи. При нормальных условиях для заполнения резервуара битов вместо битов заполнения используются свободные биты. Биты заполнения дописываются, только если резервуар битов полон.
Следует учесть, что fill_nibble должен быть равен '0000', а fill_byte равен '10100101' (для улучшения самосинхронизации).
6.8.3.1. Элементы данных
6.8.3.2. Процесс декодирования
Оценка потенциально доступной информации управления динамическим диапазоном в декодере является опциональной.
prog_ref_level_present указывает, что prog_ref_level передается. В этом случае prog_ref_level передается только по требованию (например, однажды).
prog_ref_level квантуется с шагом 0,25 дБ, используя 7 битов, и поэтому динамический диапазон равен приблизительно 32 дБ. Восстановление выполняется по формуле
,где "полный уровень" соответствует 32767 (prog_ref_level = 0).
pce_tag_present указывает, что pce_instance_tag передается. В этом случае pce_instance_tag передается только по требованию (например, однажды).
pce_instance_tag указывает, с какой программой ассоциируется информация о динамическом диапазоне. Если этот тег не присутствует, то используется программа по умолчанию. Так как в каждом потоке битов AAC обычно есть только одна программа, это является наиболее распространенным режимом. Для каждой программы многопрограммного потока битов должна передаваться своя информация о динамическом диапазоне в отдельном extension_payload () элемента fill_element (). В случае многопрограммного потока всегда должен присутствовать pce_instance_tag.
Бит drc_tag_reserved_bits заполняет дополнительные поля до целого числа байт.
Бит excluded_chns_present указывает, что каналы, которые должны быть исключены из обработки динамического диапазона, следуют сразу же после этого бита. Маски каналов должны передаваться в каждом фрейме, где есть исключенные каналы. Следующие принципы упорядочивания используются, чтобы назначить exclude_mask выходным каналам:
Если PCE присутствует, биты exclude_mask соответствуют звуковым каналам в элементах синтаксиса SCE, CPE, CCE и LFE в порядке их появления в PCE. В случае CPE первый переданный бит маски соответствует первому каналу в CPE, второй переданный бит маски - второму каналу. В случае CCE бит маски передается, только если спаренный канал является независимо переключаемым.
Если PCE не присутствует, биты exclude_mask соответствуют звуковым каналам в элементах синтаксиса SCE, CPE и LFE в порядке их появления в потоке битов, в сопровождении звуковых каналов в элементах синтаксиса CCE в порядке их появления в потоке битов. В случае CPE первый переданный бит маски соответствует первому каналу в CPE, второй переданный бит маски - второму каналу. В случае CCE бит маски передается, только если спаренный канал является независимо переключаемым.
drc_band_incr является количеством полос больше единицы, если есть многополосная информация DRC.
dyn_rng_ctl квантуется с шагом 0,25 дБ, используя 7-разрядное целое число без знака, и поэтому совместно с dyn_rng_sgn имеет диапазон +/- 31,75 дБ. Это интерпретируется как значение усиления, которое должно быть применено к декодируемым отсчетам звукового сигнала текущего фрейма.
Диапазон, обеспечиваемый информацией о динамическом диапазоне, указан в таблице 41.
Таблица 41
Диапазон DRC информации
Процесс управления динамическим диапазоном применяется к спектральным данным spec[i] одного фрейма непосредственно перед банком фильтров синтеза. В случае EIGHT_SHORT_SEQUENCE window_sequence индекс i интерпретируется как указатель на составной массив из 8 * 128 частотных линий, соответствующих 8 коротким преобразованиям.
Следующий псевдокод приводится в качестве примера, демонстрируя один метод использования одного набора информации управления динамическим диапазоном с целевым звуковым каналом. Константы ctrl1 и ctrl2 являются константами сжатия (обычно между 0 и 1, нуль соответствует отсутствию сжатия), которые могут дополнительно использоваться, чтобы масштабировать характеристики сжатия динамического диапазона для уровней, больших или меньших контрольного уровня программы соответственно. Константа target_level описывает уровень на выходе, требуемый пользователем, выраженный в том же масштабе как prog_ref_level.
bottom = 0;
drc_num_bands = 1;
if (drc_bands_present)
drc_num_bands + = drc_band_incr; else
drc_band_top [0] = 1024/4 - 1;
for (bd = 0;bd <drc_num_bands;bd ++) {
top = 4 * (drc_band_top [bd] + 1);
/* Декодировать коэффициент усиления DRC*/
if (dyn_rng_sgn [bd])
;/* компрессирование */else
;/* усиление *//* Если нормализация выполняется для цифрового сигнала
* коэффициент должен быть изменен. prog_ref_level может быть передан системе для изменения уровня аналогового сигнала. Аналоговое изменение уровня лишено проблем с уменьшенным отношением СИГНАЛ-ШУМ ЦАП или клиппированием */
;/* Применить коэффициент усиления */
for (i = bottom; i < top; i++)
spec [i]*= factor; bottom = top.
Следует учесть соотношение между управлением динамическим диапазоном и спаренными каналами.
Зависимо переключаемые спаренные каналы всегда объединяются с их целевыми каналами как спектральные коэффициенты до DRC обработки и синтезирующей фильтрации этих каналов. Поэтому сигнал зависимо переключаемых спаренных каналов, который связывается с определенным целевым каналом, будет подвергнут DRC обработке целевого канала.
Так как независимо переключаемые спаренные каналы связываются с их целевыми каналами во временном пространстве, каждый независимо переключаемый спаренный канал будет подвергнут DRC обработке и последующей синтезирующей фильтрации отдельно от его целевых каналов. Это позволяет независимо переключаемому спаренному каналу иметь отдельную DRC обработку при необходимости.
6.8.3.3. Персистентность DRC информации
В начале потока вся DRC информация для всех каналов устанавливается в значение по умолчанию: контрольный уровень программы, равный контрольному уровню декодера, одна полоса DRC, без изменения усиления DRC. Если эти данные не перезаписываются, это остается в силе.
Есть два случая для персистентности DRC информации, которая была передана:
Контрольный уровень программы дается для каждой звуковой программы и сохраняется до тех пор, пока не будет передано новое значение (разумно периодически передавать значение во избежание ошибки).
Другая DRC информация сохраняется для каналов. Следует учесть, что если канал исключается соответствующим битом маски exclude_mask[], то никакая информация не передается для этого канала в dynamic_range_info (). Маска должна быть передана в каждом фрейме, где есть исключение каналов.
Правила сохранения поканальной DRC информации:
Если в данном фрейме данного канала нет DRC информации, используется информация из предыдущего фрейма. (Это означает, что одна настройка может быть в силе в течение долгого времени, хотя уместно периодически передавать DRC информацию во избежание ошибки.)
Если DRC информация для этого канала появляется в текущем фрейме, имеет место такая последовательность: вся DRC информация для канала заменяется значениями по умолчанию (одна полоса DRC, без изменений усиления DRC для этой полосы), затем информация заменяется соответствующими переданными значениями.
Элементы заполнения, содержащие extension_payload с extension_type EXT_SBR_DATA или EXT_SBR_DATA_CRC, резервируются для данных SBR. В этом случае значение поля count элемента fill_element должно быть равно общей длине в байтах, включая данные SBR плюс поле extension_type.
sbr_extension_data () и процесс декодирования определяются в ИСО/МЭК 14496-3 [3].
Элементы заполнения SBR должны быть обработаны согласно ИСО/МЭК 14496-3 [3], пп. 4.5.2.8.2.2 "Расширение SBR для аудио объектов основного AAC, AAC SSR, LC AAC и AAC LTP". Сигнализация SBR должна быть сделана не явно в соответствии с ИСО/МЭК 14496-3 [3], пп. 1.6.5 "Сигнализация SBR".
Таблица 42
Таблица 43
![]() Таблица 44
![]() Таблица 45
LONG_START_WINDOW, LONG_STOP_WINDOW при 44,1 кГц и 48 кГц
Таблица 46
для SHORT_WINDOW при 32 кГц, 44,1 кГц и 48 кГц
Таблица 47
Полосы масштабных коэффициентов для LONG_WINDOW,
LONG_START_WINDOW, LONG_STOP_WINDOW на 32 кГц
Таблица 48
Полосы масштабных коэффициентов для LONG_WINDOW,
LONG_START_WINDOW, LONG_STOP_WINDOW на 8 кГц
Таблица 49
Полосы масштабных коэффициентов для SHORT_WINDOW на 8 кГц
Таблица 50
Полосы масштабных коэффициентов
для LONG_WINDOW, LONG_START_WINDOW, LONG_STOP_WINDOW
на 11,025 кГц, 12 кГц и 16 кГц
Таблица 51
Полосы масштабных коэффициентов
для SHORT_WINDOW на 11,025 кГц, 12 кГц и 16 кГц
Таблица 52
Полосы масштабных коэффициентов для LONG_WINDOW,
LONG_START_WINDOW, LONG_STOP_WINDOW на 22,05 кГц и 24 кГц
Таблица 53
Полосы масштабных коэффициентов
для SHORT_WINDOW на 22,05 кГц и 24 кГц
Таблица 54
Полосы масштабных коэффициентов для LONG_WINDOW,
LONG_START_WINDOW, LONG_STOP_WINDOW на 64 кГц
Таблица 55
Полосы масштабных коэффициентов для SHORT_WINDOW на 64 кГц
Таблица 56
Полосы масштабных коэффициентов для LONG_WINDOW,
LONG_START_WINDOW, LONG_STOP_WINDOW на 88,2 кГц и 96 кГц
Таблица 57
для SHORT_WINDOW на 88,2 кГц и 96 кГц
![]() ![]() в случае ONLY_LONG_SEQUENCE
![]() в случае EIGHT_SHORT_SEQUENCE
Прозрачное кодирование используется для дальнейшего уменьшения избыточности масштабных коэффициентов и квантованных спектральных значений каждого звукового канала.
global_gain кодируется как беззнаковое 8-битовое целое. Первый масштабный коэффициент, связанный с квантованными спектральными значениями, дифференциально кодируется относительно значения global_gain, и затем используется кодирование Хаффмана по кодовой книге для масштабных коэффициентов. Оставшиеся масштабные коэффициенты дифференциально кодируются относительно предыдущих масштабных коэффициентов, и затем используется кодирование Хаффмана по кодовой книге для масштабных коэффициентов.
Прозрачное кодирование квантованных спектральных значений основано на двух разделениях спектральных коэффициентов. Первым является разделение на полосы масштабных коэффициентов, которые содержат кратное четырем количество квантованных спектральных коэффициентов. См. 6.3.4 и 6.3.5.
Второе разделение, зависящее от квантованных спектральных значений, является разделением на полосы масштабных коэффициентов с целью формирования разделов. Значение раздела состоит в том, что квантованные спектральные значения в пределах раздела кодируются с использованием одной кодовой книги Хаффмана, выбранной из 11 возможных. Длина раздела и связанной с ним кодовой книги Хаффмана должна быть передана в качестве служебных данных вместе с кодированными по Хаффману спектральными значениями. Следует учесть, что длина раздела выражается в полосах масштабных коэффициентов, а не в оконных масштабных коэффициентах (см. 6.3.4). Чтобы максимизировать соответствие статистики квантованного спектра кодовой книге Хаффмана, число разделов может быть таким же, как и число полос масштабных коэффициентов. Максимальный размер раздела равен max_sfb полос масштабных коэффициентов.
Как показано в таблице 59, кодовые книги Хаффмана для спектральных значений могут заменять знаковые или беззнаковые комбинации из n коэффициентов. Для беззнаковых кодовых книг знаковые биты каждого ненулевого коэффициента в блоке из n коэффициентов следуют сразу же за соответствующей кодовой комбинацией.
При прозрачном кодировании есть два способа представить большие квантованные спектральные значения. Один способ состоит в том, чтобы передавать флаг escape из escape (ESC), сборник кодов Хаффмана, который сигнализирует о том, что биты, следующие сразу после указанной кодовой комбинации, плюс дополнительные знаковые биты являются escape-последовательностью, которой закодированы значения, большие чем представленные в кодовой книге Хаффмана ESC. Вторым путем является импульсный escape-метод, при котором коэффициенты относительно большой амплитуды могут быть заменены коэффициентами с меньшими амплитудами для включения в таблицу кода Хаффмана с более высокой эффективностью кодирования. Эта замена корректируется путем отправки позиции спектрального коэффициента и разности амплитуд в качестве служебной информации. Частотная информация представляется комбинацией номера полосы масштабных коэффициентов для указания на основную частоту и смещения внутри этой полосы масштабных коэффициентов.
7.2.1. Элементы данных
7.2.2. Элементы справки
Инструмент прозрачного кодирования требует следующих констант (см. 4.3, spectral_data ()).
ZERO_HCB 0
FIRST_PAIR_HCB 5
ESC_HCB 11
QUAD_LEN 4
PAIR_LEN 2
INTENSITY_HCB2 14
INTENSITY_HCB 15
ESC_FLAG 16
Четверки или пары квантованных спектральных коэффициентов являются кодированными с помощью кодов Хаффмана и передаются в порядке от коэффициента самой низкой частоты и до коэффициента самой высокой частоты. При наличии нескольких окон в блоке (EIGHT_SHORT_SEQUENCE) сгруппированные и чередующиеся наборы спектральных коэффициентов обрабатываются как единый набор коэффициентов, которые следуют от низкой частоты к высокой. Чередование может быть устранено после декодирования коэффициентов (см. 6.3.5). Коэффициенты сохраняются в массиве x_quant [g] [win] [sfb] [bin], и порядок передачи кодовых комбинаций Хаффмана такой, чтобы коэффициенты декодировались в порядке получения и записи в массив, bin - наиболее быстро меняющийся индекс, а g - наиболее медленный. В пределах кодовой комбинации порядок декодирования четверок - w, x, y, z; порядок декодирования пар - y, z. Набор коэффициентов делится на разделы, и информация разделения передается, начиная с самого низкого частотного раздела, до самого высокого частотного раздела. Спектральная информация для разделов, которые кодируются с "нулевой" кодовой книгой, не передается, поскольку эта спектральная информация равна нулю. Точно так же спектральная информация для разделов, кодированных "интенсивностными" кодовыми книгами, не передается. Спектральная информация для всех полос масштабных коэффициентов, выше и равных max_sfb, для которых нет данных раздела, равна нулю.
Существует единственная дифференциальная кодовая книга масштабных коэффициентов, которая представляет диапазон значений как показано в таблице 58. Дифференциальная кодовая книга масштабных коэффициентов дана в таблице А.1. Существует одиннадцать кодовых книг Хаффмана для спектральных данных в соответствии с таблицей 59. Кодовые книги даны в таблицах А.2 - А.12. Существует три других "кодовых книги" выше и вне фактических кодовых книг Хаффмана, в частности "нулевая" кодовая книга, указывающая, что ни масштабные коэффициенты, ни квантованные данные не будут переданы, и "интенсивностные" сборники кодов, указывающие, что этот отдельный канал является частью канальной пары, и что данные, которые обычно были бы в обычном случае масштабными коэффициентами, вместо этого являются данными для intensity stereo. В этом случае никакие квантованные спектральные данные не передаются. Кодовые книги 12 и 13 находятся в резерве.
Кодовые книги Хаффмана для спектральных значений кодируют пары или четверки квантованных спектральных коэффициентов без знака или со знаком, как показано в таблице 59. В этой таблице также указано самое большое абсолютное значение (LAV), которое может быть закодировано каждой кодовой книгой, и определен двоичный массив unsigned_cb [], в котором 1 соответствует беззнаковой кодовой книге и 0 - знаковой.
Результатом декодирования Хаффмана каждого кодового слова является индекс кодового слова, приведенный в первой графе таблицы А.1. Этот результат преобразовывается в требуемый дифференциальный масштабный коэффициент путем добавления index_offset к индексу. Значение index_offset равно -60, как показано в таблице 58. Аналогично результатом декодирования Хаффмана каждой группы из n спектральных коэффициентов является индекс кодового слова, приведенный в первой графе таблиц А.2 - А.12. Этот индекс преобразовывается в n спектральных значений в соответствии со следующим псевдо c-кодом:
unsigned = булевое значение unsigned_cb [i], приведенное во второй графе
таблицы 59.
dim = размерность кодовой книги, приведенная в третьей графе таблицы 59.
lav = LAV, приведенный в четвертой графе таблицы 59.
idx = индекс кодового слова.
if(unsigned){
mod = lav + 1;
off = 0;
}
else {
mod = 2*lav + 1;
off = lav;
}
if (dim ==4) {
w = INT (idx / (mod*mod*mod)) - off;
idx -= (w+off) * (mod*mod*mod)
x = INT (idx / (mod*mod)) - off;
idx -= (x+off) * (mod*mod)
Y = INT (idx/mod) - off;
idx -= (y+off) *mod
z = idx - off;
}
else {
Y = INT (idx/mod) - off;
idx -= (y+off) *mod
z = idx - off;
}
Если кодовая книга Хаффмана представляет знаковые значения, декодирование n квантованных спектральных значений заканчивается после декодирования Хаффмана и преобразования индекса кодового слова в квантованные спектральные коэффициенты.
Если кодовая книга представляет беззнаковые значения, биты знака, связанные с ненулевыми коэффициентами, следуют сразу за кодовой комбинацией Хаффмана, '1' указывает на отрицательный коэффициент, а '0' - на положительный. Например, если кодовая комбинация Хаффмана из сборника кодов 7
hcod [7] [y] [z]
была обнаружена, то сразу после нее в потоке битов следует
pair_sign_bits, которое является полем переменной длины от 0 до 2 битов.
Это может быть обнаружено в потоке битов как
if (y! = 0)
if (one_sign_bit == 1)
y =-y;
if (z! = 0)
if (one_sign_bit == 1)
z = - z,
где one_sign_bit - следующий бит в потоке битов, а pair_sign_bits -
объединение one_sign_bit полей.
Кодовая книга ESC является особым случаем. Она представляет значения от 0 до 16 включительно, однако кодирует фактически значения от 0 до 15, и значение 16 является флагом escape_flag, который сигнализирует присутствие hcod_esc_y или hcod_esc_z, любой из которых будет обозначен как escape_sequence. Этот escape_sequence разрешает кодирование квантованных спектральных элементов с LAV > 15. Он состоит из escape_prefix из N единичных бит, escape_separator из одного нулевого бита, escape_word из (N + 4) битов, представляющих беззнаковое целое. Декодированное значение escape_sequence равно
. Требуемый квантованный спектральный коэффициент получен, когда знак, определяемый pair_sign_bits, применен к значению escape_sequence. Другими словами, escape_sequence 00000 декодируется как 16, escape_sequence 01111 как 31, escape_sequence 1000000 как 32, один из 1011111 как 63 и т.д. Следует учесть, что ограничения в 10.3 диктуют, что длина escape_sequence всегда меньше, чем 22 бита. Для escape кодовых слов Хаффмана порядок элементов данных является кодовой комбинацией Хаффмана, сопровождаемой от 0 до 2 битов знака, сопровождаемых от 0 до 2 escape-последовательностями.Когда pulse_data_present равен 1 (используется импульсный escape), один или несколько квантованных коэффициентов были заменены в кодере коэффициентами с меньшими амплитудами. Число замененных коэффициентов обозначается number_pulse. При восстановлении квантованных спектральных коэффициентов x_quant эта замена компенсируется путем добавления или вычитания pulse_amp из ранее декодированных коэффициентов, индексы частоты которых обозначаются pulse_start_sfb и pulse_offset. Следует учесть, что импульсный escape-метод недопустим для блока, window_sequence которого EIGHT_SHORT_SEQUENCE. Процесс декодирования определяется в следующем псевдо c-коде:
if (pulse_data_present){
g = 0;
win = 0;
k = swb_offset [pulse_start_sfb];
for (j = 0; j <number_pulse+1; j ++) {
k + = pulse_offset [j];
/* translate_pulse_parameters (); */
for (sfb = pulse_start_sfb; sfb <num_swb; sfb ++) {
if (k <swb_offset [sfb+1]) {
bin = k - swb_offset [sfb];
break;
}
}
/* восстановление коэффициентов */
if (x_quant [g] [win] [sfb] [bin]> 0)
x_quant [g] [win] [sfb] [мусорное ведро] + = pulse_amp [j];
else
x_quant [g] [win] [sfb] [bin] - = pulse_amp [j];
}
}
Несколько инструментов декодера (TNS, банк фильтров) получают доступ к спектральным коэффициентам без чередования, т.е. все спектральные коэффициенты упорядочиваются согласно номеру окна и частоте в пределах окна. Это обозначается указанием spec [w][k] вместо x_quant [g] [w] [sfb] [bin].
Следующий псевдо c-код указывает на соотношение между четырехмерной с чередованием структурой массива x_quant [] [] [] [] и двумерной без чередования структурой массива spec[] []. В последнем массиве первый индекс увеличивается по отдельным окнам в последовательности окон, и второй индекс увеличивается по спектральным коэффициентам, которые соответствуют каждому окну, внутри которого коэффициенты следуют линейно от низких частот к верхним.
quant_to_spec()
{k = 0;
for (g = 0; g <num_window_groups; g + +) {
j = 0;
for (sfb = 0; sfb <num_swb; sfb ++) {
width = swb_offset [sfb+1] - swb_offset [sfb];
for (win = 0; win<window_group_length [g]; win ++) {
for (bin = 0; bin <width; bin ++) {
spec [win+k] [bin+j] = x_quant [g] [win] [sfb] [bin];
}
}
j + = width;
}
k + = window_group_length [g]
}
}
Таблица 58
для масштабных коэффициентов
Таблица 59
8.1. Описание инструмента
Для квантования спектральных коэффициентов в кодере используется неравномерное квантование. Декодер должен выполнить обратное неравномерное квантование после декодирования Хаффмана масштабных коэффициентов (см. разделы 7 и 11) и спектральных данных (см. раздел 7).
8.2. Элементы справки
8.3. Процесс декодирования
Обратное квантование описывается следующей формулой:
.Максимальная допустимая абсолютная амплитуда для x_quant равна 8191. Обратное квантование выполняется следующим образом:
for (g = 0; g <num_window_groups; г + +) {
for (sfb = 0; sfb <max_sfb; sfb ++) {
width = (swb_offset [sfb+1] - swb_offset [sfb]);
for (win = 0; win <window_group_len [g]; win ++) {;
for (bin = 0; bin <width; bin ++) {
x_invquant [g] [win] [sfb] [bin] = sign (x_quant [g] [win] [sfb] [bin]) *
; }
}
}
}
Основным методом регулирования шумов квантования в частотной области является формирование шума с использованием масштабных коэффициентов. С этой целью спектр делится на несколько групп спектральных коэффициентов, называемых полосами масштабных коэффициентов, для которых используется один масштабный коэффициент (см. 6.3.4). Масштабный коэффициент представляет собой значение коэффициента усиления, который используется для изменения амплитуды всех спектральных коэффициентов в этой полосе масштабного коэффициента. Этот механизм используется для изменения распределения шумов квантования, вызванных неравномерным квантованием, в спектральной области.
Для window_sequences, которые содержат окна SHORT_WINDOW, может быть применена группировка, т.е. для конкретного количества последовательных окон SHORT_WINDOW может использоваться только один набор масштабных коэффициентов. Каждый масштабный коэффициент в этом случае применяется к группе соответствующих полос масштабных коэффициентов (см. 6.3.4).
В этом инструменте масштабные коэффициенты применяются к деквантованным коэффициентам для восстановления спектральных значений.
9.2.1. Функции данных
9.2.2. Элементы данных
9.2.3. Элементы справки
9.3.1. Полосы масштабных коэффициентов
Масштабные коэффициенты используются для формирования шумов квантования в спектральной области. С этой целью спектр делится на несколько полос масштабных коэффициентов (см. 6.3.4). Каждой полосе масштабных коэффициентов соответствует масштабный коэффициент, который представляет определенное значение коэффициента усиления, которое должно быть применено ко всем спектральным коэффициентам в этой полосе масштабных коэффициентов. В случае EIGHT_SHORT_SEQUENCE полоса масштабных коэффициентов может содержать многократные оконные полосы масштабных коэффициентов SHORT_WINDOW (см. 6.3.4 и 6.3.5).
Для всех масштабных коэффициентов разность с предыдущим значением кодируется при помощи кодовой книги Хаффмана, данной в таблице А1. Начальное значение задается явным образом как 8-битный ИКМ отсчет элемента данных global_gain. Масштабный коэффициент не передается для полос масштабных коэффициентов, которые кодируются со сборником кодов Хаффмана ZERO_HCB. Если сборник кодов Хаффмана для полос масштабных коэффициентов кодируется с INTENSITY_HCB или INTENSITY_HCB2, масштабный коэффициент используется для intensity stereo (см. раздел 7 и 10.2). В этом случае обычный масштабный коэффициент не существует (но инициализируется в нуль, чтобы иметь определенное значение в массиве).
Следующий псевдокод описывает декодирование масштабных коэффициентов sf [g] [sfb]:
last_sf = global_gain;
for (g = 0; g <num_window_groups; g + +) {
for (sfb = 0; sfb <max_sfb; sfb ++) {
if (sfb_cb [g] [sfb]! = ZERO_HCB && sfb_cb [g] [sfb]! = INTENSITY_HCB
&& sfb_cb [g] [sfb]! = INTENSITY_HCB2) {
dpcm_sf = decode_huffman () - index_offset;/*см. раздел 7*/
sf [g] [sfb] = dpcm_sf + last_sf;
last_sf = sf [g] [sfb];
}
else {
sf [g] [sfb] = 0;
}
}
}
Следует учесть, что масштабные коэффициенты sf [g] [sfb] должны быть в пределах диапазона 0...255 включительно.
9.3.3. Использование масштабных коэффициентов
Спектральные коэффициенты всех полос масштабных коэффициентов должны повторно масштабироваться в соответствии с их масштабными коэффициентами. В случае последовательности окон, которая состоит из группы коротких окон, все коэффициенты в сгруппированных полосах масштабных коэффициентов окна должны масштабироваться с использованием того же самого масштабного коэффициента.
В случае window_sequences из одного окна полосы масштабных коэффициентов их соответствующие коэффициенты расположены в порядке возрастания частоты. В случае EIGHT_SHORT_SEQUENCE и группировки спектральные коэффициенты сгруппированных коротких окон чередуются с полосами масштабных коэффициентов окна.
Перемасштабирование выполняется согласно следующему псевдокоду:
for (g = 0; g <num_window_groups; g + +) {
for (sfb = 0; sfb <max_sfb; sfb ++) {
width = (swb_offset [sfb+1] - swb_offset [sfb]);
for (win = 0; win <window_group_len [g]; win ++) {;
win = get_scale_factor_gain (sf [g] [sfb]);
for (k = 0; k <width; k + +) {
x_rescal [g] [window] [sfb] [k] = x_invquant [g] [window] [sfb] [k] * gain;
}
}
}
}
Функция get_scale_factor_gain (sf [g] [sfb]) возвращает коэффициент усиления, который соответствует масштабному коэффициенту. Возвращаемое значение получается из уравнения
.Постоянная SF_OFFSET должна быть установлена равной 100.
Следующий псевдокод описывает эту операцию:
get_scale_factor_gain (sf [g] [sfb]) {
SF_OFFSET = 100;
;return(gain);
}
10.1.1. Описание инструмента
Кодирование M/S stereo применяется к парам каналов. Каналы чаще всего объединяются так, чтобы они имели симметричное расположение относительно слушателя, например левый/правый или левый окружения/правый окружения. Первый канал в паре обозначается как "левый", а второй - как "правый". Вектор, образованный сигналами левого и правого каналов, восстанавливается или дематрицируется с помощью единичной матрицы
![]() или обратной матрицы M/S
.Решение о том, какая матрица должна использоваться, принимается для каждой полосы масштабных коэффициентов в соответствии с флагами ms_used. Кодирование M/S может применяться только, если common_window равно '1' (см. 6.3.1).
10.1.2. Определения
10.1.2.1. Элементы данных
10.1.2.2. Элементы справки
10.1.3. Процесс декодирования
Восстановление (спектральные коэффициенты первого ("левого") и второго ("правого") каналов) выполняется в соответствии с mask_present и флагами ms_used [] [] следующим образом:
if (mask_present> = 1) {
for (g = 0; g <num_window_groups; g + +) {
for (b = 0; b <window_group_length [g]; b ++) {for (sfb = 0; sfb <max_sfb; sfb ++) {
if ((ms_used [g] [sfb] \\ mask_present == 2) &&! is_intensity (g, sfb)) {
for (i = 0; i <swb_offset [sfb+1]-swb_offset [sfb]; i + +) {
tmp = l_spec [g] [b] [sfb] [i] - r_spec [g] [b] [sfb] [i];
l_spec [g] [b] [sfb] [i] = l_spec [g] [b] [sfb] [i] + r_spec [g] [b] [sfb] [i];
r_spec [g] [b] [sfb] [i] = tmp;}
}
}
Следует учесть, что ms_used [] [] используется также в контексте кодирования intensity stereo. Если кодирование intensity stereo было использовано для определенной полосы масштабных коэффициентов, декодирование стерео M/S не выполняется.
10.2.1. Описание инструмента
Этот инструмент используется, чтобы реализовать кодирование intensity stereo пары каналов. Оба выходных канала получаются из одного набора спектральных коэффициентов после обратного процесса квантования. Это выполняется выборочно на основе полос масштабных коэффициентов при активном intensity stereo.
10.2.2. Определения
10.2.2.1. Элементы данных
10.2.2.2. Элементы справки
Использование кодирования intensity stereo сигнализируется при помощи псевдокодовых книг INTENSITY_HCB и INTENSITY_HCB2 (15 и 14) в правом канале channel_pair_element (), имеющем общий ics_info () (common_window == 1). INTENSITY_HCB и INTENSITY_HCB2 сигнализируют синфазное и несовпадающее по фазе кодирование intensity stereo соответственно.
Кроме того, фазовое соотношение кодирования intensity stereo может быть реверсировано посредством поля ms_used: поскольку кодирование M/S stereo и кодирование intensity stereo являются взаимоисключающими для определенной полосы масштабных коэффициентов и группы, основное фазовое соотношение, обозначенное таблицами Хаффмана, изменяется от синфазного до несовпадающего по фазе или наоборот, если соответствующий бит ms_used устанавливается для соответствующей полосы.
Информация для декодирования intensity stereo представлена "позицией intensity stereo", указывающей на соотношение между масштабированием левого и правого каналов. Если кодирование intensity stereo является активным для определенной группы и полосы масштабных коэффициентов, значение позиции intensity stereo передается вместо масштабного коэффициента правого канала.
Позиции интенсивности кодируются точно так же, как масштабные коэффициенты, т.е. с помощью кодирования методом Хаффмана разностных значений, за исключением двух отличий:
нет первого значения, которое передается как ИКМ. Вместо этого следует дифференциальное декодирование, предполагая, что последнее значение позиции intensity stereo равно нулю;
дифференциальное декодирование выполняется отдельно для масштабных коэффициентов и позиций intensity stereo. Другими словами, декодер масштабных коэффициентов игнорирует значения позиции intensity stereo и наоборот (см. 9.3.2).
Одна и та же кодовая книга используется для кодирования позиций intensity stereo и масштабных коэффициентов. Две псевдофункции определены для использования в декодировании intensity stereo:
function is_intensity (group, sfb) {
+ 1 для оконных групп/полос масштабных коэффициентов с кодовой книгой правого канала
sfb_cb [group] [sfb] == INTENSITY_HCB
- 1 для оконных групп/полос масштабных коэффициентов с кодовой книгой правого канала
sfb_cb [group] [sfb] == INTENSITY_HCB2
0 else
}
function invert_intensity (group, sfb) {
1-2*ms_used [group] [sfb],if (ms_mask_present == 1)
+1 else
}
Декодирование intensity stereo для одной пары каналов определяется следующим псевдокодом:
p = 0;
for (g = 0; g <num_window_groups; g + +) {
/* Декодировать позиции интенсивности для этой группы */
for (sfb = 0; sfb <max_sfb; sfb ++),
if (is_intensity (g, sfb))
is_position [g] [sfb] = p + = dpcm_is_position [g] [sfb];
/* Выполнить декодирование intensity stereo */
for (b = 0; b <window_group_length [g]; b ++) {for (sfb = 0; sfb <max_sfb; sfb ++) {
if (is_intensity (g, sfb)) {
; /* Масштабировать от левого к правому каналу, не трогать левый канал */
for (i = 0; i <swb_offset[sfb+1]-swb_offset [sfb]; i ++)
r_spec [g] [b] [sfb] [i] = scale * l_spec [g] [b] [sfb] [i];
}
}
}
}
10.2.4. Интеграция с инструментом внутриканального предсказания
Для полос масштабных коэффициентов, кодированных в intensity stereo, соответствующие предсказатели в правом канале выключаются для эффективного переопределения состояния, определенного маской prediction_used. Обновление этих предсказателей выполняется использованием декодируемых intensity stereo спектральных значений правого канала в качестве "последнего квантованного значения"
. Эти значения следуют из процесса масштабирования, от левого к правому каналу, как описано в псевдокоде.Элементы спаренного канала обеспечивают две функции: во-первых, спаренные каналы могут использоваться для реализации обобщенного intensity stereo кодирования, где спектральные значения каналов могут быть совместно использованы; во-вторых, спаренные каналы могут использоваться для динамического сведения одного звукового объекта в стерео.
Следует учесть, что этот инструмент включает параметры, зависимые от определенного профиля (см. 5.1).
10.3.2.1. Элементы данных
10.3.2.2. Элементы справки
Спаренный канал основан на встроенном single_channel_element (), который объединяется для этого с некоторыми соответствующими полями.
Спаренные целевые элементы синтаксиса (SCE или CPEs) адресуются, используя два элемента синтаксиса. Во-первых, поле cc_target_is_cpe указывает, адресуются ли SCE или CPE. Во-вторых, поле cc_target_tag_select указывает instance_tag SCE/CPE.
Операция масштабирования, включенная в спаривание каналов, определяется значениями gain_element, которые описывают используемый коэффициент усиления и знак. В соответствии с процедурами кодирования для масштабных коэффициентов и позиций intensity stereo значения gain_element дифференциально кодируются с использованием таблицы Хаффмана для масштабных коэффициентов. Точно также декодируемые коэффициенты усиления для пары относятся к оконным группам спектральных коэффициентов.
Независимо коммутируемые CCE и зависимо коммутируемые CCE
Есть два вида CCE: "независимо переключаемые" и "зависимо переключаемые". Независимо переключаемым CCE является CCE, в котором статус окна (т.е. window_sequence и window_shape) CCE не должен соответствовать статусу окна любого спаренного SCE или спаренных каналов CPE. Есть несколько важных ограничений:
Во-первых, требуется, чтобы независимо переключаемый CCE мог использовать только элемент common_gain, а не список gain_elements.
Во-вторых, CCE должен быть полностью декодирован во временном пространстве (включая банк фильтров синтеза) до масштабирования и добавления к различным SCE и каналам CPE, с которыми он спарен, в случае несоответствия статуса окна.
У зависимо переключаемого CCE, с другой стороны, должен быть статус окна, соответствующий всем целевым SCE, и каналы CPE, которые спарены согласно списку элементов cc_l и cc_r. В этом случае CCE должен быть полностью декодирован в частотном пространстве и затем масштабироваться в соответствии со списком усиления до добавления к целевому SCE или каналам CPE.
Следующий псевдокод в функции decode_coupling_channel () определяет декодирование для зависимо переключаемого элемента спаренного канала. Сначала спектральные коэффициенты встроенного single_channel_element () декодируются и помещаются во внутренний буфер. Так как элементы усиления для первой спаренной цели (list_index == 0) не передаются, все значения gain_element, связанные с этой целью, как предполагается, равны 0, т.е. спаренный канал добавляется к спаренному целевому каналу с его масштабированием. Иначе спектральные коэффициенты масштабируются и добавляются к коэффициентам спаренных целевых каналов, используя соответствующий список значений gain_element.
Независимо коммутируемый CCE декодируется как зависимо коммутируемый CCE, имеющий только элементы common_gain_element. Однако получающийся масштабированный спектр преобразовывается обратно к его временному представлению и затем спаривается.
Следует учесть, что списки gain_element могут быть совместно использованы левым и правым каналами целевого элемента пары каналов. Это сигнализируется нулевыми cc_l и cc_r, как обозначено в таблице 60.
Таблица 60
Совместное использование списков gain_element
decode_coupling_channel ()
{
- декодирует спектральные коэффициенты встроенного
single_channel_element в буфер "cc_spectrum []".
/* Объединение спектральных коэффициентов по целевым каналам */
list_index = 0;
for (c = 0; c <num_coupled_elements+1; c ++) {
if (! cc_target_is_cpe [c]) {
couple_channel (cc_spectrum, spectrum_m (cc_target_tag_select [c], cc_domain), list_index ++);
}
if (cc_target_is_cpe [c]) {
if (! cc_l [c] &&! cc_r [c]) {
couple_channel (cc_spectrum, spectrum_l (cc_target_tag_select [c], cc_domain), list_index);
couple_channel (cc_spectrum, spectrum_r (cc_target_tag_select [c], cc_domain), list_index ++);
}
if (cc_l [c]) {
couple_channel (cc_spectrum,
spectrum_l (cc_target_tag_select [c], cc_domain), list_index ++));
if (cc_r [c]) {
couple_channel (cc_spectrum, spectrum_r (cc_target_tag_select [c], cc_domain), list_index ++));
couple_channel (source_spectrum [], dest_spectrum [], gain_list_index)
{
idx = gain_list_index;
a = 0;
cc_scale = cc_scale_table [gain_element_scale];
for (g = 0; g <num_window_groups; g + +) {
/* Декодировать спаренные элементы усиления для этой группы */
if (common_gain_element_present[idx]) {
for (sfb = 0; sfb <max_sfb; sfb ++) {
cc_sign [idx] [g] [sfb] = 1;
gain_element [idx] [g] [sfb] = common_gain_element [idx];}
else {
for (sfb = 0; sfb <max_sfb; sfb ++) {
if (sfb_cb [g] [sfb] == ZERO_HCB)
continue;
if (gain_element_sign) {
cc_sign [idx] [g] [sfb] = 1 - 2* (dpcm_gain_element [idx] [g] [sfb] & 0x1);
gain_element [idx] [g] [sfb] = a+ = (dpcm_gain_element [idx] [g] [sfb]>> 1);
} else {
cc_sign [idx] [g] [sfb] = 1;
gain_element [idx] [g] [sfb] = a+ = dpcm_gain_element [idx] [g] [sfb];}
}
/* Выполнять спаривание целевых каналов */
for (b = 0; b <window_group_length [b]; b + +) {
for (sfb = 0; sfb <max_sfb; sfb ++) {
if (sfb_cb [g] [sfb]! = ZERO_HCB) {
; for (i = 0; i <swb_offset [sfb+1]-swb_offset [sfb];
dest_spectrum [g] [b] [sfb] [i] + = cc_gain [idx] [g] [sfb] * source_spectrum [g] [b] [sfb] [i].
Таблица 61
Предсказание используется для улучшенного устранения избыточности и особенно эффективно в случае более или менее стационарных участков сигнала, которые являются наиболее требовательными с точки зрения необходимой скорости передачи. Предсказание может быть применено к каждому каналу с помощью внутриканального (или моно) предсказывающего устройства, которое использует автокорреляцию спектральных составляющих последовательных фреймов. Поскольку window_sequence типа EIGHT_SHORT_SEQUENCE указывает на сигнальные изменения, т.е. нестационарность, предсказание используется, только если window_sequence имеет типы ONLY_LONG_SEQUENCE, LONG_START_SEQUENCE или LONG_STOP_SEQUENCE. Использование инструмента предсказания является зависимым профилем.
Для каждого канала предсказание применяется к спектральным компонентам, полученным в результате спектрального преобразования в банке фильтров. Для каждого спектрального компонента вплоть до PRED_SFB_MAX есть один соответствующий предсказатель, приводящий к банку предсказания, где каждый предсказатель использует автокорреляцию спектральных значений последовательных фреймов.
Полная структура кодирования с использованием банка фильтров с высокой спектральной разрешающей способностью подразумевает использование обратных адаптивных предсказателей для достижений высокой эффективности кодирования. В этом случае коэффициенты предсказания вычисляются по предыдущим квантованным спектральным значениям в кодере, так же как и в декодере, и никакая дополнительная служебная информация не требуется для передачи коэффициентов предсказания в отличие от прямых адаптивных предсказаний. Обратно-адаптивное предсказание второго порядка с решетчатой структурой используется для каждого спектрального компонента так, чтобы каждый предсказатель работал со спектральными значениями двух предыдущих фреймов. Параметры предсказателя адаптируются к текущей сигнальной статистике от фрейма к фрейму, используя алгоритм адаптации на основе LMS. Если предсказание активно, на вход квантователя поступает ошибка предсказания вместо исходного спектрального компонента, что приводит к увеличению эффективности кодирования.
Чтобы сохранить требования на минимуме, переменные состояния предсказателя квантуются перед хранением.
Таблица 62 определяет верхний предел полос масштабных коэффициентов, для которых может использоваться предсказание.
Таблица 62
Верхний частотный предел для предсказания
Это означает, что на частоте дискретизации 48 кГц предсказание может использоваться в полосах масштабных коэффициентов от 0 до 39. Согласно таблице 46 эти 40 полос масштабных коэффициентов включают линии МДКП 0...671, следовательно, по максимуму имеется 672 предсказателя.
Для каждого спектрального компонента вплоть до предела, определенного PRED_SFB_MAX каждого канала, есть один предсказатель. Предсказанием управляют на основе single_channel_element () или channel_pair_element (), на основе переданной служебной информации, в два шага: сначала для целого фрейма, а затем для каждой отдельной полосы масштабных коэффициентов (см. 11.3.1). Коэффициенты предсказания для каждого предсказателя вычисляются по предыдущим восстановленным значениям соответствующих спектральных составляющих. Детали необходимой обработки предсказателя описываются в 11.3.2. В начале процесса декодирования инициализируются все предсказатели. Механизм инициализации и сброс предсказателей описываются в 11.3.2.4.
Следующее описание действительно для любого одного single_channel_element () или одного channel_pair_element () и должно быть применено к каждому такому элементу. Для каждого фрейма служебная информация предсказателя должна быть извлечена из потока битов, чтобы осуществить управление дальнейшей обработкой предсказателя в декодере. В случае single_channel_element () управляющая информация допустима для банка предсказателей канала, связанного с этим элементом. В случае channel_pair_element () есть два варианта. Если common_window = 1, есть только один набор управляющей информации, которая допустима для двух банков предсказателей двух каналов, связанных с этим элементом. Если common_window = 0, есть два набора управляющей информации для каждого из двух банков предсказателей двух каналов, связанных с этим элементом.
Если window_sequence имеет тип ONLY_LONG_SEQUENCE, LONG_START_SEQUENCE или LONG_STOP_SEQUENCE, бит predictor_data_present считывается. Если этот бит не установлен в (0), то предсказание выключается для всего текущего фрейма, и нет дальнейшей служебной информации о предсказании. В этом случае бит prediction_used для каждой полосы масштабных коэффициентов, сохраненной в декодере, должен быть обнулен. Если бит predictor_data_present установлен в (1), то предсказание используется для текущего фрейма, и бит predictor_reset считывается, определяя, применяется ли сброс предсказателя в текущем фрейме (1) или нет (0). Если predictor_reset установлен, то считываются следующие 5 битов, соответствующие числу, определяющему группу предсказателей, которые будут сброшены в текущем фрейме (см. также 11.3.2.4). Если predictor_reset не установлен, то в потоке битов указанное 5-битное число отсутствует. Затем считываются биты prediction_used, которые управляют использованием предсказания в каждой полосе масштабных коэффициентов индивидуально, т.е. если бит установлен для определенной полосы масштабных коэффициентов, предсказание включается для всех спектральных компонентов этой полосы масштабных коэффициентов, и квантованная ошибка предсказания каждого спектрального компонента передается вместо квантованного значения спектрального компонента. Иначе предсказание отключается для этой полосы масштабных коэффициентов, и передаются квантованные значения спектральных компонентов.
11.3.2.1. Общие сведения
Следующее описание действительно для одного предсказателя и должно быть применено к каждому предсказателю. Используется обратное адаптивное предсказание второго порядка с решетчатой структурой. На рисунке 7 показана соответствующая блок-схема предсказания в декодере. Оценка
и , сохраняется в элементах регистра структуры предсказателя с помощью коэффициентов предсказания , m = 1, 2 оценки вычисляются согласно ,где
,![]() и
.Следовательно, полная оценка:
.Константы a и b, 0 < a, b <= 1 являются коэффициентами затухания, которые применяются в целях стабилизации рекурсивной структуры. Благодаря им возможные колебания из-за ошибок передачи или дрейфа между коэффициентами предсказания из-за численной погрешности в кодере и декодере могут постепенно быть устранены или даже предотвращены.
В случае стационарных сигналов и c = b = 1 коэффициент предсказания элемента m вычисляется
.Чтобы адаптировать коэффициенты к текущим сигнальным свойствам, математические ожидания в приведенном выше уравнении заменяют на усредненные по времени оценки, измеренные за ограниченный прошлый сигнальный период. Должен быть принят компромисс между хорошей сходимостью и оптимальной настройкой предсказателя в течение периодов сигнала с квазистационарной характеристикой и возможностью быстрой адаптации в случае нестационарности. В этом контексте особенно интересны алгоритмы с итеративным улучшением оценок, т.е. от отсчета к отсчету. Здесь используется метод наименьших квадратов (LMS) и коэффициенты предсказания вычисляются следующим образом:
![]() с
; ,где a - время адаптации, постоянная, которая определяет влияние текущего отсчета на оценку математического ожидания, a = 0,90625.
Оптимальные значения коэффициентов затухания a и b должны быть определены из-за компромисса между высоким усилением предсказания и быстрым временем спада. Выбранные значения a = b = 0,953125 независимо от того, выключено ли предсказание вообще или только для определенной полосы масштабных коэффициентов, или все предсказатели вычисляются постоянно, для постоянной адаптации коэффициентов к текущей сигнальной статистике.
Если window_sequence имеет типы ONLY_LONG_SEQUENCE, LONG_START_SEQUENCE и LONG_STOP_SEQUENCE, отличается только вычисление восстановленного значения квантованных спектральных компонентов в зависимости от значения бита prediction_used:
если бит установлен в (1), то квантованная ошибка предсказания, восстановленная по переданным данным, прибавляется к оценке
;если бит не установлен в (0), то квантованное значение спектрального компонента восстанавливается непосредственно по переданным данным.
В случае коротких блоков, т.е. window_sequence имеет тип EIGHT_SHORT_SEQUENCE, предсказание всегда отключается, и выполняется сброс всех предсказателей во всех полосах масштабных коэффициентов, который эквивалентен инициализации (см. 11.3.2.4). Для single_channel_element () обработка предсказателя для одного фрейма выполняется согласно следующему псевдокоду:
(Предполагается, что восстановленное значение y_rec (c), которое является либо восстановленной квантованной ошибкой предсказания, либо восстановленным квантованным спектральным коэффициентом, доступно из предыдущей обработки.)
if (ONLY_LONG_SEQUENCE||LONG_START_SEQUENCE||
LONG_STOP_SEQUENCE) {
for (sfb = 0; sfb <PRED_SFB_MAX; sfb ++) {
fc = swb_offset_long_window [fs_index] [sfb];
lc = swb_offset_long_window [fs_index] [sfb+1];
for (c = fc; с <lc; с ++) {
x_est [c] = predict();
if (predictor_data_present && prediction_used [sfb])
x_rec [c] = x_est [c] + y_rec [c];
else
x_rec [c] = y_rec [c];
}
else {
reset_all_predictors().
В случае channel_pair_element() с common_window = 1 единственное отличие заключается в том, что вычисление x_est и x_rec во внутренней петле цикла выполняется для обоих каналов, связанных с channel_pair_element (). В случае channel_pair_element () с common_window = 0 у каждого канала есть предсказание в соответствии с канальной служебной информацией предсказания.
11.3.2.2. Квантование при вычислении предсказания
Для заданного предсказателя должны быть сохранены шесть параметров состояния:
Предсказанное значение
Выражения
и округляются до 16-разрядного представления с плавающей запятой (т.е. к 7-разрядной мантиссе), что позволяет вычислить эти отношения по двум небольшим таблицам. C-код для генерации таких таблиц показан в псевдо C-функции make_inv_tables ().Все промежуточные результаты в каждом вычислении с плавающей запятой в алгоритме предсказания будут представлены в округленной форме с использованием фиксированной точности с плавающей запятой.
Вычислительный модуль IEEE с плавающей запятой, используемый при выполнении всех арифметических действий в инструменте предсказания, включает следующие опции:
Округление к ближайшему значению; округление к значению с младшим значащим битом, равным 0.
Исключение переполнения - значения, величина которых больше, чем самое большое возможное значение, будут установлены в бесконечность.
Исключение потери значимости - постепенная потеря значимости (денормализованные числа) будет поддерживаться; будут обнулены значения, величина которых меньше, чем самое маленькое представимое значение.
11.3.2.3. Быстрый алгоритм для округления
*/
static void
flt_round_inf
(float *pf),
{
int flg;
unsigned long tmp, tmp1, tmp2;
tmp = *(unsigned long*) pf;
fig = tmp & (unsigned long) 0x00008000;
tmp &= (unsigned long) 0xffff0000;
tmp1 = tmp;
/* округление 1/2 lsb к бесконечности */
if (flg) {
tmp &= (unsigned long) 0xff 800000; /* извлечь экспоненту и знак */
tmp |= (unsigned long) 0x00010000; /* вставить 1 lsb */
tmp2 = tmp; /* добавить 1 lsb и игнорировать один*/
tmp &= (unsigned) 0xff800000; /* извлечь экспоненту и знак */
*pf = * (float *), &tmp1+ * (float *) &tmp2 - * (float *) &tmp;
/* вычесть один */} {
*pf = * (float *),&tmp;}
static foat mnt_table [128];
static float exp_table [256];
/* функция flt_round_even () работает только для аргументов в диапазоне
*
![]() */static void flt_round_even (float *pf),
{
int exp, a;
float tmp;
frexp ((double) *pf, &exp);
tmp = *pf * (1 <<(8-exp)); = (int) tmp;
if((tmp-a)> = 0.5) + +;
if((tmp-a) == 0.5) a&= -2;
*pf= (float)/(1 <<(8-exp));}
static void make_inv_tables (void)
{
int i;
unsigned long tmp1, tmp;
float *pf= (float *) &tmp1;
float ftmp;
*pf = 1.0;
for (i=0; i <128; i ++) {
tmp = tmp1 + (i <<16);/* float 1.m, 7 msb только */
ftmp = b / * (float *), &tmp;
flt_round_even (&ftmp);/* округление к 16 битам */
mnt_table [i] = ftmp;
для (i=0; i <256;
tmp = (i <<23);
/*
*/, if (* (float *) &tmp> 1.0) { ftmp = 1.0 /* (float *), &tmp;} else {
ftmp = 0;
}
exp_table [i] = ftmp;
}
Инициализация предсказателя означает, что параметры состояния предсказателя устанавливаются следующим образом:
, , . В начале процесса декодирования все предсказатели инициализируются.Циклический механизм сброса применяется кодером и сообщается декодеру, в котором все предсказатели инициализируются снова в определенном временном интервале способом чередования. С одной стороны это увеличивает устойчивость предсказателя, повторно синхронизируя предсказатели кодера и декодера, и с другой стороны это позволяет задавать определенные точки входа в потоке битов.
Весь набор предсказателей подразделяется на 30 групп сброса согласно таблице 63.
Таблица 63
Группы сброса предсказателей
Должен ли сброс быть применен в текущем фрейме, определяется битом predictor_reset. Если этот бит установлен, номер группы сброса предсказателей, которая будет сброшена в текущем фрейме, определяется из predictor_reset_group_number. Все предсказатели, принадлежащие этой группе сброса, инициализируются как описано выше. Эта инициализация должна быть сделана после того, как была выполнена обычная обработка предсказателей для текущего фрейма. Следует учесть, что у predictor_reset_group_number не может быть значений 0 или 31.
Типичный цикл сброса начинается с группы сброса номер 1, и номер группы сброса увеличивается на 1, пока не достигнет 30, затем все снова начинается с 1. Однако может произойти разрыв в нумерации групп сброса, например, из-за переключения между программами (потоками битов) или вырезания и вставки. В этом случае есть три возможности для работы декодера:
- проигнорировать разрыв и продолжить нормальную обработку. Это может привести к короткому слышимому искажению из-за несоответствия (дрейф) между предсказателем в кодере и декодере. После одного полного цикла сброса (группа сброса n, n + 1..., 30, 1, 2..., n - 1) предсказатели повторно синхронизируются. Кроме того, возможное искажение постепенно уменьшается из-за коэффициентов затухания a и b;
- обнаружить разрыв, продолжить нормальную обработку, но отключить выходной сигнал, пока не будет выполнен один полный цикл сброса, и предсказатели не будут повторно синхронизированы;
- сбросить все предсказатели.
Каждая группа предсказателей должна быть сброшена после максимального "активного" периода длиной 240 фреймов. Сброс 30 групп сброса предсказателей может быть выполнен либо постепенно, либо за один раз, либо любым другим путем, пока максимальный период сброса 240 "активных" фреймов не нарушен. Следует учесть, что "активный" период в 240 фреймов может длиться намного дольше, чем 240 фреймов, так как фреймы с активным предсказанием могут чередоваться с произвольным числом фреймов без предсказания. Далее группы предсказателей могут быть активны независимо друг от друга, таким образом, требуется отдельный учет "активности" каждой группы сброса предсказателей.
В случае single_channel_element () или channel_pair_element () с common_window = 0 сброс должен быть применен к банку(ам) предсказателей канала(ов), связанных с этим элементом. В случае channel_pair_element () с common_window = 1 сброс должен быть применен к двум банкам предсказателей двух каналов, связанных с этим элементом.
В случае короткого блока (window_sequence типа EIGHT_SHORT_SEQUENCE) должны быть сброшены все предсказатели во всех полосах масштабных коэффициентов.
![]() для одного спектрального компонента в декодере.
(Стрелки указывают на поток сигналов для адаптации
коэффициентов предсказания.)
![]() для одного спектрального компонента
Временное формирование шума используется для управления временной формой шумов квантования в пределах отдельного окна преобразования. Это выполняется применением процессов фильтрации к частям спектральных данных каждого канала.
Следует учесть, что этот инструмент включает параметры, зависимые от определенного профиля (см. 5.1).
В зависимости от window_sequence размер следующих полей потока битов переключается для каждого окна преобразования согласно его размеру:
Процесс декодирования для временного формирования шума выполняется отдельно для каждого окна текущего фрейма путем фильтрации выбранных областей спектральных коэффициентов (см. функцию tns_decode_frame).
Число фильтров формирования шума, применяемых к каждому окну, определяется "n_filt". Целевой диапазон спектральных коэффициентов выражен в полосах масштабных коэффициентов с нисходящим счетом от верхней полосы (или нижней полосы предыдущей полосы формирования шума).
Сначала происходит декодирование переданных коэффициентов фильтра, т.е. преобразование в числа со знаком, обратное квантование, преобразование в коэффициенты LPC, как описано в функции tns_decode_coef ().
Затем фильтры применяются к целевым областям частот спектральных коэффициентов канала (см. функцию tns_ar_filter ()). Маркер "direction" используется для определения направления, в котором фильтр движется относительно коэффициентов (0 = вверх, 1 = вниз).
Постоянная TNS_MAX_BANDS определяет максимальное количество полос масштабных коэффициентов, к которым применяется временное формирование шума. Максимально возможный порядок фильтра определяется постоянной TNS_MAX_ORDER. Обе константы являются параметрами, зависимыми от профиля.
Процесс декодирования для одного канала может быть описан следующим псевдокодом:
/* Декодирование TNS для одного канала и фрейма */
tns_decode_frame ()
{
for (w = 0; w <num_windows; w ++) {
bottom = num_swb;
for (f = 0; f <n_filt [w]; f ++) {
top = bottom;
bottom = max(top -length [w] [f], 0);
tns_order = min (order [w][f], TNS_MAX_ORDER);
if (! tns_order), continue;
tns_decode_coef (tns_order, coef_res [w] +3, coef_compress [w] [f], coef [w] [f], lpc []);
start = swb_offset [min (bottom, TNS_MAX_BANDS, max_sfb)];
end = swb_offset [min (top, TNS_MAX_BANDS, max_sfb)];
if ((sizep =end - start) <= 0) continue;
if (direction [w] [f]) {
inc = -1;
start = end - 1;
} else {
inc = 1;
}
tns_ar_filter (&spec [w] [start], size, inc, lpc [], tns_order);
}
Следует учесть, что этот псевдокод использует C-интерпретацию массивов и векторов, т.е. если coef[w] [filt] [i] описывает коэффициенты для всех окон и фильтров, coef [w] [filt] является указателем на коэффициенты одного определенного окна и фильтра. Кроме того, коэффициент идентификатора используется в качестве формального параметра в функции tns_decode_coef ().
/* Декодирование переданных коэффициентов для одного фильтра TNS */
tns_decode_coef (order, coef_res_bits, coef_compress, coef[],a[])
{
/* Некоторые внутренние таблицы *
/sgn_mask [] = {0x2, 0x4, 0x8};
neg_mask [] = {~0x3, ~0x7, ~0xf};
/* размер, используемый для передачи */
coef_res2 = coef_res_bits - coef_compress;
s_mask = sgn_mask [coef_res2 - 2]; /* маска для бита знака */
n_mask = neg_mask [coef_res2 - 2];
/*маска для того, чтобы дополнить отрицательные значения */
/* Преобразование в целое число со знаком */
for(i = 0; i <order; i ++)
tmp [i] = (coef [i] & s_mask)? (coef [i] | n_mask):coef [i];
/* Обратное квантование */
iqfac = ((1<<(coef_res_bits-1)) - 0.5) / (p/2.0);
iqfac_m = ((1 <<(coef_res_bits-1)) + 0.5) / (p/2.0);
for (i = 0; i <order; i ++) {
tmp2 [i] = sin (tmp [i] / ((tmp [i]> = 0)? iqfac: iqfac_m));}
/* Преобразование в коэффициенты LPC*/
a[0] = 1;
for (m = 1; m <= order; m ++) {
for (i = 1; i <m; i ++) {
b [i] = [i] + tmp2 [m-1] * [m-i];
for (i = 1; i <m; i ++) {
a[m] = tmp2 [m-1];
}
tns_ar_filter (spectrum [], size, inc, lpc [], order)
{
Простой фильтр порядка "order", определенный согласно
y (n) = x (n) - lpc [1] *y(n - 1)-... - lpc [order] *y(n - order)
Параметры состояния фильтра инициализируются в нуль каждый раз.
Выходные данные заменяют входные данные.
Входной вектор "size" отсчетов обрабатывается, и индекс увеличивается на "inc" до следующего отсчета данных.
}
Частотно-временное представление сигнала отображается во временное пространство путем подачи его коэффициентов в банк фильтров. Этот модуль состоит из ОМДКП и функции окна со сложением. Чтобы адаптировать частотно/временную разрешающую способность банка фильтров к характеристикам входного сигнала, применяется инструмент переключения окон. N соответствует длине окна, N является функцией window_sequence, см. 6.3.3. Для каждого канала N/2 частотно-временных значений
Элементы синтаксиса банка фильтров определяются в потоке необработанных данных для single_channel_element () (см. 4.3, таблицу 13), channel_pair_element () (см. 4.3, таблицу 14) и coupling_channel (см. 4.3, таблицу 22). Они состоят из управляющей информации window_sequence и window_shape.
Элементы данных:
В таблице 44 показаны четыре window_sequences (ONLY_LONG_SEQUENCE, LONG_START_SEQUENCE, EIGHT_SHORT_SEQUENCE, LONG_STOP_SEQUENCE).
Аналитическое выражение для ОМДКП
,где n - индекс отсчета;
i - индекс окна;
k - индекс спектрального коэффициента;
N - длина окна, основанная на значении window_sequence n = (N/2 + 1)/2.
Длина окна синтеза N для обратного преобразования является функцией элемента синтаксиса window_sequence и определяется следующим образом:
![]() Значимые блочные переходы:
from ONLY_LONG_SEQUENCE to
![]() from LONG_START_SEQUENCE to
![]() from LONG_STOP_SEQUENCE to
![]() from EIGHT_SHORT_SEQUENCE to
![]() В дополнение к значимым блочным переходам следующие переходы возможны:
from ONLY_LONG_SEQUENCE to
![]() from LONG_START_SEQUENCE to
![]() from LONG_STOP_SEQUENCE to
![]() from EIGHT_SHORT_SEQUENCE to
![]() Все это обеспечивает плавный переход от одного блока к следующему.
В зависимости от window_sequence и элемента window_shape используются различные окна. Комбинация из половин окон, описанных ниже, обеспечивает любые возможные window_sequences.
Для window_shape == 1 коэффициенты окна берутся из оконной функции Кайзера - Бесселя (KBD):
; ,где:
W' (ядро оконной функции Кайзера - Бесселя) определяется следующим образом:
; , .Иначе для window_shape == 0 используется синусное окно:
, .Длина окна N может быть 2048 или 256 для KBD и синусного окна. Процедура получения возможных последовательностей окон объясняется в частях а) - г) этого пункта. У всех четырех window_sequences, описанных ниже, общая длина равна 2048 отсчета.
Для всех видов window_sequences window_shape левой половины первого окна определяется формой окна предыдущего блока. Это выражается следующей формулой:
,где:
window_shape_previous_block: window_shape предыдущего (i - 1) блока.
Для первого декодируемого блока потока битов window_shape левой и правой половины окна идентичны.
window_sequence == ONLY_LONG_SEQUENCE эквивалентно одному LONG_WINDOW (см. таблицу 44) с общей длиной окна 2048.
Для window_shape == 1 окно для ONLY_LONG_SEQUENCE задается следующим образом:
.Если window_shape == 0, окно для Only_Long_Sequence может быть описано следующим образом:
.После работы с окнами значения во времени могут быть выражены как:
;б) LONG_START_SEQUENCE:
LONG_START_SEQUENCE необходима для получения корректного перекрытия и сложения для блочного перехода от ONLY_LONG_SEQUENCE к EIGHT_SHORT_SEQUENCE.
Если window_shape == 1, окно для LONG_START_SEQUENCE задается следующим образом:
.Если window_shape == 0, окно для LONG_START_SEQUENCE:
.Взвешенные в окне временные значения могут быть вычислены по формуле из а).
в) EIGHT_SHORT
window_sequence == EIGHT_SHORT включает в себя восемь перекрытых и сложенных SHORT_WINDOW (см. таблицу 44) длиной 256 каждое. Общая длина window_sequence вместе со смещением и нулями равна 2048. Каждый из восьми коротких блоков в начале взвешивается в отдельном окне.
Номер короткого блока индексируется переменной j = 0,..., 7.
window_shape предыдущего блока влияет только на первый из восьми коротких блоков
. Если window_shape == 1, оконные функции даны следующим образом:![]() .Иначе, если window_shape == 0, оконные функции могут быть описаны как:
![]() .Перекрытие и сложение между EIGHT_SHORT window_sequence, приводящее к взвешенным временным значениям, описывается следующим образом:
![]() Эта window_sequence необходима для переключения от IGHT_SHORT_SEQUENCE назад к ONLY_LONG_SEQUENCE.
Если window_shape == 1, окно для LONG_STOP_SEQUENCE задается следующим образом:
.Если window_shape == 0, окно для LONG_START_SEQUENCE определяется как:
.Помимо перекрытия и сложения в пределах EIGHT_SHORT window_sequence первая (левая) половина каждого window_sequence перекрывается и складывается со второй (правой) половиной предыдущего window_sequence, образуя окончательные временные значения
.Инструмент управления усилением состоит из нескольких компенсаторов усиления, этапов перекрытия/сложения и IPQF (обратной полифазного квадратурной фильтрации) этапа. Этот инструмент получает неперекрытые последовательности сигналов после этапов ОМДКП, window_sequence и gain_control_data и затем воспроизводит выходные ИКМ данные. Блок-схема для инструмента управления усилением показана на рисунке 9.
Из-за характеристик PQF банка фильтров порядок следования коэффициентов МДКП в каждой четной полосе PQF должен быть реверсирован. Это выполняется путем реверсирования порядка следования спектральных коэффициентов МДКП, т.е. заменой местами более высоких по частоте коэффициентов МДКП на более низкие по частоте коэффициенты МДКП.
Если инструмент управления усиления используется, конфигурация инструмента банка фильтров изменяется следующим образом. В случае EIGHT_SHORT_SEQUENCE window_sequence число коэффициентов для ОМДКП - 32 вместо 128, и выполняются восемь ОМДКП. В случае других значений window_sequence число коэффициентов для ОМДКП - 256 вместо 1024, и выполняется одно ОМДКП. Во всех случаях на выходе инструмента банка фильтров в общей сложности 2048 неперекрытых значений на фрейм. Эти значения поступают в инструмент управления усилением как
, определенный в 14.3.3.IPQF комбинирует четыре равных полосы частот и производит декодированный выходной сигнал во времени. Компоненты элайзинга, возникшие из PQF в кодере, отменяются в IPQF.
Значения усиления для каждой полосы можно регулировать независимо за исключением самой низкой полосы частот. Размер шага регулирования усиления равен
На выходе инструмента управления усилением образуется последовательность временного сигнала AS(n), определенная в 14.3.4.
14.2.1. Элементы данных
14.2.2. Элементы справки
Следующие процессы требуются для декодирования:
- Декодирование данных управления усилением.
- Установка функции управления усилением.
- Взвешивание регулирования усиления и наложение.
- Фильтр синтеза.
Данные управления усилением восстанавливаются следующим образом.
(1)
, (2)
, , (3)
![]() , (4)
![]() ,где
- номер информации об управлении усилением, целое число; - расположение управления усилением, целое число; - уровень управления усилением, целочисленное действительное число;B - ID полосы, целое число от 1 до 3;
W - ID окна, целое число от 0 до 7;
m - целое число;
aloccode [B] [W] [m] должен быть установлен так, чтобы
удовлетворял следующим условиям: ,AdjLoc () определяется из таблицы 64. AdjLev() определяется из таблицы 65.
Функция управления усилением получается следующим образом:
(1)
, , (2)
, (3)
ifONLY_LONG_SEQUENCE
,![]() ifLONG_START_SEQUENCE
, ,если EIGHT_SHORT_SEQUENCE
, , ifLONG_STOP_SEQUENCE
, , (4)
, 0 <= j <= 511, W == 0 ifONLY_LONG_SEQUENCE
0 <= j <= 511, W == 0 ifLONG_START_SEQUENCE
0 <= j <= 63, 0 <= W <= 7 ifEIGHT_SHORT_SEQUENCE,
0 <= j <= 511, W == 0 ifLONG_STOP_SEQUENCE
где
и
.Следует учесть, что начальное значение
должно быть равно 1.0.Данные полос получаются посредством процессов (1) и (2), приведенные ниже.
(1) Взвешивание в окне
, 0 <= j <= 511, W == 0 ifONLY_LONG_SEQUENCE
0 <= j <= 511, W == 0 ifLONG_START_SEQUENCE
0 <= j <= 63, 0 <= W <= 7 if EIGHT_SHORT_SEQUENCE
0 <= j <= 511, W == 0 ifLONG_STOP_SEQUENCE
else
, 0 <= j <= 511, W == 0 ifONLY_LONG_SEQUENCE
0 <= j <= 511, W == 0 ifLONG_START_SEQUENCE
0 <= j <= 63, 0 <= W <= 7 ifEIGHT_SHORT_SEQUENCE
0 <= j <= 511, W == 0 ifLONG_STOP_SEQUENCE
if ONLY_LONG_SEQUENCE
, 0 <= j <= 255 , 0 <= j <= 255 if LONG_START_SEQUENCE
, 0 <= j <= 255 , 0 <= j <= 111 , 0 <= j <= 31 if EIGHT_SHORT_SEQUENCE
, W = 0, 0 <= j <= 31 , 1 <= W <= 7, 0 <= j <= 31 , W == 7, 0 <= j <= 31 if LONG_STOP_SEQUENCE
, 0 <= j <= 31 , 0 <= j <= 111 , 0 <= j <= 255,где:
- спектральные данные полосы, вещественное число; - данные полосы с управлением усиления, вещественное число; - данные полосы с управлением усиления предыдущего фрейма, вещественное число;
- функция управления усилением, определенная в 14.3.2, вещественное число;
B - ID полосы, целое число от 0 до 3;
W - ID окна, целое число от 0 до 7;
J - целое число.
Следует учесть, что начальное значение
должно быть равно 0.0.Звуковые данные получаются из следующих уравнений:
(1)
,(2)
, 0 <= j <= 95, 0 <= B <= 3,(3)
,где:
AS(n) - звуковые данные;
QB (j) - коэффициенты фильтра синтеза, вещественное число;
Q (j) - коэффициенты фильтра-прототипа, данные ниже, вещественное число;
B - ID полосы, целое число от 0 до 3;
W - ID окна, целое число от 0 до 7;
n - целое число;
j - целое число;
k - целое число.
Значения Q(0)...Q(47) даны в таблице 66. Значения Q(48)...Q(95) получаются из следующего уравнения:
Q(j) = Q(95 - j), 48 <= j <= 95.
![]() Таблица 64
Таблица 65
Таблица 66
(обязательное)
ТАБЛИЦЫ КОДОВ ХАФФМАНА
Окончание таблицы А.9
Окончание таблицы А.10
Окончание таблицы А.11
Продолжение таблицы А.12
Окончание таблицы А.12
Окно Кайзера - Бесселя для SSR профиля EIGHT_SHORT_SEQUENCE
Окно Кайзера - Бесселя для SSR профиля
для остальных последовательностей окон
Продолжение таблицы А.14
Окончание таблицы А.14
(обязательное)
ИНФОРМАЦИЯ О НЕИСПОЛЬЗОВАННЫХ КОДОВЫХ КНИГАХ
В настоящем стандарте декодер AAC не использует сборники кодов #12 и #13. Однако, при желании, декодер может использовать эти сборники кодов, чтобы расширить его функциональность, если это не противоречит другим стандартам MPEG, таким как ИСО/МЭК 14496-3 [3], которые используют эти сборники кодов для расширенных методов кодирования.
Пример: синтаксис в 4.3 изменился бы, как представлено в таблице Б1.
Таблица Б.1
Расширенный синтаксис для scale_factor_data ()
????????????????????????????????????????????????????????????????????????????????????
? Синтаксис ?Биты ?Мнемо-?
? ? ?ника ?
????????????????????????????????????????????????????????????????????????????????????
?scale_factor_data() { ? ? ?
? noise_pcm_flag = 1; ? ? ?
? for (g = 0; g < num_window_groups; g++) { ? ? ?
? for (sfb = 0; sfb < max sfb; sfb++) { ? ? ?
? if (sfb_cb[g][sfb] != ZERO_HCB) { ? ? ?
? if (is_intensity(g,sfb)) ? ? ?
? hcod_sf[dpcm_is_position[g][sfb]];?1..19?vlclbf?
? else if (sfb_cb[g][sfb] == 13) ? ? ?
? if (noise_pcm_flag) { ? ? ?
? noise_pcm_flag = 0; ? ? ?
? dpcm_noise_nrg[g][sfb]; ? 9 ?uimsbf?
? } else ? ? ?
? hcod_sf[dpcm_noise_nrg[g][sfb]]; ?1..19?vlclbf?
? else ? ? ?
? hcod sf[dpcm sf[g][sfb]]; ?1..19?vlclbf?
? } ? ? ?
? } ? ? ?
? } ? ? ?
?} ? ? ?
????????????????????????????????????????????????????????????????????????????????????
(обязательное)
КОДЕР
В.1.1. Общие сведения
В этом Приложении представлена психоакустическая модель для кодера AAC. Психоакустическая модель вычисляет максимальную энергию искажений, которая маскируется энергией сигнала. Эту энергию называют порогом маскирования. У процесса вычисления порога маскирования есть три входа:
1. Длина сдвига для процесса вычисления порога маскирования iblen. Параметр iblen должен оставаться постоянным. Так как необходимо вычислить пороги для двух различных длин сдвига, необходимо два процесса, каждый со своей фиксированной длиной сдвига. Для длинного быстрого преобразования Фурье (БПФ) iblen = 1024, для короткого БПФ iblen = 128.
2. Для каждого типа БПФ следующие iblen отсчетов сигнала с задержанными отсчетами (в банке фильтров или в блоке психоакустического расчета) располагаются таким образом, чтобы окно психоакустического расчета оказалось по центру окна частотно-временного преобразования.
3. Частота дискретизации. Существуют наборы таблиц, предусмотренные для стандартных частот дискретизации. Частота дискретизации так же, как iblen, должна оставаться постоянной в течение одной реализации процесса вычисления порога маскирования.
Выходы психоакустической модели:
1. Набор отношений сигнал-маска и значений порога, которые адаптируются к кодеру как описано ниже.
2. Задержанные временные данные (ИКМ-отсчеты), которые используются МДКП.
3. Тип блока МДКП (длинный, стартовый, стоповый или короткий).
4. Оценка количества битов, которое должно использоваться для кодирования в дополнение к среднему количеству доступных битов.
Задержка ИКМ отсчетов необходима, ибо алгоритм переключения обнаруживает резкую атаку, т.е. для фрейма должны использоваться короткие блоки, длинный блок перед короткими блоками должен быть изменен на стартовый.
Перед начальной реализацией модели массив с предыдущих данных БПФ и массивы r (w) и f (w) должны быть обнулены для обеспечения известной начальной точки.
В.1.2. Комментарии
В процессе вычисления порога маскирования используются три индекса для значений данных:
w - индекс частотной линии спектра БПФ. Индекс 0 соответствует постоянной составляющей, индекс 1023 соответствует линии спектра на частоте Найквиста.
b - индекс частотной полосы. Если вычисление включает свертку или сумму, bb используется в качестве переменной суммирования. Нумерация полос начинается с 0.
n - индекс полосы масштабных коэффициентов. Индекс 0 соответствует самой низкой полосе масштабных коэффициентов.
В.1.3. Функция маскирования
В психоакустическом расчете используется "функция маскирования". Она вычисляется следующим образом:
if j >= i
tmpx = 3.0 (j-i)
else
tmpx = 1.5 (j-i),
где i - значение, барк, определяющее расстояние от маскера, j - значение, барк, соответствующее положению маскера, tmpx - временная переменная.
,где tmpz - временная переменная, min(a, b) - функция, возвращающая большее отрицательное значение из a и b.
,где tmpy - временная переменная.
if (tmpy <-100) then {sprdngf (i, j) =0} else
![]() В.1.4. Шаги при вычислении порога маскирования
Следующие шаги являются необходимыми для вычисления SMR (n) и xmin (n), используемыми в кодере для длинного и короткого БПФ.
1. Восстановить 2 * iblen отсчетов входного сигнала.
iblen новых отсчетов делаются доступными при каждом вызове генератора порога. Генератор порога должен хранить 2 * iblen - iblen отсчетов и объединить эти отсчеты для точного восстановления 2 * iblen последовательных отсчетов входного сигнала, s (i), где i - индекс входных отсчетов, 0 <= i < 2 * iblen.
2. Вычислить комплексный спектр входного сигнала.
Во-первых, s(i) взвешивается окном Хана, т.е.
sw(i) = s(i) * (0,5 - 0,5 * cos((pi * (i + 0,5))/iblen).
Во-вторых, вычисляется стандартное БПФ sw(i).
В-третьих, вычисляется полярное представление преобразования. r(w) и f(w) соответствуют амплитудным и фазовым частям преобразованного sw(i) соответственно.
3. Вычислить предсказание r(w) и f(w).
Предсказанные амплитуда r_pred (w) и фаза f_pred (w) вычисляются по двум предыдущим блокам расчета порога r(w) и f(w):
r_pred (w) = 2,0 * r(t - 1) - r(t - 2)
f_pred (w) = 2,0 * f(t - 1) - f(t - 2),
где t - текущий номер блока, t-1 соответствует данным предыдущего блока и t-2 соответствует данным блока перед предыдущим.
4. Вычислить меру неопределенности c(w).
![]() Эта формула используется для каждого из коротких блоков с коротким БПФ, для первых 6 строк длинных блоков мера неопределенности вычисляется по длинному БПФ, для оставшихся строк используется минимальное значение неопределенности для коротких блоков БПФ. Если необходимо уменьшить сложность вычислений, неопределенность для верхней части спектра может быть установлена равной 0,4.
5. Вычислить энергию и неопределенность в разделах вычисления порога.
Энергия каждого раздела, e(b):
do for each partition b:
e(b) = 0
do from lower index to upper index w of partition b
![]() end do end
do
(e(b) используется в модуле M/S (см. Б.6.1): e(b) равно Xengy с 'X' = [R, L, M, S]) и взвешенная неопределенность, c(b):
do for each partition b: c(b) = 0 do from lower index to upper index w of partition b
end do end do
Разделы вычисления порога обеспечивают разрешение, примерно равное одной частотной линии БПФ или 1/3 критической полосы. На нижних частотах одна линия БПФ соответствует одному разделу вычисления. На верхних частотах несколько строк будут объединены в один раздел вычисления. Набор значений линий разделов для каждой из трех частот дискретизации задан в таблицах Б.1 - Б.24. Элементы этих таблиц будут использоваться в процессе вычисления порога маскирования. В каждой таблице есть следующие графы:
1. Индекс раздела вычисления, b;
2. Самая низкая частотная линия раздела, w_low (b);
3. Самая высокая частотная линия раздела, w_high (b);
4. Среднее значение частоты раздела, барк, bval (b);
5. Абсолютный порог слышимости qsthr (b).
6. Максимальное значение b, bmax, равное самому большому индексу, существующему для данной частоты дискретизации.
6. Вычислить свертку энергии разделов и неопределенности с функцией маскирования.
for each partition b:
ecb(b) = 0
do for each partition bb:
ecb (b) = ecb (b) +e (bb) * sprdngf (bval (bb), bval (b))
end do end do do for each partition b:
ct (b) = 0
do for each partition bb:
ct(b) = ct(b) +c(bb)* sprdngf (bval (bb), bval (b))
end do end do
Поскольку ct (b) взвешивается энергией сигнала, оно должно быть повторно нормализовано к cb (b)
cb (b) = ct (b) / ecb (b)
Аналогично, из-за ненормализованной природы функции маскирования ecbb должно быть повторно нормализовано и нормализованная энергия en(b) равна:
en (b) = ecb (b) / rnorm (b)
коэффициент нормализации, rnorm (b):
do for each partition b tmp (b) = 0
do for each partition bb
tmp (b) = tmp (b) + sprdngf (bval (bb), bval (b)) end do
rnorm (b) = 1/ tmp (b) end do
7. Преобразовать cb (b) в tb (b), индекс тональности.
![]() Каждый tb (b) ограничен диапазоном 0 <tb (b) <1.
8. Вычислить необходимое SNR в каждом разделе.
NMT (b) = 6 дБ для всех b. NMT (b) соответствует шумовому маскеру (в дБ) для раздела. TMN (b) = 18 дБ для всех b. TMN (b) соответствует тональному маскеру (в дБ). Требуемое отношение сигнал-шум, SNR (b):
SNR (b) = tb (b) * TMN (b) + (1-tb (b)) * NMT (b).
9. Вычислить отношение мощностей.
Отношение мощностей, bc (b):
![]() 10. Вычислить фактический энергетический порог, nb (b).
nb (b) = en (b) * bc (b) nb (b) также используется в модуле M/S (см. пункт 12): nb (b) равен Xthr с 'X' = [R, L, M., S].
11. Контроль пре-эха и абсолютный порог слышимости.
Чтобы избежать пре-эха, вычисляется контроль пре-эхом для коротких и длинных БПФ, абсолютный порог слышимости также учитывается здесь:
nb_l (b) является порогом раздела b для последнего блока, qsthr (b) является абсолютным порогом слышимости. Значения дБ qsthr (b) показаны на рисунке В.1.
Значения таблиц В.1 - В.24 даны относительно уровня частотной линии БПФ, которой соответствует синусоидальная волна амплитудой +/- 1 lsb. Значения (в дБ) должны быть преобразованы в единицы энергии после нормализации БПФ.
nb (b) = max (qsthr (b), min (nb (b), nb_l (b) *rpelev))
rpelev устанавливается в '1' для коротких блоков и '2' для длинных блоков.
12. PE вычисляется для каждого типа блока из отношения e (b) / nb (b), где nb (b) - порог маскирования и e (b) - энергия для каждого порогового раздела.
PE = 0
do for threshold partition b
PE = PE - (w_high(b)-w_low(b)) * log10 (nb(b) / (e (b) +1)) end do
13. Принимается решение об использовании длинного или короткого блока.
if PE for long block is greater than switch_pe then
coding_block_type = short_block_type else
coding_block_type = long_block_type end if if (coding_block_type == short_block_type)
and
(last_coding_block_type == long_type) then
last coding block type = start_type else
last_coding_block_type = short_type.
Последние четыре строки необходимы, так как в AAC нет комбинированного стартового/стопового блока. switch_pe - постоянная, зависящая от реализации.
14. Вычислить отношения сигнал-маска, SMR (n) и порог маскирования xmin (n).
Таблицы 45...57 дают:
1. Индекс swb раздела кодера, называемого полосой масштабных коэффициентов.
2. Смещение линии МДКП для полосы масштабных коэффициентов swb_offset_long/short_window.
Вводится следующая переменная:
n = swb
w_low (n) = swb_offset_long/short_window (n) whigh (n) = swb_offset_long/short_window (n+1) - 1
энергия БПФ в полосе масштабных коэффициентов, epart (n):
do for each scalefactor band n
epart (n) = 0
do for w = lower index w_low (n) к n = upper index w_high (n)
![]() end do
end do
порог для одной спектральной линии вычисляется согласно:
do for each threshold partition b
thr (all line_indices in this partition b) =
thr (w_low (b)..., w_high (b)), =nb (b) / (w_high (b) +1-w_low (b))
end do
уровень шума в полосе масштабных коэффициентов на уровне БПФ, npart (n) вычисляется как:
do for each scalefactor band n
npart (n) = minimum (thr (w_low (n))..., thr (w_high (n)))
* (w_high (n) +1-w_low (n)), end do
Где в этом случае minimum (a...z) - функция, возвращающая самый меньший положительный аргумент из a...z.
![]() Отношения, которые будут переданы в модуль квантования, SMR (n), вычисляются как:
SMR (n) = epart (n) / npart (n).
Для вычисления порогов кодера xmin (n) вычисляется энергия МДКП для каждой полосы масштабных коэффициентов:
Do for all scalefactor bands n
codec_e (n) = 0
do for lower index i to higher index i of this scalefactor band
![]() end do
end do.
Затем xmin (n), максимальная допустимая энергия искажений на уровне МДКП, может быть вычислена согласно этой формуле:
xmin (n) = npart (n) * codec_e (n) / epart (n).
15. Вычислить распределение битов из психоакустической энтропии (PE).
bit_allocation = pew1*PE + pew2*sqrt (PE);
для длинных блоков константы определяются как:
pew1 = 0,3, pew2 = 6,0;
для коротких блоков PE восьми коротких блоков суммируются, и константы:
pew1 =0,6, pew2 = 24,
тогда bit_allocation ограничивается 0 <bit_allocation <3000, и вычисляется more_bits:
more_bits = bit_allocation - (mean_bits - side_info_bits).
Таблица В.1
Таблица В.2
Психоакустические параметры для короткого БПФ,
![]()
Таблица В.3
Психоакустические параметры
для длинного БПФ,
![]()
Таблица В.4
Психоакустические параметры
для короткого БПФ,
![]()
Таблица В.5
Психоакустические параметры для длинного БПФ,
![]()
Таблица В.6
Психоакустические параметры для короткого БПФ,
![]()
Таблица В.7
Психоакустические параметры для длинного БПФ,
![]()
Таблица В.8
Психоакустические параметры для короткого БПФ,
![]()
Таблица В.9
Психоакустические параметры для длинного БПФ,
![]()
Таблица В.10
Психоакустические параметры
для короткого БПФ,
![]()
Таблица В.11
Психоакустические параметры для длинного БПФ,
![]()
Таблица В.12
Психоакустические параметры для короткого БПФ,
![]()
Таблица В.13
Психоакустические параметры для длинного БПФ,
![]()
Таблица В.14
Психоакустические параметры для короткого БПФ,
![]()
Таблица В.15
Психоакустические параметры для длинного БПФ,
![]()
Таблица В.16
Психоакустические параметры для короткого БПФ,
![]()
Таблица В.17
Психоакустические параметры для длинного БПФ,
![]()
Таблица В.18
Психоакустические параметры для короткого БПФ,
![]()
Таблица В.19
Психоакустические параметры для длинного БПФ,
![]()
Таблица В.20
Психоакустические параметры для короткого БПФ,
![]()
Таблица В.21
Психоакустические параметры для длинного БПФ,
![]()
Таблица В.22
Психоакустические параметры для короткого БПФ,
![]()
Таблица В.23
Психоакустические параметры для длинного БПФ,
![]()
Таблица В.24
В.2.1. Процесс кодирования
Инструмент управления усилением состоит из PQF (полифазного квадратурного фильтра), детекторов усиления и модификаторов усиления. Этот инструмент получает входные сигналы во времени и window_sequence, и затем выводит gain_control_data и сигнал с управляемым усилением, длина которого равна длине окна МДКП. Блок-схема для инструмента управления усилением показана на рисунке В.2.
Из-за характеристик банка PQF порядок коэффициентов МДКП в каждой четной субполосе PQF должен быть реверсирован. Это делается путем реверсирования порядка следования спектральных коэффициентов МДКП, т.е. переменой мест более высоких частотных коэффициентов МДКП с более низкими.
Если инструмент управления усилением используется, конфигурация банка фильтров изменяется следующим образом. В случае EIGHT_SHORT_SEQUENCE window_sequence число коэффициентов для МДКП 32 вместо 128 и восемь МДКП. В случае других значений window_sequence число коэффициентов для МДКП 256 вместо 1024, и выполняется одно МДКП. Во всех случаях инструмент банка фильтров получает в общей сложности 2048 значений сигнала с управляемым усилением на фрейм из-за перекрытия входных отсчетов.
В.2.1.1. PQF
Входной сигнал делится в PQF на четыре равных по ширине полосы. Коэффициенты в каждой полосе PQF определяются следующим образом:
, 0 <= n <= 95,0 <= i <= 3,где:
Q(n) = Q(95 - n), 48 <= n <= 95
и значения Q(n) являются теми же самыми значениями, что и в декодере.
В.2.1.2. Детектор усиления
Детекторы усиления производят данные управления усилением, которые удовлетворяют синтаксису потока битов. Эта информация состоит из количества изменений усиления, индекса позиций изменения усиления и индекса уровня изменения усиления. Выходные данные управления усилением применяются к предыдущему входному сигналу во времени. Это означает, что у детектора усиления есть задержка на один фрейм.
Обнаружение точки изменения усиления выполняется во второй половине окна МДКП и в неперекрытой области (LONG_START_SEQUENCE и LONG_STOP_SEQUENCE). Таким образом, число областей равно одной для ONLY_LONG_SEQUENCE, двум для LONG_START_SEQUENCE и LONG_STOP_SEQUNCE и восьми для EIGHT_SHORT_SEQUENCE.
Отсчеты в каждой области делятся на подобласти, каждая из которых содержит количество отсчетов, кратное восьми. Затем выбирается одно значение (например, пиковое значение) в этих подобластях. Вычисляются отношения между значениями подобластей и значением последней подобласти. Если отношение лежит вне диапазона
В.2.1.3. Модификатор усиления
Модификатор усиления для каждой полосы PQF управляет усилением каждой полосы сигнала. Дополнительный процесс управления усилением в декодере уменьшает пред-эхо и восстанавливает исходный сигнал. Оконная функция для управления усилением, функция модификации усиления (GMF), которая определяется в процессе декодирования, получается из значений усилений и позиций изменения усиления. Управляемые сигналы усиления получаются путем применения GMF к соответствующим полосным сигналам.
В.2.2. Схемы
![]() усилением для кодера
Основным компонентом в процессе аудиокодирования является преобразование сигналов во времени в частотно-временное представление. Эту функцию выполняет модифицированное дискретное косинусное преобразование (МДКП).
В.3.1. Процесс кодирования
В банк фильтров кодера поступает соответствующий блок временных отсчетов, где они модулируются соответствующей оконной функцией, и выполняется МДКП. Каждый блок входных отсчетов перекрывается на 50% с предыдущим и следующим блоками. Размер входного блока для преобразования N может быть установлен равным 2048 или 256 отсчетам. Так как оконная функция оказывает существенный эффект на частотную характеристику банка фильтров, последний должен быть разработан таким образом, чтобы поддерживать изменение формы окна для лучшего адаптирования к свойствам входного сигнала. Форма окна меняется одновременно в кодере и декодере, чтобы позволить банку фильтров эффективно разделять входные спектральные компоненты для разнообразных входных сигналов.
В.3.1.1. Работа с окнами и переключение блоков
Адаптация разрешающей способности банка фильтров по частоте и по времени к характеристикам входного сигнала выполняется путем переключения между длинами преобразований, равными 2048 и 256 отсчетам. Процесс переключения описан в 13.3.1.
Решение о выборе формы окна принимается кодером для каждого фрейма. Выбранная форма окна применима только ко второй половине окна, так как первая половина ограничивается соответствующей формой окна предыдущего фрейма. На рисунке В.3 показана последовательность блоков для перехода (D-E-F) к и от фрейма, использующего синусное окно. Селектор формы окна обычно производит окна большей длины, чем показано на рисунке.
2048 временных отсчетов
,где: i - индекс блока, n - индекс отсчета в пределах блока. Как только форма окна выбрана, инициализируется элемент синтаксиса window_shape. Вместе с выбранной window_sequence это вся информация, необходимая для работы с окнами.
С половинами окон, описанными в 13.3.2, могут применяться все window_sequence.
В.3.1.2. МДКП
Спектральный коэффициент
,где:
z - входная последовательность, взвешенная в окне;
n - индекс отсчета;
k - индекс спектрального коэффициента;
i - индекс блока;
N - длина окна преобразования, соответствующая значению window_sequence
.Длина окна анализа N МДКП является функцией элемента синтаксиса window_sequence и определяется следующим образом:
![]() В.3.2. Схемы
![]() ![]() при наличии резких изменений в сигнале
В.4.1. Описание инструмента
Так как любой предсказатель идентичен для кодера и декодера, все описания и определения, данные для декодера в разделе 13, также допустимы здесь.
Предсказание используется для улучшенного устранения избыточности и особенно эффективно в случае относительно стационарных участков сигнала, которые принадлежат к наиболее требовательным частям с точки зрения необходимой скорости передачи. Предсказание может быть применено к каждому каналу при использовании внутриканального (или моно) предсказателя, который использует автокорреляцию между спектральными компонентами последовательных фреймов. Поскольку window_sequence типа EIGHT_SHORT_SEQUENCE указывает на изменения в сигнале, т.е. нестационарные свойства сигнала, то предсказание используется только, если window_sequence имеет тип ONLY_LONG_SEQUENCE, LONG_START_SEQUENCE или LONG_STOP_SEQUENCE.
Для каждого канала предсказание применяется к спектральным компонентам, полученным в результате прохождения временных отсчетов через банк фильтров. Каждому спектральному компоненту вплоть до PRED_SFB_MAX соответствует один предсказатель, что в результате приводит к банку предсказателей, в котором каждый предсказатель использует автокорреляцию между спектральными значениями последовательных фреймов.
Общая структура кодирования с использованием банка фильтров с высокой спектральной разрешающей способностью подразумевает использование обратных адаптивных прогнозирующих устройств для достижения высокой эффективности кодирования. В этом случае коэффициенты прогнозирующего устройства вычисляются по предыдущим квантованным значениям спектральных компонентов как в кодере, так и в декодере, и никакая дополнительная служебная информация не требуется для передачи коэффициентов предсказания, как это требовалось бы для прямых адаптивных предсказаний. Обратно-адаптивное предсказание со структурой решетки второго порядка используется для каждого спектрального компонента так, чтобы каждый предсказатель работал со спектральными компонентами двух предыдущих фреймов. Параметры предсказателя адаптируются к текущей сигнальной статистике фрейма, используя алгоритм адаптации на основе LMS. Если предсказание активно, на квантователь поступает ошибка предсказания вместо исходных спектральных компонентов, что приводит к увеличению эффективности кодирования.
В.4.2. Процесс кодирования
Каждому спектральному компоненту каждого канала вплоть до PRED_SFB_MAX соответствует один предсказатель. Следующее описание допустимо для одного предсказателя и должно быть применено к остальным. Как сказано выше, каждый предсказатель идентичен в кодере и декодере. Поэтому структура предсказателя, показанная на рисунке В4, и вычисление оценки
Единственное отличие заключается в необходимости вычисления ошибки предсказания в кодере
, которая поступает на вход блока квантования. В этом случае квантованная ошибка предсказания передается вместо квантованного спектрального компонента.В.4.2.1. Управление предсказателем
Чтобы гарантировать использование предсказания для увеличения эффективности кодирования, требуется соответствующее управление предсказателями, и небольшое количество управляющей информации для предсказания должно быть передано к декодеру. Для управления предсказанием предсказатели группируются в полосы масштабных коэффициентов.
Следующее описание допустимо для любого одного single_channel_element () или одного channel_pair_element () и должно быть применено к каждому такому элементу. Так как предсказание используется, только если window_sequence имеет типы ONLY_LONG_SEQUENCE, LONG_START_SEQUENCE или LONG_STOP_SEQUENCE для канала, связанного с single_channel_element () или для обоих каналов, связанных с channel_pair_element (), следующее применяется только в этих случаях.
Управляющая информация предсказания для каждого фрейма, которая должна быть передана как служебная, определяется в двух шагах. Во-первых, для каждой полосы масштабных коэффициентов определяется, приводит ли предсказание к улучшению эффективности кодирования и, если да, бит prediction_used для соответствующей полосы масштабных коэффициентов устанавливается в '1'. После того как это было сделано для всех полос масштабных коэффициентов вплоть до PRED_SFB_MAX, определяется, компенсирует ли общее усиление кодирования за счет предсказания в этом фрейме, по крайней мере, дополнительные биты служебной информации, необходимые для предсказания. Если да, бит predictor_data_present устанавливается в '1', и полная служебная информация, включая необходимые данные для сброса предсказания (см. ниже), должна быть передана, и ошибка предсказания подается в квантователь. В противном случае бит predictor_data_present устанавливается в '0', все биты prediction_used сбрасываются и не передаются. В этом случае на вход квантователя поступают спектральные компоненты. На рисунке В.5 показана блок-схема модуля предсказания для одной полосы масштабных коэффициентов. Как описано выше, управление предсказанием сначала работает для всех предсказателей одной полосы масштабных коэффициентов, а затем согласно второму шагу для всех полос масштабных коэффициентов.
В случае single_channel_element () или channel_pair_element () с common_window = 0 управляющая информация вычисляется и является допустимой для банка(ов) предсказателей канала(ов), связанных с тем элементом. В случае channel_pair_element () с common_window = 1 управляющая информация вычисляется с учетом обоих каналов, связанных с этим элементом. В этом случае управляющая информация допустима для обоих банков предсказателей двух каналов.
В.4.2.2. Восстановление квантованного спектрального компонента
Так как восстановленное значение квантованного спектрального компонента требуется в качестве входного сигнала для предсказания, оно должно быть вычислено в кодере (см. также рисунки 8 и В.5). В зависимости от значения бита prediction_used восстановленное значение является либо квантованным спектральным компонентом, либо квантованной ошибкой предсказания. Поэтому следующие шаги необходимы:
Если бит установлен (1), то квантованная ошибка предсказания, восстановленная из данных, которые будут переданы, добавляется к оценке
.Если бит не установлен (0), то квантованное значение спектрального компонента идентично значению, восстановленному непосредственно из данных, которые будут переданы.
В.4.3. Схемы
![]() для одной полосы масштабных коэффициентов
Полная обработка показана только для предсказателя
Временное формирование шума используется для управления временной формой шумов квантования в пределах каждого окна преобразования. Это достигается в процессе фильтрации частей спектральных данных каждого канала.
Кодирование выполняется на основе окна. Следующие шаги выполняются, чтобы применить инструмент временного формирования шума к одному окну спектральных данных:
- Выбирается целевой частотный диапазон для инструмента TNS. Подходящий выбор состоит в том, чтобы покрыть частотный диапазон от 1,5 кГц до высшей полосы масштабных коэффициентов одним фильтром. Этот параметр (TNS_MAX_BANDS) зависит от профиля и частоты дискретизации, как обозначено в нормативной части.
- Далее кодирование с линейным предсказанием (LPC) выполняется для спектральных коэффициентов МДКП, соответствующих выбранному целевому частотному диапазону. Для лучшей устойчивости коэффициенты, соответствующие частотам ниже 2,5 кГц, могут быть исключены из этого процесса. Стандартные процедуры LPC могут использоваться для вычисления LPC, например алгоритм Левинсона - Дербина. Вычисление выполняется для максимального разрешенного порядка фильтра формирования шума (TNS_MAX_ORDER).
В результате вычисления LPC становится известен ожидаемый коэффициент усиления предсказания gp, так же как и коэффициенты отражения TNS_MAX_ORDER r[] (так называемые коэффициенты PARCOR).
Если усиление предсказания gp не превышает определенный порог t, временное формирование шума не используется. В этом случае бит tns_data_present устанавливается в '0', и обработка TNS заканчивается. Подходящее пороговое значение t = 1.4.
Если коэффициент усиления предсказания gp превышает порог t, временное ограничение шума используется.
На следующем шаге коэффициенты отражения квантуются, используя биты coef_res. Длина coef_res составляет 4 бита. Следующий псевдокод описывает преобразование коэффициентов отражения r [] в индексы index[], и обратное преобразование к квантованным коэффициентам отражения rq[].
; ;/* Reflection coefficient quantization */
for (i = 0; i < TNS_MAX_ORDER; i++) {
index[i] = NINT(arcsin(r[i]) * ((r[i] >= 0) ? iqfac : iqfac_m));
}
/* Inverse quantization */
for (i = 0; i < TNS_MAX_ORDER; i++) {
rq[i] = sin(index[i] / ((index[i] >= 0) ? iqfac : iqfac_m));
}
где arcsin () соответствует функции арксинус.
Порядок используемого фильтра формирования шума определяется путем последовательного удаления всех коэффициентов отражения с "хвоста" массива коэффициентов отражения с абсолютными значениями, меньшими чем порог p. Число оставшихся коэффициентов отражения является порядком фильтра формирования шума. Соответствующий порог для усечения p = 0,1.
Оставшиеся коэффициенты отражения rq[] преобразовываются в order+1 коэффициентов линейного предсказания a[].
Вычисленные коэффициенты LPC [] используются в качестве коэффициентов фильтра формирования шума в кодере. Этот КИХ-фильтр скользит по определенному целевому частотному диапазону по способу, который описывается в нормативной части для процесса декодирования (описание инструмента). Различие между фильтрацией при декодировании и кодировании заключается в том, что всеполосный (авторегрессивный) фильтр, используемый для декодирования, заменяется его инверсным всенулевым (усредняющим) фильтром, т.е. происходит замена уравнения фильтра декодера
y[n] = x[n] - a[1]*y[n -1] - ... - a[order]*y[n - order]
инверсным уравнением
y[n] = x[n] - a[1]*x[n -1] + ... + a[order]*x[n - order].
По умолчанию используется восходящее направление фильтрации.
Наконец, передается следующая служебная информация для временного формирования шума (таблица В.25).
Таблица В.25
Служебная информация TNS
Использование поля coef_compress позволяет сохранять 1 бит на каждый переданный коэффициент отражения, если ни один из коэффициентов отражения не использует больше половины их полного диапазона. В частности, если два старших значащих бита каждого квантованного коэффициента отражения равны '00' или '11', coeff_compress может быть установлен в '1', и размер переданных квантованных коэффициентов отражения будет уменьшен на единицу.
Решение о кодировании левых и правых коэффициентов как левый + правый (L/R) или как середина/сторона (M/S) принимается в отдельности для спектральных коэффициентов каждой из частотных полос текущего блока:
1 - Для каждой полосы кодирования вычисляются не только необработанные пороги L и R, но также и M = (L + R)/2 и S = (L - R)/2. Для необработанных порогов M и S вместо использования их степени тональности выбирается наибольший показатель тональности из L и R в каждой полосе вычисления порога. В психоакустической модели для M и S используются энергии M и S и минимальные значения L или R для
2 - Необработанные пороги для M, S, L и R и энергии распространения для M, S, L и R поступают в "процесс управления звуковым образом". Получающиеся скорректированные пороги вставляются как значения для cb (b) в шаге 11 психоакустического расчета для дальнейшей обработки.
3 - Окончательные, защищенные и адаптированные полосам пороги M, S, L и R непосредственно применяются к соответствующему спектру через квантование фактических спектральных значений L, R, M и S с соответствующим расчетным и квантованным порогом.
4 - Определяется число битов, требуемых для кодирования M/S, и число битов, требуемых для кодирования L/R.
5 - Метод, требующий наименьшее количество битов, используется в каждой полосе кодирования, и соответственно устанавливается стерео маска.
Используются следующие переменные:
.Используется следующий процесс управления звуковым образом:
t = Mthr/Sthr
if (t> 1)
t = 1/t
Rfthr = max (Rthr*t, min (Rthr, bmax*Rengy)
Lfthr = max (Lthr*t, min (Lthr, bmax) *Lengy) t = min (Lthr, Rthr)
Mfthr = min (t, max (Mthr, min (Sengy*bmax, Sthr))
Sfthr = min (t, max (Sthr, min (Mengy*bmax, Mthr))
В.6.2. Интенсивностное стерео кодирование
Интенсивностное стерео кодирование используется для устранения избыточности в обоих каналах стерео пары в области верхних частот. Следующая процедура описывает одну из возможных реализаций.
Кодирование выполняется отдельно для каждой группы окон. Выполняются следующие шаги:
- Интенсивностное стерео кодирование соответствующей области полос масштабных коэффициентов выполняется, начиная с граничной частоты
является подходящим для большинства типов сигналов.- Для каждой полосы масштабных коэффициентов вычисляются энергии левого, правого и суммарного каналов путем суммирования спектральных коэффициентов в квадрате, El[sfb],
, . Если группа окон включает в себя несколько окон, энергии входящих в группу окон складываются.- Для каждой полосы масштабных коэффициентов соответствующее значение позиции интенсивности вычисляется как
.- Затем вычисляются интенсивностные спектральные коэффициенты speci [i] для каждой полосы масштабных коэффициентов путем сложения спектральных отсчетов левого и правого каналов (
и ) и масштабированием полученных значений .- Спектральные компоненты интенсивностного сигнала используются для замены соответствующих спектральных коэффициентов левого канала. Соответствующие спектральные коэффициенты правого канала обнуляются.
Затем, выполняется стандартный процесс квантования и кодирования спектральных данных обоих каналов. Однако состояние предсказателей в правом канале устанавливается в "выкл" для всех полос масштабных коэффициентов, кодированных в режиме интенсивностного стерео. Эти предсказатели обновляются с помощью декодируемой интенсивностной версии квантованных спектральных коэффициентов.
Наконец, перед передачей кодовой книги Хаффмана устанавливается INTENSITY_HCB в соответствующем разделе для всех полос масштабных коэффициентов, которые кодируются в режиме интенсивностного стерео.
В.7.1. Введение
Описание модуля квантования AAC подразделяется на три уровня. Верхний уровень называется "программой циклов фрейма". Эта программа вызывает подпрограмму "внешний итеративный цикл", которая в свою очередь вызывает подпрограмму "внутренний итеративный цикл". Для каждого уровня дана соответствующая блок-схема. Модуль циклов квантует входной вектор спектральных данных в итеративном процессе согласно нескольким требованиям. Внутренний цикл квантует входной вектор и увеличивает размер шага квантователя, пока выходной вектор не будет кодирован с доступным числом битов. После завершения внутреннего цикла внешний цикл проверяет искажение в каждой полосе масштабных коэффициентов и, если допустимый уровень искажений превышен, полоса масштабных коэффициентов ослабляется, и снова вызывается внутренний цикл.
Вход модуля циклов AAC:
1. Вектор спектральных значений mdct_line (0.. 1023).
2. xmin (sb).
3. mean_bits (среднее число битов, доступных для кодирования потока битов).
4. more_bits, число битов в дополнение к среднему числу битов, вычисленное психоакустическим модулем из перцепционной энтропии (PE).
5. Число и ширина полос масштабных коэффициентов (см. таблицы 45 - 57).
6. Для группы коротких блоков спектральные значения должны чередоваться так, чтобы спектральные линии, принадлежащие к одной полосе масштабных коэффициентов, но различным типам блоков, которые должны быть квантованы с одинаковыми масштабными коэффициентами, были соединены в одной (большей) полосе масштабных коэффициентов (для полного описания группировки см. 6.3.4).
Выход модуля циклов AAC:
1. Вектор квантованных значений x_quant (0.. 1023).
2. Масштабный коэффициент для каждой полосы масштабных коэффициентов (sb).
3. common_scalefac (информация о размере шага квантователя для всех полос масштабных коэффициентов).
4. Количество неиспользованных битов, доступных для дальнейшего использования.
В.7.2. Предварительные шаги
Сброс всех итеративных переменных:
1. Вычисляется начальное значение common_scalefac для квантователя так, чтобы все квантованные значения МДКП могли быть закодированы в потоке битов:
![]() max_mdct_line является самым большим по абсолютному значению коэффициентом МДКП, а функция ceiling() округляет аргумент до ближайшего целого в направлении положительной бесконечности. MAX_QUANT - максимальное квантованное значение, которое может быть закодировано в потоке битов, равное 8191. Во время итеративного процесса common_scalefac не должен стать меньше, чем start_common_scalefac.
2. Scalefactor [sb] обнуляется для всех значений sb.
В.7.3. Управление резервуаром битов
Биты помещаются в резервуар, если для кодирования одного фрейма используется меньше, чем mean_bits.
mean_bits = bit_rate * 1024 / sampling_rate.
Максимальное число битов, которые могут быть помещены в резервуар, называется max_bit_reservoir, которое вычисляется, используя процедуру в 6.2.3. Если резервуар заполнен, неиспользованные биты должны быть закодированы в потоке битов как fillbits. Максимальное количество битов, доступных для фрейма, является суммой mean_bits и битов, сохраненных в резервуаре.
Число битов, которые должны использоваться для кодирования фрейма, зависит от значения more_bits, которое вычисляется психоакустической моделью, и от максимального количества доступных битов. Самый простой способ управления резервуаром:
if more_bits> 0:
available_bits = mean_bits + min (more_bits, bit_reservoir_state [frame]),
if more_bits <0:
available_bits = mean_bits + max (more_bits, bit_reservoir_state [frame]
- max_bit_reservoir)
В.7.4. Квантование коэффициентов МДКП
Формула для квантования в кодере является инверсией формулы деквантования в декодере (см. также описание декодера):
![]() MAGIC_NUMBER равно 0.4054, SF_OFFSET равно 100, а mdct_line - одно из спектральных значений МДКП. Эти значения также вызывают "коэффициентами". Масштабный коэффициент sf_decoder является тем же самым, что и sf [g] [sfb] в разделе 9.
Для использования в итеративных циклах масштабный коэффициент 'sf_decoder' разделяется на две переменные:
sf_decoder = common_scalefac - scalefactor + SF_OFFSET
Это следует из формулы, используемой в цикле управления искажениями:
![]() Знак масштабного коэффициента выбирается таким образом, чтобы положительное значение увеличивало величину x_quant и, таким образом, уменьшало искажения и увеличивало число используемых битов.
Знак mdct_line сохраняется отдельно и добавляется только для подсчета битов и кодирования потока битов.
Внешний итеративный цикл управляет шумами квантования, которые возникают в результате квантования частотных линий в пределах внутреннего итеративного цикла. Окраска шума выполняется умножением линий в пределах полос масштабных коэффициентов на значения масштабных коэффициентов перед квантованием. Следующий псевдокод иллюстрирует умножение:
do for each scalefactor band sb:
do from lower index to upper index i of scalefactor band
![]() end
do end do
В.7.4.2. Вызов внутреннего итеративного цикла
Для каждого внешнего итеративного цикла (цикл управления искажениями) вызывается внутренний итеративный цикл (цикл управления уровнем). Параметрами являются масштабированные значения в частотной области (mdct_scaled (0...1023)), начальное значение common_scalefac и число битов, которые доступны циклу управления уровнем. Результатом является число используемых битов, квантованные частотные линии x_quant (i) и новый common_scalefac.
Формула для вычисления квантованных коэффициентов МДКП:
![]() Число битов, необходимых для кодирования квантованных значений и служебной информации (масштабные коэффициенты и т.д.), определяется согласно синтаксису потока битов, описанному в разделе 7.
В.7.4.3. Аттенюация полос масштабных коэффициентов, которые нарушают порог маскирования
Вычисление искажений (error_energy (sb)) в полосе масштабных коэффициентов выполняется следующим образом:
Do for each scalefactor sb:
error_energy (сурьма) =0
Do from lower index to upper index i of scalefactor band
![]() end do
end do
Все спектральные значения полос масштабных коэффициентов, у которых есть искажение, превышающее дозволенное искажение (xmin (sb)), ослабляются согласно формуле в В.7.4.1, новые масштабные коэффициенты могут быть вычислены согласно этому псевдокоду:
Do for each scalefactor band sb
if (error_energy (sb)> xmin (sb)) then
scalefactor (sb) = scalefactor (sb) - 1
end if
end do.
В.7.4.4. Условия завершения обработки циклов
Обычно обработка циклов завершается, если отсутствуют полосы масштабных коэффициентов с искажениями, превышающими дозволенные значения. Однако это не всегда возможно. В этом случае есть другие условия завершения внешнего цикла. Если:
- все полосы с энергией, превышающей xmin (sb), уже ослаблены, или
- различие между двумя соседними масштабными коэффициентами больше, чем 60.
Обработка цикла прекращается, и восстановленные сохраненные scalefactors(sb) поступают на выход. Для реализации в реальном времени возможно третье условие, которое завершает цикл в случае нехватки вычислительного времени.
Процедура, описанная выше, допустима только в том случае, когда число доступных битов равно числу необходимых битов, соответствующих перцепционной энтропии. В случае, когда число доступных битов больше или меньше, чем число необходимых битов, целью модуля циклов становится создание постоянного отношения шумов квантования к порогу маскирования во всех полосах масштабных коэффициентов (постоянное отношение шум-маска (NMR)). Это может быть реализовано за счет применения смещения к дозволенному искажению xmin (sb), которое является одинаковым для всех полос масштабных коэффициентов до запуска модуля циклов.
В.7.4.5. Внутренний итеративный цикл (цикл управления уровнем)
Во внутреннем итеративном цикле вычисляется фактическое квантование данных частотной области (mdct_scaled) по следующей функции, которая использует формулу из В.7.4.2:
quantize_spectrum (x_quant [] , mdct_scaled [] , common_scalefac) :
do for all MDCT coefficients i :
![]() end do
и затем вызывается функция bit_count (). Эта функция подсчитывает число битов, требуемых для кодирования фрейма потока битов согласно разделу 6.
Внутренний итеративный цикл может быть реализован на основе последовательного приближения:
inner_loop():
if (outer_loop_count == 0)
common_scalefac = start_common_scalefac;
quantizer_change = 32;
else
quantizer_change = 1;
end if
do
quantize_spectrum ();
counted_bits = bit_count();
if (counted_bits > available_bits) then
common_scalefac = common_scalefac + quantizer_change;
else
common_scalefac = common_scalefac - quantizer_change;
end if
quantizer_change = int (quantizer_change /2);
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.1. Введение
В кодере AAC на вход модуля кодирования без потерь поступают 1024 квантованных спектральных коэффициента. Так как кодирование без потерь выполняется внутри квантователя внутреннего цикла, это является частью итеративного процесса, который сходится, когда полное число битов (из которых на кодирование без потерь приходится большинство) находится в пределах некоторого интервала в окрестности выделенного числа битов. В этом разделе описан процесс кодирования для одного вызова модуля кодирования без потерь.
Кодирование без потерь выполняется по следующим шагам:
- клиппирование спектра,
- предварительное кодирование методом Хаффмана с использованием максимального количества разделов,
- объединение разделов для достижения минимального количества битов.
В.8.2. Клиппирование спектра
На первом шаге кодирования без потерь реализуется метод ограничения динамического диапазона. До четырех коэффициентов с амплитудами, превышающими 1, может быть кодировано отдельно со значением +/- 1, оставленным в квантованном массиве коэффициентов для сохранения знака. Индекс полосы масштабных коэффициентов, содержащей самые низкочастотные, "усеченные" коэффициенты, отправляется в поток битов. Каждый из "усеченных" коэффициентов кодируется как амплитуда (сверх 1) и смещение по отношению к предыдущей полосе. Для этого длинные блоки полос масштабных коэффициентов и порядок коэффициентов в этих полосах используются независимо от последовательности окон. Одна из стратегий применения клиппирования спектра состоит в том, чтобы отсечь высокочастотные коэффициенты, абсолютные амплитуды которых превышают единицу. Так как служебная информация для усеченных коэффициентов требует несколько битов, то компрессия без потерь применяется, только если это приводит к сокращению битов.
В.8.3. Разделы
При кодировании без потерь набор из 1024 квантованных спектральных коэффициентов сегментируется на разделы так, что для каждого раздела используется одна кодовая книга Хаффмана (метод кодирования по Хаффману объясняется ниже). По причинам эффективности кодирования границы раздела должны соответствовать границам полос масштабных коэффициентов так, чтобы для каждого раздела спектра передавать его размер в полосах масштабных коэффициентов и номер кодовой книги Хаффмана, используемой для раздела.
Сегментирование на разделы является динамичным и обычно изменяется от блока к блоку, чтобы минимизировать количество битов, необходимое для представления набора квантованных спектральных коэффициентов. Это выполняется при помощи специального алгоритма, начиная с максимально возможного числа разделов, каждый из которых использует кодовую книгу Хаффмана с наименьшим индексом. Разделы объединяются, если результирующий объединенный раздел приводит к меньшему общему количеству битов, при этом объединению подлежат в первую очередь разделы с наибольшим количеством требуемых битов. Если объединяемые разделы не используют одну и ту же кодовую книгу Хаффмана, то должна использоваться кодовая книга с более высоким индексом.
Разделы часто содержат только коэффициенты с нулевыми значениями. Например, если входной звуковой сигнал ограничен в полосе 20 кГц или ниже, то самые высокие коэффициенты имеют нулевые значения. Такие разделы кодируются нулевой кодовой книгой Хаффмана, которая указывает, что все коэффициенты являются нулями и передача кодовых комбинаций Хаффмана для этого раздела не требуется.
В.8.4. Группировка и чередование
Если последовательность окон состоит из восьми коротких окон, то набор из 1024 коэффициентов представляет собой матрицу 8 x 128 частотных коэффициентов, представляющих частотно-временное развитие сигнала на протяжении восьми коротких окон. Несмотря на то, что механизм разделения достаточно гибок, чтобы эффективно представить 8 нулевых разделов, группировка и чередование обеспечивают большую эффективность кодирования. Как было объяснено ранее, коэффициенты, связанные с непрерывными короткими окнами, могут быть сгруппированы для совместного использования масштабных коэффициентов несколькими полосами в пределах группы. Кроме того, коэффициенты в пределах группы чередуются, обмениваясь порядком следования полос масштабных коэффициентов и окон. Перед чередованием набор из 1024 коэффициентов c индексируется как c [g][w][b][k], где:
g - индекс группы;
w - индекс окна в пределах группы;
b - индекс полосы масштабных коэффициентов в пределах окна;
k - индекс коэффициента в пределах полосы масштабных коэффициентов (самый правый индекс изменяется наиболее быстро).
После чередования коэффициенты индексируются как c [g][b][w][k].
Это обеспечивает преимущество при объединении всех нулевых разделов из-за ограничения полосы частот в пределах каждой группы.
В.8.5. Масштабные коэффициенты
При кодировании спектральных значений используется один квантователь на каждую полосу масштабных коэффициентов. Размеры шага каждого квантователя определяются как ряд масштабных коэффициентов и общее усиление, которое нормализует эти масштабные коэффициенты. Чтобы увеличить сжатие, масштабные коэффициенты, связанные с полосами, содержащими только нулевые коэффициенты, игнорируются при кодировании и не передаются. Общее усиление и масштабные коэффициенты квантуются с шагом 1,5 дБ. Общее усиление кодируется как 8-разрядное целое число без знака, а масштабные коэффициенты дифференцированно кодируются относительно предыдущих масштабных коэффициентов (либо общего усиления для первого масштабного коэффициента), затем применяется кодирование по Хаффману. Динамический диапазон общего усиления достаточен, чтобы представить полную шкалу 24-разрядных ИКМ значений.
В.8.6. Кодирование методом Хаффмана
Кодирование методом Хаффмана используется, чтобы представить n-кратные квантованные коэффициенты кодами Хаффмана, взятыми из одной из 11 кодовых книг. Спектральные коэффициенты в пределах n-кратной группы упорядочиваются (от низкого к высокому), и размер n-кратной группы равен двум или четырем коэффициентам. Максимальное абсолютное значение квантованных коэффициентов, которое может быть представлено каждой кодовой книгой Хаффмана, и число коэффициентов в каждой n-кратной группе для каждой кодовой книги даются в таблице В.26. Есть два сборника кодов для каждого максимального абсолютного значения с различной функцией распределения. Всегда выбирается ближайшее из двух распределений. Для экономии ресурсов при хранении кодовых книг (важное обстоятельство для серийно выпускаемых декодеров) большинство кодовых книг представляет значения без знака. При этом амплитуда коэффициентов кодируется методом Хаффмана с добавлением к комбинации знакового бита каждого ненулевого коэффициента.
Таблица В.26
Кодовые книги Хаффмана
Две кодовые книги требуют специального замечания: сборник кодов 0 и сборник кодов 11. Как было сказано ранее, кодовая книга 0 соответствует случаю, когда все коэффициенты в пределах раздела являются нулями. Кодовая книга 11 может представлять квантованные коэффициенты, у которых абсолютное значение больше или равно 16. Если амплитуда одного или обоих коэффициентов больше или равна 16, используется специальный escape-механизм кодирования для представления этих значений. Амплитуда коэффициентов не должна превышать 16, и соответствующая пара кодируется методом Хаффмана. Биты знака добавляются к кодовой комбинации. Для каждой амплитуды коэффициента, большей или равной 16, добавляется escape-последовательность:
escape-последовательность = <escape_prefix><escape_separator><escape_word>,
где
<escape_prefix> - последовательность из '1' бит длиной N,
<escape_separator> - двоичный '0',
<escape_word> - целое число без знака, msb сначала, длиной N + 4,
N - число, достаточно большое, чтобы амплитуда квантованного коэффициента была равна
![]() Чтобы обработать исходный материал с переменными пиковыми уровнями, средними уровнями и динамическим диапазоном так, чтобы минимизировать изменения при воспроизведении, необходимо управлять уровнем воспроизведения таким образом, чтобы, например, уровень диалога или средний уровень музыки устанавливались в соответствии с желанием слушателя независимо от того, какой баланс уровней был в оригинальной программе. Кроме того, не все потребители будут прослушивать программу в хороших акустических условиях (т.е. при малом окружающем шуме), без ограничений на максимальную громкость воспроизведения. Например, при прослушивании программ в условиях автомобиля, где присутствует высокий уровень фонового шума, можно ожидать, что слушатель захочет уменьшить диапазон уровней.
По указанным причинам управление динамическим диапазоном должно быть доступным в пределах спецификации AAC. Для достижения этого необходимо сопровождать сжатый звук данными, используемыми для установки и управления динамическим диапазоном элементов программы. Это управление должно быть определено относительно контрольного уровня и по отношению к важным элементам программы, например диалогам.
Функции управления динамическим диапазоном следующие:
1. Управление динамическим диапазоном является полностью опциональным. Поэтому при корректном синтаксисе нет никаких сложных изменений для тех, кто не желает использовать DRC.
2. Сжатые звуковые данные передаются с полным динамическим диапазоном исходного материала и с данными для осуществления управления динамическим диапазоном.
3. Информация для управления динамическим диапазоном может быть передана в каждом фрейме для уменьшения задержки в установке усиления воспроизведения до минимума.
4. Информация для управления динамическим диапазоном передается с использованием 'fill_element' AAC.
5. Контрольный уровень соответствует полной шкале.
6. Контрольный уровень программы передается для сохранения соответствия между уровнями воспроизведения различных источников. Эта функция исходного сигнала в большей степени относится к субъективному впечатлению от громкости программы.
7. Контрольный уровень программы соответствует уровню, который может быть установлен на пользовательском устройстве воспроизведения относительно контрольного уровня. Более тихие части программы могут быть усилены по уровню, а более громкие части программы могут быть ослаблены.
8. Контрольный уровень программы определен в диапазоне от 0 до -31,75 дБ относительно контрольного уровня.
9. Контрольный уровень программы использует 7 битовых полей с шагом 0,25 дБ.
10. Управление динамическим диапазоном определено в диапазоне +/- 31,75 дБ.
11. Управление динамическим диапазоном использует 8 битовых полей (1 знак, 7 значений) с шагом 0,25 дБ.
12. Управление динамическим диапазоном может быть применено ко всем спектральным коэффициентам частотных полос звукового канала или к группам коэффициентов, соответствующих различным полосам масштабных коэффициентов.
13. Управление динамическим диапазоном может быть применено ко всем каналам одинаково или разделено для наборов каналов.
14. Если ожидаемый набор информации управления динамическим диапазоном отсутствует, используются последние полученные допустимые значения.
15. Не все элементы информации управления динамическим диапазоном передаются каждый раз. Например, контрольный уровень программы может передаваться в среднем только раз в 200 мс.
16. Если необходимо, обнаружение ошибок/защита обеспечивается транспортным уровнем.
17. Пользователь должен быть обеспечен средствами изменения управления динамическим диапазоном, представленными в потоке битов и применяемыми к уровню сигнала.
Вернуться в "Каталог нормативных документов"
Источник информации: https://internet-law.ru/documents/prod/gost-r_gosudarstvennyj-standart/41/gost_66930.html
На правах рекламы:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||