static void decode_lsp(TwinVQContext *tctx, int lpc_idx1, uint8_t *lpc_idx2, int lpc_hist_idx, float *lsp, float *hist) { const TwinVQModeTab *mtab = tctx->mtab; int i, j; const float *cb = mtab->lspcodebook; const float *cb2 = cb + (1 << mtab->lsp_bit1) * mtab->n_lsp; const float *cb3 = cb2 + (1 << mtab->lsp_bit2) * mtab->n_lsp; const int8_t funny_rounding[4] = { -2, mtab->lsp_split == 4 ? -2 : 1, mtab->lsp_split == 4 ? -2 : 1, 0 }; j = 0; for (i = 0; i < mtab->lsp_split; i++) { int chunk_end = ((i + 1) * mtab->n_lsp + funny_rounding[i]) / mtab->lsp_split; for (; j < chunk_end; j++) lsp[j] = cb[lpc_idx1 * mtab->n_lsp + j] + cb2[lpc_idx2[i] * mtab->n_lsp + j]; } rearrange_lsp(mtab->n_lsp, lsp, 0.0001); for (i = 0; i < mtab->n_lsp; i++) { float tmp1 = 1.0 - cb3[lpc_hist_idx * mtab->n_lsp + i]; float tmp2 = hist[i] * cb3[lpc_hist_idx * mtab->n_lsp + i]; hist[i] = lsp[i]; lsp[i] = lsp[i] * tmp1 + tmp2; } rearrange_lsp(mtab->n_lsp, lsp, 0.0001); rearrange_lsp(mtab->n_lsp, lsp, 0.000095); ff_sort_nearly_sorted_floats(lsp, mtab->n_lsp); }
static void lsf_decode_fp(float *lsfnew, float *lsf_history, const SiprParameters *parm) { int i; float lsf_tmp[LP_FILTER_ORDER]; dequant(lsf_tmp, parm->vq_indexes, lsf_codebooks); for (i = 0; i < LP_FILTER_ORDER; i++) lsfnew[i] = lsf_history[i] * 0.33 + lsf_tmp[i] + mean_lsf[i]; ff_sort_nearly_sorted_floats(lsfnew, LP_FILTER_ORDER - 1); /* Note that a minimum distance is not enforced between the last value and the previous one, contrary to what is done in ff_acelp_reorder_lsf() */ ff_set_min_dist_lsf(lsfnew, LSFQ_DIFF_MIN, LP_FILTER_ORDER - 1); lsfnew[9] = FFMIN(lsfnew[LP_FILTER_ORDER - 1], 1.3 * M_PI); memcpy(lsf_history, lsf_tmp, LP_FILTER_ORDER * sizeof(*lsf_history)); for (i = 0; i < LP_FILTER_ORDER - 1; i++) lsfnew[i] = cos(lsfnew[i]); lsfnew[LP_FILTER_ORDER - 1] *= 6.153848 / M_PI; }