From 4770ac4d68d06a79fb1263db8738e84f37a10404 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 24 Jun 2024 15:16:08 +0530 Subject: [PATCH] Fix for issue 678: Amplitude issue in BWE during bitrate switching [x] With these changes, the high frequency burst observed at 22.8s is resolved. --- lib_com/ivas_prot_fx.h | 4 ++-- lib_com/ivas_sns_com_fx.c | 12 ++++++++++-- lib_dec/TonalComponentDetection_fx.c | 2 +- lib_dec/ivas_mdct_core_dec.c | 8 ++++---- lib_dec/ivas_stereo_switching_dec.c | 1 + lib_dec/tonalMDCTconcealment.c | 2 +- lib_dec/tonalMDCTconcealment_fx.c | 6 +++--- 7 files changed, 22 insertions(+), 13 deletions(-) diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index 8ae9ce456..a96ef417a 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -315,8 +315,8 @@ void sns_shape_spectrum_fx( const PsychoacousticParameters *pPsychParams, /* i : psychoacoustic parameters used to get the frequency bands */ const Word32 *scf_int, /* i : already interpolated SNS scalefactors */ const Word16 q_scf_int, /* i : Q of interpolated SNS scalefactors */ - const Word16 L_frame /* i : frame length */ -); + const Word16 L_frame, /* i : frame length */ + Word16 *length ); // ivas_stereo_eclvq_com_fx.c Word32 ECSQ_dequantize_gain_fx( diff --git a/lib_com/ivas_sns_com_fx.c b/lib_com/ivas_sns_com_fx.c index b08155749..12f546ef3 100644 --- a/lib_com/ivas_sns_com_fx.c +++ b/lib_com/ivas_sns_com_fx.c @@ -284,8 +284,8 @@ void sns_shape_spectrum_fx( const PsychoacousticParameters *pPsychParams, /* i : psychoacoustic parameters used to get the frequency bands */ const Word32 *scf_int, /* i : already interpolated SNS scalefactors */ const Word16 q_scf_int, /* i : Q of interpolated SNS scalefactors */ - const Word16 L_frame /* i : frame length */ -) + const Word16 L_frame, /* i : frame length */ + Word16 *length ) { Word16 i, n, k, tmp_k, bw, q_tmp = 0, shift, min_shift = 63; Word64 L64_tmp[L_FRAME48k]; @@ -311,6 +311,10 @@ void sns_shape_spectrum_fx( } } tmp_k = k; + if ( length != NULL ) + { + *length = k; + } q_tmp = sub( add( add( *q_spectrum, q_scf_int ), min_shift ), 32 ); IF( GT_16( q_tmp, 30 ) ) { @@ -340,6 +344,10 @@ void sns_shape_spectrum_fx( } } tmp_k = k; + if ( length != NULL ) + { + *length = k; + } q_tmp = sub( add( add( *q_spectrum, q_scf_int ), min_shift ), 32 ); IF( GT_16( q_tmp, 30 ) ) { diff --git a/lib_dec/TonalComponentDetection_fx.c b/lib_dec/TonalComponentDetection_fx.c index 4a576bfe0..c3224a099 100644 --- a/lib_dec/TonalComponentDetection_fx.c +++ b/lib_dec/TonalComponentDetection_fx.c @@ -101,7 +101,7 @@ void ivas_DetectTonalComponents_fx( } #endif q_pScaledMdctSpectrum = sub( 31, lastMDCTSpectrum_exp ); - sns_shape_spectrum_fx( pScaledMdctSpectrum, &q_pScaledMdctSpectrum, psychParamsCurrent, sns_int_scf_fx, 16, nSamplesCore ); + sns_shape_spectrum_fx( pScaledMdctSpectrum, &q_pScaledMdctSpectrum, psychParamsCurrent, sns_int_scf_fx, 16, nSamplesCore, NULL ); q_pScaledMdctSpectrum = add( q_pScaledMdctSpectrum, 1 ); Word16 tmp_e = sub( 31, q_pScaledMdctSpectrum ); nBands = psychParamsCurrent->nBands; diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index 0b3973293..f3f268f35 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -2430,7 +2430,7 @@ void ivas_mdct_core_tns_ns_fx( x_e[ch][k] = sub( 31, q_x ); Word16 q_sns_int_scf; - Word16 q_2; + Word16 q_2, length; q_sns_int_scf = add( 16 - 1, getScaleFactor32( sns_int_scf_fx, FDNS_NPTS ) ); // q_sns_int_scf -= 1; FOR( Word16 c = 0; c < FDNS_NPTS; c++ ) @@ -2438,15 +2438,15 @@ void ivas_mdct_core_tns_ns_fx( sns_int_scf_fx[c] = L_shl( sns_int_scf_fx[c], q_sns_int_scf - 16 ); } q_2 = q_x; - sns_shape_spectrum_fx( x_fx[ch][k], &q_x, st->hTcxCfg->psychParamsCurrent, sns_int_scf_fx, q_sns_int_scf, st->hTcxCfg->psychParamsCurrent->nBins ); + sns_shape_spectrum_fx( x_fx[ch][k], &q_x, st->hTcxCfg->psychParamsCurrent, sns_int_scf_fx, q_sns_int_scf, st->hTcxCfg->psychParamsCurrent->nBins, &length ); IF( LT_16( q_2, add( q_x, 1 ) ) ) /*scaling to q_2*/ { - Scale_sig32( &x_fx[ch][k][0], st->hTcxCfg->psychParamsCurrent->nBins, q_2 - q_x - 1 ); + Scale_sig32( &x_fx[ch][k][0], length, q_2 - q_x - 1 ); q_x = q_2; } ELSE /*scaling to q_x+1*/ { - Scale_sig32( &x_fx[ch][k][0] + st->hTcxCfg->psychParamsCurrent->nBins, L_spec[ch] - st->hTcxCfg->psychParamsCurrent->nBins, q_x + 1 - q_2 ); + Scale_sig32( &x_fx[ch][k][0] + length, L_spec[ch] - length, q_x + 1 - q_2 ); q_x = add( q_x, 1 ); } x_e[ch][k] = sub( 31, q_x ); diff --git a/lib_dec/ivas_stereo_switching_dec.c b/lib_dec/ivas_stereo_switching_dec.c index b4df02cab..f3253d728 100644 --- a/lib_dec/ivas_stereo_switching_dec.c +++ b/lib_dec/ivas_stereo_switching_dec.c @@ -1700,6 +1700,7 @@ ivas_error stereo_memory_dec_fx( IF( EQ_16( hCPE->last_element_mode, IVAS_CPE_TD ) ) { mvl2l( tmpF_buff, st->hTcxDec->old_syn_Overl_32, L_FRAME16k / 2 ); + Copy_Scale_sig32_16( st->hTcxDec->old_syn_Overl_32, st->hTcxDec->old_syn_Overl, L_FRAME16k / 2, add( st->Q_syn, 5 ) ); //(st->Qsyn - (11 - 16)) } set16_fx( st->hTcxDec->FBTCXdelayBuf, 0, 111 ); diff --git a/lib_dec/tonalMDCTconcealment.c b/lib_dec/tonalMDCTconcealment.c index a9b293e4e..8e2097d74 100644 --- a/lib_dec/tonalMDCTconcealment.c +++ b/lib_dec/tonalMDCTconcealment.c @@ -1698,7 +1698,7 @@ void TonalMdctConceal_whiten_noise_shape_ivas_fx( IF( GT_32( sum32_sat( scfs_for_shaping, FDNS_NPTS ), 0 ) ) { q_wns = sub( 31, noiseLevelPtr_exp ); - sns_shape_spectrum_fx( whitenend_noise_shape, &q_wns, psychParams, scfs_for_shaping, Q16, L_frame ); + sns_shape_spectrum_fx( whitenend_noise_shape, &q_wns, psychParams, scfs_for_shaping, Q16, L_frame, NULL ); Copy32( whitenend_noise_shape + start_idx, hFdCngCom->cngNoiseLevel, sub( stop_idx, start_idx ) ); hFdCngCom->cngNoiseLevelExp = sub( 30, q_wns ); diff --git a/lib_dec/tonalMDCTconcealment_fx.c b/lib_dec/tonalMDCTconcealment_fx.c index a41fd48f5..9ebbc635e 100644 --- a/lib_dec/tonalMDCTconcealment_fx.c +++ b/lib_dec/tonalMDCTconcealment_fx.c @@ -841,7 +841,7 @@ static void ivas_CalcPowerSpecAndDetectTonalComponents_fx( invScaleFactors_fx[i] = L_shl( invScaleFactors[i], add( 1, invScaleFactors_exp[i] ) ); // Q16 move32(); } - sns_shape_spectrum_fx( powerSpectrum, &power_spectrum_q, psychParamsCurrent, invScaleFactors_fx, 16, hTonalMDCTConc->nSamplesCore ); + sns_shape_spectrum_fx( powerSpectrum, &power_spectrum_q, psychParamsCurrent, invScaleFactors_fx, 16, hTonalMDCTConc->nSamplesCore, NULL ); power_spectrum_q = add( power_spectrum_q, 1 ); // sns_shape_spectrum(powerSpectrum, psychParamsCurrent, invScaleFactors, hTonalMDCTConc->nSamplesCore); // nBands = psychParamsCurrent->nBands; @@ -1290,7 +1290,7 @@ void TonalMDCTConceal_Detect_ivas_fx( sns_int_scf_fx[i] = L_shl( hTonalMDCTConc->secondLastBlockData.scaleFactors[i], add( 1, hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i] ) ); // Q16 move32(); } - sns_shape_spectrum_fx( powerSpectrum, &power_spectrum_q, psychParamsCurrent, sns_int_scf_fx, 16, hTonalMDCTConc->nSamplesCore ); + sns_shape_spectrum_fx( powerSpectrum, &power_spectrum_q, psychParamsCurrent, sns_int_scf_fx, 16, hTonalMDCTConc->nSamplesCore, NULL ); } powerSpectrum_exp = getScaleFactor32( powerSpectrum, nSamples ); powerSpectrum_exp = sub( powerSpectrum_exp, 3 ); /*extra 3 bits of headroom for MA filter in getEnvelope*/ @@ -2944,7 +2944,7 @@ void TonalMDCTConceal_Apply_ivas_fx( move32(); } - sns_shape_spectrum_fx( powerSpectrum, &q_ps, psychParamsCurrent, scaleFactors, q_sf, hTonalMDCTConc->nSamplesCore ); + sns_shape_spectrum_fx( powerSpectrum, &q_ps, psychParamsCurrent, scaleFactors, q_sf, hTonalMDCTConc->nSamplesCore, NULL ); powerSpectrum_exp = sub( 31, add( q_ps, 1 ) ); -- GitLab