Мнемонический код Райса и BGMC указывают, что используются кодовые комбинации переменной длины.
В разделах псевдокода используются следующие типы данных:
Если перед типом данных добавляется "без знака", то типом является тип без знака вместо типа со знаком.
В этом документе есть несколько логарифмических арифметических вычислений в форме 'ceil(log2(...))', которые определяют целочисленное значение, которое описывает число необходимых битов для определенного параметра.
Чтобы избежать непоследовательных результатов и реализовать ceil() и log2(), не должны использоваться никакие функции с плавающей точкой. Чтобы получить математически корректные целочисленные результаты, должны использоваться реализации с фиксированной точкой (например, применение сдвигов битов).
Таблица 1
Таблица 2
Таблица 3
Таблица 4
Таблица 5
Таблица 6
Таблица 7
Таблица 8
5.1.1 ALSSpecificConfig
ALSSpecificConfig содержит общие данные конфигурации. Дополнительно могут быть встроены заголовок и концевик исходного аудиофайла, чтобы восстановить эту информацию в дополнение к фактическим аудиоданным. Синтаксис ALSSpecificConfig определяется в таблице 1, ее элементы описываются в таблице 9.
Таблица 9
Элементы ALSSpecificConfig
5.1.2 frame_data
Это высокоуровневая полезная нагрузка ALS. Если random_access > 0, число полезных нагрузок, отображенных в одном устройстве доступа, равняется значению random_access (1 ... 255). В этом случае размер каждого блока доступа может быть сохранен в ra_unit_size. Если random_access = 0, все полезные нагрузки отображаются в тот же самый блок доступа.
Поле bs_info содержит информацию о переключении блока для канала или пары каналов. Синтаксис frame_data определяется в таблице 2, его элементы описываются в таблице 10.
Таблица 10
5.1.3 block_data
Блочные данные определяют тип блока (нормальный, постоянный, тишина) и в основном содержат индексы кода, порядок прогнозирующего устройства, коэффициенты прогнозирующего устройства и кодированные остаточные значения. Синтаксис block_data определяется в таблице 3, его элементы описываются в таблице 11.
Таблица 11
Элементы block_data
5.1.4 channel_data
Синтаксис channel_data определяется в таблице 4, его элементы описываются в таблице 12.
Таблица 12
Элементы channel_data
5.1.5 RLSLMS_extension_data
Синтаксис RLSLMS_extension_data определяется в таблице 5, его элементы описываются в таблице 13.
Таблица 13
Элементы RLSLMS_extension_data
5.2.1 diff_float_data
Синтаксис diff_float_data определяется в таблице 6, его элементы описываются в таблице 14.
Таблица 14
Элементы diff_float_data
5.2.2 diff_mantissa
Синтаксис diff_mantissa определяется в таблице 7, его элементы описываются в таблице 15.
Таблица 15
Элементы diff_mantissa
5.2.3 Masked_LZ_decompression
Синтаксис Masked_LZ_decompression определяется в таблице 8, его элементы описываются в таблице 16.
Таблица 16
Элементы Masked_LZ_decompression
В стандартах кодирования MPEG с наибольшими потерями подробно определяется только декодер. Однако схема кодирования без потерь обычно требует спецификации некоторых (но не всех) частей кодера. Так как процесс кодирования должен быть совершенно обратимым без потери информации, несколько частей кодера и декодера должны быть определены детерминированным способом.
6.1.1 Структура потока битов
Каждый фрейм (frame_data) состоит из B = 1 ... 32 блоков выборок (block_data) для каждого канала. Помимо общей информации о блоке (например, блок тишины, блок различия объединенного стерео (joint stereo) и т.д.) каждый блок обычно содержит индексы кода, порядок прогнозирующего устройства K, коэффициенты прогнозирующего устройства и остаточные значения, кодированные по Райсу или BGMC. Если используется объединенное кодирование между парами каналов, часть блока идентична для обоих каналов, и блоки сохраняются перемежающимся способом. Иначе, эта часть блока для каждого канала независима.
Если вводятся данные с плавающей точкой, дополнительные элементы потока битов для дифференциальных значений мантиссы вставляются после потока битов каждого целочисленного фрейма.
6.1.2 Декодирование ALSSpecificConfig
ALSSpecificConfig содержит информацию об исходных данных (например, "samp_freq", "channels", "resolution"), а также глобальные параметры, которые не изменяются от фрейма к фрейму (например, "frame_length", "max_order"). Наиболее важные параметры описываются далее.
Идентификатор ALS - это поле должно содержать значение 1095521024 = 0x414C5300 (шестнадцатеричное). Используя побайтовое чтение, первые три байта эквивалентны кодам ASCII для 'ALS'.
Частота дискретизации - частота дискретизации исходных аудиоданных сохраняется, например для прямого воспроизведения сжатого файла.
Выборки - общее количество аудиовыборок на канал.
Число каналов - 1 (моно), 2 (стерео), или более (многоканальный).
Разрешение - 8-битовое, 16-битовое, 24-битовое, или 32-битовое. Если разрешение исходных аудиоданных находится в промежутке (например, 20-битовое), для представления выборок используется более высокое разрешение.
Плавающая точка - указывает формат аудиоданных. Если этот флаг установлен, аудиоданные представлены в 32-битовом формате с плавающей точкой IEEE, иначе аудиоданные являются целочисленными.
Порядок байтов - указывает на порядок байтов исходного аудиофайла, либо старший значащий байт сначала (например, aiff), либо младший значащий байт сначала (например, wave).
Длина фрейма - число выборок в каждом фрейме (на канал).
Произвольный доступ - расстояние (во фреймах) между теми фреймами, которые могут декодироваться независимо от предыдущих фреймов (фреймы произвольного доступа). Перед каждым фреймом произвольного доступа есть поле "ra_unit_size", которое определяет это расстояние в байтах.
Адаптивный порядок - у каждого блока может быть индивидуальный порядок прогнозирующего устройства.
Таблица коэффициентов - таблица, содержащая параметры, которые используются для кодирования энтропии коэффициентов прогнозирующего устройства.
Максимальный порядок - максимальный порядок фильтра прогноза. Если "adapt_order" выключается, этот порядок используется для всех блоков.
Переключение блоков - вместо одного блока на канал может быть до 32 более коротких блоков. Если переключение блоков не используется, размер блока идентичен длине фрейма.
Режим BGMC - указывает, что для остатка прогноза используются коды BGMC. Если этот флаг устанавливается в 0, для остатка прогноза используются более простые коды Райса.
Раздел подблока - раздел подблока для кодирования энтропии остатка.
Объединенное стерео - в каждом блоке может быть закодирован разностный сигнал вместо сигнала левого или правого канала (или один из двух каналов пары каналов, соответственно).
Многоканальное кодирование - расширенное межканальное кодирование.
Вид канала - перегруппировка каналов, используемая для создания выделенных пар каналов.
Позиции канала - исходные позиции канала, используемые только если включается channel_sort.
Размер заголовка - размер заголовка исходного аудиофайла в байтах.
Размер концевика - размер оконечной неаудиоинформации в исходном аудиофайле в байтах.
Исходный заголовок - встроенный заголовок исходного аудиофайла.
Исходный концевик - встроенная оконечная часть исходного аудиофайла.
CRC - контрольная сумма циклической избыточности (CCITT-32) байтов исходных аудиоданных (то есть в их оригинальном порядке, включая чередование каналов).
6.1.3 Число фреймов
Число фреймов для декодирования зависит от фактической длины фрейма (N = frame_length + 1) и числа выборок. Это может быть определено следующим образом:
N = frame_length + 1.
frames = samples / N;
remainder = samples % N;
if (remainder)
{
frames++;
N_last = remainder;
}
else
N_Last = N;
Если число выборок не является кратным длине фрейма N, длина последнего фрейма соответственно уменьшается (N_last = остаток).
Если значение выборок является (шестнадцатеричным) 0xFFFFFFFF, число выборок не определяется. Если полезная нагрузка ALS сохраняется, используя формат файла MPEG-4, число выборок может быть получено из метаданных файла.
Если число выборок недоступно, число фреймов не определено, и считается, что у всех фреймов одна и та же длина N. В этом случае размеры блоков произвольного доступа не должны сохраняться в ALSSpecificConfig (то есть должны использоваться только ra_flag = 0 или ra_flag = 1), так как число блоков произвольного доступа тоже не определено.
6.1.4 Объединенное кодирование каналов
Чтобы использовать дублирование между каналами, кодер может применить простой подход, состоящий из пар каналов и одиночных каналов. Два канала пары каналов могут быть закодированы, используя кодирование различия, тогда как одиночные каналы кодируются независимо.
Об общем использовании объединенного кодирования сообщается флагом joint_stereo в заголовке ALS. Если joint_stereo выключен, каждый канал является одиночным каналом и кодируется независимо от других каналов. Если joint_stereo включен, в каждом случае два соседних канала расцениваются как пара каналов. Если число каналов нечетно, то один канал остается одиночным.
Определение пар каналов не означает, что должно использоваться объединенное кодирование. Если joint_stereo будет установлен, то декодер будет считать комбинации двух каналов парами каналов, даже если кодер фактически никогда не использовал объединенное кодирование. В этом случае декодер просто не будет обнаруживать block_data с установленным флагом js_block.
Если выбирается MCC (Многоканальное кодирование), то декодируется информация об отношении между каналами (ведущий или ведомый). Декодируемые остаточные значения ведомого канала изменяются добавлением значений ведущего канала, умноженных на декодированные коэффициенты взвешивания. Другие процессы реконструкции для сигналов всех каналов, которые включают декодирование параметров, декодирование остатка прогноза, фильтрацию синтеза долгосрочного и краткосрочного прогноза, идентичны процессам для декодирования независимых каналов. Инструменты кодирования двух объединенных каналов, объединенное стерео и MCC, могут быть адаптивно выбраны на пофреймовой основе.
6.1.5 Конфигурация и перестановка каналов
Поле chan_config_info определяет отображение канал-динамик, указывая существует ли канал для определенного местоположения. Существующие каналы должны быть расположены в предопределенном порядке (таблица 17). Если определенный канал присутствует, устанавливается соответствующий бит в поле chan_config_info.
Таблица 17
Конфигурация канала
Решение о том, какие каналы группируются, может быть принято автоматически кодером или вручную пользователем. Если конфигурация каналов указывается в исходном файле, кодер может сделать подходящую перестановку. Если формат файла не имеет конфигурации каналов по умолчанию, но пользователь знает отображение канал-динамик в этом конкретном случае, он может сообщить кодеру, как сгруппировать каналы.
Декодер должен инвертировать возможную перестановку каналов (флаг chan_sort), присваивая каждому каналу его исходную позицию, которая хранится в chan_pos [].
6.1.6 Декодирование фреймов
Фрейм составляет высокоуровневую полезную нагрузку (frame_data), то есть основной блок аудиоданных (см. в таблице 2 о синтаксисе и таблице 10 о семантике). Если используется переключение блоков, каждый канал фрейма может быть подразделен на 32 блока. Иначе, блок состоит из всех выборок канала фрейма.
6.1.7 Декодирование блоков
Структура block_data () содержит информацию об одном блоке (то есть сегмент аудиоданных из одного канала). Она определяет, является ли блок "нормальным" блоком (то есть содержащим закодированные аудиовыборки), постоянным блоком (все аудиовыборки являются одними и теми же) или блоком тишины (все аудиовыборки являются нулем). Кроме того поле "joint_stereo" указывает, содержит ли блок разностный сигнал (правый канал минус левый). Либо левый, либо правый канал может быть заменен этим разностным сигналом. Структура, в случае блочного переключения, также содержит информацию, когда длина блока может быть короче, чем длина фрейма.
Для "нормальных" блоков блочные данные включают:
- индексы кода;
- порядок прогнозирующего устройства K;
- квантованные и закодированные коэффициенты прогнозирующего устройства (или параметры прогнозирующего устройства RLS-LMS в случае режима RLSLMS);
- параметры LTP в случае режима LTP;
- кодированные остаточные значения по Райсу или BGMC.
Если блок дополнительно подразделяется на подблоки для кодирования энтропии (обозначенный как ec_sub), параметры кода s и sx передаются для каждого подблока.
В случае адаптивного порядка прогнозирующего устройства (adapt_order) указывается порядок для блока (opt_order). Имеется также флаг (shift_lsbs), определяющий есть ли у всех аудиовыборок в текущем блоке некоторые LSB, которые являются перманентно нулевыми. В этом случае число пустых LSB дается в другом поле (shift_pos). Это означает, что кодер сместил все значения выборок вправо на shift_pos+1 позиций до выполнения прогноза. Таким образом декодер должен сместить выходные значения выборок влево на shift_pos+1 позиций после того, как был применен инверсный фильтр прогноза. Если процесс прогноза использует выборки из предыдущего блока, смещенная версия этих выборок должна использоваться в качестве ввода как в фильтр прогноза, так и в инверсный фильтр прогноза (то есть как в кодере, так и в декодере), даже если LSB не являются нулем в предыдущем блоке. Это необходимо, чтобы выровнять амплитудный диапазон входных выборок прогнозирующего устройства с выборками, которые будут спрогнозированы.
6.1.8 Чередование
Наиболее несжатые форматы аудиофайла хранят два канала стереосигнала как последовательность чередующихся выборок (L1, R1, L2, R2, L3, R3, ...). Для многоканальных данных с M каналами каждый шаг выборки включает M чередующихся выборок. Так как кодер создает блоки выборок для каждого канала, декодируемые выборки всех каналов вероятно придется снова чередовать прежде, чем записать их в выходной аудиофайл.
Если включено block_switching, каждый канал фрейма может быть иерархически подразделен на блоки вплоть до 32 блоков.
Произвольные комбинации блоков с NB = N, N/2, N/4, N/8, N/16 и N/32 возможны в пределах фрейма до тех пор, пока каждый блок получается из подразделения вышестоящего блока двойной длины.
О фактическом разделении сообщается в дополнительном поле bs_info, длина которого зависит от числа уровней переключения блоков (таблица 18). Фрейм длиной N должен быть разделен на 2levels без остатка, чтобы получить целочисленные длины блока NB.
Таблица 18
Уровни переключения блоков
Поле bs_info состоит из 4 байтов, где отображение битов относительно уровней от 1 до 5 имеет вид [(0) 1223333 44444444 55555555 55555555]. Первый бит используется только чтобы сигнализировать о независимом переключении блоков.
В каждом фрейме передаются поля bs_info для всех пар каналов и всех одиночных каналов, задействуя переключение независимого блока для различных каналов. В то время как длина фрейма идентична для всех каналов, переключение блока может быть выполнено индивидуально для каждого канала. Если используется различное кодирование, оба канала пары каналов должны быть переключены синхронно, но другие пары каналов все еще могут использовать различное переключение блоков.
Если два канала пары каналов не коррелированы друг с другом, то кодирование различия не будет окупаться, и не будет никакой необходимости переключать оба канала синхронно. Вместо этого имеет смысл переключать каналы независимо.
Как правило поле bs_info будет для каждой пары каналов и во фрейме одиночного канала, то есть два канала пары каналов переключаются синхронно. Если они переключаются независимо, первый бит bs_info устанавливается в 1, и информация применяется к первому каналу пары каналов. В этом случае становится необходимым другое поле bs_info для второго канала.
В этой главе описывается прямая адаптивная схема прогноза.
Кодер состоит из нескольких стандартных блоков. Буфер хранит один блок входных выборок, и соответствующий набор коэффициентов parcor вычисляется для каждого блока. Число коэффициентов, то есть порядок прогнозирующего устройства, может быть также адаптировано. Квантованные значения parcor являются кодированными для передачи энтропией и преобразованными в коэффициенты LPC для фильтра прогноза, который вычисляет остаток прогноза.
Декодер значительно менее сложен, чем кодер, так как никакая адаптация не должна выполняться. Переданные значения parcor декодируются, преобразовываются в коэффициенты LPC и используются инверсным фильтром прогноза для вычисления сигнала реконструкции без потерь. Вычислительная работа декодера зависит от порядка прогнозирующего устройства, выбранного кодером.
Если порядок прогноза K выбирается адаптивно (adapt_order = 1), число битов, используемых для сигнализации о фактическом порядке (opt_order = K) в каждом блоке, ограничивается в зависимости как от глобального максимального порядка (max_order), так и в зависимости от размера блока NB:
Bits = min{ceil[log2(max_order + 1)], max[ceil(log2(NB >> 3)), 1]}.
Максимальный порядок Kmax = min(2Bits - 1, max_order) ограничивается в зависимости от значения max_order и длины блока (таблица 19).
Таблица 19
Примеры максимальных порядков прогноза
в зависимости от длины блока и max_order
Базовый (краткосрочный) прогноз может быть объединен с долгосрочным прогнозом (LTP).
6.3.1 Коэффициенты прогнозирующего устройства
Передача коэффициентов фильтра прогноза выполняется путем использования коэффициентов parcor
6.3.1.1 Квантование и кодирование коэффициентов parcor
Первые два коэффициента parcor (
![]() ![]() Остающиеся коэффициенты квантуются, используя простые 7-битовые универсальные квантователи:
где k > 2.Во всех случаях получающиеся квантованные значения
Передача квантованных коэффициентов
.Которые кодируются с использованием кодов Райса. Соответствующие смещения и параметры кодов Райса, используемых в этом процессе, могут быть выбраны из одного из наборов в таблице 20, где табличный индекс (coef_table) указывается в ALSSpecificConfig. Если coef_table = 11, то кодирование энтропии не применяется и квантованные коэффициенты передаются с 7 битами каждый. В этом случае смещение всегда -64, чтобы получить значения без знака
, которые ограничиваются диапазоном [0, 127].Таблица 20
для кодирования коэффициентов parcor
6.3.1.2 Реконструкция коэффициентов parcor
Кодированные по Райсу остаточные значения
![]() Затем производится реконструкция первых двух коэффициентов, используя:
![]() ![]() где 2Q представляет постоянный масштабный коэффициент (Q = 20), требующийся для целочисленного представления восстановленных коэффициентов, и Г(i) являются отображением, описанным таблице 21.
Таблица 21
Индексы i и соответствующие масштабные значения
parcor Г(i) для i = -64 ... 63
Реконструкция коэффициентов 3-го и более высоких порядков производится, используя формулу
(k > 2).6.3.1.3 Преобразование восстановленных коэффициентов parcor в коэффициенты прямого фильтра
Масштабированные коэффициенты parcor затем преобразовываются в коэффициенты LPC, используя следующий алгоритм:
short m, i, K, Q = 20;
long *cof, *par, corr = 1 << (Q - 1);
INT64 temp, temp2;
for (m = 1; m <= K; m++)
{
for (i = 1; i <= m/2; i++)
{
temp = cof[i] + ((((INT64)par[m] * cof[m-i]) + corr) >> Q);
if ((temp > LONG_MAX) || (temp < LONG_MIN)) // Overflow: use different
coefficientsreturn(1);
temp2 = cof[m-i] + ((((INT64)par[m] * cof[i]) + corr) >> Q);
if ((temp2 > LONG_MAX) || (temp2 < LONG_MIN)) // Overflow: use different
coefficientsreturn(1);
cof[m-i] = (long)temp2;
cof[i] = (long)temp;
}
cof[m] = par[m];
}
Здесь LONG_MAX = 231 - 1 и LONG_MIN = -(231). Получающиеся коэффициенты LPC cof также масштабируются с 220. Масштабирование будет учтено во время процесса фильтрации.
6.3.2 Фильтр прогноза
Вычисление спрогнозированного сигнала должно быть выполнено детерминированным способом, чтобы включить идентичное вычисление и в кодере, и в декодере, поэтому невозможно использовать коэффициенты с плавающей запятой. Вместо этого используют целочисленное представление с увеличением масштаба. Так как коэффициенты увеличиваются с множителем 2Q = 220, предсказанный сигнал также будет увеличен тем же самым множителем. Таким образом в конце процесса фильтрации масштаб каждой выборки предсказанного сигнала должен быть уменьшен.
6.3.2.1 Кодер
Следующий алгоритм описывает вычисление остатка d для входного сигнала x, длины блока N, порядка прогнозирующего устройства K и коэффициентов LPC cof:
short n, N, k, K, Q = 20;
long *x, *d, *cof, corr = 1 << (Q - 1);
INT64 y;
for (n = 0; n < N; n++)
{
y = corr;
for (k = 1; k <= K; k++)
y += (INT64)cof[k-1] * x[n-k];
d[n] = x[n] + (long)(y >> Q);
}
Чтобы предсказать первую выборку текущего блока, прогнозирующее устройство использует последние K выборок из предыдущего блока.
Если текущий блок (или подблок) является первым блоком канала во фрейме с произвольным доступом, никакие выборки из предыдущего блока не могут использоваться. В этом случае используется прогноз с прогрессивным порядком, где масштабированные коэффициенты parcor прогрессивно конвертируются в коэффициенты LPC cof в фильтре прогноза. В каждой рекурсии вычисляются величина текущего остатка d(n) и новый набор n + 1 коэффициентов LPC (первый цикл). После того, как вычисляются первые значения остатка K и все K коэффициенты, используется прогноз полного порядка (второй цикл). Индексы для par и cof в этой реализации начинаются с 1.
short m, n, N, i, k, K, Q = 20;
long *x, *d, *cof, corr = 1 << (Q - 1);
INT64 y, temp, temp2;
for (n = 0; n < min(K, N); n++)
{
y = corr;
for(k = 1; k <= n; k++)
y += (INT64)cof[k] *x[n-k];
d[n] = x[n] + (long)(y >> Q);
m = n + 1;
for(i = 1; i <= m/2; i++)
{
temp = cof[i] + ((((INT64)par[m] * cof[m-i]) + corr) >> Q);
if ((temp > LONG_MAX) || (temp < LONG_MIN)) // Overflow: use different
coefficients return(1);
temp2 = cof[m-i] + ((((INT64)par[m] * cof[i]) + corr) >> Q);
if ((temp2 > LONG_MAX) || (temp2 < LONG_MIN)) // Overflow: use different
coefficients return(1);
cof[m-i] = (long)temp2;
cof[i] = (long)temp;
}
cof[m] = par[m];
}
for (n = K; n < N; n++)
{
y = corr;
for (k = 1; k <= K; k++)
y += (INT64)cof[k] * x[n-k];
d[n] = x[n] + (long)(y >> Q);
}
Только первая выборка x(0) передается непосредственно, используя код Райса с s = resolution - 4 (то есть s = 12 для 16-битового и s = 20 для 24-битового). Следующие две величины остатка d(1) и d(2) кодируются кодами Райса, которые связываются с первым параметром Райса блока s[0]. В зависимости от кодера энтропии остающиеся величины остатка от d(3) до d(K) являются или кодированными по Райсу с s[0], или BGMC-кодированными с s[0] и sx[0]. Сводка всех кодов дается в таблице 22.
Таблица 22
Параметры кода для различных позиций выборки
6.3.2.2 Декодер
Алгоритм для вычисления исходного сигнала в декодере почти идентичен с алгоритмом кодера, за исключением последней инструкции:
short n, N, k, K, Q = 20;
long *x, *d, corr = 1 << (Q - 1);
INT64 y;
for (n = 0; n < N; n++)
{
y = corr;
for (k = 1; k <= K; k++)
y += (INT64)cof[k-1] * x[n-k];
x[n] = d[n] - (long)(y >> Q);
}
В случае произвольного доступа используется прогноз с прогрессивным порядком. Алгоритм для вычисления также почти идентичен с алгоритмом кодера за исключением двух строк, где вычисляется x. Индексы для par и cof начинаются с 1.
short m, n, N, i, k, K, Q = 20;
long *x, *d, *cof, corr = 1 << (Q - 1);
INT64 y, temp, temp2;
for (n = 0; n < min(K, N); n++)
{
y = corr;
for (k = 1; k <= n; k++)
y += (INT64)cof[k] * x[n-k];
x[n] = d[n] - (long)(y >> Q);
m = n + 1;
for (i = 1; i <= m/2; i++)
{
temp = cof[i] + ((((INT64)par[m] * cof[m-i]) + corr) >> Q);
temp2 = cof[m-i] + ((((INT64)par[m] * cof[i]) + corr) >> Q);
cof[m-i] = (long)temp2;
cof[i] = (long)temp;
}
cof[m] = par[m];
}
for (n = K; n < N; n++)
{
y = corr;
for (k = 1; k <= K; k++)
y += (INT64)cof[k] * x[n-k];
x[n] = d[n] - (long)(y >> Q);
}
Если кодером использовалось кодирование объединенных каналов, декодируемый сигнал x может быть разностным сигналом. В этом случае должна быть произведена дальнейшая обработка, чтобы получить исходный сигнал.
6.4.1 Усиление и задержка LTP
Если LTPenable включено, декодируются величины усиления p(i) и значение задержки
Таблица 23
Значения реконструкции и код Райса для усиления
Таблица 24
Таблица 25
Переданное значение относительной задержки является фактическим значением исключая стартовое значение задержки. Оно непосредственно кодируется естественным двоичным кодированием от 8 до 10 битов в зависимости от частот дискретизации. Фактические значения задержки показаны в таблице 26, где "optP" обозначает фактический порядок на краткосрочный прогноз.
Таблица 26
Поисковый диапазон задержки
6.4.2 Процедура синтеза LTP
Если декодируются параметры задержки и усиления, выполняется операция следующей рекурсивной фильтрации
.Для того, чтобы обеспечить совершенную реконструкцию, процесс должен быть строго определен. Псевдокод для этого фильтра в декодере следующий:
INT64 u;
for (smpl=0; smpl<end; smpl++)
{
for (u=1<<6, tap=-2; tap<=2; tap++)
{
u += (INT64)LTPgain[tap]*d[smpl-lag+tap];
}
d[smpl] += (long)(u>>7);
}
Здесь d является остаточным сигналом (который позже подается в фильтр синтеза). LTPgain является величиной усиления p(i)*128. Задержка имеет величину
Для простой комбинации с адаптивным переключением блока все значения остаточного сигнала и d(i) в предыдущем блоке равны "0". Процесс фильтрации синтеза имеет псевдокод для процесса фильтрации анализа в кодере. Этот процесс также должен быть нормативным с целью совершенной реконструкции. В этом псевдокоде различие между кодером и декодером появляется в последней строке. Ввод и вывод в декодере являются общими, в то время как в кодере они отличаются.
INT64 u;
for (smpl=0; smpl<end; smpl++)
{
for (u=1<<6, tap=-2; tap<=2; tap++)
{
u += (INT64)LTPgain[tap]*d[smpl-lag+tap];
}
dout[smpl] = d[smpl]-(long)(u>>7);
}
Здесь d является остатком краткосрочного прогноза и dout является остатком LTP.
Обратно-адаптивный прогноз использует адаптивное прогнозирующее устройство RLS-LMS.
В кодере прогнозирующее устройство RLS-LMS генерирует оценку текущей входной аудиовыборки при использовании прошлых выборок. Эта оценка вычитается из текущей выборки, чтобы сгенерировать остаток, который затем кодируется кодером энтропии, чтобы сформировать поток битов ALS.
В декодере выполняется обратный процесс. Декодер энтропии декодирует поток битов ALS в остаток, который затем добавляется к оценке прогнозирующего устройства RLS-LMS, чтобы регенерировать исходную аудиовыборку.
Прогнозирующее устройство RLS-LMS состоит из каскада прогнозирующих устройств DPCM, RLS прогнозирующего устройства и серии прогнозирующих устройств LMS. Входные выборки последовательно проходят через цепочку прогнозирующих устройств. Остатки из одного прогнозирующего устройства служат вводом в следующее прогнозирующее устройство. Оценки из прогнозирующих устройств в цепочке взвешиваются и складываются линейным объединителем, чтобы сгенерировать заключительную оценку текущей входной выборки.
Прогнозирующее устройство RLS-LMS может быть включено/выключено установкой RLSLMS в ALSSpecificConfig () в 1/0, соответственно.
6.5.1 Прогнозирующее устройство DPCM
Ввод: исходная аудиовыборка x(n).
Остаток: e1(n) как вход в прогнозирующее устройство RLS.
Оценка: y1(n) как вход в линейный объединитель.
Прогнозирующее устройство DPCM является первым прогнозирующим устройством в цепочке прогнозирующих устройств RLS-LMS. Это простое прогнозирующее устройство первого порядка с набором коэффициентов, то есть предыдущая входная выборка используется в качестве оценки текущей входной выборки. Это иллюстрируется следующим образом:
y1(n) = x(n - 1),
где y1(n) является оценкой прогнозирующим устройством DPCM и x(n - 1) является предыдущей входной выборкой.
Ввод: остаток прогнозирующего устройства DPCM e1(n).
Остаток: e2(n) как вход в прогнозирующее устройство LMS.
Оценка: y2(n) как вход в линейный объединитель.
Прогнозирующее устройство RLS является вторым прогнозирующим устройством в цепочке прогнозирующих устройств RLS-LMS. Алгоритм RLS используется, чтобы адаптировать весовых коэффициентов прогнозирующего устройства. Алгоритм инициализируется, устанавливая матрицы инверсной автокорреляции MxM в предопределенное значение P следующим образом:
![]() где
Вектор веса прогнозирующего устройства RLS, определенный как
wRLS(n) = [wRLS,1(n), wRLS,2(n), ....., wRLS,M(n)]T
инициализируется как
wrls(0) = 0.
Для каждого индекса n, n = 1, 2, ..., выполняются следующие вычисления:
v(n) = P(n - 1)e1(n),
где e1(n) является входным вектором прогнозирующего устройства RLS, определенным как
e1(n) = [e1(n - 1), e1(n - 2), ....., e1(n - M)]T
и
![]() k(n) = mv(n)
![]() e2(n) = e1(n) - y2(n),
wRLS(n) = wRLS(n - 1) + k(n)e2(n),
![]() где k(n) является вектором усиления Mx1,
6.5.2.1 Прогнозирующее устройство RLS объединенного-стерео
Для элемента пары каналов (CPE), если joint_stereo в ALSSpecificConfig () устанавливается в 1, прогнозирующее устройство RLS будет работать в режиме объединенного-стерео. В режиме объединенного-стерео прогнозирующее устройство RLS использует как внутриканальный прогноз, так и межканальный прогноз.
Входными сигналами прогнозирующего устройства являются остаток прогнозирующего устройства DPCM канала L, eL,1(n) и остаток прогнозирующего устройства DPCM канала R, eR,1(n). Прогнозирующее устройство объединенного-стерео состоит из внутриканального прогнозирующего устройства aL и межканального прогнозирующего устройства bL. Внутриканальное прогнозирующее устройство aL генерирует оценку текущей входной eL,1(n) выборки канала L из прошлых L-выборок, eL,1(n - 1), eL,1(n - 2), ..., eL,1(n - M/2), где M является порядком прогнозирующего устройства RLS объединенного-стерео. В то же время межканальное прогнозирующее устройство bL генерирует другую оценку, eL,1(n), из прошлых входных выборок eR,1(n - 1), eR,1(n - 2), ..., eR,1(n - M/2) канала R. Эти две оценки складываются вместе. Результат yL,1(n) представляет оценку прогнозирующего устройства RLS объединенного-стерео канала L. Этот процесс представляется как
![]() где aL,m - коэффициенты внутриканального прогнозирующего устройства aL, bL,m - коэффициенты межканального прогнозирующего устройства bL. Первый элемент суммирования в уравнении является оценкой внутриканального прогнозирующего устройства, а второй элемент суммирования - оценкой межканального прогнозирующего устройства. Этот остаток eL,2(n) генерируется, вычитая оценку yL,1(n) из eL,1(n) таким образом
eL,2(n) = eL,1(n) - yL,1(n).
Прогнозирующее устройство RLS объединенного-стерео канала L обновляется алгоритмом RLS, данным в 6.5.2, где вектор веса, входной вектор и остаток в алгоритме RLS пересматриваются следующим образом:
wRLS(n) = [bL,1(n), aL,1(n), bL,2(n), aL,2(n), .....,
bL,M/2(n), aL,M/2(n)]T,
e1(n) = [eR,1(n - 1), eL,1(n - 1), eR,1(n - 2),
eL,1(n - 2), ....., eR,1(n - M/2), eL,1(n - M/2)]T,
e2(n) = eL,2(n).
Входные сигналы в прогнозирующее устройство для правого звукового канала являются остатком прогнозирующего устройства DPCM канала L, eL,1(n), и остатком прогнозирующего устройства DPCM канала R, eR,1(n). Прогнозирующее устройство RLS объединенного-стерео состоит из внутриканального прогнозирующего устройства aR и межканального прогнозирующего устройства bR. Внутриканальное прогнозирующее устройство aR генерирует оценку текущей входной выборки канала R eR,1(n) из прошлых выборок eR,1(n - 1), eR,1(n - 2), ..., eR,1(n - M/2), где M является порядком прогнозирующего устройства RLS объединенного-стерео. В то же время межканальное прогнозирующее устройство bR генерирует другую оценку eR,1(n) из входных выборок канала L, eL,1(n), eR,1(n - 1), ..., eR,1(n - M/2 + 1). Эти две оценки суммируются вместе. Результат yR,1(n) является оценкой прогнозирующего устройства RLS объединенного-стерео R-канала. Этот процесс представляется как
![]() где aR,m - коэффициенты внутриканального прогнозирующего устройства aR, bR,m - коэффициенты межканального прогнозирующего устройства bR. В этом уравнении первый элемент суммирования является оценкой внутриканального прогнозирующего устройства, а второй элемент суммирования - оценкой межканального прогнозирующего устройства. Остаток eR,2(n) генерируется, вычитая оценку yR,1(n) из eR,1(n)
eR,2(n) = eR,1(n) - yR,1(n).
Прогнозирующее устройство RLS объединенного-стерео канала R обновляется алгоритмом RLS, данным в 6.5.2, где вектор веса, входной вектор и остаток в алгоритме RLS переопределяются следующим образом:
wRLS(n) = [bL,0(n), aL,1(n), bL,1(n), aL,2(n), .....,
bL,M/2-1(n), aL,M/2(n)]T,
e1(n) = [eR,1(n - 1), eL,1(n), eR,1(n - 2),
eL,1(n - 1), ....., eR,1(n - M/2), eL,1(n - M/2 + 1)]T,
e2(n) = eR,2(n).
Декодер обрабатывает CPE в порядке LRLRLR....... Текущая выборка канала L всегда декодируется перед текущей выборкой канала R.
6.5.2.2 Прогнозирующее устройство RLS моно
Для элемента одиночного канала (SCE) прогнозирующее устройство RLS работает в режиме моно. В режиме моно прогнозирующее устройство RLS обновляется алгоритмом RLS.
Для CPE, если joint_stereo в ALSSpecificConfig () устанавливается в 0, используется моно RLS для каждого отдельного канала в CPE. Для CPE, если mono_block в RLSLMS_extension () устанавливается в 1, CPE будет кодировано как два отдельных канала L и L-R. Канал L обрабатывается как SCE, тогда как канал различия L-R проходит непосредственно в кодер энтропии. Для SCE, если входной фрейм содержит только постоянные величины, прогнозирующее устройство RLS-LMS применяется для этого фрейма. Для CPE, если входной фрейм обоих каналов содержит только постоянные величины, прогнозирующее устройство RLS-LMS применяется для этого фрейма.
6.5.2.3 Операция фильтрации в прогнозирующем устройстве RLS
Следующий псевдокод иллюстрирует, как прогнозирующее устройство RLS порядка M генерирует оценочный сигнал.
6.5.2.4 Адаптация веса в прогнозирующем устройстве RLS
Следующий псевдокод иллюстрирует, как обновляется вектор веса прогнозирующего устройства RLS порядка M.
Прогнозирующее устройство RLS может быть выключено установкой RLS_order в нуль. В этом случае оценка прогнозирующего устройства RLS y2(n) обнуляется.
6.5.3 Прогнозирующие устройства LMS
Ввод: ek-1(n) остаток предыдущего прогнозирующего устройства (может быть прогнозирующим устройством RLS или прогнозирующим устройством LMS),
Остаток: ek(n) как вход в следующее прогнозирующее устройство LMS
Оценка: yk(n) как вход в линейный объединитель.
Прогнозирующее устройство RLS-LMS содержит ряд прогнозирующих устройств LMS. Чтобы адаптировать веса прогнозирующего устройства, используется алгоритм нормализованного LMS (NLMS). Для прогнозирующего устройства LMS M-порядка его вектора веса
wLMS(n) = [wLMS,1(n), wLMS,2(n), ....., wLMS,M(n)]T
инициализируется как
wRLS(0) = 0.
Для каждого индекса времени n, n = 1, 2, ..., оценка вычисляется как
![]() где ek-1(n) является входным вектором, определенным как
ek-1(n) = [ek-1(n - 1), ek-1(n - 2), ....., ek-1(n - M)]T.
Вектор веса прогнозирующего устройства LMS обновляется согласно
ek(n) = ek-1(n) - yk(n),
![]() где
6.5.3.1 Операция фильтрации в прогнозирующем устройстве LMS
Следующий псевдокод иллюстрирует, как прогнозирующее устройство LMS M-порядка генерирует оценочный сигнал. Порядок прогнозирующего устройства LMS определяется в 6.5.6.3.
6.5.3.2 Адаптация веса в прогнозирующем устройстве LMS
Следующий псевдокод иллюстрирует, как обновляется вектор веса прогнозирующего устройства LMS порядка-M.
6.5.4 Линейный объединитель
Ввод: y1(n), y2(n), ..., yK(n) оценивает прогнозирующие устройства из DPCM, RLS и LMS.
Вывод: x(n) заключительная оценка прогнозирующего устройства RLS-LMS.
Линейный объединитель умножает оценки из прогнозирующих устройств DPCM, RLS и LMS на ряд весов. Результаты суммируются, чтобы обеспечить заключительную оценку прогнозирующего устройства RLS-LMS. Знак алгоритм Sign-Sign LMS используется, чтобы обновить веса линейного объединителя. Если в каскаде прогнозирующего устройства RLS-LMS есть всего k прогнозирующих устройств, вектор веса линейного объединителя дается выражением
c(n) = [c1(n), c2(n), ......., ck(n)]T.
Входной вектор линейного объединителя дается так:
y(n) = [y1(n), y2(n), ......., yk(n)]T.
Заключительная оценка прогнозирующего устройства RLS-LMS дается следующим образом
![]() Вектор веса линейного объединителя обновляется алгоритмом Sign-Sign LMS
![]() где x(n) является текущей входной выборкой прогнозирующего устройства RLS-LMS, a является длиной шага Sign-Sign LMS. Функция sgn{*} определяется как
![]() Следующий псевдокод иллюстрирует, как линейный объединитель K-порядка генерирует заключительную оценку прогнозирующего устройства RLS-LMS. Порядок линейного объединителя дается из LMS_stage+2. Код также показывает, как обновляется вектор веса линейного объединителя. Первые два веса линейного объединителя не обновляются.
6.5.5 Инициализация прогнозирующего устройства RLS-LMS
Прогнозирующее устройство RLS-LMS инициализируется в следующие моменты: запуск кодирования, запуск декодирования, старт каждого фрейма произвольного доступа (PA), и всякий раз, когда изменяется порядок фильтра. Прогнозирующее устройство RLS-LMS инициализируется заполнением нулями следующих буферов: предыдущая входная выборка прогнозирующего устройства DPCM, входной вектор и вектор веса прогнозирующего устройства RLS, все входные векторы и векторы веса прогнозирующего устройства LMS и входной вектор линейного объединителя. Матрица P прогнозирующего устройства RLS инициализируется, вызывая функцию reinit_P(P). Вектор веса линейного объединителя устанавливается в константу FRACTION, которая представляет 1,0 в формате 8.24.
В таблице 27 перечисляются константы и макросы, используемые прогнозирующим устройством RLS-LMS.
Таблица 27
Константы и макросы
6.5.6 Параметры прогнозирующего устройства RLS-LMS
Параметры прогнозирующего устройства RLS-LMS могут быть изменены каждый фрейм. Об этом сообщается в RLSLMS_extension(), когда ext_mode = 1.
6.5.6.1 RLS_order
Параметр RLS_order определяет порядок прогнозирующего устройства RLS. Допустимые значения и соответствующие 4-битовые индексы перечисляются в таблице 28.
Таблица 28
RLS_order
6.5.6.2 LMS_stage
Параметр LMS_stage определяет число прогнозирующих устройств LMS в цепочке прогнозирующих устройств RLS-LMS. Допустимые значения и соответствующие 3-битовые индексы перечисляются в таблице 29.
Таблица 29
LMS_stage
Параметр LMS_order определяет порядок прогнозирующего устройства LMS. Допустимые значения и соответствующие 5-битовые индексы перечисляются в таблице 30.
Таблица 30
LMS_order
6.5.6.4 LMS_mu
Параметр LMS_mu определяет длину шага (stepsize) алгоритма NLMS, который используется, чтобы обновить прогнозирующее устройство LMS. Допустимые значения и соответствующие 5-битовые индексы перечисляются в таблице 31.
Таблица 31
LMS_mu
Параметр LMS_stepsize определяет длину шага (stepsize) алгоритма Sign-Sign LMS, который используется, чтобы обновить линейный объединитель. Допустимые значения (формат 7.24) и соответствующие 3-битовые индексы перечисляются в таблице 32.
Таблица 32
LMS_stepsize
RLS lambda и RLS lambda_ra являются параметрами, которые управляют фактором игнорирования прогнозирующего устройства RLS. RLS lambda ra используется только для фрейма PA, тогда как RLS lambda используется и для обоих фреймов PA и non-PA. RLS lambda и RLS lambda ra принимают целочисленные значения в диапазоне [1, 1023]. Фактор игнорирования
![]() и
![]() 6.5.7 Произвольный доступ
Прогнозирующее устройство RLS-LMS переинициализируется в начале каждого фрейма произвольного доступа. Во фрейме PA прогнозирующее устройство RLS-LMS использует RLS_lambda_ra, чтобы определить фактор игнорирования RLS для первых 300 выборок. Для остальной части выборок во фрейме используется RLS_lambda. Во фрейме PA прогнозирующие устройства LMS в цепочке прогнозирующих устройств RLS-LMS начинают обновлять свои состояния только после первых N/32 выборок во фрейме, где N является длиной фрейма.
Есть два возможных режима для передачи остатка прогноза: быстрая схема кодирования, использующая простые коды Райса и более сложная и эффективная схема, которая использует блок кодов Гильберта-Мура (BGMC).
Когда флаг bgmc_mode в ALSSpecificConfig устанавливается в 0, остаточные значения являются кодированной энтропией, использующей коды Райса. Выбранный синтаксис для генерации кодовой комбинации определяется в следующем.
Код Райса определяется параметром s >= 0. Для данного значения s каждая кодовая комбинация состоит из
префикса и s-битного субкода. Префикс сообщается, используя ![]() Для s = 0 используем модифицированное вычисление:
![]() Подкод для s > 0 вычисляется следующим образом:
![]() Для s = 0 нет никакого подкода, а только префикс, таким образом, префикс и кодовая комбинация идентичны. Разрешенными значениями являются s = 0 ... 15 для разрешения выборки <= 16 битов и s = 0 ... 31 для разрешения выборки > 16 битов.
Таблицы 33 и 34 показывают примеры для кода Райса с s = 4. Таблица 35 показывает специальный код Райса с s = 0.
Таблица 33
Код Райса с s = 4. Биты xxxx содержат 4-битовый подкод sub
Таблица 34
Таблица 35
и кодовая комбинация идентичны)
Для каждого блока остаточных значений все значения могут быть закодированы, используя тот же самый код Райса или, если установлен флаг sb_part в заголовке файла, блок может быть разделен на четыре подблока, каждый из которых кодируется различными кодами Райса. В последнем случае флаг ec_sub в заголовке блока указывает, используется один или четыре блока.
В то время как параметр s[i = 0] первого подблока непосредственно передается 4 битами (разрешение <= 16 битов), либо 5 битами (разрешение > 16 битов), передаются только различия следующих параметров s[i > 0]. Эти различия дополнительно кодируются, снова используя соответственно выбранные коды Райса (таблица 36).
Таблица 36
Кодирование параметров кода Райса s [i]
6.6.2 Режим кодирования BGMC
Когда флаг bgmc_mode в заголовке файла устанавливается в 1, остаточные значения разделяются на MSB, LSB и хвостовые компоненты, которые затем кодируются, используя блок Гильберта-Мура, фиксированную длину и коды Райса соответственно.
Кроме того используется различная схема разделения на подблоки. Если флаг sb_part в заголовке файла устанавливается, каждый блок может быть разделен на 1, 2, 4, или 8 подблоков, где фактическое число обозначается 2-битовым полем ec_sub в заголовке блока. Если sb_part не устанавливается, каждый блок может быть разделен только на 1 или 4 подблока, и фактическое число указывается 1-битовым полем ec_sub.
6.6.2.1 Дополнительные параметры
В дополнение к параметру кода s (используется для создания кодов Райса), кодер/декодер BGMC опирается на следующие величины:
Число самых младших значащих битов (LSBs) k остатков, которые будут переданы непосредственно:
![]() где s является параметром Райса и B является параметром, зависящим от размера подблока N:
![]() где 0 <= B <= 5 (значения за пределами границ отсекаются до границ). Число отсутствующих (в таблицах частот доступа) битов delta:
delta = 5 - s + k.
Индекс таблицы частот sx используется для того, чтобы кодировать/декодировать MSBs.
Параметр sx передается в дополнение к s для каждого подблока, где 'полный' параметр BGMC может быть представлен как S = 16·s + sx. Подобно режиму кодирования Райса первый параметр передается непосредственно, в то время как для последующих параметров передаются только закодированные различия (таблица 37).
Таблица 37
Кодирование BGMC кодирует параметры S[i] = 16·s[i] + sx[i]
6.6.2.2 Разделение остаточных значений на MSB, LSB и хвостовые части
Процесс получения отсеченных и с удаленным знаком значений MSB, LSB или хвостовых частей, соответствующих остаточным выборкам (res [i]), может быть описан следующим образом:
for (i = 1; i <= N; i++)
{
long msbi = res[i] >> k; // remove lsbs
if (msbi >= max_msb[sx][delta]){ // positive tail
msb[l] = tail_code[sx][delta];
tail[i] = res[i] - (max_msb[sx][delta] << k);
} else
if (msbi <= -max_msb[sx][delta]){ //negative tail
msb[l] = tail_code[sx][delta];
tail[i] = res[i] + ((max_msb[sx][delta] - 1) << k);
} else { // normal msb range
if (msbi >= 0) msbi = msbi * 2;
else msbi = -msbi * 2 - 1; // remove sign
if (msbi >= tail_code[sx][delta])
msbi ++; // skip tail code
msb[i] = msbi; // msb and lsb values
lsb[i] = res[i] & ((1 << k)-1); // to encode
}
}
Максимальные абсолютные значения MSB и коды хвостовых частей, используемых в этом алгоритме (массивы max_msb [] и tail_code [] соответственно), определяются в таблицах 38 и 39.
Таблица 38
Максимальные/минимальные значения остаточных MSB
Таблица 39
Инверсный процесс (декодирование), восстанавливающий исходные остаточные выборки (res [i]) на основе их MSB, LSB или хвостовых частей, может быть описан следующим образом:
for (i = 1; i <= N; i++)
{
if (msb[i] == tail_code[sx][delta]) {
if (tail[i] >= 0) // positive tail
res[i] = tail[i] + (abs_max_x) << k;
else // negative tail
res[i] = tail[i] - (abs_max_x - 1) << k;
} else {
int msbi = msb[i];
if (msbi > tail_code[sx][delta])
msbi --; // skip tail code
if (msbi & 1)
msbi = (-msbi - 1)/2; // remove sign
else
msbi = msbi/2;
res[i] = (msbi << k) | lsb[i]; // add lsbs
}
}
6.6.2.3 Кодирование и декодирование MSB
Отсеченные MSB остаточных выборок блочно кодируются, используя коды Гильберта-Мура, созданные для распределения (кумулятивная таблица частот), индексированного параметром sx.
Процесс кодирования состоит из инициализации состояния (арифметического) кодера блока Гильберта-Мура, последовательного кодирования всех значений MSB во всех подблоках, и сбрасывания состояния кодера.
Спецификации на языке C соответствующих функций кодера даются ниже.
#define FREQ_BITS 14 // # bits used by freq. counters
#define VALUE_BITS 18 // # bits used to describe code range
#define TOP_VALUE 0x3FFFF // largest code value
#define FIRST_QTR 0x10000 // first quarter
#define HALF 0x20000 // first half
#define THIRD_QTR 0x30000 // third quarter
// encoder state variables:
static unsigned long high, low, bits_to_follow;
// start encoding:
void bgmc_start_encoding (void)
{
high = TOP_VALUE;
low = 0;
bits_to_follow = 0;
}
// sends a bit followed by a sequence of opposite bits:
void put_bit_plus_follow (unsigned long bit)
{
put_bit (bit);
while (bits_to_follow) {
put_bit (bit
bits_to_follow --;
}
}
// encodes a symbol using Gilbert-Moore code for
// a distribution s_freq[] subsampled by delta bits:
void bgmc_encode (unsigned long symbol, long delta, unsigned long *s_freq)
{
unsigned long range = high - low +1;
high = low+((range*s_freq[symbol<<delta]-(1<<FREQ_BITS))>>FREQ_BITS);
low = low+((range*s_freq[(symbol+1)<<delta])>>FREQ_BITS);
for(;;) {
if (high < HALF) {
put_bit_plus_follow (0, p);
} else if (low >= HALF) {
put_bit_plus_follow (1, p);
low -= HALF;
high -= HALF;
} else if (low >= FIRST_QTR && high < THIRD_QTR) {
bits_to_follow += 1;
low -= FIRST_QTR;
high -= FIRST_QTR;
} else
break;
low = 2 * low;
high = 2 * high + 1;
}
}
// Finish the encoding:
static void bgmc_finish_encoding ()
{
bits_to_follow += 1;
if (low < FIRST_QTR) put_bit_plus_follow (0,p);
else put_bit_plus_follow (1,p);
}
Спецификации соответствующих функций декодера блока Гильберта-Мура на языке C даются ниже.
// decoder state variables:
static unsigned long high, low, value;
// start decoding:
void bgmc_start_decoding (void)
{
high = TOP_VALUE;
low = 0;
value = get_bits(VALUE_BITS);
}
// decodes a symbol using Gilbert-Moore code for
// a distribution s_freq[] subsampled by delta bits:
unsigned long bgmc_decode (long delta, unsigned long *s_freq)
{
unsigned long range, target, symbol;
range = high - low + 1;
target = (((value - low + 1) << FREQ_BITS) - 1) / range;
symbol = 0;
while (s_freq [(symbol+1)<<delta] > target)
symbol ++;
high=low+((range*s_freq[symbol<<delta]-(1<<FREQ_BITS))>>FREQ_BITS);
low=low+((range*s_freq[(symbol+1)<<delta])>>FREQ_BITS);
for(;;) {
if (high < HALF);
else if (low >= HALF) {
value -= HALF;
low -= HALF;
high -= HALF;
} else if (low >= FIRST_QTR && high < THIRD_QTR) {
value -= FIRST_QTR;
low -= FIRST_QTR;
high -= FIRST_QTR;
} else
break;
low = 2 * low;
high = 2 * high + 1;
value = 2 * value + get_bit ();
}
return symbol;}
// Finish decoding:
void bgmc_finish_decoding ()
{
scroll_bitstream_position_back(VALUE_BITS-2);
}
Совокупные таблицы частот (массивы s_freq []), используемые вышеприведенными алгоритмами для кодирования/декодирования остаточных MSB, перечисляются ниже. Соответствующая (в пределах каждого подблока) таблица выбирается, используя параметр sx.
Таблица 40
Совокупные таблицы частот, используемые
кодером/декодером BGMC
6.6.2.4 Кодирование остаточных LSB и концевых частей
LSB и концевые части передаются способом чередования (то есть, если msb [i]! = tail_code, передаем lsb [i], иначе tail [i]) для всех остатков в подблоке.
LSB передаются непосредственно, используя k битов, в то время как концевые части кодируются, используя коды Райса с параметром s, как описано в 6.6.1.
Объединенное кодирование пар каналов идентично объединенному кодированию стереопары. Таким образом, используем термины "левый канал" и "правый канал", чтобы сослаться на два канала любой пары каналов, независимо от того, переносит ли она подлинный сигнал стерео или два других канала многоканального сигнала.
Когда декодируемый блок, который обычно представлял левый канал (L) или правый канал (R), содержит разностный сигнал объединенного стерео (D = R - L, обозначенный js_block), исходные данные канала должны быть явно восстановлены. Если первый канал содержит разностный сигнал, левый канал был заменен и может быть восстановлен, используя L = R - D для всех выборок этого блока. Если второй канал содержит разностный сигнал, правый канал был заменен, и восстанавливается, используя R = D + L для всех выборок. Если block_switching включено, это относится к любой паре синхронизируемых блоков пары каналов, то есть любой блок может содержать разностный сигнал или исходный сигнал канала. С точки зрения прогноза разностные сигналы обрабатываются как нормальные сигналы. Если фильтр прогноза использует выборки из предыдущего блока, то они должны быть разностными значениями тех же самых двух каналов в этом предыдущем блоке. То же самое применяется к инверсному фильтру прогноза декодера.
Многоканальное кодирование использует адаптивно взвешенное межканальное вычитание, чтобы далее уменьшить амплитуды остатков прогноза.
6.8.1 Декодирование и восстановление одиночных каналов
Наборы информации о межканальной зависимости, включая master_channel_index, weighting_factor и time_difference_flag, декодируются для каждого канала. Числами итераций управляет stop_flag. Кроме того имеется бит js_switch, который активирует простое кодирование входных сигналов объединенного стерео вместо многоканального кодирования остаточных сигналов прогноза LPC, даже когда используется режим межканальной корреляции.
Если флаг time_difference_flag является нулем, выполняется синфазное взвешенное дополнение с тремя ответвлениями, как показано в следующем псевдокоде.
INT64 u;
for(smpl=1; smpl<N-1; smpl++)
{
u = (INT64)MCCgain[0]*d_masterchannel[smpl-1]
+(INT64)MCCgain[1]*d_masterchannel[smpl]
+(INT64)MCCgain[2]*d_masterchannel[smpl+1];
d[smpl] += (long) ((u+64)>>7);
}
d: целое число для остаточного сигнала
MCCgain: величина усиления
![]() Если time_difference_flag равен единице, выполняется взвешенное дополнение с шестью ответвлениями с декодированным параметром временного различия TDL, как показано в следующем псевдокоде.
INT64 u;
if(TDL>0) {ss=1; se=N-TDL-1;}
else {ss=-TDL+1; se=N-1;}
for(smpl=ss; smpkse; smpl++)
{
u = (INT64)MCCgain[0]*d_masterchannel[smpl-1]
+(INT64)MCCgain[1]*d_masterchannel[smpl]
+(INT64)MCCgain[2]*d_masterchannel[smpl+1]
+(INT64)MCCgain[3]*d_masterchannel[smpl+TDL-1]
+(INT64)MCCgain[4]*d_masterchannel[smpl+TDL]
+(INT64)MCCgain[5]*d_masterchannel[smpl+TDL+1];
d[smpl] += (long)((u+64)>>7);
}
d: целое число для остаточного сигнала
MCCgain: величина усиления (i)*128
TDL: величина задержки временного различия:
Диапазон TDL зависит от частоты дискретизации, как показано в таблице 41. Имеется бит знака для TDL, чтобы поддерживать и положительные и отрицательные различия относительно сигнала кодирования. Чтобы избежать конфликтов с синфазным взвешиванием, TDL должно быть больше 3 или меньше -3.
Таблица 41
Диапазон задержки
Значение усиления
квантуется согласно таблице 42. Фактические индексы значений усиления кодируются с использованием кодов Райса с параметром 1 и смещением 16, за исключением weighting_factor [1]. Индекс weighting_factor [1] декодируется, используя коды Райса с параметром 2 со смещением 14.Таблица 42
Код Райса факторов межканального взвешивания
![]()
6.8.2 Последовательное декодирование для многоканальных сигналов
Последовательность остаточных выборок прогноза в одном канале и одном блоке обрабатывается как вектор, e = (e0, e1, ..., en-1)T, где n представляет число выборок во фрейме. Пусть ei будет вектором остатка прогноза основного канала, где j определяется master_channel_index, и ei является вектором остатка прогноза кодированного (ведомого) канала. Остаточный сигнал ведомого канала восстанавливается путем добавления сигнала основного канала с коэффициентами умножения
![]() Если stop_flag включено, никакая межканальная информация для этого канала не следует. Если stop_flag выключено, межканальная информация следует, и это позволено неоднократно. Таким образом синтаксису разрешено иметь многократные этапы межканальной информации. Число этапов должно быть общим для всех каналов. Если master_channel_index идентично номеру канала на всех дальнейших этапах, что означает, что взвешенное вычитание более не активируется, элементы синтаксиса для дальнейших этапов пропускаются для этого канала. В результате stop_flag устанавливается в конце эффективного набора информации.
Для того чтобы восстановить остаточные сигналы из многоступенчатой межканальной информации, процесс должен запуститься с правого набора информации. Промежуточный вектор остатка в i-м канале и k-м этапе,
![]() где
либо 3-отводная, либо 6-отводная фильтрация.Пример потока битов для 5 каналов и трех этапов итерации показан в таблице 43. У канала 0 есть три элемента синтаксиса, соответствующие этапам. Реконструкцию следует выполнять с последнего этапа, то есть третьего этапа. У третьего этапа имеется только stop_flag, поэтому работа начинается со второго этапа обращением к
На втором этапе у канала 0 как основной канал есть канал 4 с коэффициентами взвешивания
, где На первом этапе у канала 0 как основной канал служит канал 2 с коэффициентами взвешивания
. Однако . У канала 2 основной канал - канал 1 со значением временного различия "5" и коэффициентами умножения . Теперь, когда канал 2 был восстановлен, может быть восстановлен канал 0. Другие каналы не имеют никаких операций на первом этапе. Таким образом, Таблица 43
для 5 каналов и 3 этапов
Мы можем восстановить вектор только тогда, когда вектор основного канала уже восстановлен на этом этапе.
В дополнение к целочисленным аудиосигналам MPEG-4 ALS также поддерживает сжатие аудиосигналов без потерь в 32-разрядном формате с плавающей точкой IEEE.
6.9.1 Кодер для данных с плавающей точкой
Если входной сигнал является 32-битовым с плавающей точкой, входные значения разлагаются на три части: предполагаемый общий множитель A, усеченная целочисленная последовательность сомножителя Y и разностный сигнал Z. Та же самая схема сжатия как для нормального целочисленного ввода применяется для усеченной и нормализованной целочисленной последовательности сомножителя. Когда предполагаемый общий множитель A равняется 1,0, извлекается и упаковывается только необходимый код длины мантиссы для последовательности различия. Необходимая длина слова уникально определяется значением соответствующего целого числа. 23 или меньше битов сигнала мантиссы-различия Z кодируются, используя модуль сжатия Masked-LZ, кроме тех случаев, когда Y равняется 0. Если целое число Y равняется 0, все 32 бита данных x кодируются с модулем отдельно. Во всех случаях для усеченной целочисленной последовательности Y используется модуль сжатия ALS.
6.9.2 Декодер для данных с плавающей точкой
В случае данных с плавающей точкой восстанавливается целочисленная последовательность сомножителя Y, и множитель A умножается, чтобы получить последовательность с плавающей точкой (Y*A). Для операции округления умножения используется округляющийся режим "round to nearest, to even when tie". Последовательность различия декодируется модулем распаковки Masked-LZ и преобразовывается в последовательность формата с плавающей точкой Z. Часть A и часть B декодируются отдельно и выравниваются для реконструкции. Если множитель A равняется 1,0, последовательность различия декодируется, используя информацию о длине слова, которая определяется из значения соответствующей целочисленной величины. Дополнительные биты более, чем необходимая длина в битах, отключаются (выбрасываются), так как они - фиктивные биты, добавленные кодером. Обе последовательности, (Y*A) и Z, суммируются, чтобы генерировать выходную последовательность с плавающей точкой.
6.9.3 Декодирование потока битов для данных с плавающей точкой
В случае данных с плавающей точкой необходимо декодировать последовательность различий так же, как целочисленный поток битов. Можно воспользоваться тем, что граница слова каждой выборки различия уникально определяется абсолютным значением связанного усеченного целого числа. На заключительном этапе процесса декодирования обе последовательности от целого числа и мантиссы различия суммируются, чтобы восстановить последовательность в формате с плавающей точкой.
6.9.3.1 Декодирование размера данных элемента различия
В процессе, названном frame_data, декодируется num_bytes_diff_float. Следующие байты num_bytes_diff_float являются сжатыми данными различия.
6.9.3.2 Декодирование элемента различия
6.9.3.2.1 Инициализация переменных
В первом фрейме или фреймах произвольного доступа некоторые переменные должны быть инициализированы следующим образом.
last_acf_mantissa [c] устанавливается в 0. last_shift_value [c] устанавливается в 0.
В FlushDict () флаг freeze_flag устанавливается в 0, code_bits устанавливается в 9, bump_code устанавливается в 511, next_code устанавливается в 258.
Таблица 44
6.9.3.2.2 Параметры нормализации
Перед декодированием разностного сигнала параметры нормализации должны декодироваться следующим способом.
Во-первых, декодируется use_acd. Если use_acf не 0, для каждого канала декодируется acf_flag [c]. Если acf_flag [c] не 0, декодируется acf_mantissa [c]. Если acf_flag [c] равняется 0, то же самое значение last_acf_mantissa [c] устанавливается в acf_mantissa [c]. Когда use_acf равняется 0, last_acf_mantissa [c], и acf_mantissa [c] устанавливаются в 0. Это означает, что общий множитель инициализируется в 1,0.
Кроме того, для каждого канала декодируются highest_byte [c], partA_flag [c] и shift_amp [c]. Когда partA_flag [c] равно 0, значения всех выборок в части A являются всеми нулями, или нет никакой выборки, для которой соответствующее усеченное целое число равняется 0. Если shift_amp [c] равняется 0, значение last_shift_value [c] копируется в shift_value [c]. Иначе shift_value [c] декодируется из потока битов. Заключительная выходная последовательность с плавающей точкой, восстановленная из усеченного целого числа, денормализовывается добавлением shift_value [c] к экспоненте выходных данных. В конце концов last_acf_mantissa [c] и last_shift_value [c] обновляются текущими величинами acf_mantissa [c] и shift_value [c].
6.9.3.2.3 Различия мантиссы (когда acf_mantissa [c] равняется 0)
Если acf_mantissa [c] равняется 0, мантисса различия восстанавливается следующим способом.
Последовательность различий во фрейме упаковывается. У каждой выборки имеется уникальная длина слова фактической информации, где длина определяется значением соответствующего целого числа. Каждое значение различия мантиссы D[c][n] восстанавливается следующим образом.
Поток битов для восстановления значения различия разделяется на две части (часть A и часть B). Часть A содержит выборки, необходимые для кодирования всех 32 битов. Это выборки, для которых соответствующее усеченное целое число y равняется 0. Если усеченное целочисленное значение является нулем, получаются исходные данные с плавающей точкой.
Если partA_flag [c] равняется 0, все значения в части A являются нулями или в части A нет никаких выборок. Когда partA_flag [c] не является нулем, в части A есть выборки и должен быть считан compressed_flag. Если compressed_flag [c] равняется 0, все потоки битов упаковываются несжатыми. Если compressed_flag [c] равняется 1, выборки части A сжимаются, используя схему сжатия Masked-LZ. В этом случае распаковка Masked-LZ применяется для потока битов в части A.
Часть B содержит выборки, для которых соответствующее усеченное целое число y не равно 0. Перед декодированием потока битов в части B должно быть считано compressed_flag [c] для части B. Если compressed_flag [c] равняется 0, поток битов упаковывается несжатым. Если compressed_flag [c] равняется 1, выборки части B сжимаются, используя схему сжатия Masked-LZ. В этом случае для потока битов в части B применяется распаковка Masked-LZ.
Необходимые биты этих выборок различаются от 0 до 23 битов в зависимости от highest_byte [c], acf_mantissa [c] и соответствующего усеченного целого числа y.
Самая высокая длина различия в битах nbits[c][n], которая будет кодироваться, определяется следующим образом:
nbits[c][n] = min (word_length[c][n], highest_byte*8),
где word_length [c] [n] показано в таблице 45,
"highest_byte [c]" обозначает наибольшую длину байта всех значений различия мантиссы во фрейме. "highest_byte [c]" равно 0, если у исходных данных с плавающей точкой имеется точность 16-битового целого числа.
Таблица 45
Необходимая длина слова для различия мантиссы
(когда acf_mantissa[c] равняется 0)
6.9.3.2.4 Различия мантиссы (когда acf_mantissa [c] не равно 0)
Если acf_mantissa [c] не 0, мантисса различия восстанавливается следующим способом.
Последовательность различий во фрейме упаковывается. У каждой выборки есть уникальная длина слова фактической информации, где длина определяется значением соответствующего целого числа. Каждое значение различия мантиссы D[c][n] восстанавливается следующим образом.
Поток битов для реконструкции значений различия разделяется на две части (часть A и часть B). Часть A содержит выборки, необходимые для кодирования всех 32 битов. Это выборки, для которых соответствующее усеченное целое число y равняется 0. Если усеченное целочисленное значение является нулем, получаются исходные данные с плавающей точкой.
Если partA_flag [c] равняется 0, все значения в части A являются нулями или в части A нет никаких выборок. Когда partA_flag [c] не является нулем, в части A есть выборки, и compressed_flag должен быть считан. Если compressed_flag [c] равняется 0, все потоки битов упаковываются несжатые. Если compressed_flag [c] равняется 1, выборки части A сжимаются, используя схему сжатия Masked-LZ. В этом случае для потока битов в части A применяется распаковка Masked-LZ.
Часть B содержит выборки, для которых соответствующее усеченное целое число y не равно 0. compressed_flag [c] для части B должно быть считано до декодирования потока битов в части B. Если compressed_flag [c] равняется 0, поток битов упаковывается несжатым. Если compressed_flag [c] равняется 1, выборки части B сжимаются, используя схему сжатия Masked-LZ. В этом случае для потока битов в части B применяется распаковка Masked-LZ. Необходимые биты этих выборок различаются от 0 до 23 битов в зависимости от highest_byte [c], acf_mantissa [c] и соответствующего усеченного целого числа y.
Наибольшая длина в битах различия nbits[c][n], которое будет кодировано, определяется следующим образом
nbits[c][n] = min (word_length[c][n], highest_byte[c]*8),
где word_length[c][n] показано в таблице 46.
"highest_byte [c]" обозначает наибольшую длину байта всех значений мантиссы различия во фрейме. "highest_byte [c]" равно 0, если у исходных данных с плавающей точкой имеется точность 16-битного целого числа.
Таблица 46
Необходимая длина слова для различия мантиссы
(когда acf_mantissa[c] не равно 0)
6.9.3.2.5 Распаковка Masked-LZ
Сжатие Masked-LZ является видом, основанным на словаре схемы сжатия.
Это весьма подобно другим разновидностям сжатия Lempel-Ziv, таким как схема сжатия LZW, то есть существует словарь строк, которые встретились ранее. Ищется самая длинная строка соответствия входных символов, используя строку, сохраненную в словаре.
Диапазон code_bits меняется от 9 до 14 битов, так как индекс словаря кодируется как 9 - 15-битовый в зависимости от числа записей, сохраненных в словаре. Для синхронизации словаря в кодере и декодере используются коды Bump и код Flush (таблица 47). bump_code сначала устанавливается в 511 и увеличивается в зависимости от записей, хранящихся в словаре.
Декодер читает (code_bits) биты из потока битов и получают string_code. Когда string_code является FLUSH_CODE или MAX_CODE, словарь и переменные, связанные со словарем, должны быть повторно инициализированы начальными значениями (таблица 44). Когда string_code является FREEZE_CODE, декодер прекращает добавлять новые записи в словарь, пока он не встречается с фреймом произвольного доступа или не получает FLUSH_CODE.
Таблица 47
Алгоритм для распаковки Masked-LZ дается ниже.
// Masked-LZ decompression.
long n, i, readBits, string_code, last_string_code, charCode;
unsigned long dec_chars
last_string_code = -1;
for (dec_chars = 0; dec_chars < nchars;) {
readBits = inputCode( &string_code, code_bits);
if (string_code == FLUSH_CODE) || (string_code == MAX_CODE)) {
FlushDict();
last_string_code = -1;
}
else if (string_code == FREEZE_CODE) {
freeze_flag = 1;
}
else if (string_code == bump_code) {
code_bits++;
bump_code = bump_code * 2 + 1;
}
else {
if (string_code >= next_code) {
dec_chars += decodeString( &dec_buf[dec_chars], last_string_code, &charCode);
dec_chars += decodeString( &dec_buf[dec_chars], charCode, &charCode);
setNewEntryToDict(next_code, last_string_code, charCode);
next_code ++;
}
else {
dec_chars += decodeString(&dec_buf[dec_chars], string_code, &charCode);
if ((dec_chars <= nchars) && (last_string_code != -1) && (freeze_flag == 0)) {
setNewEntryToDict(next_code, last_string_code, charCode);
next_code ++;
}
}
last_string_code = string_code;
}
}
Примечание - Функция inputCode() читает число битов "code_bits" из закодированного потока битов и возвращает string_code. Функция decodeString() берет string_code в качестве входного значения и возвращает декодированную строку символов, связанную с string_code, путем поиска в словаре, число символов в декодируемой строке и код первого символа строки charCode. Функция setNewEntryToDict() берет last_string_code и charCode и устанавливает их в свободную запись словаря, представленную как next_code. Функция FlushDict() очищает все записи словаря и инициализирует связанные значения словаря. В вышеупомянутом псевдокоде "dec_buf" является буфером для сохранения декодируемых символов, а "nchars" является числом символов, которые должны декодироваться. В FlushDict() "code_bits" устанавливается в 9, "bump_code" устанавливается в 511 и "freeze_flag" устанавливается в 0.
После того, как входные символы декодируются из string_code, эти символы преобразовываются в значения различия мантиссы, D[c][n].
Если nbits[c][n], которое является размером слова символов, используемых в модуле Masked-LZ, не кратно 8, это означает, что на стороне кодера были добавлены фиктивные биты.
Дополнительные биты более, чем nbits[c][n], вырезаются (выбрасываются), используя следующий алгоритм:
// reconstruction of difference values from decoded characters.
long n, i, nbits_aligned;
unsigned long acc, j;
j = 0;
for (n = 0; n < frame_length; n++) {
if (!int_zero[c][n]) {
if (nbits[c][n] % 8) > 0)
nbits_aligned = 8 * ((unsigned int)(nbits[c][n]/8) + 1);
else
nbits_aligned = nbits[c][n];
acc = 0;
for (i = 0; i < nbits_aligned / 8; i++)
acc = (acc << 8) + dec_buf[j++];
acc >>= (nbits_aligned - nbits[c][n]); // throw away dummy bits added by the
encoder.
D[c][n] = acc;
}
}
Примечание - "int_zero" является истиной, если соответствующее усеченное целое число равно 0. "nbits[c][n]" является необходимой длиной слова для различия мантиссы. "dec_buf []" является буфером для сохранения декодируемых символов.
6.9.3.3 Реконструкция данных с плавающей точкой
6.9.3.3.1 Реконструкция данных с плавающей точкой (когда acf_mantissa [c] равно 0)
Усеченные целочисленные значения преобразовываются в 32-разрядные данные с плавающей запятой F[c][n] согласно определению 32-разрядного формата с плавающей точкой IEEE, с нормализацией с точки зрения максимального целочисленного значения (223)
F[c][n] = (float)(truncated_integer_value)*2-23
Поле экспоненты F[c][n] является shift_value[c], если shift_amp[c] равно 1.
Если целое число "0", кодированные данные с плавающей точкой используются как для окончательного результата. Иначе восстановленное значение различия мантиссы D[c][n] добавляется к мантиссе данных с плавающей точкой F[c][n], преобразованных из целочисленного значения. Нет никакой необходимости изменять ни знак, ни поле экспоненты F[c][n].
6.9.3.3.2 Реконструкция данных с плавающей точкой (когда acf_mantissa[c] не равно 0)
Усеченные целочисленные значения преобразовываются в 32-разрядные данные с плавающей точкой F[c][n] согласно определению 32-битового формата с плавающей точкой IEEE с нормализацией с точки зрения максимального целочисленного значения (223).
F[c][n] = (float)(truncated_integer_value)*2-23.
Полем экспоненты F[c][n] является shift_value [c], если shift_amp [c] равно 1.
Если целое число является "0", кодированные данные с плавающей точкой используются как для окончательного выхода. Иначе восстановленное значение различия мантиссы D[c][n] добавляется к мантиссе данных с плавающей точкой F[c][n], которая преобразовывается из целочисленного значения и умножается на общий множитель.
6.9.3.3.3 Умножение на общий сомножитель
После преобразования общий множитель A восстанавливается из acf_mantissa [c] и умножается на F[c][n], а результат устанавливается в F[c][n]. Вычислительная процедура умножения имеет следующий вид.
Шаг 1: Установка бита знака:
Знак результата является таким же, как знак F[c][n].
Шаг 2: Умножение мантиссы:
(acf_mantissa [c] | 0x0800000) умножается на (биты мантиссы F[c][n] | 0x0800000) в 64-битовом целочисленном регистре.
Шаг 3: Нормализация:
Результат 64-битового целочисленного умножения нормализуется до точности 23 бита.
Поскольку 1,0 <= (acf_mantissa [c] | 0x0800000)*2-23 (часть мантиссы F[c][n] | 0x0800000)*2-23 < 2,0, результат умножения находится в диапазоне [1, 4).
Следовательно, может понадобиться нормализация путем смещения на один бит вправо и приращения экспоненты.
Шаг 4: Округление:
Режим округления "округление до ближайшего, до четного, когда привязка" применяется к округлению нормализованной мантиссы результата.
6.9.3.3.4 Добавление значения различия мантиссы
После умножения восстановленное значение различия мантиссы D[c][n] добавляется к данным с плавающей точкой F[c][n], и результат устанавливается в F[c][n]. Вычислительная процедура дополнения следующая.
Шаг 1: Добавление мантиссы:
(D[c][n]), добавляется к (биты мантиссы F[c][n] | 0x0800000) в 32-разрядном целочисленном регистре.
Шаг 2: Нормализация:
Результат 32-битового целочисленного дополнения нормализуется до 23-битовой точности.
Поскольку (D[c][n])*2-23 < 1,0 и 1,0 <= (часть мантиссы F[c][n] | 0x0800000)*2-23 < 2,0, результат умножения находится в диапазоне [1, 3).
Следовательно, может понадобиться нормализация смещением на один бит вправо и наращиванием экспоненты.
Шаг 4: Усечение:
Округление для этого дополнения не требуется, потому что всякий раз, когда происходит смещение, LSB получающейся мантиссы равняется 0.
Вернуться в "Каталог нормативных документов"
Источник информации: https://internet-law.ru/documents/prod/gost-r_gosudarstvennyj-standart/37/gost_39951.html
На правах рекламы:
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||