# HG changeset patch # User reynaldo # Date 1239068357 0 # Node ID 70c3982d0bad92978fb9e94f1e019a03e7f51657 # Parent 03fd7ea4926bf3438a099cd2a3743ddcc83b9cfc Move scale factor computation to its own function. Patch by Kenan Gillet. diff -r 03fd7ea4926b -r 70c3982d0bad qcelpdec.c --- a/qcelpdec.c Mon Apr 06 21:45:02 2009 +0000 +++ b/qcelpdec.c Tue Apr 07 01:39:17 2009 +0000 @@ -412,17 +412,38 @@ } /** + * Compute the gain control + * + * @param v_in gain-controlled vector + * @param v_ref vector to control gain of + * + * @return gain control + * + * FIXME: If v_ref is a zero vector, it energy is zero + * and the behavior of the gain control is + * undefined in the specs. + * + * TIA/EIA/IS-733 2.4.8.3-2/3/4/5, 2.4.8.6 + */ +static float compute_gain_ctrl(const float *v_ref, const float *v_in, const int len) +{ + float scalefactor = ff_dot_productf(v_in, v_in, len); + + if(scalefactor) + scalefactor = sqrt(ff_dot_productf(v_ref, v_ref, len) / scalefactor); + else + ff_log_missing_feature(NULL, "Zero energy for gain control", 1); + return scalefactor; +} + +/** * Apply generic gain control. * * @param v_out output vector * @param v_in gain-controlled vector * @param v_ref vector to control gain of * - * FIXME: If v_ref is a zero vector, it energy is zero - * and the behavior of the gain control is - * undefined in the specs. - * - * TIA/EIA/IS-733 2.4.8.3-2/3/4/5, 2.4.8.6 + * TIA/EIA/IS-733 2.4.8.3, 2.4.8.6 */ static void apply_gain_ctrl(float *v_out, const float *v_ref, const float *v_in) @@ -432,12 +453,7 @@ for(i=0, j=0; i<4; i++) { - scalefactor = ff_dot_productf(v_in + j, v_in + j, 40); - if(scalefactor) - scalefactor = sqrt(ff_dot_productf(v_ref + j, v_ref + j, 40) - / scalefactor); - else - ff_log_missing_feature(NULL, "Zero energy for gain control", 1); + scalefactor = compute_gain_ctrl(v_ref + j, v_in + j, 40); for(len=j+40; j