ГОСТ Р 54713—2011
Процессдекодирования для одного канала может быть описан следующим псевдокодом:
Г Декодирование TNS для одного канала и фрейма 7
tns_docode_frame 0
{
for(w = 0; и/ <num_windows: w +♦) {
bottom = num_swb;
for (f = 0; f <n_filt [wj; 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_ordor. coef_res [w] +3. coef_compress [w] [f]. coef[w][f). lpc[]);
start = swb_offset [min (bottom. TNS_MAX_BANDS. max_sfb)J;
end = swb_offset [min (top. TNS_MAX_BANDS. max_sfbjj;
if ((sizop =end - start) <= 0) continue.
if (direction [w][f]) {
inc = -1:
start = end - 1;
} else {
inc = 1;
}
tns_ar_filter (&spec [v/] [start], size. inc. Ipc [J. tns_order):
}
Следует учесть, что этот псевдокод использует С-иитерпретацию массивов и векторов, т. е. если
coef[w] [filt] [i] описывает коэффициенты для всех окон и фильтров, coef[w] [filt] является указателем на
коэффициенты одного определенного окна и фильтра. Кроме того, коэффициент идентификатора использу
ется в качестве формального параметра в функции tns_decode_coefО-
Г Декодирование переданных коэффициентов для одного фильтра TNS */
tns_decode_coef (order. coef_res bits. coef_compress. coef[J.a[J)
{
’
/* Некоторые внутренние таблицы ’
/sgn_mask [) = {0x2. 0x4. 0x8};
neg_mask [] = (-0x3. -0x7. -Oxf};
Г размер, используемый для передачи *I
coef_res2 = coef_res_bits - coef_compross:
s_mask = sgn_mask [coef_res2 - 2]; Г маска для бита знака 7
n_mask = neg_mask [coef_res2 - 2);
Гмаска для того, чтобы дополнить отрицательные значения 7
Г Преобразование в целое число со знаком 7
for(i - 0; i <order; i +*)
tmp [I] = (coef [i] & s_mask)? (coef[i] | n_mask);coef[i]:
Г Обратное квантование 7
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 [ij = sin (tmp [i]/((tm p [i}> -0 )? iqfac; iqfac_m));}
Г Преобразование в коэффициенты LPC 7
a[0J=1;
for (m = 1; m <= order; m ++) {
for (i = 1; i <m. i +*) {
b PJ= p] * tmp2 [m-1] * [m-i);
for (i = 1; i <m, i +*) {
a[mj = tmp2 [m-1);
}
tns_ar_filter (spectrum [). size. inc. Ipc [ ]. order)
{
75