Commit c1091a4b authored by janssonfr's avatar janssonfr
Browse files

Updated FIX_ITD_CNG

parent 94652f35
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -150,6 +150,10 @@ typedef struct stereo_dft_dec_data_struct
    int16_t itd_xfade_counter;
    float itd_xfade_prev;
    int32_t last_active_element_brate;
    float ipd_xfade_target;
    float ipd_xfade_step;
    int16_t ipd_xfade_counter;
    float ipd_xfade_prev;
#endif

    /*residual prediction*/
+51 −0
Original line number Diff line number Diff line
@@ -486,6 +486,10 @@ void stereo_dft_dec_reset(
    hStereoDft->itd_xfade_counter = 0;
    hStereoDft->itd_xfade_prev = 0.0f;
    hStereoDft->last_active_element_brate = 0;
    hStereoDft->ipd_xfade_target = 0.0f;
    hStereoDft->ipd_xfade_step = 0.0f;
    hStereoDft->ipd_xfade_counter = 0;
    hStereoDft->ipd_xfade_prev = 0.0f;
#endif

    return;
@@ -1796,6 +1800,7 @@ void stereo_dft_dec_read_BS(
        *total_brate = 0;
#ifdef FIX_ITD_CNG
        hStereoDft->itd[k = hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->itd_xfade_target;
        hStereoDft->gipd[hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->ipd_xfade_target;
#endif

        return;
@@ -2835,6 +2840,49 @@ void stereo_dft_dec_smooth_parameters(
            *( hStereoDft->side_gain + ( ( k + k_offset ) - 1 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->side_gain + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b );
        }

#ifdef FIX_ITD_CNG
        if ( hStereoDft->frame_sid_nodata )
        {
            /* set new xfade target if new itd received */
            if ( hStereoDft->gipd[k + k_offset] != hStereoDft->ipd_xfade_target )
            {
                if ( ( hStereoDft->gipd[k + k_offset] - hStereoDft->ipd_xfade_prev ) > EVS_PI )
                {
                    hStereoDft->ipd_xfade_target = hStereoDft->gipd[k + k_offset] - 2 * EVS_PI;
                    hStereoDft->ipd_xfade_step = ( hStereoDft->ipd_xfade_target - hStereoDft->ipd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->ipd_xfade_counter );
                }
                else if ( ( hStereoDft->ipd_xfade_prev - hStereoDft->gipd[k + k_offset] ) > EVS_PI )
                {
                    hStereoDft->ipd_xfade_target = hStereoDft->gipd[k + k_offset] + 2 * EVS_PI;
                    hStereoDft->ipd_xfade_step = ( hStereoDft->ipd_xfade_target - hStereoDft->ipd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->ipd_xfade_counter );
                }
                else
                {
                    hStereoDft->ipd_xfade_target = hStereoDft->gipd[k + k_offset];
                    hStereoDft->ipd_xfade_step = ( hStereoDft->ipd_xfade_target - hStereoDft->ipd_xfade_prev ) / ( STEREO_DFT_ITD_CNG_XFADE - hStereoDft->ipd_xfade_counter );
                }
            }

            /* xfade */
            if ( hStereoDft->ipd_xfade_prev != hStereoDft->ipd_xfade_target && hStereoDft->ipd_xfade_counter < STEREO_DFT_ITD_CNG_XFADE && hStereoDft->last_active_element_brate <= 24400 )
            {
                hStereoDft->gipd[k + k_offset] = hStereoDft->ipd_xfade_prev + hStereoDft->ipd_xfade_step;
                hStereoDft->ipd_xfade_prev = hStereoDft->gipd[k + k_offset];
                hStereoDft->ipd_xfade_counter++;
            }
        }
        else
        {
            /* First active frame, "reset" everything if long enough active encoding, only triggered if STEREO_DFT_ITD_CNG_XFADE_RESET = -1 */
            if ( active_frame_counter > STEREO_DFT_ITD_CNG_XFADE_RESET )
            {
                hStereoDft->ipd_xfade_target = hStereoDft->gipd[k + k_offset];
                hStereoDft->ipd_xfade_prev = hStereoDft->gipd[k + k_offset];
                hStereoDft->ipd_xfade_counter = 0;
            }
        }
#endif

        for ( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ )
        {
            hStereoDft->gipd[( k + k_offset ) - k2] = hStereoDft->gipd[k + k_offset];
@@ -2887,6 +2935,9 @@ void stereo_dft_dec_smooth_parameters(
        hStereoDft->itd_xfade_counter = 0;
        hStereoDft->itd_xfade_target = hStereoDft->itd[STEREO_DFT_NBDIV - 1];
        hStereoDft->itd_xfade_prev = hStereoDft->itd[STEREO_DFT_NBDIV - 1];
        hStereoDft->ipd_xfade_counter = 0;
        hStereoDft->ipd_xfade_target = hStereoDft->gipd[STEREO_DFT_NBDIV - 1];
        hStereoDft->ipd_xfade_prev = hStereoDft->gipd[STEREO_DFT_NBDIV - 1];
    }
#endif

+4 −0
Original line number Diff line number Diff line
@@ -194,6 +194,10 @@ typedef struct stereo_dft_enc_data_struct
    float Spd_R_smooth[STEREO_DFT_N_32k_ENC / 2];
    float sid_gipd;
    int16_t coh_fade_counter;
#ifdef FIX_ITD_CNG
    float prev_sid_gipd;
    int16_t prev_sid_no_ipd_flag;
#endif

    /*IPD*/
    float gipd[STEREO_DFT_ENC_DFT_NB];
+28 −2
Original line number Diff line number Diff line
@@ -62,6 +62,9 @@ static FILE *pF = NULL;
#define STEREO_DFT_NRG_PAST_MAX_BAND_LB 4
#define STEREO_DFT_DMX_CROSSOVER        ( int16_t )( 132 * ( (float) ( STEREO_DFT_N_NS_ENC ) / STEREO_DFT_N_NS ) + 0.5f ) /* crossover bin between binwise and bandwise DMX */
#define ITD_VAD_E_BAND_N_INIT           200000
#ifdef FIX_ITD_CNG
#define ITD_SID_PREV_FRAMES 5
#endif


/*-------------------------------------------------------------------------
@@ -495,6 +498,9 @@ void stereo_dft_enc_reset(
    hStereoDft->currentNumUpdates = 0;
    hStereoDft->expectedNumUpdates = FIXED_SID_RATE;
    hStereoDft->resetFrames = 0; 
    hStereoDft->sid_gipd = 0;
    hStereoDft->prev_sid_gipd = 0;
    hStereoDft->prev_sid_no_ipd_flag = 1;
#endif

    hStereoDft->coh_fade_counter = 0;
@@ -1384,6 +1390,23 @@ void stereo_dft_enc_process(
    /* DFT stereo parameters */
    stereo_dft_enc_compute_prm( hStereoDft, pDFT_L, pDFT_R, k_offset, 1, hCPE->hCoreCoder[0]->sp_aud_decision0, hCPE->hCoreCoder[0]->vad_flag, bin_nrgL, bin_nrgR, dot_prod_nrg_ratio );

#ifdef FIX_ITD_CNG
    if ( vad_flag_dtx[0] == 0 )
    {
        if ( hCPE->hStereoCng->cng_counter == 0 && !hCPE->hStereoCng->first_SID_after_TD )
        {
            hStereoDft->sid_gipd = hStereoDft->prev_sid_gipd;
            hStereoDft->no_ipd_flag = hStereoDft->prev_sid_no_ipd_flag;
        }

        if ( hCPE->hStereoCng->cng_counter > ITD_SID_PREV_FRAMES )
        {
            hStereoDft->prev_sid_gipd = hStereoDft->sid_gipd;
            hStereoDft->prev_sid_no_ipd_flag = hStereoDft->no_ipd_flag;
        }
    }
#endif

    /*----------------------------------------------------------------*
     * UNCLR classifier (detection of uncorrelated L and R channels)
     *----------------------------------------------------------------*/
@@ -1440,7 +1463,11 @@ void stereo_dft_enc_process(
                }
            }

#ifdef FIX_ITD_CNG
            if ( b < hStereoDft->res_cod_band_max && vad_flag_dtx[0] )
#else
            if ( b < hStereoDft->res_cod_band_max )
#endif
            {
#ifdef DEBUGGING
                assert( hStereoDft->nbands == hStereoDft->nbands_dmx && "Don't use coarser stereo parameter resolution for residual coding bitrates!" );
@@ -2437,7 +2464,6 @@ void stereo_dft_enc_write_BS(
#endif
    ( *nb_bits ) += nb;


    /*----------------------------------------------------------------*
     * Residual prediction
     *----------------------------------------------------------------*/
+1 −0
Original line number Diff line number Diff line
@@ -1132,6 +1132,7 @@ void stereo_dft_enc_compute_itd(
                /* expectedNumUpdates updated after call to dtx() in SID frames */
                cng_xcorr_filt = max( min( CORR_FILT, 10.0f * CORR_FILT / ( hStereoDft->expectedNumUpdates + hStereoDft->currentNumUpdates ) ), sfm_L );
                hStereoDft->currentNumUpdates++;
                hStereoDft->sfm = cng_xcorr_filt;
            }
            else /* use sfm for active frames */
            {