40 #define TNS_Q_BITS_IS8 4
43 #define TNS_ENABLE_COEF_COMPRESSION
47 #define TNS_PREDGAIN_GATE 1.4f
48 #define TNS_PG_C1_LONG 1.4f
49 #define TNS_PG_C1_SHORT 3.2f
50 #define TNS_PG_CLAMP 6.0f
51 #define TNS_WEIGHT_FLOOR 0.01f
56 const int low_idx = c_bits ? 4 : 2;
57 const int shift_val = c_bits ? 8 : 4;
58 const int high_idx = c_bits ? 11 : 5;
59 #ifndef TNS_ENABLE_COEF_COMPRESSION
62 for (
i = 0;
i < order;
i++)
63 if (coef[
i] >= low_idx && coef[
i] <= high_idx)
65 for (
i = 0;
i < order;
i++)
66 coef[
i] -= (coef[
i] > high_idx) ? shift_val : 0;
74 int i,
w,
filt, coef_compress = 0, coef_len;
95 coef_len = c_bits + 3 - coef_compress;
106 for (
int g = 0;
g < mmm;
g++)
116 int w,
filt, m,
i, top, order, bottom, start, end,
size,
inc;
122 memcpy(hist, sce->
coeffs,
sizeof(hist));
138 e0 =
FFMIN( top, mmm);
141 if ((
size = end - start) <= 0)
152 for (m = 0; m <
size; m++, start +=
inc) {
153 for (
i = 1;
i <=
FFMIN(m, order);
i++) {
154 sce->
coeffs[start] += lpc[
i-1]*hist[start -
i*
inc];
170 for (
i = 0;
i < order;
i++) {
172 lpc[
i] = quant_arr[idx[
i]];
190 FFPsyBand *
const psy_bands = &
s->psy.ch[
s->cur_channel].psy_bands[0];
192 memset(tns, 0,
sizeof(*tns));
193 if (sfb_end - sfb_start <= 0)
197 const int clen = c_hi - c_lo;
210 for (
int w2 = 0; w2 < gl; w2++) {
212 float maxrms = 0.0f, floorrms;
213 for (
int g = sfb_start;
g < sfb_end;
g++) {
216 maxrms =
FFMAX(maxrms, rms);
219 for (
int g = sfb_start;
g < sfb_end;
g++) {
222 float wgt = 1.0f /
FFMAX(rms, floorrms);
223 for (
int k = s0; k < s1; k++)
224 pooled[w2*clen + (k - c_lo)] = sce->
coeffs[
w*128 + k] * wgt;
231 for (
int i = 0;
i < ord_g;
i++)
232 coefs[
i] = -coefs[
i];
239 for (
int w2 = 0; w2 < gl; w2++) {
240 const float *msrc = pooled + w2*clen;
241 float orig_e = 0.0f, filt_e = 0.0f;
242 for (
int m = 0; m < clen; m++) {
244 for (
int i = 1;
i <=
FFMIN(m, ord_g);
i++)
245 acc += lpc_q[
i-1] * msrc[m -
i];
246 orig_e += msrc[m]*msrc[m];
254 int in_run =
s->nmr ?
s->nmr->prev_was_short : 0;
255 int prev_on =
s->nmr ?
s->nmr->tns8_prev[
s->cur_channel & 15] : 0;
256 float bar =
TNS_PG_C1_SHORT * (!in_run ? 1.0f : prev_on ? 0.5f : 1.8f);
262 for (
int w2 = 0; w2 < gl; w2++) {
265 tns->
length[
w][0] = sfb_end - sfb_start;
270 memcpy(tns->
coef[
w][0], tns->
coef[wh][0],
sizeof(tns->
coef[
w][0]));
278 s->nmr->tns8_prev[
s->cur_channel & 15] = !!count;
290 const int order = is8 ? 7 : 12;
293 const int sfb_len = sfb_end - sfb_start;
296 const int ord_g = order / n_filt;
301 FFPsyBand *
const psy_bands = &
s->psy.ch[
s->cur_channel].psy_bands[0];
303 if (coef_len <= 0 || sfb_len <= 0) {
314 const int tlen = is8 ? 256 : 2048;
316 float mgain[8] = {0};
324 const float *tw = sce->
ret_buf +
w*tlen;
325 float e_early = 0.0f, e_late = 0.0f;
327 for (ti = 0; ti < tlen/2; ti++)
328 e_early += tw[ti]*tw[ti];
329 for (; ti < tlen; ti++)
330 e_late += tw[ti]*tw[ti];
331 const int tdir = e_early > e_late;
340 int len_sfb = (
filt == n_filt - 1) ? sfb_len -
filt*(sfb_len/n_filt)
342 int bot_sfb =
FFMAX(0, top_sfb - len_sfb);
343 int g_lo =
FFMIN(bot_sfb, mmm), g_hi =
FFMIN(top_sfb, mmm);
346 int clen = c_hi - c_lo;
347 const int dir = slant != 2 ? slant : tdir;
348 float gain, orig_e = 0.0f, filt_e = 0.0f;
349 int m,
i,
g,
inc, st;
361 float maxrms = 0.0f, floorrms;
363 for (
g = g_lo;
g < g_hi;
g++) {
365 float rms =
sqrtf(
FFMAX(psy_bands[
w*16 +
g].threshold, 0.0
f) /
367 maxrms =
FFMAX(maxrms, rms);
370 for (
g = g_lo;
g < g_hi;
g++) {
372 float rms =
sqrtf(
FFMAX(psy_bands[
w*16 +
g].threshold, 0.0
f) /
374 float wgt = 1.0f /
FFMAX(rms, floorrms);
375 for (k = s0; k < s1; k++)
376 wspec[k - c_lo] = sce->
coeffs[
w*128 + k] * wgt;
387 for (
i = 0;
i < ord_g;
i++)
388 coefs[
i] = -coefs[
i];
396 const float *msrc = wspec;
398 st = dir ? clen - 1 : 0;
399 for (m = 0; m < clen; m++) {
400 int idx = st + m*
inc;
401 float acc = msrc[idx];
402 for (
i = 1;
i <=
FFMIN(m, ord_g);
i++)
403 acc += lpc_q[
i-1] * msrc[idx -
i*
inc];
406 for (m = 0; m < clen; m++) {
407 orig_e += msrc[m]*msrc[m];
410 filt_e =
FFMAX(filt_e, 1e-9
f);
413 if (orig_e <
c1*filt_e)
418 mgain[
w] = orig_e / filt_e;
421 tns->
n_filt[
w] = any ? n_filt : 0;
429 const float gspread = 2.0f;
433 float gmin = FLT_MAX, gmax = 0.0f;
434 for (
int w2 =
w; w2 <
w + gl; w2++) {
435 if (!tns->
n_filt[w2] || mgain[w2] <= 0.0f) { drop = 1;
break; }
436 gmin =
FFMIN(gmin, mgain[w2]);
437 gmax =
FFMAX(gmax, mgain[w2]);
439 if (!drop && gmax > gspread * gmin)
441 for (
int w2 =
w; w2 <
w + gl; w2++) {
444 for (
int f2 = 0; f2 < n_filt; f2++)
445 tns->
order[w2][f2] = 0;
446 }
else if (tns->
n_filt[w2]) {