From 4afd1667823633ebafd21d77ec1524f5db608e8d Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 4 Feb 2025 09:08:08 +0530 Subject: [PATCH] Fix for 3GPP issue 1135: downmixing difference between float and fixed-point (DFT - stereo) - 3 Link #1135 Fixed further saturations --- lib_enc/ivas_cpe_enc.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c index 5f04dc87f..c905e0e51 100644 --- a/lib_enc/ivas_cpe_enc.c +++ b/lib_enc/ivas_cpe_enc.c @@ -814,7 +814,6 @@ ivas_error ivas_cpe_enc_fx( /*----------------------------------------------------------------* * DFT stereo: iDFT and resampling on both channels *----------------------------------------------------------------*/ - IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { Word32 internal_Fs; @@ -838,11 +837,22 @@ ivas_error ivas_cpe_enc_fx( stereo_dft_enc_synthesize_fx( hCPE->hStereoDft, sts[0]->input32_fx, &out_start_ind, &out_end_ind, 0, input_Fs, input_Fs, 0, NULL ); #ifdef FIX_ISSUE_1135 - Word16 common_q = s_min( sub( sts[0]->q_inp, 2 ), sts[0]->q_old_inp ); /* -2 from target Q-factor sts[0]->q_inp to avoid some saturations (issue 1135) */ - Word16 fir_delay_len = NS2SA( sts[0]->input_Fs, DELAY_FIR_RESAMPL_NS ); - Scale_sig( sts[0]->old_input_signal_fx, input_frame, sub( common_q, sts[0]->q_old_inp ) ); // q_old_inp -> common_q + // Normalise the input buffer from Q15 + Word16 input_norm, q_inp32, common_q, fir_delay_len; + input_norm = L_norm_arr( sts[0]->input32_fx + out_start_ind, sub( out_end_ind, out_start_ind ) ); + q_inp32 = add( Q15, input_norm ); + fir_delay_len = NS2SA( sts[0]->input_Fs, DELAY_FIR_RESAMPL_NS ); + move16(); + + // Find common Q-factor between { q_inp, q_old_inp and q_inp32-16 } + common_q = s_min( s_min( sub( q_inp32, 16 ), sts[0]->q_inp ), sts[0]->q_old_inp ); + + // Rescale the old input, input and FIR delay section of input buffer + scale_sig( sts[0]->old_input_signal_fx, input_frame, sub( common_q, sts[0]->q_old_inp ) ); // q_old_inp -> common_q Copy_Scale_sig32_16( sts[0]->input32_fx + out_start_ind, sts[0]->input_fx + out_start_ind, sub( out_end_ind, out_start_ind ), sub( add( Q16, common_q ), Q15 ) ); // Q15 -> common_q - Scale_sig( sts[0]->input_fx + out_end_ind, add( sub( input_frame, out_end_ind ), fir_delay_len ), sub( common_q, sts[0]->q_inp ) ); // q_inp -> common_q + scale_sig( sts[0]->input_fx + out_end_ind, add( sub( input_frame, out_end_ind ), fir_delay_len ), sub( common_q, sts[0]->q_inp ) ); // q_inp -> common_q + + // Update the Q-factors sts[0]->q_inp = common_q; move16(); sts[0]->q_old_inp = common_q; -- GitLab