Commit 3fabbf35 authored by Manuel Jander's avatar Manuel Jander
Browse files

Make old_fdbwe_speech_fx dynamic scale instead of Q-1 to avoid saturation (or crash).

parent b0ef9455
Loading
Loading
Loading
Loading
Loading
+7 −1
Original line number Diff line number Diff line
@@ -997,8 +997,13 @@ typedef struct td_bwe_enc_structure
    Word16 gFrame_WB;

    Word16 idxGain;
#ifdef NONBE_FIX_ISSUE_2206
    Word16 dec_2_over_3_mem_fx[L_FILT_2OVER3]; /* Q0*/
    Word16 dec_2_over_3_mem_lp_fx[6];          /* Q0*/
#else
    Word16 dec_2_over_3_mem_fx[L_FILT_2OVER3];
    Word16 dec_2_over_3_mem_lp_fx[6];
#endif

    Word16 tbe_demph_fx;                  /* Q(prev_Q_bwe_exc - 16 - NOISE_QADJ) */
    Word16 tbe_premph_fx;                 /* Q(prev_Q_bwe_exc - 16) */
@@ -1034,7 +1039,8 @@ typedef struct fd_bwe_enc_structure
    Word16 old_input_lp_fx[NS2SA( 16000, ACELP_LOOK_NS + DELAY_FD_BWE_ENC_NS )]; // st->hBWE_FD->prev_Q_input_lp
    Word16 old_syn_12k8_16k_fx[NS2SA( 16000, DELAY_FD_BWE_ENC_NS )];             // st->Q_syn
#ifdef NONBE_FIX_ISSUE_2206
    Word16 old_fdbwe_speech_fx[L_FRAME48k]; // Q(-1)
    Word16 old_fdbwe_speech_fx[L_FRAME48k]; // Q(old_fdbwe_speech_q) for IVAS, Q(-1) for EVS.
    Word16 old_fdbwe_speech_q;
#else
    Word16 old_fdbwe_speech_fx[L_FRAME48k];
#endif
+4 −0
Original line number Diff line number Diff line
@@ -3296,6 +3296,10 @@ void fd_bwe_enc_init_fx(
    hBWE_FD->prev_Q_input_lp = 0;
    move16();
    set16_fx( hBWE_FD->old_fdbwe_speech_fx, 0, L_FRAME48k );
#ifdef NONBE_FIX_ISSUE_2206
    hBWE_FD->old_fdbwe_speech_q = Q15;
    move16();
#endif
    hBWE_FD->mem_deemph_old_syn_fx = 0;
    move16();

+21 −10
Original line number Diff line number Diff line
@@ -533,8 +533,10 @@ void swb_pre_proc_fx(
            }

#ifdef NONBE_FIX_ISSUE_2206
            Copy_Scale_sig_nosat( st->input_fx - Sample_Delay_SWB_BWE, hBWE_FD->old_input_fx, Sample_Delay_SWB_BWE, sub( -1, st->q_inp ) );
            Copy_Scale_sig_nosat( st->input_fx - L_FRAME32k, hBWE_FD->old_fdbwe_speech_fx, L_FRAME32k, sub( -1, st->q_inp ) );
            hBWE_FD->old_fdbwe_speech_q = s_min( Q14, add( st->q_old_inp, norm_arr( st->input_fx - L_FRAME32k, L_FRAME32k ) ) );
            move16();
            Copy_Scale_sig_nosat( st->input_fx - Sample_Delay_SWB_BWE, hBWE_FD->old_input_fx, Sample_Delay_SWB_BWE, sub( -1, st->q_old_inp ) );
            Copy_Scale_sig_nosat( st->input_fx - L_FRAME32k, hBWE_FD->old_fdbwe_speech_fx, L_FRAME32k, sub( hBWE_FD->old_fdbwe_speech_q, st->q_old_inp ) );
#else
            Copy( st->input_fx - Sample_Delay_SWB_BWE, hBWE_FD->old_input_fx, Sample_Delay_SWB_BWE );
            Copy( st->input_fx - L_FRAME32k, hBWE_FD->old_fdbwe_speech_fx, L_FRAME32k );
@@ -591,18 +593,21 @@ void swb_pre_proc_fx(
#ifdef NONBE_FIX_ISSUE_2206
            IF( st->element_mode > EVS_MONO )
            {
                Copy_Scale_sig_nosat( hBWE_FD->old_fdbwe_speech_fx, &old_input_fx[Sample_Delay_SWB_BWE], L_FRAME32k, sub( st->q_inp, -1 ) );
                Copy_Scale_sig_nosat( hBWE_FD->old_fdbwe_speech_fx, &old_input_fx[Sample_Delay_SWB_BWE], L_FRAME32k, sub( st->q_inp, hBWE_FD->old_fdbwe_speech_q ) );
                Copy_Scale_sig_nosat( hBWE_FD->old_fdbwe_speech_fx + L_FRAME32k - Sample_Delay_SWB_BWE, hBWE_FD->old_input_fx, Sample_Delay_SWB_BWE, sub( -1, hBWE_FD->old_fdbwe_speech_q ) );
            }
            ELSE
            {
                Copy( hBWE_FD->old_fdbwe_speech_fx, &old_input_fx[Sample_Delay_SWB_BWE], L_FRAME32k );
                Copy( hBWE_FD->old_fdbwe_speech_fx + L_FRAME32k - Sample_Delay_SWB_BWE, hBWE_FD->old_input_fx, Sample_Delay_SWB_BWE );
            }
            set16_fx( old_input_fx, 0, Sample_Delay_SWB_BWE );
#else
            Copy( hBWE_FD->old_fdbwe_speech_fx, &old_input_fx[Sample_Delay_SWB_BWE], L_FRAME32k );
#endif

            set16_fx( old_input_fx, 0, Sample_Delay_SWB_BWE );
            Copy( hBWE_FD->old_fdbwe_speech_fx + L_FRAME32k - Sample_Delay_SWB_BWE, hBWE_FD->old_input_fx, Sample_Delay_SWB_BWE );
#endif

            IF( NE_16( st->extl, WB_BWE ) )
            {
                Copy( old_input_fx, hBWE_FD->L_old_wtda_swb_fx, L_FRAME32k );
@@ -621,7 +626,9 @@ void swb_pre_proc_fx(
        IF( NE_16( st->extl, SWB_BWE ) && NE_16( st->extl, FB_BWE ) )
        {
#ifdef NONBE_FIX_ISSUE_2206
            Copy_Scale_sig_nosat( st->input_fx, hBWE_FD->old_fdbwe_speech_fx, L_FRAME32k, sub( -1, st->q_inp ) );
            Copy( st->input_fx, hBWE_FD->old_fdbwe_speech_fx, L_FRAME32k );
            hBWE_FD->old_fdbwe_speech_q = st->q_inp;
            move16();
#else
            Copy( st->input_fx, hBWE_FD->old_fdbwe_speech_fx, L_FRAME32k );
#endif
@@ -666,7 +673,9 @@ void swb_pre_proc_fx(
                }

#ifdef NONBE_FIX_ISSUE_2206
                Copy_Scale_sig_nosat( st->input_fx - L_FRAME48k, hBWE_FD->old_fdbwe_speech_fx, L_FRAME48k, sub( -1, st->q_inp ) );
                Copy( st->input_fx - L_FRAME48k, hBWE_FD->old_fdbwe_speech_fx, L_FRAME48k );
                hBWE_FD->old_fdbwe_speech_q = st->q_old_inp;
                move16();
#else
                Copy( st->input_fx - L_FRAME48k, hBWE_FD->old_fdbwe_speech_fx, L_FRAME48k );
#endif
@@ -743,7 +752,9 @@ void swb_pre_proc_fx(
            {
                /* move the resampling out of the TDBWE path as new_swb_speech is not needed for TDBWE. */
#ifdef NONBE_FIX_ISSUE_2206
                Copy_Scale_sig_nosat( st->input_fx, hBWE_FD->old_fdbwe_speech_fx, L_FRAME48k, sub( -1, st->q_inp ) );
                Copy( st->input_fx, hBWE_FD->old_fdbwe_speech_fx, L_FRAME48k );
                hBWE_FD->old_fdbwe_speech_q = st->q_inp;
                move16();
#else
                Copy( st->input_fx, hBWE_FD->old_fdbwe_speech_fx, L_FRAME48k );
#endif
@@ -761,7 +772,7 @@ void swb_pre_proc_fx(
                        inner_Fs = 48000;
                        move32();
#ifdef NONBE_FIX_ISSUE_2206
                        Copy_Scale_sig_nosat( hBWE_FD->old_fdbwe_speech_fx, new_swb_speech, L_FRAME48k, sub( st->q_inp, -1 ) );
                        Copy_Scale_sig_nosat( hBWE_FD->old_fdbwe_speech_fx, new_swb_speech, L_FRAME48k, sub( st->q_inp, hBWE_FD->old_fdbwe_speech_q ) );
#else
                        Copy( hBWE_FD->old_fdbwe_speech_fx, new_swb_speech, L_FRAME48k );
#endif
@@ -774,7 +785,7 @@ void swb_pre_proc_fx(
                        move32();

#ifdef NONBE_FIX_ISSUE_2206
                        Copy_Scale_sig_nosat( hBWE_FD->old_fdbwe_speech_fx, new_swb_speech, L_FRAME48k, sub( st->q_inp, -1 ) );
                        Copy_Scale_sig_nosat( hBWE_FD->old_fdbwe_speech_fx, new_swb_speech, L_FRAME48k, sub( st->q_inp, hBWE_FD->old_fdbwe_speech_q ) );

                        IF( NE_16( st->element_mode, IVAS_CPE_DFT ) )
                        {