Commit d182ef7f authored by Sandesh Venkatesh's avatar Sandesh Venkatesh
Browse files

Merge branch '3gpp_issue_1135_fix_2' into 'main'

Fix for 3GPP issue 1135: downmixing difference between float and fixed-point (DFT - stereo) - 3

See merge request !1070
parents c7aa17ac 4afd1667
Loading
Loading
Loading
Loading
Loading
+15 −5
Original line number Diff line number Diff line
@@ -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;