Commit d021ed31 authored by Mohammadreza Naghibzadeh's avatar Mohammadreza Naghibzadeh
Browse files

Improve locally signal precision for LP analysis to preserve LSP accuracy in low-Q SCE path

parent 2ab72551
Loading
Loading
Loading
Loading
Loading
+29 −8
Original line number Diff line number Diff line
@@ -356,11 +356,7 @@ void pre_proc_front_ivas_fx(
    /* Take into account resampling memory for Q_min, and 1 bit headroom for resampling overshoot. */
    IF( NE_32( input_Fs, INT_FS_12k8 ) )
    {
#ifdef FIX_BASOP_2517_CLICK_IN_OMASA_LTV
        Q_min = s_min( Q_min, add( st->mem_q, norm_arr( st->mem_decim_fx_q_inp, 2 * L_FILT_MAX ) ) );
#else
        Q_min = sub( s_min( Q_min, add( st->mem_q, norm_arr( st->mem_decim_fx_q_inp, 2 * L_FILT_MAX ) ) ), Q1 );
#endif
    }
#endif
    /* Limit Q_min to avoid rescale larger than 15 against Q-1 */
@@ -495,11 +491,7 @@ void pre_proc_front_ivas_fx(
    {
        new_inp_out_size = modify_Fs_fx( signal_in_fx, input_frame, input_Fs, new_inp_12k8_fx, INT_FS_12k8, st->mem_decim_fx_q_inp, ( st->max_bwidth == NB ), &Q_new_inp, &mem_decim_size ); /* st->q_inp */
#ifdef NONBE_FIX_ISSUE_2206
#ifdef FIX_BASOP_2517_CLICK_IN_OMASA_LTV
        Scale_sig( new_inp_12k8_fx, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to st->q_inp*/
#else
        scale_sig( new_inp_12k8_fx, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to st->q_inp*/
#endif
#else
        Scale_sig( new_inp_12k8_fx, new_inp_out_size, negate( Q_new_inp ) ); /* scaling back to st->q_inp*/
        st->mem_q = st->q_inp;
@@ -1161,7 +1153,36 @@ void pre_proc_front_ivas_fx(
        move16();
    }

#ifdef FIX_BASOP_2517_CLICK_IN_OMASA_LTV
    Word16 inp_local[L_INP_12k8];
    Word16 offset = (Word16) ( inp_12k8_fx - old_inp_12k8_fx );
    Word16 norm_inp = norm_arr( old_inp_12k8_fx, L_INP_12k8 );
    Word16 Q_local;

    IF( GT_16( norm_inp, 0 ) )
    {
        Copy_Scale_sig( old_inp_12k8_fx, inp_local, L_INP_12k8, norm_inp );
        Q_local = add( *Q_new, norm_inp );
        analy_lp_fx( inp_local + offset, L_FRAME, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, element_mode, i, Q_local, Q_r );
        IF( ener_fx != NULL )
        {
            Word16 ener_shift = shl( norm_inp, 1 );
            IF( ener_shift > 0 )
            {
                ener_fx[0] = L_shr_sat( ener_fx[0], ener_shift );
                move32();
            }
        }
        Q_r[0] = sub( Q_r[0], shl( norm_inp, 1 ) );
        move16();
    }
    ELSE
    {
        analy_lp_fx( inp_12k8_fx, L_FRAME, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, element_mode, i, *Q_new, Q_r );
    }
#else
    analy_lp_fx( inp_12k8_fx, L_FRAME, L_look, ener_fx, A_fx, epsP_h, epsP_l, lsp_new_fx, lsp_mid_fx, st->lsp_old1_fx, alw_pitch_lag_12k8, alw_voicing_fx, INT_FS_12k8, element_mode, i, *Q_new, Q_r );
#endif

    FOR( Word16 idx = 0; idx < M + 1; idx++ )
    {