From 32b5c4e2dc763e75b63bf90121d3088fe85f827c Mon Sep 17 00:00:00 2001 From: vaclav Date: Wed, 7 May 2025 12:58:33 +0200 Subject: [PATCH] port NONBE_FIX_1063_DIV_BY_ZERO_SUMNRG --- lib_com/options.h | 1 + lib_enc/ivas_stereo_dft_enc_itd.c | 21 ++++++++++++++++++--- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lib_com/options.h b/lib_com/options.h index 2d952edea..4d0b7d9ad 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -188,6 +188,7 @@ #define NONBE_FIX_968_ISM_BRIR_WITH_HEADROTATION_5MS_FIX /* FhG : issue #968: differences between 5ms and 20ms rendering for discrete ISM with BRIR and head rotation*/ #define FIX_969_USAN_IGF_ARITH /* FhG: issue 969: fix USAN error in igf_sce_dec; same issue as #962 */ #define FIX_959_MASA_LINEAR_REND /* VA: issue 959: remove unused calling of ivas_sba_linear_renderer() in MASA rendering */ +#define NONBE_FIX_1063_DIV_BY_ZERO_SUMNRG /* VoiceAge: issue 1063: division by zero for angle_rot feature in the UNCLR classifier */ /* #################### End BASOP porting switches ############################ */ diff --git a/lib_enc/ivas_stereo_dft_enc_itd.c b/lib_enc/ivas_stereo_dft_enc_itd.c index 7913a8bf5..214b26088 100644 --- a/lib_enc/ivas_stereo_dft_enc_itd.c +++ b/lib_enc/ivas_stereo_dft_enc_itd.c @@ -642,9 +642,10 @@ void stereo_dft_enc_compute_itd( STEREO_CLASSIF_HANDLE hStereoClassif; const float *dft_trigo32k; float trigo_enc[STEREO_DFT_N_32k_ENC / 2 + 1]; - float cng_xcorr_filt; - +#ifdef NONBE_FIX_1063_DIV_BY_ZERO_SUMNRG + float sum_nrg_delta; +#endif int16_t prev_itd_max; int16_t itd_max_flip; @@ -729,10 +730,12 @@ void stereo_dft_enc_compute_itd( grand_dot_prod_real += xcorr[2 * i]; grand_dot_prod_img += xcorr[2 * i + 1]; xcorr_abs[i] = sqrtf( xcorr[2 * i] * xcorr[2 * i] + xcorr[2 * i + 1] * xcorr[2 * i + 1] ); + +#ifndef NONBE_FIX_1063_DIV_BY_ZERO_SUMNRG /* VM: prod_LL tends to overflow, better to replace with sum(log(prod_L)) and retrain the classifier */ prod_LL = prod_L; prod_RR = prod_R; - +#endif if ( j == SFM_PROD_GRP || i == NFFT_mid - 1 ) { prod_L = max( FLT_MIN, prod_L ); @@ -786,7 +789,19 @@ void stereo_dft_enc_compute_itd( hStereoClassif->unclr_fv[E_gainIPD] = g_IPD; hStereoClassif->xtalk_fv[E_gainIPD] = g_IPD; +#ifdef NONBE_FIX_1063_DIV_BY_ZERO_SUMNRG + if ( sum_nrg_L >= sum_nrg_R ) + { + sum_nrg_delta = max( sum_nrg_L - sum_nrg_R, 1.0f ); + } + else + { + sum_nrg_delta = min( sum_nrg_L - sum_nrg_R, -1.0f ); + } + angle_rot = fabsf( atanf( 2.0f * ( grand_dot_prod_real ) / sum_nrg_delta ) ); +#else angle_rot = fabsf( atanf( 2.0f * ( grand_dot_prod_real ) / ( sum_nrg_L - sum_nrg_R + 1.0f ) ) ); +#endif hStereoClassif->unclr_fv[E_angle_rot] = angle_rot; hStereoClassif->xtalk_fv[E_angle_rot] = angle_rot; -- GitLab