Loading lib_dec/ivas_stat_dec.h +4 −0 Original line number Diff line number Diff line Loading @@ -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*/ Loading lib_dec/ivas_stereo_dft_dec.c +51 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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]; Loading Loading @@ -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 Loading lib_enc/ivas_stat_enc.h +4 −0 Original line number Diff line number Diff line Loading @@ -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]; Loading lib_enc/ivas_stereo_dft_enc.c +28 −2 Original line number Diff line number Diff line Loading @@ -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 /*------------------------------------------------------------------------- Loading Loading @@ -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; Loading Loading @@ -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) *----------------------------------------------------------------*/ Loading Loading @@ -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!" ); Loading Loading @@ -2437,7 +2464,6 @@ void stereo_dft_enc_write_BS( #endif ( *nb_bits ) += nb; /*----------------------------------------------------------------* * Residual prediction *----------------------------------------------------------------*/ Loading lib_enc/ivas_stereo_dft_enc_itd.c +1 −0 Original line number Diff line number Diff line Loading @@ -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 */ { Loading Loading
lib_dec/ivas_stat_dec.h +4 −0 Original line number Diff line number Diff line Loading @@ -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*/ Loading
lib_dec/ivas_stereo_dft_dec.c +51 −0 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -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]; Loading Loading @@ -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 Loading
lib_enc/ivas_stat_enc.h +4 −0 Original line number Diff line number Diff line Loading @@ -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]; Loading
lib_enc/ivas_stereo_dft_enc.c +28 −2 Original line number Diff line number Diff line Loading @@ -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 /*------------------------------------------------------------------------- Loading Loading @@ -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; Loading Loading @@ -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) *----------------------------------------------------------------*/ Loading Loading @@ -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!" ); Loading Loading @@ -2437,7 +2464,6 @@ void stereo_dft_enc_write_BS( #endif ( *nb_bits ) += nb; /*----------------------------------------------------------------* * Residual prediction *----------------------------------------------------------------*/ Loading
lib_enc/ivas_stereo_dft_enc_itd.c +1 −0 Original line number Diff line number Diff line Loading @@ -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 */ { Loading