147
масштабные коэффициенты могут быть вычислены согласно этому псевдокоду:
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 :
x_quant(i) = int ((mdct_scaled (i) * 2л (-3/16 * common_scalefac))
+ MAGIC_NUMBER)
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 + quant izer_change;
else
common_scalefac = common_scalefac - quantizer_change;
end if
quantizer_change = int (quantizer_change /2);