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 = ff_dot_productf(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 = ff_dot_productf(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.; 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 = ff_dot_productf(buffer, buffer, 5) * ((1<<24)/5.); sum = FFMAX(sum, 1); /* shift and store */ memmove(gain_block, gain_block + 1, 9 * sizeof(*gain_block)); gain_block[9] = 10 * log10(sum) - 32; ff_celp_lp_synthesis_filterf(block, ractx->sp_lpc, buffer, 5, 36); /* output */ for (i=0; i < 5; i++) block[i] = av_clipf(block[i], -4095./4096., 4095./4096.); }
static void convolve(float *tgt, const float *src, int len, int n) { for (; n >= 0; n--) tgt[n] = ff_dot_productf(src, src - n, len); }