Commit 739f1958 authored by Sandesh Venkatesh's avatar Sandesh Venkatesh Committed by Manuel Jander
Browse files

Fix for 3GPP issue 1407: BASOP encoder: Distortion Stereo DTX 24.4 kbps, high MLD

Link #1407
parent a516ef99
Loading
Loading
Loading
Loading
+25 −28
Original line number Diff line number Diff line
@@ -127,6 +127,7 @@ ivas_error ivas_cpe_enc_fx(
    Word16 e_old_wsp[CPE_CHANNELS], q_old_wsp;
    move16(); // Q_new
    move16(); // Q_new
    Word16 q_com;

    error = IVAS_ERR_OK;
    move32();
@@ -649,35 +650,31 @@ ivas_error ivas_cpe_enc_fx(
        hCPE->hStereoDft->Spd_R_smooth_fx_e = sub( hCPE->hStereoDft->Spd_R_smooth_fx_e, temp );
        move16();

        shift = getScaleFactor16( sts[1]->old_input_signal_fx, input_frame );
        Scale_sig( sts[1]->old_input_signal_fx, input_frame, shift ); /* sts[1]->q_old_inp + shift */
        sts[1]->q_old_inp = add( sts[1]->q_old_inp, shift );
        move16();
        shift = getScaleFactor16( sts[1]->input_fx, input_frame );
        Copy_Scale_sig_32_16( sts[1]->input32_fx, sts[1]->input_fx, input_frame, sub( add( sts[1]->q_inp, shift ), sts[1]->q_inp32 ) ); /* sts[1]->q_inp + shift */
        sts[1]->q_inp = add( sts[1]->q_inp, shift );
        move16();
        Scale_sig( sts[1]->input_fx, input_frame, sub( s_min( sts[1]->q_inp, sts[1]->q_old_inp ), sts[1]->q_inp ) );                /* min( sts[1]->q_inp, sts[1]->q_old_inp) */
        Scale_sig( sts[1]->old_input_signal_fx, input_frame, sub( s_min( sts[1]->q_old_inp, sts[1]->q_inp ), sts[1]->q_old_inp ) ); /* min( sts[1]->q_old_inp, sts[1]->q_inp) */
        sts[1]->q_inp = s_min( sts[1]->q_inp, sts[1]->q_old_inp );
        move16();
        sts[1]->q_old_inp = sts[1]->q_inp;
        move16();

        shift = getScaleFactor16( sts[0]->old_input_signal_fx, input_frame );
        Scale_sig( sts[0]->old_input_signal_fx, input_frame, shift ); /* sts[0]->q_old_inp + shift */
        sts[0]->q_old_inp = add( sts[0]->q_old_inp, shift );
        FOR( n = 0; n < CPE_CHANNELS; n++ )
        {
            q_com = sub( add( L_norm_arr( sts[n]->input32_fx, input_frame ), sts[n]->q_inp32 ), 16 );
            q_com = s_min( q_com, add( norm_arr( sts[n]->old_input_signal_fx, input_frame ), sts[n]->q_old_inp ) );
            q_com = s_min( q_com, add( norm_arr( hCPE->input_mem_fx[n], hCPE->hStereoDft->dft_ovl ), hCPE->q_input_mem[n] ) );

            if ( EQ_16( q_com, Q15 ) )
            {
                q_com = 0;
                move16();
        shift = getScaleFactor16( sts[0]->input_fx, input_frame );
        Copy_Scale_sig_32_16( sts[0]->input32_fx, sts[0]->input_fx, input_frame, sub( add( sts[0]->q_inp, shift ), sts[0]->q_inp32 ) ); /* sts[0]->q_inp + shift */
        sts[0]->q_inp = add( sts[0]->q_inp, shift );
            }

            Copy_Scale_sig_32_16( sts[n]->input32_fx, sts[n]->input_fx, input_frame, sub( q_com, sts[n]->q_inp32 ) );
            sts[n]->q_inp = q_com;
            move16();
        Scale_sig( sts[0]->input_fx, input_frame, sub( s_min( sts[0]->q_inp, sts[0]->q_old_inp ), sts[0]->q_inp ) );                /* min( sts[1]->q_inp, sts[1]->q_old_inp) */
        Scale_sig( sts[0]->old_input_signal_fx, input_frame, sub( s_min( sts[0]->q_old_inp, sts[0]->q_inp ), sts[0]->q_old_inp ) ); /* min( sts[1]->q_old_inp, sts[1]->q_inp) */
        sts[0]->q_inp = s_min( sts[0]->q_inp, sts[0]->q_old_inp );

            scale_sig( sts[n]->old_input_signal_fx, input_frame, sub( q_com, sts[n]->q_old_inp ) );
            sts[n]->q_old_inp = q_com;
            move16();
        sts[0]->q_old_inp = sts[0]->q_inp;

            scale_sig( hCPE->input_mem_fx[n], hCPE->hStereoDft->dft_ovl, sub( q_com, hCPE->q_input_mem[n] ) );
            hCPE->q_input_mem[n] = q_com;
            move16();
        }

        stereo_dft_hybrid_ITD_flag_fx( hCPE->hStereoDft->hConfig, input_Fs, hCPE->hStereoDft->hItd->hybrid_itd_max );

+4 −13
Original line number Diff line number Diff line
@@ -1064,23 +1064,14 @@ void stereo_dft_enc_analyze_fx(

    Word16 q_shift, guarded_bits;
    guarded_bits = find_guarded_bits_fx( NFFT );
    q_shift = sub( getScaleFactor32( pDFT_L, NFFT ), guarded_bits );
    q_shift = s_min( q_shift, sub( getScaleFactor32( pDFT_R, NFFT ), guarded_bits ) );
    FOR( Word16 j = 0; j < NFFT; j++ )
    {
        pDFT_L[j] = L_shl( pDFT_L[j], q_shift );
        move32();
    }

    q_shift = sub( L_norm_arr( pDFT_L, NFFT ), guarded_bits );
    scale_sig32( pDFT_L, NFFT, q_shift );
    DFT_e[0] = sub( DFT_e[0], q_shift );
    move16();

    FOR( Word16 j = 0; j < NFFT; j++ )
    {
        pDFT_R[j] = L_shl( pDFT_R[j], q_shift );
        move32();
    }

    q_shift = sub( L_norm_arr( pDFT_R, NFFT ), guarded_bits );
    scale_sig32( pDFT_R, NFFT, q_shift );
    DFT_e[1] = sub( DFT_e[1], q_shift );
    move16();

+26 −10
Original line number Diff line number Diff line
@@ -380,15 +380,6 @@ void stereo_td_itd_fx(
    move16();
    set16_fx( shift_input, 0, input_frame );

    FOR( n = 0; n < CPE_CHANNELS; n++ )
    {

        Scale_sig( &input_mem[n][0], dft_ovl, sts[n]->q_inp - q_input_mem[n] ); // Q(sts[n]->q_inp)
        // Scale_sig(&sts[n]->old_input_signal_fx, 1965, sts[n]->q_inp - sts[n]->q_old_inp);
        // sts[n]->q_old_inp = sts[n]->q_inp;
        q_input_mem[n] = sts[n]->q_inp;
        move16();
    }
    IF( EQ_16( sts[0]->element_mode, IVAS_CPE_MDCT ) )
    {
        FOR( n = 0; n < CPE_CHANNELS; n++ )
@@ -540,7 +531,7 @@ void stereo_td_itd_mdct_stereo_fx(
    const Word16 input_frame       /* i  : frame length           */
)
{
    Word16 i;
    Word16 i, n, q_com;
    Word32 bin_nrgL_fx[STEREO_DFT_N_32k_ENC];
    Word16 bin_nrgL_e[STEREO_DFT_N_32k_ENC];
    Word32 bin_nrgR_fx[STEREO_DFT_N_32k_ENC];
@@ -584,6 +575,31 @@ void stereo_td_itd_mdct_stereo_fx(
        /*call ITD function*/
        stereo_dft_enc_compute_itd_fx( hCPE, DFT_fx[0], DFT_tmp_e[0], DFT_fx[1], DFT_tmp_e[1], STEREO_DFT_OFFSET, input_frame, vad_flag_dtx, vad_hover_flag, bin_nrgL_fx, bin_nrgL_e, bin_nrgR_fx, bin_nrgR_e );

        FOR( n = 0; n < CPE_CHANNELS; n++ )
        {
            q_com = add( norm_arr( hCPE->hCoreCoder[n]->input_fx, input_frame ), hCPE->hCoreCoder[n]->q_inp );
            q_com = s_min( q_com, add( norm_arr( hCPE->hCoreCoder[n]->old_input_signal_fx, input_frame ), hCPE->hCoreCoder[n]->q_old_inp ) );
            q_com = s_min( q_com, add( norm_arr( hCPE->input_mem_fx[n], hStereoMdct->hDft_ana->dft_ovl ), hCPE->q_input_mem[n] ) );

            if ( EQ_16( q_com, Q15 ) )
            {
                q_com = 0;
                move16();
            }

            scale_sig( hCPE->hCoreCoder[n]->input_fx, input_frame, sub( q_com, hCPE->hCoreCoder[n]->q_inp ) );
            hCPE->hCoreCoder[n]->q_inp = q_com;
            move16();

            scale_sig( hCPE->hCoreCoder[n]->old_input_signal_fx, input_frame, sub( q_com, hCPE->hCoreCoder[n]->q_old_inp ) );
            hCPE->hCoreCoder[n]->q_old_inp = q_com;
            move16();

            scale_sig( hCPE->input_mem_fx[n], hStereoMdct->hDft_ana->dft_ovl, sub( q_com, hCPE->q_input_mem[n] ) );
            hCPE->q_input_mem[n] = q_com;
            move16();
        }

        /* Time Domain ITD compensation using extrapolation */
        stereo_td_itd_fx( hStereoMdct->hItd, NULL, NULL, 1, hStereoMdct->hDft_ana->dft_ovl, hCPE->hCoreCoder, input_frame, hCPE->input_mem_fx, hCPE->q_input_mem );
    }