Loading .gitlab-ci.yml +2 −2 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ variables: PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" TESTCASE_TIMEOUT_STV: 900 TESTCASE_TIMEOUT_LTV: 2400 TESTCASE_TIMEOUT_STV_SANITIZERS: 1800 TESTCASE_TIMEOUT_LTV_SANITIZERS: 6000 CI_REGRESSION_THRESH_MLD: "0.1" CI_REGRESSION_THRESH_MAX_ABS_DIFF: "50" CI_REGRESSION_THRESH_SSNR: "-1" Loading Loading @@ -511,7 +511,7 @@ stages: - make clean - make -j CLANG=$CLANG_NUM - if [[ $CLANG_NUM == 3 ]]; then export UBSAN_OPTIONS="suppressions=scripts/ubsan.supp,report_error_type=1"; fi - testcase_timeout=$TESTCASE_TIMEOUT_STV_SANITIZERS - testcase_timeout=$TESTCASE_TIMEOUT_LTV_SANITIZERS - python3 -m pytest $TEST_SUITE -v --tb=no --update_ref 1 --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout $testcase_timeout --ref_encoder_path $DUT_ENCODER_PATH --ref_decoder_path $DUT_DECODER_PATH artifacts: name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" Loading lib_com/options.h +9 −3 Original line number Diff line number Diff line Loading @@ -109,8 +109,14 @@ #define FIX_1132_STACK_CORRUPTION /* Stack corruption issue due of extending index access*/ #define FIX_ISSUE_1092 /* Ittiam: Fix for Issue 1092: BASOP asserts in stereo fx encoder for selection test inputs*/ #define FIX_ISSUE_1148 //#define FIX_867 //#define FIX_867_DBG #define FIX_ISSUE_1147 /*Ittiam: Fix for issue 1147: Added saturation in DetectTnsFilt_fx.*/ #define FIX_ISSUE_1150 /* Ittiam: Fix for Issue 1150: Assertion error observed in evs_enc_fx (with option stereo_dmx_evs) from tcx_ltp_find_gain function*/ #define FIX_ISSUE_1151 /* Ittiam: Fix for Issue 1151: Assertion error observed in evs_enc_fx (with option stereo_dmx_evs) from sp_mus_classif_gmm_fx function*/ #define FIX_ISSUE_1153 /* Ittiam: Fix for Issue 1153: Assertion error observed in stereo_dmx_evs_enc_fx from calc_poc_fx function*/ #define FIX_ISSUE_1154 /* Ittiam: Fix for Issue 1154: Encoder crash for ParamMC 7.1 at 96kbps in ivas_param_mc_param_est_enc_fx() */ #define FIX_ISSUE_1157 /* Ittiam: Fix for Issue 1157: Encoder crash for Stereo at 48/64kbps DTX on/off in kernel_switch_trafo_fx() */ #define FIX_867 #define FIX_867_DBG #endif lib_com/swb_tbe_com_fx.c +1 −6 Original line number Diff line number Diff line Loading @@ -7847,13 +7847,8 @@ void prep_tbe_exc_ivas_fx( } ELSE { Word16 shift = 8; Word16 shift = 4; move16(); if ( element_mode == EVS_MONO ) { shift = 4; move16(); } IF( gain_preQ_fx != 0 ) { FOR( i = 0; i < L_subfr; i++ ) Loading lib_enc/cod4t64_fast.c +24 −1 Original line number Diff line number Diff line Loading @@ -770,7 +770,30 @@ void acelp_fast_fx( alp_pos3++; } i = emaximum_32fx( Q_dn, dn, L_subfr, &L_tmp1 ); Word16 k; Word64 W_tmp, W_tmp1; Word64 emax; emax = W_mult0_32_32( dn[0], dn[0] ); i = 0; move16(); FOR( k = 1; k < L_subfr; k++ ) { W_tmp = W_mult0_32_32( dn[k], dn[k] ); W_tmp1 = W_sub( W_tmp, emax ); if ( W_tmp1 > 0 ) { i = k; move16(); } if ( LE_64( emax, W_tmp ) ) { emax = W_tmp; move64(); } } track = i % nb_tracks; move16(); Loading lib_enc/find_tilt.c +100 −95 Original line number Diff line number Diff line Loading @@ -56,22 +56,22 @@ * Find LF/HF energy ratio *-------------------------------------------------------------------*/ void find_tilt_ivas_fx( const Word32 fr_bands[], /* i : energy in frequency bands Q_new*/ const Word32 bckr[], /* i : per band background noise energy estimate Q_new*/ const Word32 fr_bands[], /* i : energy in frequency bands q_fr_bands*/ const Word16 q_fr_bands, /* i : Q of fr_bands Q0*/ const Word32 bckr[], /* i : per band background noise energy estimate q_bckr*/ const Word16 q_bckr, /* i : Q of bckr Q0*/ Word32 ee[2], /* o : lf/hf E ration for present frame Q6*/ const Word16 pitch[3], /* i : open loop pitch values for 3 half-frames Q0*/ const Word16 voicing[3], /* i : normalized correlation for 3 half-frames Q15*/ const Word32 *lf_E, /* i : per bin energy for low frequencies Q_new - 2*/ const Word32 *lf_E, /* i : per bin energy for low frequencies q_lf_E*/ const Word16 q_lf_E, /* i : Q of lf_E */ const Word16 corr_shift, /* i : normalized correlation correction Q15*/ const Word16 bwidth, /* i : input signal bandwidth Q0*/ const Word16 max_band, /* i : maximum critical band Q0*/ const Word16 bwidth, /* i : input signal bandwidth */ const Word16 max_band, /* i : maximum critical band */ Word32 hp_E[], /* o : energy in HF Q_new*/ const Word16 codec_mode, /* i : MODE1 or MODE2 Q0*/ const Word16 Q_new, /* i : scaling factor */ Word32 *bckr_tilt_lt /* i/o: lf/hf E ratio of background noise Q16*/ , Word16 Opt_vbr_mode /* Q0 */ ) const Word16 codec_mode, /* i : MODE1 or MODE2 */ Word32 *bckr_tilt_lt, /* i/o: lf/hf E ratio of background noise Q16 */ Word16 Opt_vbr_mode ) { Word32 lp_bckr = 0, hp_bckr = 0, lp_E, Ltmp; const Word32 *pt_E, *pt_bands, *pt_bckr, *hf_bands, *tmp_E; Loading @@ -81,6 +81,9 @@ void find_tilt_ivas_fx( Word16 m_Fs, e_Fs; Word16 m_cnt, e_cnt; Word16 m_hpE, e_hpE; Word64 sum; Word16 inv_bands, q_lp_E; Word32 Le_min_scaled, Ltmp2; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); Loading @@ -91,7 +94,7 @@ void find_tilt_ivas_fx( * Initializations *-----------------------------------------------------------------*/ IF( NE_16( bwidth, NB ) ) IF( ( bwidth != NB ) ) { /* WB processing */ bin = BIN4_FX; Loading @@ -100,16 +103,20 @@ void find_tilt_ivas_fx( tmp_E = lf_E; /* Q_new - 2 */ pt_bckr = bckr; /* Q_new */ nb_bands = 10; inv_bands = 3277 /* 1/10 in Q15 */; move16(); move16(); } ELSE { /* NB processing */ bin = add( shl( BIN4_FX, 1 ), BIN4_FX ); /* First useful frequency bin ~ 150 Hz */ bin = 3 * BIN4_FX; /* First useful frequency bin ~ 150 Hz */ pt_bands = fr_bands + 1; /* Exlcude 1st critical band */ tmp_E = lf_E + 2; /* Start at the 3rd bin (150 Hz) */ pt_bckr = bckr + 1; /* Exlcude 1st critical band */ nb_bands = 9; inv_bands = 3641; /* 1/9 in Q15 */ move16(); move16(); /* Nb. of "low" frequency bands taken into account in NB processing */ } Loading @@ -122,21 +129,23 @@ void find_tilt_ivas_fx( /* bckr + voicing */ /*lp_bckr = mean( pt_bckr, nb_bands );*/ /* estimated noise E in first critical bands, up to 1270 Hz */ lp_bckr = Mean32( pt_bckr, nb_bands ); sum = 0; move64(); FOR( i = 0; i < nb_bands; i++ ) { sum = W_mac_32_16( sum, pt_bckr[i], inv_bands ); // q_bckr+16 } lp_bckr = W_shl_sat_l( sum, -16 ); // q_bckr /*hp_bckr = 0.5f * (bckr[max_band-1] + bckr[max_band]);*/ /* estimated noise E in last 2 critical bands */ #ifdef BASOP_NOGLOB hp_bckr = L_shr( L_add_sat( bckr[max_band - 1], bckr[max_band] ), 1 ); /* Q_new - 1 */ #else hp_bckr = L_shr( L_add( bckr[max_band - 1], bckr[max_band] ), 1 ); #endif hp_bckr = W_extract_h( W_mac_32_32( W_mult_32_32( bckr[max_band - 1], ONE_IN_Q30 ), bckr[max_band], ONE_IN_Q30 ) ); // q_bckr if ( hp_bckr == 0 ) /* Avoid division by zero. */ { hp_bckr = L_deposit_l( 1 ); } Ltmp = BASOP_Util_Divide3232_Scale_cadence( lp_bckr, hp_bckr, &e_tmp ); /* exp(e_tmp) */ Ltmp = Mpy_32_16_r( Ltmp, 3277 /* 0.1 in Q15 */ ); Ltmp = BASOP_Util_Divide3232_Scale_cadence( lp_bckr, hp_bckr, &e_tmp ); Ltmp = Mpy_32_16_r( Ltmp, 3277 /* 0.1f in Q15 */ ); Ltmp = L_shr_sat( Ltmp, sub( 15, e_tmp ) ); *bckr_tilt_lt = L_add_sat( Mpy_32_16_r( *bckr_tilt_lt, 29491 ), Ltmp ); /* Q16 */ *bckr_tilt_lt = L_add_sat( Mpy_32_16_r( *bckr_tilt_lt, 29491 /* 0.9f in Q15 */ ), Ltmp ); // Q16 move32(); test(); Loading Loading @@ -171,34 +180,31 @@ void find_tilt_ivas_fx( e_Fs = sub( 15, e_tmp ); f0 = shr( m_Fs, sub( e_Fs, 4 ) ); /* Q4 */ Le_min_scaled = L_shl( E_MIN_FXQ31, sub( q_fr_bands, Q31 ) ); // q_fr_bands=q_bckr FOR( i = 0; i < 2; i++ ) { /*hp_E[i] = 0.5f * (hf_bands[max_band-1] + hf_bands[max_band]) - hp_bckr; */ /* averaged E in last 2 critical bands */ Ltmp = L_add( L_shr( hf_bands[max_band - 1], 1 ), L_shr( hf_bands[max_band], 1 ) ); /* Q_new */ hp_E[i] = L_sub( Ltmp, hp_bckr ); /* Q_new */ move32(); IF( Opt_vbr_mode == 0 ) { IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( hp_E[i], sub( 31, Q_new ), E_MIN_IVAS_FX, 31 - Q19 ), -1 ) ) Ltmp = W_extract_h( W_mac_32_32( W_mult_32_32( hf_bands[max_band - 1], ONE_IN_Q30 ), hf_bands[max_band], ONE_IN_Q30 ) ); // q_fr_bands Ltmp = L_sub( Ltmp, hp_bckr ); // q_fr_bands Ltmp2 = L_max( Ltmp, L_shl_sat( 1, q_fr_bands ) ); // q_fr_bands, saturation is added because q_fr_bands is limited to 31 if ( Opt_vbr_mode == 0 ) { hp_E[i] = L_shl( E_MIN_IVAS_FX, sub( Q_new, Q19 ) ); move32(); Ltmp2 = L_max( Ltmp, Le_min_scaled ); // q_fr_bands } } ELSE { hp_E[i] = L_max( hp_E[i], L_shl( 1, Q_new ) ); hp_E[i] = L_max( Ltmp2, 1 ); // to prevent division by zero move32(); } test(); IF( GT_16( mean_voi, TH_COR_FX ) && LT_16( pitch[2], TH_PIT_FX ) ) /* High-pitched voiced frames */ { freq = bin; freq = bin; // Q4 move16(); /* 1st useful frequency bin */ m_cnt = 0; move16(); lp_E = L_deposit_l( 0 ); sum = 0; move64(); f1 = add( shr( f0, 1 ), f0 ); /* Middle between 2 harmonics */ f2 = f0; Loading @@ -208,14 +214,10 @@ void find_tilt_ivas_fx( FOR( ; freq <= f1; freq += BIN4_FX ) { /* include only bins sufficiently close to harmonics */ tmp = sub( freq, f2 ); /* Q4 */ IF( L_mac0( -(Word32) TH_D_FX * TH_D_FX, tmp, tmp ) < 0 ) tmp = sub( freq, f2 ); IF( L_mac0( -TH_D_FX * TH_D_FX, tmp, tmp ) < 0 ) { #ifdef BASOP_NOGLOB lp_E = L_add_o( *pt_E, lp_E, &Overflow ); /* Q_new - 1 */ #else lp_E = L_add( *pt_E, lp_E ); #endif sum = W_mac_32_16( sum, *pt_E, 1 ); // q_lf_E+1 m_cnt = add( m_cnt, 1 ); } pt_E++; Loading @@ -229,52 +231,65 @@ void find_tilt_ivas_fx( #endif } /*lp_E = lp_E / (float)cnt - lp_bckr;*/ e_tmp = sub( norm_l( lp_E ), 1 ); m_tmp = extract_h( L_shl( lp_E, e_tmp ) ); e_tmp = sub( e_tmp, 2 ); /* lf_e divided by 4 in anal_sp */ e_tmp = sub( W_norm( sum ), 1 ); m_tmp = extract_h( W_extract_h( W_shl( sum, e_tmp ) ) ); // q_lf_E+1+e_tmp-32-16 e_tmp = sub( add( q_lf_E, e_tmp ), 47 ); e_cnt = norm_s( m_cnt ); m_cnt = shl( m_cnt, e_cnt ); m_cnt = shl( m_cnt, e_cnt ); // e_cnt m_tmp = div_s( m_tmp, m_cnt ); e_tmp = sub( e_tmp, e_cnt ); #ifdef BASOP_NOGLOB lp_E = L_sub_o( L_shr_o( m_tmp, sub( e_tmp, 1 ), &Overflow ), lp_bckr, &Overflow ); #else lp_E = L_sub( L_shr( m_tmp, sub( e_tmp, 1 ) ), lp_bckr ); #endif m_tmp = div_s( m_tmp, m_cnt ); // Q15+e_tmp-e_cnt e_tmp = add( Q15, sub( e_tmp, e_cnt ) ); sum = W_shl( m_tmp, sub( add( q_bckr, 1 ), e_tmp ) ); // q_bckr+1 sum = W_msu_32_16( sum, lp_bckr, 1 ); // q_bckr+1 q_lp_E = W_norm( sum ); lp_E = W_extract_h( W_shl( sum, q_lp_E ) ); // q_bckr+1+q_lp_E-32 q_lp_E = sub( add( q_lp_E, q_bckr ), Q31 ); pt_E = tmp_E + VOIC_BINS; /* Update for next half-frame Q_new - 1 */ } ELSE /* Other than high-pitched voiced frames */ { /*lp_E = mean( pt_bands, nb_bands ) - lp_bckr;*/ /* averaged E in first critical bands, up to 1270 Hz */ lp_E = L_sub( Mean32( pt_bands, nb_bands ), lp_bckr ); } IF( Opt_vbr_mode == 0 ) sum = 0; move64(); FOR( Word16 j = 0; j < nb_bands; j++ ) { IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( lp_E, sub( 31, Q_new ), E_MIN_IVAS_FX, 31 - Q19 ), -1 ) ) { lp_E = L_shl( E_MIN_IVAS_FX, sub( Q_new, Q19 ) ); sum = W_mac_32_16( sum, pt_bands[j], inv_bands ); // q_fr_bands+16 } sum = W_mac_32_16( sum, lp_bckr, -ONE_IN_Q15 ); // q_fr_bands+16 lp_E = W_round48_L( sum ); // q_fr_bands=q_bckr q_lp_E = q_bckr; // q_fr_bands=q_bckr move16(); } ELSE test(); IF( Opt_vbr_mode == 0 && GT_32( L_shl_sat( Le_min_scaled, sub( q_lp_E, q_bckr ) ), lp_E ) ) { lp_E = E_MIN_FXQ31; q_lp_E = Q31; move32(); move16(); } if ( Opt_vbr_mode != 0 ) { lp_E = L_max( lp_E, 0 ); lp_E = L_max( lp_E, 0 ); // q_lp_E } /*ee[i] = lp_E / hp_E[i];*/ /* LF/HF ratio */ if ( lp_E == 0 ) { ee[i] = 0; move32(); } test(); IF( lp_E != 0 && hp_E[i] != 0 ) IF( lp_E != 0 ) { e_tmp = sub( norm_l( lp_E ), 1 ); m_tmp = extract_h( L_shl( lp_E, e_tmp ) ); m_tmp = extract_h( L_shl( lp_E, e_tmp ) ); // e_tmp+q_lp_E-16 e_hpE = norm_l( hp_E[i] ); m_hpE = extract_h( L_shl( hp_E[i], e_hpE ) ); m_tmp = div_s( m_tmp, m_hpE ); /* e_tmp + e_hpE */ e_tmp = sub( e_tmp, e_hpE ); m_hpE = extract_h( L_shl( hp_E[i], e_hpE ) ); // e_hpE+q_bckr-16 m_tmp = div_s( m_tmp, m_hpE ); // Q15+(e_tmp+q_lp_E)-(e_hpE+q_bckr) e_tmp = sub( add( e_tmp, q_lp_E ), add( e_hpE, q_bckr ) ); #ifdef BASOP_NOGLOB ee[i] = L_shr_o( m_tmp, add( e_tmp, 15 - 6 ), &Overflow ); /* ee in Q6 */ #else /* BASOP_NOGLOB */ Loading @@ -282,18 +297,8 @@ void find_tilt_ivas_fx( #endif move32(); } ELSE IF( lp_E == 0 ) { ee[i] = L_deposit_l( 0 ); move32(); } ELSE { ee[i] = MAX_32; move32(); } IF( EQ_16( bwidth, NB ) ) /* For NB input, compensate for the missing bands */ IF( bwidth == NB ) /* For NB input, compensate for the missing bands */ { #ifdef BASOP_NOGLOB Ltmp = L_shl_o( ee[i], 3, &Overflow ); /* Q6 */ Loading Loading
.gitlab-ci.yml +2 −2 Original line number Diff line number Diff line Loading @@ -23,7 +23,7 @@ variables: PRM_FILES: "scripts/config/self_test.prm scripts/config/self_test_ltv.prm" TESTCASE_TIMEOUT_STV: 900 TESTCASE_TIMEOUT_LTV: 2400 TESTCASE_TIMEOUT_STV_SANITIZERS: 1800 TESTCASE_TIMEOUT_LTV_SANITIZERS: 6000 CI_REGRESSION_THRESH_MLD: "0.1" CI_REGRESSION_THRESH_MAX_ABS_DIFF: "50" CI_REGRESSION_THRESH_SSNR: "-1" Loading Loading @@ -511,7 +511,7 @@ stages: - make clean - make -j CLANG=$CLANG_NUM - if [[ $CLANG_NUM == 3 ]]; then export UBSAN_OPTIONS="suppressions=scripts/ubsan.supp,report_error_type=1"; fi - testcase_timeout=$TESTCASE_TIMEOUT_STV_SANITIZERS - testcase_timeout=$TESTCASE_TIMEOUT_LTV_SANITIZERS - python3 -m pytest $TEST_SUITE -v --tb=no --update_ref 1 --html=report.html --self-contained-html --junit-xml=report-junit.xml --testcase_timeout $testcase_timeout --ref_encoder_path $DUT_ENCODER_PATH --ref_decoder_path $DUT_DECODER_PATH artifacts: name: "$CI_JOB_NAME--sha-$CI_COMMIT_SHORT_SHA--results" Loading
lib_com/options.h +9 −3 Original line number Diff line number Diff line Loading @@ -109,8 +109,14 @@ #define FIX_1132_STACK_CORRUPTION /* Stack corruption issue due of extending index access*/ #define FIX_ISSUE_1092 /* Ittiam: Fix for Issue 1092: BASOP asserts in stereo fx encoder for selection test inputs*/ #define FIX_ISSUE_1148 //#define FIX_867 //#define FIX_867_DBG #define FIX_ISSUE_1147 /*Ittiam: Fix for issue 1147: Added saturation in DetectTnsFilt_fx.*/ #define FIX_ISSUE_1150 /* Ittiam: Fix for Issue 1150: Assertion error observed in evs_enc_fx (with option stereo_dmx_evs) from tcx_ltp_find_gain function*/ #define FIX_ISSUE_1151 /* Ittiam: Fix for Issue 1151: Assertion error observed in evs_enc_fx (with option stereo_dmx_evs) from sp_mus_classif_gmm_fx function*/ #define FIX_ISSUE_1153 /* Ittiam: Fix for Issue 1153: Assertion error observed in stereo_dmx_evs_enc_fx from calc_poc_fx function*/ #define FIX_ISSUE_1154 /* Ittiam: Fix for Issue 1154: Encoder crash for ParamMC 7.1 at 96kbps in ivas_param_mc_param_est_enc_fx() */ #define FIX_ISSUE_1157 /* Ittiam: Fix for Issue 1157: Encoder crash for Stereo at 48/64kbps DTX on/off in kernel_switch_trafo_fx() */ #define FIX_867 #define FIX_867_DBG #endif
lib_com/swb_tbe_com_fx.c +1 −6 Original line number Diff line number Diff line Loading @@ -7847,13 +7847,8 @@ void prep_tbe_exc_ivas_fx( } ELSE { Word16 shift = 8; Word16 shift = 4; move16(); if ( element_mode == EVS_MONO ) { shift = 4; move16(); } IF( gain_preQ_fx != 0 ) { FOR( i = 0; i < L_subfr; i++ ) Loading
lib_enc/cod4t64_fast.c +24 −1 Original line number Diff line number Diff line Loading @@ -770,7 +770,30 @@ void acelp_fast_fx( alp_pos3++; } i = emaximum_32fx( Q_dn, dn, L_subfr, &L_tmp1 ); Word16 k; Word64 W_tmp, W_tmp1; Word64 emax; emax = W_mult0_32_32( dn[0], dn[0] ); i = 0; move16(); FOR( k = 1; k < L_subfr; k++ ) { W_tmp = W_mult0_32_32( dn[k], dn[k] ); W_tmp1 = W_sub( W_tmp, emax ); if ( W_tmp1 > 0 ) { i = k; move16(); } if ( LE_64( emax, W_tmp ) ) { emax = W_tmp; move64(); } } track = i % nb_tracks; move16(); Loading
lib_enc/find_tilt.c +100 −95 Original line number Diff line number Diff line Loading @@ -56,22 +56,22 @@ * Find LF/HF energy ratio *-------------------------------------------------------------------*/ void find_tilt_ivas_fx( const Word32 fr_bands[], /* i : energy in frequency bands Q_new*/ const Word32 bckr[], /* i : per band background noise energy estimate Q_new*/ const Word32 fr_bands[], /* i : energy in frequency bands q_fr_bands*/ const Word16 q_fr_bands, /* i : Q of fr_bands Q0*/ const Word32 bckr[], /* i : per band background noise energy estimate q_bckr*/ const Word16 q_bckr, /* i : Q of bckr Q0*/ Word32 ee[2], /* o : lf/hf E ration for present frame Q6*/ const Word16 pitch[3], /* i : open loop pitch values for 3 half-frames Q0*/ const Word16 voicing[3], /* i : normalized correlation for 3 half-frames Q15*/ const Word32 *lf_E, /* i : per bin energy for low frequencies Q_new - 2*/ const Word32 *lf_E, /* i : per bin energy for low frequencies q_lf_E*/ const Word16 q_lf_E, /* i : Q of lf_E */ const Word16 corr_shift, /* i : normalized correlation correction Q15*/ const Word16 bwidth, /* i : input signal bandwidth Q0*/ const Word16 max_band, /* i : maximum critical band Q0*/ const Word16 bwidth, /* i : input signal bandwidth */ const Word16 max_band, /* i : maximum critical band */ Word32 hp_E[], /* o : energy in HF Q_new*/ const Word16 codec_mode, /* i : MODE1 or MODE2 Q0*/ const Word16 Q_new, /* i : scaling factor */ Word32 *bckr_tilt_lt /* i/o: lf/hf E ratio of background noise Q16*/ , Word16 Opt_vbr_mode /* Q0 */ ) const Word16 codec_mode, /* i : MODE1 or MODE2 */ Word32 *bckr_tilt_lt, /* i/o: lf/hf E ratio of background noise Q16 */ Word16 Opt_vbr_mode ) { Word32 lp_bckr = 0, hp_bckr = 0, lp_E, Ltmp; const Word32 *pt_E, *pt_bands, *pt_bckr, *hf_bands, *tmp_E; Loading @@ -81,6 +81,9 @@ void find_tilt_ivas_fx( Word16 m_Fs, e_Fs; Word16 m_cnt, e_cnt; Word16 m_hpE, e_hpE; Word64 sum; Word16 inv_bands, q_lp_E; Word32 Le_min_scaled, Ltmp2; #ifdef BASOP_NOGLOB_DECLARE_LOCAL Flag Overflow = 0; move32(); Loading @@ -91,7 +94,7 @@ void find_tilt_ivas_fx( * Initializations *-----------------------------------------------------------------*/ IF( NE_16( bwidth, NB ) ) IF( ( bwidth != NB ) ) { /* WB processing */ bin = BIN4_FX; Loading @@ -100,16 +103,20 @@ void find_tilt_ivas_fx( tmp_E = lf_E; /* Q_new - 2 */ pt_bckr = bckr; /* Q_new */ nb_bands = 10; inv_bands = 3277 /* 1/10 in Q15 */; move16(); move16(); } ELSE { /* NB processing */ bin = add( shl( BIN4_FX, 1 ), BIN4_FX ); /* First useful frequency bin ~ 150 Hz */ bin = 3 * BIN4_FX; /* First useful frequency bin ~ 150 Hz */ pt_bands = fr_bands + 1; /* Exlcude 1st critical band */ tmp_E = lf_E + 2; /* Start at the 3rd bin (150 Hz) */ pt_bckr = bckr + 1; /* Exlcude 1st critical band */ nb_bands = 9; inv_bands = 3641; /* 1/9 in Q15 */ move16(); move16(); /* Nb. of "low" frequency bands taken into account in NB processing */ } Loading @@ -122,21 +129,23 @@ void find_tilt_ivas_fx( /* bckr + voicing */ /*lp_bckr = mean( pt_bckr, nb_bands );*/ /* estimated noise E in first critical bands, up to 1270 Hz */ lp_bckr = Mean32( pt_bckr, nb_bands ); sum = 0; move64(); FOR( i = 0; i < nb_bands; i++ ) { sum = W_mac_32_16( sum, pt_bckr[i], inv_bands ); // q_bckr+16 } lp_bckr = W_shl_sat_l( sum, -16 ); // q_bckr /*hp_bckr = 0.5f * (bckr[max_band-1] + bckr[max_band]);*/ /* estimated noise E in last 2 critical bands */ #ifdef BASOP_NOGLOB hp_bckr = L_shr( L_add_sat( bckr[max_band - 1], bckr[max_band] ), 1 ); /* Q_new - 1 */ #else hp_bckr = L_shr( L_add( bckr[max_band - 1], bckr[max_band] ), 1 ); #endif hp_bckr = W_extract_h( W_mac_32_32( W_mult_32_32( bckr[max_band - 1], ONE_IN_Q30 ), bckr[max_band], ONE_IN_Q30 ) ); // q_bckr if ( hp_bckr == 0 ) /* Avoid division by zero. */ { hp_bckr = L_deposit_l( 1 ); } Ltmp = BASOP_Util_Divide3232_Scale_cadence( lp_bckr, hp_bckr, &e_tmp ); /* exp(e_tmp) */ Ltmp = Mpy_32_16_r( Ltmp, 3277 /* 0.1 in Q15 */ ); Ltmp = BASOP_Util_Divide3232_Scale_cadence( lp_bckr, hp_bckr, &e_tmp ); Ltmp = Mpy_32_16_r( Ltmp, 3277 /* 0.1f in Q15 */ ); Ltmp = L_shr_sat( Ltmp, sub( 15, e_tmp ) ); *bckr_tilt_lt = L_add_sat( Mpy_32_16_r( *bckr_tilt_lt, 29491 ), Ltmp ); /* Q16 */ *bckr_tilt_lt = L_add_sat( Mpy_32_16_r( *bckr_tilt_lt, 29491 /* 0.9f in Q15 */ ), Ltmp ); // Q16 move32(); test(); Loading Loading @@ -171,34 +180,31 @@ void find_tilt_ivas_fx( e_Fs = sub( 15, e_tmp ); f0 = shr( m_Fs, sub( e_Fs, 4 ) ); /* Q4 */ Le_min_scaled = L_shl( E_MIN_FXQ31, sub( q_fr_bands, Q31 ) ); // q_fr_bands=q_bckr FOR( i = 0; i < 2; i++ ) { /*hp_E[i] = 0.5f * (hf_bands[max_band-1] + hf_bands[max_band]) - hp_bckr; */ /* averaged E in last 2 critical bands */ Ltmp = L_add( L_shr( hf_bands[max_band - 1], 1 ), L_shr( hf_bands[max_band], 1 ) ); /* Q_new */ hp_E[i] = L_sub( Ltmp, hp_bckr ); /* Q_new */ move32(); IF( Opt_vbr_mode == 0 ) { IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( hp_E[i], sub( 31, Q_new ), E_MIN_IVAS_FX, 31 - Q19 ), -1 ) ) Ltmp = W_extract_h( W_mac_32_32( W_mult_32_32( hf_bands[max_band - 1], ONE_IN_Q30 ), hf_bands[max_band], ONE_IN_Q30 ) ); // q_fr_bands Ltmp = L_sub( Ltmp, hp_bckr ); // q_fr_bands Ltmp2 = L_max( Ltmp, L_shl_sat( 1, q_fr_bands ) ); // q_fr_bands, saturation is added because q_fr_bands is limited to 31 if ( Opt_vbr_mode == 0 ) { hp_E[i] = L_shl( E_MIN_IVAS_FX, sub( Q_new, Q19 ) ); move32(); Ltmp2 = L_max( Ltmp, Le_min_scaled ); // q_fr_bands } } ELSE { hp_E[i] = L_max( hp_E[i], L_shl( 1, Q_new ) ); hp_E[i] = L_max( Ltmp2, 1 ); // to prevent division by zero move32(); } test(); IF( GT_16( mean_voi, TH_COR_FX ) && LT_16( pitch[2], TH_PIT_FX ) ) /* High-pitched voiced frames */ { freq = bin; freq = bin; // Q4 move16(); /* 1st useful frequency bin */ m_cnt = 0; move16(); lp_E = L_deposit_l( 0 ); sum = 0; move64(); f1 = add( shr( f0, 1 ), f0 ); /* Middle between 2 harmonics */ f2 = f0; Loading @@ -208,14 +214,10 @@ void find_tilt_ivas_fx( FOR( ; freq <= f1; freq += BIN4_FX ) { /* include only bins sufficiently close to harmonics */ tmp = sub( freq, f2 ); /* Q4 */ IF( L_mac0( -(Word32) TH_D_FX * TH_D_FX, tmp, tmp ) < 0 ) tmp = sub( freq, f2 ); IF( L_mac0( -TH_D_FX * TH_D_FX, tmp, tmp ) < 0 ) { #ifdef BASOP_NOGLOB lp_E = L_add_o( *pt_E, lp_E, &Overflow ); /* Q_new - 1 */ #else lp_E = L_add( *pt_E, lp_E ); #endif sum = W_mac_32_16( sum, *pt_E, 1 ); // q_lf_E+1 m_cnt = add( m_cnt, 1 ); } pt_E++; Loading @@ -229,52 +231,65 @@ void find_tilt_ivas_fx( #endif } /*lp_E = lp_E / (float)cnt - lp_bckr;*/ e_tmp = sub( norm_l( lp_E ), 1 ); m_tmp = extract_h( L_shl( lp_E, e_tmp ) ); e_tmp = sub( e_tmp, 2 ); /* lf_e divided by 4 in anal_sp */ e_tmp = sub( W_norm( sum ), 1 ); m_tmp = extract_h( W_extract_h( W_shl( sum, e_tmp ) ) ); // q_lf_E+1+e_tmp-32-16 e_tmp = sub( add( q_lf_E, e_tmp ), 47 ); e_cnt = norm_s( m_cnt ); m_cnt = shl( m_cnt, e_cnt ); m_cnt = shl( m_cnt, e_cnt ); // e_cnt m_tmp = div_s( m_tmp, m_cnt ); e_tmp = sub( e_tmp, e_cnt ); #ifdef BASOP_NOGLOB lp_E = L_sub_o( L_shr_o( m_tmp, sub( e_tmp, 1 ), &Overflow ), lp_bckr, &Overflow ); #else lp_E = L_sub( L_shr( m_tmp, sub( e_tmp, 1 ) ), lp_bckr ); #endif m_tmp = div_s( m_tmp, m_cnt ); // Q15+e_tmp-e_cnt e_tmp = add( Q15, sub( e_tmp, e_cnt ) ); sum = W_shl( m_tmp, sub( add( q_bckr, 1 ), e_tmp ) ); // q_bckr+1 sum = W_msu_32_16( sum, lp_bckr, 1 ); // q_bckr+1 q_lp_E = W_norm( sum ); lp_E = W_extract_h( W_shl( sum, q_lp_E ) ); // q_bckr+1+q_lp_E-32 q_lp_E = sub( add( q_lp_E, q_bckr ), Q31 ); pt_E = tmp_E + VOIC_BINS; /* Update for next half-frame Q_new - 1 */ } ELSE /* Other than high-pitched voiced frames */ { /*lp_E = mean( pt_bands, nb_bands ) - lp_bckr;*/ /* averaged E in first critical bands, up to 1270 Hz */ lp_E = L_sub( Mean32( pt_bands, nb_bands ), lp_bckr ); } IF( Opt_vbr_mode == 0 ) sum = 0; move64(); FOR( Word16 j = 0; j < nb_bands; j++ ) { IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( lp_E, sub( 31, Q_new ), E_MIN_IVAS_FX, 31 - Q19 ), -1 ) ) { lp_E = L_shl( E_MIN_IVAS_FX, sub( Q_new, Q19 ) ); sum = W_mac_32_16( sum, pt_bands[j], inv_bands ); // q_fr_bands+16 } sum = W_mac_32_16( sum, lp_bckr, -ONE_IN_Q15 ); // q_fr_bands+16 lp_E = W_round48_L( sum ); // q_fr_bands=q_bckr q_lp_E = q_bckr; // q_fr_bands=q_bckr move16(); } ELSE test(); IF( Opt_vbr_mode == 0 && GT_32( L_shl_sat( Le_min_scaled, sub( q_lp_E, q_bckr ) ), lp_E ) ) { lp_E = E_MIN_FXQ31; q_lp_E = Q31; move32(); move16(); } if ( Opt_vbr_mode != 0 ) { lp_E = L_max( lp_E, 0 ); lp_E = L_max( lp_E, 0 ); // q_lp_E } /*ee[i] = lp_E / hp_E[i];*/ /* LF/HF ratio */ if ( lp_E == 0 ) { ee[i] = 0; move32(); } test(); IF( lp_E != 0 && hp_E[i] != 0 ) IF( lp_E != 0 ) { e_tmp = sub( norm_l( lp_E ), 1 ); m_tmp = extract_h( L_shl( lp_E, e_tmp ) ); m_tmp = extract_h( L_shl( lp_E, e_tmp ) ); // e_tmp+q_lp_E-16 e_hpE = norm_l( hp_E[i] ); m_hpE = extract_h( L_shl( hp_E[i], e_hpE ) ); m_tmp = div_s( m_tmp, m_hpE ); /* e_tmp + e_hpE */ e_tmp = sub( e_tmp, e_hpE ); m_hpE = extract_h( L_shl( hp_E[i], e_hpE ) ); // e_hpE+q_bckr-16 m_tmp = div_s( m_tmp, m_hpE ); // Q15+(e_tmp+q_lp_E)-(e_hpE+q_bckr) e_tmp = sub( add( e_tmp, q_lp_E ), add( e_hpE, q_bckr ) ); #ifdef BASOP_NOGLOB ee[i] = L_shr_o( m_tmp, add( e_tmp, 15 - 6 ), &Overflow ); /* ee in Q6 */ #else /* BASOP_NOGLOB */ Loading @@ -282,18 +297,8 @@ void find_tilt_ivas_fx( #endif move32(); } ELSE IF( lp_E == 0 ) { ee[i] = L_deposit_l( 0 ); move32(); } ELSE { ee[i] = MAX_32; move32(); } IF( EQ_16( bwidth, NB ) ) /* For NB input, compensate for the missing bands */ IF( bwidth == NB ) /* For NB input, compensate for the missing bands */ { #ifdef BASOP_NOGLOB Ltmp = L_shl_o( ee[i], 3, &Overflow ); /* Q6 */ Loading