/** * Floating point version of ff_acelp_decode_gain_code(). */ static float acelp_decode_gain_codef(float gain_corr_factor, const float *fc_v, float mr_energy, const float *quant_energy, const float *ma_prediction_coeff, int subframe_size, int ma_pred_order) { mr_energy += avpriv_scalarproduct_float_c(quant_energy, ma_prediction_coeff, ma_pred_order); mr_energy = gain_corr_factor * exp(M_LN10 / 20. * mr_energy) / sqrt((0.01 + avpriv_scalarproduct_float_c(fc_v, fc_v, subframe_size))); return mr_energy; }
void ff_scale_vector_to_given_sum_of_squares(float *out, const float *in, float sum_of_squares, const int n) { int i; float scalefactor = avpriv_scalarproduct_float_c(in, in, n); if (scalefactor) scalefactor = sqrt(sum_of_squares / scalefactor); for (i = 0; i < n; i++) out[i] = in[i] * scalefactor; }
void ff_adaptive_gain_control(float *out, const float *in, float speech_energ, int size, float alpha, float *gain_mem) { int i; float postfilter_energ = avpriv_scalarproduct_float_c(in, in, size); float gain_scale_factor = 1.0; float mem = *gain_mem; if (postfilter_energ) gain_scale_factor = sqrt(speech_energ / postfilter_energ); gain_scale_factor *= 1.0 - alpha; for (i = 0; i < size; i++) { mem = alpha * mem + gain_scale_factor; out[i] = in[i] * mem; } *gain_mem = mem; }
static void decode(RA288Context *ractx, float gain, int cb_coef) { int i; double sumsum; float sum, buffer[5]; float *block = ractx->sp_hist + 70 + 36; // current block float *gain_block = ractx->gain_hist + 28; memmove(ractx->sp_hist + 70, ractx->sp_hist + 75, 36*sizeof(*block)); /* block 46 of G.728 spec */ sum = 32.0; for (i=0; i < 10; i++) sum -= gain_block[9-i] * ractx->gain_lpc[i]; /* block 47 of G.728 spec */ sum = av_clipf(sum, 0, 60); /* block 48 of G.728 spec */ /* exp(sum * 0.1151292546497) == pow(10.0,sum/20) */ sumsum = exp(sum * 0.1151292546497) * gain * (1.0/(1<<23)); for (i=0; i < 5; i++) buffer[i] = codetable[cb_coef][i] * sumsum; sum = avpriv_scalarproduct_float_c(buffer, buffer, 5); sum = FFMAX(sum, 5.0 / (1<<24)); /* shift and store */ memmove(gain_block, gain_block + 1, 9 * sizeof(*gain_block)); gain_block[9] = 10 * log10(sum) + (10*log10(((1<<24)/5.)) - 32); ff_celp_lp_synthesis_filterf(block, ractx->sp_lpc, buffer, 5, 36); }
static void convolve(float *tgt, const float *src, int len, int n) { for (; n >= 0; n--) tgt[n] = avpriv_scalarproduct_float_c(src, src - n, len); }