From 7569a189d335f3f3993e0c1ce1b7c0e4c60e1f31 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 20 Aug 2024 21:01:57 +0530 Subject: [PATCH] Fix for 3gpp issue 852: Missing synthesis when switching to CNG (stereo 13.2kbps) [x] Fix - Scaling smoothed_psd_fx and cngNoiseLevel in stereo_dft_generate_comfort_noise_fx to avoid precision loss --- lib_dec/fd_cng_dec_fx.c | 7 ++++--- lib_dec/ivas_stereo_cng_dec.c | 34 +++++++++++++------------------- lib_dec/ivas_stereo_dft_dec_fx.c | 2 +- lib_dec/stat_dec.h | 2 +- 4 files changed, 20 insertions(+), 25 deletions(-) diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index de5474bd4..caebd763c 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -149,7 +149,8 @@ void initFdCngDec_ivas_fx( hFdCngDec->hFdCngCom->periodog_exp = 0; move16(); set32_fx( hFdCngDec->smoothed_psd_fx, 0, L_FRAME16k ); - hFdCngDec->q_smoothed_psd = Q4; + hFdCngDec->smoothed_psd_exp = 0; + move16(); set32_fx( hFdCngDec->hFdCngCom->sidNoiseEstLp, 0, NPART ); hFdCngDec->ms_last_inactive_bwidth = NB; @@ -269,7 +270,7 @@ void initFdCngDec_fx( hFdCngDec->hFdCngCom->periodog_exp = 0; move16(); set32_fx( hFdCngDec->smoothed_psd_fx, 0, L_FRAME16k ); - hFdCngDec->q_smoothed_psd = Q4; + hFdCngDec->smoothed_psd_exp = 0; move16(); #ifdef IVAS_CODE_CNG @@ -3020,7 +3021,7 @@ void perform_noise_estimation_dec_ivas_fx( hFdCngDec->bandNoiseShape_exp = hFdCngDec->msNoiseEst_exp; move16(); Copy32( hFdCngDec->bandNoiseShape, &hFdCngDec->smoothed_psd_fx[startBand], sub( stopFFTbin, startBand ) ); - hFdCngDec->q_smoothed_psd = sub( Q31, hFdCngDec->bandNoiseShape_exp ); + hFdCngDec->smoothed_psd_exp = hFdCngDec->bandNoiseShape_exp; move16(); set32_fx( &hFdCngDec->smoothed_psd_fx[stopFFTbin], 0, sub( L_FRAME16k, stopFFTbin ) ); } diff --git a/lib_dec/ivas_stereo_cng_dec.c b/lib_dec/ivas_stereo_cng_dec.c index aaf3b7575..8bcbd2a45 100644 --- a/lib_dec/ivas_stereo_cng_dec.c +++ b/lib_dec/ivas_stereo_cng_dec.c @@ -722,7 +722,7 @@ static void stereo_dft_generate_comfort_noise_fx( Word16 trigo_step; Word32 tmp32_1, tmp32_2; Word16 q_div, q_sqrt1, q_sqrt2, q_sqrt, sqrt_res; - Word16 q_shift; + Word16 q_shift, q_shift_1, q_shift_2, min_q; hFdCngCom = st->hFdCngDec->hFdCngCom; @@ -1381,24 +1381,18 @@ static void stereo_dft_generate_comfort_noise_fx( IF( ( chan == 0 ) && LE_32( st->core_brate, SID_2k40 ) ) { /* update smoothed periodogram used by stereo CNA in SID and NO_DATA frames from cngNoiseLevel_flt */ - Word16 l_shift_val = sub( st->hFdCngDec->q_smoothed_psd, sub( Q31, hFdCngCom->cngNoiseLevelExp ) ); - q_shift = L_norm_arr( st->hFdCngDec->smoothed_psd_fx, L_FRAME16k ); - IF( GE_16( q_shift, negate( l_shift_val ) ) ) - { - scale_sig32( st->hFdCngDec->smoothed_psd_fx, L_FRAME16k, negate( l_shift_val ) ); - st->hFdCngDec->q_smoothed_psd = sub( Q31, hFdCngCom->cngNoiseLevelExp ); - move16(); - } - ELSE - { - scale_sig32( st->hFdCngDec->smoothed_psd_fx, L_FRAME16k, q_shift ); - st->hFdCngDec->q_smoothed_psd = add( st->hFdCngDec->q_smoothed_psd, q_shift ); - move16(); - l_shift_val = add( q_shift, l_shift_val ); - scale_sig32( hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, l_shift_val ); - hFdCngCom->cngNoiseLevelExp = sub( hFdCngCom->cngNoiseLevelExp, l_shift_val ); - move16(); - } + q_shift_1 = L_norm_arr( st->hFdCngDec->smoothed_psd_fx, L_FRAME16k ); + q_shift_2 = L_norm_arr( hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); + + min_q = sub( s_min( add( q_shift_1, sub( Q31, st->hFdCngDec->smoothed_psd_exp ) ), add( q_shift_2, sub( Q31, hFdCngCom->cngNoiseLevelExp ) ) ), 1 /* Guard bit */ ); + + scale_sig32( st->hFdCngDec->smoothed_psd_fx, L_FRAME16k, sub( min_q, sub( Q31, st->hFdCngDec->smoothed_psd_exp ) ) ); + st->hFdCngDec->smoothed_psd_exp = sub( Q31, min_q ); + move16(); + scale_sig32( hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, sub( min_q, sub( Q31, hFdCngCom->cngNoiseLevelExp ) ) ); + hFdCngCom->cngNoiseLevelExp = st->hFdCngDec->smoothed_psd_exp; + move16(); + FOR( i = hFdCngCom->startBand; i < hFdCngCom->stopFFTbin; i++ ) { ftmp = hFdCngCom->cngNoiseLevel[sub( i, hFdCngCom->startBand )]; @@ -1434,7 +1428,7 @@ static void stereo_dft_generate_comfort_noise_fx( } /* update msNoiseEst in SID and NO_DATA frames */ - bandcombinepow( &st->hFdCngDec->smoothed_psd_fx[hFdCngCom->startBand], sub( Q31, st->hFdCngDec->q_smoothed_psd ), sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), st->hFdCngDec->part_shaping, st->hFdCngDec->nFFTpart_shaping, st->hFdCngDec->psize_inv_shaping, st->hFdCngDec->msNoiseEst, &st->hFdCngDec->msNoiseEst_exp ); + bandcombinepow( &st->hFdCngDec->smoothed_psd_fx[hFdCngCom->startBand], st->hFdCngDec->smoothed_psd_exp, sub( hFdCngCom->stopFFTbin, hFdCngCom->startBand ), st->hFdCngDec->part_shaping, st->hFdCngDec->nFFTpart_shaping, st->hFdCngDec->psize_inv_shaping, st->hFdCngDec->msNoiseEst, &st->hFdCngDec->msNoiseEst_exp ); Word32 max_l; maximum_32_fx( st->hFdCngDec->msNoiseEst, NPART_SHAPING, &max_l ); diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 729a2e49a..c4988417f 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -2203,7 +2203,7 @@ void stereo_dft_dec_fx( /* take the average of two adjacent frequency bins */ cna_level = L_add( L_shr( lev1, 1 ), L_shr( lev2, 1 ) ); } - q_cna_level = sub( Q31, hFdCngDec->q_smoothed_psd ); + q_cna_level = hFdCngDec->smoothed_psd_exp; move16(); l_tmp = Sqrt32( cna_level, &q_cna_level ); scale_fact = Mpy_32_32( l_tmp, scale_fact0 ); diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index f7d66f35d..6ba95bf76 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -247,7 +247,7 @@ typedef struct Word16 cna_cm_fx[STEREO_DFT_BAND_MAX]; /* stereo CNA - coherence from the last inactive frame */ Word16 cna_act_fact_fx; /* stereo CNA - long-term signal activity factor (0-1) */ Word16 cna_rescale_fact_fx; - Word16 q_smoothed_psd; + Word16 smoothed_psd_exp; #endif } FD_CNG_DEC, *HANDLE_FD_CNG_DEC; -- GitLab