[soc]: r4164 - amr/amrnbfloatdec.c
Author: kmalaussene Date: Wed Mar 4 22:35:32 2009 New Revision: 4164 Log: Move smoothing of fixed gain into its own function fixed_gain_smooth. Modified: amr/amrnbfloatdec.c Modified: amr/amrnbfloatdec.c ============================================================================== --- amr/amrnbfloatdec.c Wed Mar 4 21:25:29 2009 (r4163) +++ amr/amrnbfloatdec.c Wed Mar 4 22:35:32 2009 (r4164) @@ -685,6 +685,44 @@ static float fixed_gain_prediction(float } /** + * fixed gain smoothing + * + * @param p the context + * @param lsp lsp coefficients for the current subframe + * @param lsp_avg averaged lsp coefficients + * + * @return fixed gain smoothed + */ + +static float fixed_gain_smooth(AMRContext *p , const float *lsp, const float *lsp_avg) { + float diff = 0.0; + float smoothing_factor = 0.0; + int i; + + for(i=0; i<LP_FILTER_ORDER; i++) { + // calculate diff + diff += fabs(lsp_avg[i]-lsp[i])/lsp_avg[i]; + } + + // if diff has been >0.65 for 10 frames (40 subframes) no smoothing is applied + if(diff > 0.65) { + p->diff_count++; + }else { + p->diff_count = 0; + } + + if(p->diff_count < 40) { + float fixed_gain_mean; + // calculate the fixed gain smoothing factor (k_m) + smoothing_factor = FFMIN(0.25, FFMAX(0.0, diff - 0.4))/0.25; + // calculate the mean fixed gain for the current subframe + fixed_gain_mean = (p->fixed_gain[0] + p->fixed_gain[1] + p->fixed_gain[2] + p->fixed_gain[3] + p->fixed_gain[4])/5.0; + // calculate the smoothed fixed gain + p->fixed_gain[4] = smoothing_factor*p->fixed_gain[4] + (1.0 - smoothing_factor)*fixed_gain_mean; + } + return p->fixed_gain[4]; +} +/** * Decode fixed and pitch gains. * * @param p the context @@ -941,32 +979,8 @@ static int amrnb_decode_frame(AVCodecCon } // smooth fixed gain - if(p->cur_frame_mode < MODE_74 || p->cur_frame_mode == MODE_102) { - float diff = 0.0; - float smoothing_factor = 0.0; - - for(i=0; i<LP_FILTER_ORDER; i++) { - // calculate diff - diff += fabs(p->lsp_avg[i]-p->lsp[subframe][i])/p->lsp_avg[i]; - } - - // if diff has been >0.65 for 10 frames (40 subframes) no smoothing is applied - if(diff > 0.65) { - p->diff_count++; - }else { - p->diff_count = 0; - } - - if(p->diff_count < 40) { - float fixed_gain_mean; - // calculate the fixed gain smoothing factor (k_m) - smoothing_factor = FFMIN(0.25, FFMAX(0.0, diff - 0.4))/0.25; - // calculate the mean fixed gain for the current subframe - fixed_gain_mean = (p->fixed_gain[0] + p->fixed_gain[1] + p->fixed_gain[2] + p->fixed_gain[3] + p->fixed_gain[4])/5.0; - // calculate the smoothed fixed gain - p->fixed_gain[4] = smoothing_factor*p->fixed_gain[4] + (1.0 - smoothing_factor)*fixed_gain_mean; - } - } + if(p->cur_frame_mode < MODE_74 || p->cur_frame_mode == MODE_102) + p->fixed_gain[4] = fixed_gain_smooth(p, p->lsp[subframe], p->lsp_avg); apply_ir_filter(p, p->fixed_vector);
participants (1)
-
kmalaussene