80
Процесс декодирования для одного канала может быть описан следующим псевдокодом:
/* Декодирование TN S для одного канала и фрейма */ 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);
tnsorder = min (order [w] [f], TNSMAXORDER);
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)
{