Commit 5d09a050 authored by Manuel Jander's avatar Manuel Jander
Browse files

Improve change under switch NONBE_FIX_ISSUE_2206_TD_CHANNEL_EXTRAPOLATION. Fix...

Improve change under switch NONBE_FIX_ISSUE_2206_TD_CHANNEL_EXTRAPOLATION. Fix saturation/precision issue of LPC synthesis.
parent 077e7f34
Loading
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -305,8 +305,14 @@ static void stereo_td_channel_extrapolate_fx(
    move16();
    flag = E_LPC_lev_dur_fx( r_h, r_l, A, NULL, STEREO_DFT_CHANNEL_EXTR_LPC_ORDER, NULL );
#ifdef NONBE_FIX_ISSUE_2206_TD_CHANNEL_EXTRAPOLATION
    tmp = add( 2, sub( norm_s( A[0] ), norm_arr( A, STEREO_DFT_CHANNEL_EXTR_LPC_ORDER + 1 ) ) );
    scale_sig( A, STEREO_DFT_CHANNEL_EXTR_LPC_ORDER + 1, sub( norm_s( A[0] ), tmp ) );
    const Word16 headroom = sub( 0, norm_arr( A, STEREO_DFT_CHANNEL_EXTR_LPC_ORDER + 1 ) ); /* headroom to avoid saturation of LPC synthesis */
    Word16 q_A = sub( Q14, norm_s( A[0]) );
    Word16 q_residual = add( sub( q_shift, norm_s( A[0]) ), sub( 1, headroom ) );
    Word16 q_synthesis = sub( q_residual, 0 );
    scale_sig( A, STEREO_DFT_CHANNEL_EXTR_LPC_ORDER + 1, sub( 0, headroom ) );
    scale_sig( shift_input, input_frame, sub( s_min( q_shift, q_synthesis ), q_shift ) );
    scale_sig( shift_combined, add( input_frame, input_frame ), sub( s_min( q_shift, q_synthesis ), q_shift ) );
    q_shift = s_min( q_shift, q_synthesis );
#else
    Copy_Scale_sig( A, A, STEREO_DFT_CHANNEL_EXTR_LPC_ORDER + 1, sub( norm_s( A[0] ), 2 ) );
#endif
@@ -318,8 +324,11 @@ static void stereo_td_channel_extrapolate_fx(
    ELSE
    {
        /* get the residual */
#ifdef NONBE_FIX_ISSUE_2206_TD_CHANNEL_EXTRAPOLATION
        fir_fx( shift_combined + input_frame + size_ovl - itd_shift - STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT, A, residual, mem_zero, STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT, STEREO_DFT_CHANNEL_EXTR_LPC_ORDER, 0, sub( Q15, q_A ) );
#else
        fir_fx( shift_combined + input_frame + size_ovl - itd_shift - STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT, A, residual, mem_zero, STEREO_DFT_CHANNEL_EXTR_LPC_VEC_LIMIT, STEREO_DFT_CHANNEL_EXTR_LPC_ORDER, 0, 3 );

#endif
        /* extend the residual */
        /* to prevent out of bound reading */
        IF( LT_16( pitch_lag, PIT_MAX ) )
@@ -353,11 +362,7 @@ static void stereo_td_channel_extrapolate_fx(
        shift_input[i] = extract_h( L_mac0( L_mult0( g_lpc, shift_input[i] ), g, sts[leading_channel]->input_fx[i] ) ); // Q = 14 + q_shift - 16
        move16();
    }
#ifdef NONBE_FIX_ISSUE_2206_TD_CHANNEL_EXTRAPOLATION
    Word16 q_temp = sub( q_shift, tmp );
#else
    Word16 q_temp = sub( q_shift, 2 );
#endif

    /* smooth transition (currently done by blending over linearly, could be replaced by something more elaborate.) */
    Word16 e_shift = 0;