Loading lib_com/options.h +3 −0 Original line number Diff line number Diff line Loading @@ -150,6 +150,9 @@ /* for EVS_MONO, all is kept BE. */ #define FIX_ISSUE_1966_PHASE_DIFF /* FhG: Basop issue 1966: shift phase range to [-2PI..+2PI[, handle 4 quadrants */ #define FIX_ISSUE_1966_F0_32BIT /* FhG: Basop issue 1966: use 32-bit variables for F0 and thresholdModification */ #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 ######################### */ Loading lib_enc/ivas_stat_enc.h +11 −5 Original line number Diff line number Diff line Loading @@ -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; Loading lib_enc/ivas_stereo_ica_enc_fx.c +14 −0 Original line number Diff line number Diff line Loading @@ -171,8 +171,15 @@ static void tcaTargetCh_LA_fx( move32(); target_exp_temp[i + currentNCShift] = temp; move16(); #ifdef FIX_BASOP_2519_TCA_LA_ZERO_EXP IF( NE_32( target[i + currentNCShift], 0 ) ) { exp_com = s_max( exp_com, temp ); } #else exp_com = s_max( exp_com, temp ); #endif } FOR( ; i < input_frame; i++ ) { Loading @@ -180,8 +187,15 @@ static void tcaTargetCh_LA_fx( move32(); target_exp_temp[i + currentNCShift] = add( gAdj_exp, ref_exp ); move16(); #ifdef FIX_BASOP_2519_TCA_LA_ZERO_EXP IF( NE_32( target[i + currentNCShift], 0 ) ) { exp_com = s_max( exp_com, target_exp_temp[i + currentNCShift] ); } #else exp_com = s_max( exp_com, target_exp_temp[i + currentNCShift] ); #endif } FOR( i = 0; i < input_frame + currentNCShift; i++ ) { Loading lib_enc/ivas_stereo_icbwe_enc_fx.c +44 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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 ); Loading @@ -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 */ Loading @@ -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 */ Loading Loading @@ -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 ); Loading Loading @@ -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 ); } Loading Loading
lib_com/options.h +3 −0 Original line number Diff line number Diff line Loading @@ -150,6 +150,9 @@ /* for EVS_MONO, all is kept BE. */ #define FIX_ISSUE_1966_PHASE_DIFF /* FhG: Basop issue 1966: shift phase range to [-2PI..+2PI[, handle 4 quadrants */ #define FIX_ISSUE_1966_F0_32BIT /* FhG: Basop issue 1966: use 32-bit variables for F0 and thresholdModification */ #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 ######################### */ Loading
lib_enc/ivas_stat_enc.h +11 −5 Original line number Diff line number Diff line Loading @@ -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; Loading
lib_enc/ivas_stereo_ica_enc_fx.c +14 −0 Original line number Diff line number Diff line Loading @@ -171,8 +171,15 @@ static void tcaTargetCh_LA_fx( move32(); target_exp_temp[i + currentNCShift] = temp; move16(); #ifdef FIX_BASOP_2519_TCA_LA_ZERO_EXP IF( NE_32( target[i + currentNCShift], 0 ) ) { exp_com = s_max( exp_com, temp ); } #else exp_com = s_max( exp_com, temp ); #endif } FOR( ; i < input_frame; i++ ) { Loading @@ -180,8 +187,15 @@ static void tcaTargetCh_LA_fx( move32(); target_exp_temp[i + currentNCShift] = add( gAdj_exp, ref_exp ); move16(); #ifdef FIX_BASOP_2519_TCA_LA_ZERO_EXP IF( NE_32( target[i + currentNCShift], 0 ) ) { exp_com = s_max( exp_com, target_exp_temp[i + currentNCShift] ); } #else exp_com = s_max( exp_com, target_exp_temp[i + currentNCShift] ); #endif } FOR( i = 0; i < input_frame + currentNCShift; i++ ) { Loading
lib_enc/ivas_stereo_icbwe_enc_fx.c +44 −0 Original line number Diff line number Diff line Loading @@ -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 */ Loading Loading @@ -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 ); Loading @@ -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 */ Loading @@ -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 */ Loading Loading @@ -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 ); Loading Loading @@ -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 ); } Loading