Commit a4eff17e authored by Mohammadreza Naghibzadeh's avatar Mohammadreza Naghibzadeh
Browse files

Track Q-format of dec_2over3_mem_fx across frames in stereo_icBWE_preproc_fx

parent e8f8b300
Loading
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -135,7 +135,7 @@
#define FIX_1559                                        /* Eri/FhG: fix for Issue 1559 in FD CNG with bitrate/bw switching */
#define NONBE_FIX_2575                                  /* Fhg: Fix issue 2575, precision loss in FD CNG */
#define FIX_BASOP_2519_TCA_LA_ZERO_EXP                  /* FhG: BASOP #2519: Exclude zero samples from exp_com calculation in tcaTargetCh_LA_fx */

#define FIX_BASOP_2519_ICBWE_DEC_Q_TRACK                /* FhG: BASOP #2519: Track Q-format of dec_2over3_mem_fx across frames in stereo_icBWE_preproc_fx */
/* ##################### End NON-BE switches ########################### */

/* ################## End MAINTENANCE switches ######################### */
+6 −0
Original line number Diff line number Diff line
@@ -511,8 +511,14 @@ typedef struct stereo_icbwe_enc_data_structure
    Word32 prevRefEner_fx;                                                      // Q31
    Word32 prevNonRefEner_fx;                                                   // Q31
    Word32 memGsEnerMap_fx[2];                                                  // Q31
#ifdef FIX_BASOP_2519_ICBWE_DEC_Q_TRACK
    Word16 dec_2over3_mem_fx[L_FILT_2OVER3];                                    // Q -> q_dec_2over3_mem_fx
    Word16 dec_2over3_mem_lp_fx[L_FILT_2OVER3_LP];                              // Q -> q_dec_2over3_mem_fx
    Word16 q_dec_2over3_mem_fx;                                                 // current Q of dec_2over3_mem_fx and dec_2over3_mem_lp_fx
#else
    Word16 dec_2over3_mem_fx[L_FILT_2OVER3];                                    // Q -> q_dataChan_fx
    Word16 dec_2over3_mem_lp_fx[L_FILT_2OVER3_LP];                              // Q -> q_dataChan_fx
#endif
    Word16 icbwe_inp_mem_fx[CPE_CHANNELS][NS2SA( 48000, L_MEM_RECALC_TBE_NS )]; // Q -> q_dataChan_fx
    Word16 *dataChan_fx[CPE_CHANNELS];
    Word16 q_dataChan_fx;
+44 −0
Original line number Diff line number Diff line
@@ -1146,6 +1146,10 @@ void stereo_icBWE_init_enc_fx(

    set16_fx( hStereoICBWE->dec_2over3_mem_fx, 0, L_FILT_2OVER3 );
    set16_fx( hStereoICBWE->dec_2over3_mem_lp_fx, 0, L_FILT_2OVER3_LP );
#ifdef FIX_BASOP_2519_ICBWE_DEC_Q_TRACK
    hStereoICBWE->q_dec_2over3_mem_fx = 0;
    move16();
#endif
    set16_fx( hStereoICBWE->memHPF_fx, 0, 8 );

    /* BWE ref channel */
@@ -1278,6 +1282,10 @@ void stereo_icBWE_preproc_fx(
    {
        set16_fx( hStereoICBWE->dec_2over3_mem_fx, 0, L_FILT_2OVER3 );
        set16_fx( hStereoICBWE->dec_2over3_mem_lp_fx, 0, L_FILT_2OVER3_LP );
#ifdef FIX_BASOP_2519_ICBWE_DEC_Q_TRACK
        hStereoICBWE->q_dec_2over3_mem_fx = 0;
        move16();
#endif
        set16_fx( hStereoICBWE->mem_decim_shb_ch0_fx, 0, ( 2 * L_FILT_MAX ) );
        set16_fx( shb_speech_nonref_fx, 0, L_FRAME16k );
        set16_fx( hStereoICBWE->memHPF_fx, 0, 8 );
@@ -1298,6 +1306,16 @@ void stereo_icBWE_preproc_fx(
                i = 2 * L_FILT48k + L_FILT_2OVER3;
                move16();

#ifdef FIX_BASOP_2519_ICBWE_DEC_Q_TRACK
                IF( NE_16( hStereoICBWE->q_dec_2over3_mem_fx, hStereoICBWE->q_dataChan_fx ) )
                {
                    Word16 scf = sub( hStereoICBWE->q_dataChan_fx, hStereoICBWE->q_dec_2over3_mem_fx );
                    Scale_sig( hStereoICBWE->dec_2over3_mem_fx,    L_FILT_2OVER3,    scf );
                    Scale_sig( hStereoICBWE->dec_2over3_mem_lp_fx, L_FILT_2OVER3_LP, scf );
                    hStereoICBWE->q_dec_2over3_mem_fx = hStereoICBWE->q_dataChan_fx;
                    move16();
                }
#endif
                decimate_2_over_3_allpass_fx( temp_in_fx + sub( input_frame, i ), i, temp_inp_fx + mult( sub( input_frame, i ), 21845 /* 2/3 Q15*/ ), hStereoICBWE->dec_2over3_mem_fx, allpass_poles_3_ov_2, decimate_3_ov_2_lowpass_num_fx, decimate_3_ov_2_lowpass_den_fx, hStereoICBWE->dec_2over3_mem_lp_fx );
            }
            /* flip the spectrum */
@@ -1319,6 +1337,17 @@ void stereo_icBWE_preproc_fx(
                move16();

                /* IVAS-219: the same filter memories are used for both channels; the continuity is thus lost; shouldn't the memories be separated? */
#ifdef FIX_BASOP_2519_ICBWE_DEC_Q_TRACK
                IF( NE_16( hStereoICBWE->q_dec_2over3_mem_fx, hStereoICBWE->q_dataChan_fx ) )
                {
                    Word16 scf = sub( hStereoICBWE->q_dataChan_fx, hStereoICBWE->q_dec_2over3_mem_fx );
                    Scale_sig( hStereoICBWE->dec_2over3_mem_fx,    L_FILT_2OVER3,    scf );
                    Scale_sig( hStereoICBWE->dec_2over3_mem_lp_fx, L_FILT_2OVER3_LP, scf );
                    hStereoICBWE->q_dec_2over3_mem_fx = hStereoICBWE->q_dataChan_fx;
                    move16();
                }
#endif

                decimate_2_over_3_allpass_fx( temp_in_fx + sub( input_frame, i ), i, temp_inp_fx + mult( sub( input_frame, i ), 21845 /* 2/3 Q15*/ ), hStereoICBWE->dec_2over3_mem_fx, allpass_poles_3_ov_2, decimate_3_ov_2_lowpass_num_fx, decimate_3_ov_2_lowpass_den_fx, hStereoICBWE->dec_2over3_mem_lp_fx );
            }
            /* flip the spectrum */
@@ -1354,6 +1383,10 @@ void stereo_icBWE_preproc_fx(

        set16_fx( hStereoICBWE->dec_2over3_mem_fx, 0, L_FILT_2OVER3 );
        set16_fx( hStereoICBWE->dec_2over3_mem_lp_fx, 0, L_FILT_2OVER3_LP );
#ifdef FIX_BASOP_2519_ICBWE_DEC_Q_TRACK
        hStereoICBWE->q_dec_2over3_mem_fx = 0;
        move16();
#endif
        set16_fx( hStereoICBWE->mem_decim_shb_ch0_fx, 0, ( 2 * L_FILT_MAX ) );
        set16_fx( shb_speech_nonref_fx, 0, L_FRAME16k );
        set16_fx( hStereoICBWE->memHPF_fx, 0, 8 );
@@ -1397,6 +1430,17 @@ void stereo_icBWE_preproc_fx(
        Copy( temp_inp_fx, temp_in_fx, L_FRAME48k ); /* q_dataChan_fx */
        set16_fx( temp_inp_fx, 0, L_FRAME48k );

#ifdef FIX_BASOP_2519_ICBWE_DEC_Q_TRACK
        IF( NE_16( hStereoICBWE->q_dec_2over3_mem_fx, hStereoICBWE->q_dataChan_fx ) )
        {
            Word16 scf = sub( hStereoICBWE->q_dataChan_fx, hStereoICBWE->q_dec_2over3_mem_fx );
            Scale_sig( hStereoICBWE->dec_2over3_mem_fx, L_FILT_2OVER3, scf );
            Scale_sig( hStereoICBWE->dec_2over3_mem_lp_fx, L_FILT_2OVER3_LP, scf );
            hStereoICBWE->q_dec_2over3_mem_fx = hStereoICBWE->q_dataChan_fx;
            move16();
        }
#endif

        decimate_2_over_3_allpass_fx( temp_in_fx, L_FRAME48k, temp_inp_fx, hStereoICBWE->dec_2over3_mem_fx, allpass_poles_3_ov_2, decimate_3_ov_2_lowpass_num_fx, decimate_3_ov_2_lowpass_den_fx, hStereoICBWE->dec_2over3_mem_lp_fx );
    }