/** * Backward synthesis filter, find the LPC coefficients from past speech data. */ static void backward_filter(float *hist, float *rec, const float *window, float *lpc, const float *tab, int order, int n, int non_rec, int move_size) { float temp[MAX_BACKWARD_FILTER_ORDER+1]; do_hybrid_window(order, n, non_rec, temp, hist, rec, window); if (!compute_lpc_coefs(temp, order, lpc, 0, 1, 1)) apply_window(lpc, lpc, tab, order); memmove(hist, hist + n, move_size*sizeof(*hist)); }
/** * Backward synthesis filter, find the LPC coefficients from past speech data. */ static void backward_filter(RA288Context *ractx, float *hist, float *rec, const float *window, float *lpc, const float *tab, int order, int n, int non_rec, int move_size) { float temp[MAX_BACKWARD_FILTER_ORDER+1]; do_hybrid_window(ractx, order, n, non_rec, temp, hist, rec, window); if (!compute_lpc_coefs(temp, order, lpc, 0, 1, 1)) ractx->fdsp->vector_fmul(lpc, lpc, tab, FFALIGN(order, 16)); memmove(hist, hist + n, move_size*sizeof(*hist)); }
/** * Backward synthesis filter, find the LPC coefficients from past speech data. */ static void backward_filter(float *hist, float *rec, const float *window, float *lpc, const float *tab, int order, int n, int non_rec, int move_size) { #if __STDC_VERSION__ >= 199901L float temp[order+1]; #else float *temp = _alloca((order + 1) * sizeof(float)); #endif do_hybrid_window(order, n, non_rec, temp, hist, rec, window); if (!compute_lpc_coefs(temp, order, lpc, 0, 1, 1)) apply_window(lpc, lpc, tab, order); memmove(hist, hist + n, move_size*sizeof(*hist)); }
/** * Backward synthesis filter, find the LPC coefficients from past speech data. */ static void backward_filter(float *hist, float *rec, const float *window, float *lpc, const float *tab, int order, int n, int non_rec, int move_size) { #ifndef _MSC_VER float temp[order+1]; #else float *temp = av_malloc_items(order + 1, float); #endif do_hybrid_window(order, n, non_rec, temp, hist, rec, window); if (!compute_lpc_coefs(temp, order, lpc, 0, 1, 1)) apply_window(lpc, lpc, tab, order); memmove(hist, hist + n, move_size*sizeof(*hist)); #ifdef _MSC_VER av_free(temp); #endif }
/* Apply TNS filter */ void ff_aac_apply_tns(AACEncContext *s, SingleChannelElement *sce) { TemporalNoiseShaping *tns = &sce->tns; IndividualChannelStream *ics = &sce->ics; int w, filt, m, i, top, order, bottom, start, end, size, inc; const int mmm = FFMIN(ics->tns_max_bands, ics->max_sfb); float lpc[TNS_MAX_ORDER]; for (w = 0; w < ics->num_windows; w++) { bottom = ics->num_swb; for (filt = 0; filt < tns->n_filt[w]; filt++) { top = bottom; bottom = FFMAX(0, top - tns->length[w][filt]); order = tns->order[w][filt]; if (order == 0) continue; // tns_decode_coef compute_lpc_coefs(tns->coef[w][filt], order, lpc, 0, 0, 0); start = ics->swb_offset[FFMIN(bottom, mmm)]; end = ics->swb_offset[FFMIN( top, mmm)]; if ((size = end - start) <= 0) continue; if (tns->direction[w][filt]) { inc = -1; start = end - 1; } else { inc = 1; } start += w * 128; // ar filter for (m = 0; m < size; m++, start += inc) for (i = 1; i <= FFMIN(m, order); i++) sce->coeffs[start] += lpc[i-1]*sce->pcoeffs[start - i*inc]; } } }