[soc]: r4084 - amr/amrnbfloatdec.c
Author: kmalaussene Date: Thu Feb 19 03:25:35 2009 New Revision: 4084 Log: Extract function ff_apply_gain_ctrl that could be reused by the QCELP decoder and other celp codecs. Modified: amr/amrnbfloatdec.c Modified: amr/amrnbfloatdec.c ============================================================================== --- amr/amrnbfloatdec.c Wed Feb 18 01:28:12 2009 (r4083) +++ amr/amrnbfloatdec.c Thu Feb 19 03:25:35 2009 (r4084) @@ -95,6 +95,35 @@ static void weighted_vector_sumf(float * + weight_coeff_b * in_b[i]; } +/** + * @note this function should be moved to acelp_vectors.[ch] + * and used in qcelpdec.c + * + * Apply adaptive gain control by gain scaling. + * + * @param v_out output vector + * @param v_in gain-controlled vector + * @param v_ref vector to control gain of + * @param length vectors length + * + * 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 + */ +void ff_apply_gain_ctrl(float *v_out, const float *v_ref, const float *v_in, const int length) +{ + int i; + float scalefactor = ff_dot_productf(v_in, v_in, length); + if(scalefactor) + scalefactor = sqrt(ff_dot_productf(v_ref, v_ref, length) / scalefactor); + else + ff_log_missing_feature(NULL, "Zero energy for gain control", 1); + for(i=0; i<length; i++) + v_out[i] = scalefactor * v_in[i]; +} + static void reset_state(AMRContext *p) { int i; @@ -806,21 +835,14 @@ static int synthesis(AMRContext *p, floa if(p->pitch_gain[4] > 0.5 && !overflow) { float excitation_temp[AMR_SUBFRAME_SIZE]; float pitch_factor = (p->cur_frame_mode == MODE_122 ? 0.25 : 0.5)*p->beta*p->pitch_gain[4]; - float eta, temp1 = 0.0, temp2 = 0.0; for(i=0; i<AMR_SUBFRAME_SIZE; i++) { // emphasize pitch vector contribution excitation_temp[i] = excitation[i] + pitch_factor*p->pitch_vector[i]; - // find gain scale - temp1 += excitation[i]*excitation[i]; - temp2 += excitation_temp[i]*excitation_temp[i]; } // adaptive gain control by gain scaling - eta = sqrt(temp1/temp2); - for(i=0; i<AMR_SUBFRAME_SIZE; i++) { - excitation[i] = eta*excitation_temp[i]; - } + ff_apply_gain_ctrl(excitation, excitation, excitation_temp, AMR_SUBFRAME_SIZE); } for(i=0; i<AMR_SUBFRAME_SIZE; i++) {
On Thu, Feb 19, 2009 at 03:25:35AM +0100, kmalaussene wrote:
Log: Extract function ff_apply_gain_ctrl that could be reused by the QCELP decoder and other celp codecs.
Maybe you could extract these parts and submit them for review right away... Diego
On Feb 19, 2009, at 1:20 AM, Diego Biurrun wrote:
On Thu, Feb 19, 2009 at 03:25:35AM +0100, kmalaussene wrote:
Log: Extract function ff_apply_gain_ctrl that could be reused by the QCELP decoder and other celp codecs.
Maybe you could extract these parts and submit them for review right away...
thanks, will do Kenan
participants (3)
-
Diego Biurrun -
Kenan Gillet -
kmalaussene