diff --git a/lib_com/options.h b/lib_com/options.h index 356e84c929038c214e011917016a2c7b787998b8..1ab8d2b4256dae8747722ceeacb7beff6f93a3e9 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -174,11 +174,11 @@ #define NONBE_FIX_1176_OSBA_REVERB_JBM_ASAN_ERROR /* Ericsson: Issue 1176, fix in TDREND_firfilt for subframes shorter than the filter length */ #define NONBE_FIX_1212_TONAL_MDCT_CONCEALMENT /* FhG: Fix issue 1212, zero IGF spec also in 1st concealed frame */ +#define NONBE_FIX_1204_MDCT_STEREO_NOISE_EST_SCALING /* FhG: fixes for decoder-side noise level estimation in MDCT-Stereo to prevent noise bursts in stereo switching */ #define NONBE_1200_ISM_JBM_BRATE_SW_FLUSH /* VA: issue 1200: fix bug in renderer flush in ISM JBM bitrate switching */ #define NONBE_FIX_1205_TD_STEREO_MOD_CT /* VA: fix mismatch of coder_type (mod_ct) btw. TD stereo encoder and decoder */ #define NONBE_1203_MDCT2DFT_SWITCHING /* VA: issue 1203: fix severe artifacts during MDCT to DFT stereo switching when MDCT ITD is not used */ - /* ##################### End NON-BE switches ########################### */ /* ################## End DEVELOPMENT switches ######################### */ diff --git a/lib_dec/ivas_stereo_mdct_core_dec.c b/lib_dec/ivas_stereo_mdct_core_dec.c index 9ee33e7ad7f466f698947b337e9bfced85111af3..20e4dcc8a07021f223ff0a4c74fdd69d1436d644 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec.c +++ b/lib_dec/ivas_stereo_mdct_core_dec.c @@ -620,24 +620,48 @@ static void run_min_stats( computed only once (for ch == 0) and not again in the second run sive the outcome will be the same anyway */ if ( ( will_estimate_noise_on_channel[0] == will_estimate_noise_on_channel[1] ) || ch == 0 ) { +#ifdef NONBE_FIX_1204_MDCT_STEREO_NOISE_EST_SCALING + float power_spec_scale_fac; + + /* calculate power spectrum from MDCT coefficients and estimated MDST coeffs */ + power_spec_scale_fac = 1.f / (float) ( L_FRAME16k * L_FRAME16k ); + power_spec[0] = spec_in[0] * spec_in[0] * power_spec_scale_fac; + power_spec[L_FRAME16k - 1] = spec_in[L_FRAME16k - 1] * spec_in[L_FRAME16k - 1] * power_spec_scale_fac; +#else /* calculate power spectrum from MDCT coefficients and estimated MDST coeffs */ power_spec[0] = spec_in[0] * spec_in[0]; power_spec[L_FRAME16k - 1] = spec_in[L_FRAME16k - 1] * spec_in[L_FRAME16k - 1]; +#endif for ( int16_t i = 1; i < L_FRAME16k - 1; i++ ) { float mdst; mdst = spec_in[i + 1] - spec_in[i - 1]; +#ifdef NONBE_FIX_1204_MDCT_STEREO_NOISE_EST_SCALING + power_spec[i] = power_spec_scale_fac * ( spec_in[i] * spec_in[i] + mdst * mdst ); +#else power_spec[i] = spec_in[i] * spec_in[i] + mdst * mdst; +#endif } } +#ifndef NONBE_FIX_1204_MDCT_STEREO_NOISE_EST_SCALING noisy_speech_detection( st->hFdCngDec, st->VAD && st->m_frame_type == ACTIVE_FRAME, power_spec ); st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = 0.99f * st->hFdCngDec->hFdCngCom->likelihood_noisy_speech + 0.01f * (float) st->hFdCngDec->hFdCngCom->flag_noisy_speech; st->lp_noise = st->hFdCngDec->lp_noise; +#endif } +#ifdef NONBE_FIX_1204_MDCT_STEREO_NOISE_EST_SCALING + if ( st->core == TCX_20_CORE ) + { + noisy_speech_detection( st->hFdCngDec, save_VAD[ch] && st->m_frame_type == ACTIVE_FRAME, x[ch][0] ); + st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = 0.99f * st->hFdCngDec->hFdCngCom->likelihood_noisy_speech + 0.01f * (float) st->hFdCngDec->hFdCngCom->flag_noisy_speech; + st->lp_noise = st->hFdCngDec->lp_noise; + } +#endif + if ( will_estimate_noise_on_channel[0] || will_estimate_noise_on_channel[1] || st->bfi ) { ApplyFdCng( NULL, st->bfi ? NULL : power_spec, NULL, NULL, st, st->bfi, 0 );