Loading lib_com/options.h +0 −2 Original line number Diff line number Diff line Loading @@ -77,8 +77,6 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ #define OPT_MCT_ENC_V3_BE #define OPT_BIN_REND_V2_NBE #define OPT_MASA_DEC_V1_NBE #define OPT_MASA_DEC_V2_NBE #define OPT_MCT_ENC_48KB_NBE #define OPT_MCH_DEC_V1_BE #define OPT_MCT_ENC_V2_NBE Loading lib_rend/ivas_objectRenderer_hrFilt_fx.c +0 −112 Original line number Diff line number Diff line Loading @@ -254,7 +254,6 @@ static void GenerateFilter_fx( move16(); FOR( p = 0; p < num_ev_idx; p++ ) { #ifdef OPT_MASA_DEC_V1_NBE Word32 expt = L_shl_sat( modelEval->elevBfVec_fx[p], 1 ); FOR( i = 0; i < num_az_idx[p]; i++ ) { Loading @@ -263,80 +262,35 @@ static void GenerateFilter_fx( BM_idx[qp + i] = add( model->azim_start_idx[EvIdx[p]], AzIdx[p][i] ); move16(); } #else /* OPT_MASA_DEC_V1_NBE */ FOR( i = 0; i < num_az_idx[p]; i++ ) { modelEval->BM_fx[add( qp, i )] = L_shl( Mpy_32_32( modelEval->elevBfVec_fx[p], modelEval->azimBfVec_fx[p][i] ), 1 ); /*Q30 - ( Q30 * 2 - 31 )*/ // Q30 move32(); BM_idx[add( qp, i )] = add( model->azim_start_idx[EvIdx[p]], AzIdx[p][i] ); move16(); } #endif /* OPT_MASA_DEC_V1_NBE */ qp = add( qp, num_az_idx[p] ); } #ifdef OPT_MASA_DEC_V1_NBE Word16 expL = add( model->AlphaL_e, 1 ); Word16 expR = add( model->AlphaR_e, 1 ); BMEnergiesL_e = add( model->EL_e, 2 ); BMEnergiesR_e = add( model->ER_e, 2 ); #endif /* OPT_MASA_DEC_V1_NBE */ /* Compute HR filters, approximate optimized model evaluation */ FOR( iSec = 0; iSec < HRTF_MODEL_N_SECTIONS; iSec++ ) { #ifndef OPT_MASA_DEC_V1_NBE ETotL = 0; move32(); ETotR = 0; move32(); ESynL = 0; move32(); ESynR = 0; move32(); ETotL_e = 0; move16(); ETotR_e = 0; move16(); ESynR_e = 0; move16(); ESynL_e = 0; move16(); BMEnergiesL_e = add( model->EL_e, 2 ); BMEnergiesR_e = add( model->ER_e, 2 ); #else /* OPT_MASA_DEC_V1_NBE */ Word64 temp1 = 0; move64(); Word64 temp2 = 0; move64(); #endif /* OPT_MASA_DEC_V1_NBE */ /* Energy is precalculated part updated with square of BM value. Store index for sorting */ FOR( i = 0; i < qp; i++ ) { #ifdef OPT_MASA_DEC_V1_NBE modelEval->BMEnergiesL[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->EL_fx[( iSec * model->AlphaN ) + BM_idx[i]] ); // exp: model->EL_e + 2 modelEval->BMEnergiesR[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->ER_fx[( iSec * model->AlphaN ) + BM_idx[i]] ); // exp: model->ER_e + 2 #else /* OPT_MASA_DEC_V1_NBE */ modelEval->BMEnergiesL[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->EL_fx[add( i_mult( iSec, model->AlphaN ), BM_idx[i] )] ); // exp: model->EL_e + 2 modelEval->BMEnergiesR[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->ER_fx[add( i_mult( iSec, model->AlphaN ), BM_idx[i] )] ); // exp: model->ER_e + 2 #endif /* OPT_MASA_DEC_V1_NBE */ move32(); move32(); modelEval->BMEnergiesL[i].i = i; move16(); modelEval->BMEnergiesR[i].i = i; move16(); #ifndef OPT_MASA_DEC_V1_NBE ETotL = BASOP_Util_Add_Mant32Exp( ETotL, ETotL_e, modelEval->BMEnergiesL[i].val_fx, BMEnergiesL_e, &ETotL_e ); ETotR = BASOP_Util_Add_Mant32Exp( ETotR, ETotR_e, modelEval->BMEnergiesR[i].val_fx, BMEnergiesR_e, &ETotR_e ); #else /* OPT_MASA_DEC_V1_NBE */ temp1 = W_add( temp1, modelEval->BMEnergiesL[i].val_fx ); // BMEnergiesL_e temp2 = W_add( temp2, modelEval->BMEnergiesR[i].val_fx ); // BMEnergiesR_e #endif /* OPT_MASA_DEC_V1_NBE */ } #ifdef OPT_MASA_DEC_V1_NBE ETotL_e = W_norm( temp1 ); ETotL_e = sub( ETotL_e, 32 ); ETotL = W_shl_sat_l( temp1, ETotL_e ); Loading @@ -346,21 +300,12 @@ static void GenerateFilter_fx( ETotR_e = sub( ETotR_e, 32 ); ETotR = W_shl_sat_l( temp2, ETotR_e ); ETotR_e = sub( BMEnergiesR_e, ETotR_e ); #endif /* OPT_MASA_DEC_V1_NBE */ /* Number of basis components actually used. */ p = s_min( HRTF_MODEL_N_CPTS_VAR[iSec], qp ); SkipSmallest_ValueIndex_fx( modelEval->UseIndsL, modelEval->BMEnergiesL, qp, sub( qp, p ) ); SkipSmallest_ValueIndex_fx( modelEval->UseIndsR, modelEval->BMEnergiesR, qp, sub( qp, p ) ); #ifndef OPT_MASA_DEC_V1_NBE /* Account for lost energy */ FOR( i = 0; i < p; i++ ) { ESynL = BASOP_Util_Add_Mant32Exp( ESynL, ESynL_e, modelEval->BMEnergiesL[modelEval->UseIndsL[i]].val_fx, BMEnergiesL_e, &ESynL_e ); ESynR = BASOP_Util_Add_Mant32Exp( ESynR, ESynR_e, modelEval->BMEnergiesR[modelEval->UseIndsR[i]].val_fx, BMEnergiesR_e, &ESynR_e ); } #else /* OPT_MASA_DEC_V1_NBE */ temp1 = 0; move64(); temp2 = 0; Loading @@ -382,49 +327,20 @@ static void GenerateFilter_fx( ESynR = W_shl_sat_l( temp2, ESynR_e ); ESynR_e = sub( BMEnergiesR_e, ESynR_e ); #endif /* OPT_MASA_DEC_V1_NBE */ tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( ETotL, ESynL, &ScaleL_e ) ); ScaleL_e = add( ScaleL_e, sub( ETotL_e, ESynL_e ) ); ScaleL = Sqrt32( tmp32, &ScaleL_e ); #ifdef OPT_MASA_DEC_V1_NBE ScaleL_e = sub( ScaleL_e, 1 ); #endif /* OPT_MASA_DEC_V1_NBE */ tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( ETotR, ESynR, &ScaleR_e ) ); ScaleR_e = add( ScaleR_e, sub( ETotR_e, ESynR_e ) ); ScaleR = Sqrt32( tmp32, &ScaleR_e ); #ifdef OPT_MASA_DEC_V1_NBE ScaleR_e = sub( ScaleR_e, 1 ); #endif /* OPT_MASA_DEC_V1_NBE */ /* Build using only the most energetic components. */ FOR( k = model->iSecFirst[iSec]; k <= model->iSecLast[iSec]; k++ ) { #ifndef OPT_MASA_DEC_V1_NBE modelEval->hrfModL_fx[k] = 0; move32(); modelEval->hrfModR_fx[k] = 0; move32(); tmp_hrfModL_e = 0; move16(); tmp_hrfModR_e = 0; move16(); Word32 index; FOR( i = 0; i < p; i++ ) { index = L_add( BM_idx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i], imult3216( model->AlphaN, k ) ); tmp32 = Mpy_32_32( modelEval->BM_fx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i], model->AlphaL_fx[index] ); modelEval->hrfModL_fx[k] = BASOP_Util_Add_Mant32Exp( modelEval->hrfModL_fx[k], tmp_hrfModL_e, tmp32, add( model->AlphaL_e, 1 ), &tmp_hrfModL_e ); move32(); index = L_add( BM_idx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i], imult3216( model->AlphaN, k ) ); tmp32 = Mpy_32_32( modelEval->BM_fx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i], model->AlphaR_fx[index] ); modelEval->hrfModR_fx[k] = BASOP_Util_Add_Mant32Exp( modelEval->hrfModR_fx[k], tmp_hrfModR_e, tmp32, add( model->AlphaR_e, 1 ), &tmp_hrfModR_e ); move32(); } #else /* OPT_MASA_DEC_V1_NBE */ temp1 = 0; move64(); temp2 = 0; Loading Loading @@ -459,7 +375,6 @@ static void GenerateFilter_fx( move16(); } #endif /* OPT_MASA_DEC_V1_NBE */ /* Account for lost energy */ modelEval->hrfModL_fx[k] = Mpy_32_32( modelEval->hrfModL_fx[k], ScaleL ); move32(); Loading @@ -467,13 +382,8 @@ static void GenerateFilter_fx( move32(); /* NOTE: Assuming that finally, hrfMod values will be <= 1. Hence making it Q30 */ #ifdef OPT_MASA_DEC_V1_NBE modelEval->hrfModL_fx[k] = L_shl( modelEval->hrfModL_fx[k], add( tmp_hrfModL_e, ScaleL_e ) ); // assuming Q30 modelEval->hrfModR_fx[k] = L_shl( modelEval->hrfModR_fx[k], add( tmp_hrfModR_e, ScaleR_e ) ); // assuming Q30 #else /* OPT_MASA_DEC_V1_NBE */ modelEval->hrfModL_fx[k] = L_shl( modelEval->hrfModL_fx[k], sub( add( tmp_hrfModL_e, ScaleL_e ), 1 ) ); // assuming Q30 modelEval->hrfModR_fx[k] = L_shl( modelEval->hrfModR_fx[k], sub( add( tmp_hrfModR_e, ScaleR_e ), 1 ) ); // assuming Q30 #endif /* OPT_MASA_DEC_V1_NBE */ // move32(); move32(); } Loading Loading @@ -604,18 +514,12 @@ static void GenerateITD_fx( } ELSE { #ifdef OPT_MASA_DEC_V2_NBE Word16 temp_e = add( imult1616( EvIdx[p], model->azimDim3 ), elev_offset ); #endif /* OPT_MASA_DEC_V2_NBE */ FOR( i = 0; i < num_az_idx; i++ ) { modelEval->BM_ITD_fx[qp + i] = L_shl( Mpy_32_32( modelEval->elevBfVecITD_fx[p], modelEval->azimBfVecITD_fx[i] ), 1 ); // Q30 move32(); #ifdef OPT_MASA_DEC_V2_NBE BM_idx[qp + i] = add( temp_e, AzIdx[i] ); #else /* OPT_MASA_DEC_V2_NBE */ BM_idx[qp + i] = add( add( imult1616( EvIdx[p], model->azimDim3 ), elev_offset ), AzIdx[i] ); #endif /* OPT_MASA_DEC_V2_NBE */ move16(); } qp = add( qp, num_az_idx ); Loading @@ -630,35 +534,19 @@ static void GenerateITD_fx( } /* Matrix multiplcation (row x column) */ #ifndef OPT_MASA_DEC_V2_NBE modelEval->itdMod_fx = 0; move16(); itdMod_e = 0; move16(); #else /* OPT_MASA_DEC_V2_NBE */ Word64 temp = 0; move64(); Word16 res_e = add( model->W_e, 1 ); #endif /* OPT_MASA_DEC_V2_NBE */ FOR( i = 0; i < qp; i++ ) { index = BM_idx[i]; move32(); #ifndef OPT_MASA_DEC_V2_NBE Word16 tmp_e; modelEval->itdMod_fx = BASOP_Util_Add_Mant32Exp( modelEval->itdMod_fx, itdMod_e, Mpy_32_32( modelEval->BM_ITD_fx[i], model->W_fx[index] ), add( model->W_e, 1 ), &tmp_e ); itdMod_e = tmp_e; move16(); #else /* OPT_MASA_DEC_V2_NBE */ temp = W_add( temp, Mpy_32_32( modelEval->BM_ITD_fx[i], model->W_fx[index] ) ); #endif /* OPT_MASA_DEC_V2_NBE */ } #ifdef OPT_MASA_DEC_V2_NBE itdMod_e = W_norm( temp ); itdMod_e = sub( itdMod_e, 32 ); modelEval->itdMod_fx = W_shl_sat_l( temp, itdMod_e ); itdMod_e = sub( res_e, itdMod_e ); #endif /* OPT_MASA_DEC_V2_NBE */ Word32 tmp32 = Mpy_32_16_1( modelEval->itdMod_fx, model->resamp_factor_fx ); // Q = 31 - ( itdMod_e + 1 ) Word16 tmp_q = sub( 30, itdMod_e ); Loading lib_rend/ivas_objectRenderer_sfx_fx.c +0 −39 Original line number Diff line number Diff line Loading @@ -191,9 +191,7 @@ static void sincResample_fx( Word16 t_step_e; Word32 t_frac_fx; Word16 t_frac_e; #ifdef OPT_MASA_DEC_V2_NBE Word64 t_frac_fx_acc; #endif /* OPT_MASA_DEC_V2_NBE */ Word64 tmp64_fx; // Qx + 32 const Word32 *p_mid_fx; const Word32 *p_forward_fx; Loading @@ -215,10 +213,8 @@ static void sincResample_fx( /* Compute fractional time step */ t_step_fx = L_deposit_h( BASOP_Util_Divide1616_Scale( length_in, length_out, &t_step_e ) ); // exp(t_step_e) #ifdef OPT_MASA_DEC_V2_NBE t_frac_fx_acc = 0; move64(); #endif /* OPT_MASA_DEC_V2_NBE */ t_frac_fx = 0; move32(); t_frac_e = 0; Loading @@ -232,20 +228,12 @@ static void sincResample_fx( /* Calculate the sinc-index for the center value of the sinc */ Word16 center_val_e; #ifndef OPT_MASA_DEC_V2_NBE Word32 center_val; center_val = BASOP_Util_Add_Mant32Exp( t_frac_plus_eps, t_frac_plus_eps_e, L_negate( L_deposit_h( t ) ), 15, ¢er_val_e ); // exp(center_val_e) center_val_e = add( center_val_e, 6 ); // center_val * SFX_SPAT_BIN_NUM_SUBSAMPLES (i.e. 64) center_val = BASOP_Util_Add_Mant32Exp( center_val, center_val_e, ONE_IN_Q29, 1, ¢er_val_e ); // exp(center_val_e) snc0 = extract_l( L_shr( center_val, sub( 31, center_val_e ) ) ); // Q0 #else /* OPT_MASA_DEC_V2_NBE */ Word64 center_val; center_val = W_sub( t_frac_plus_eps, W_shl( t, sub( 31, t_frac_plus_eps_e ) ) ); // exp(center_val_e) center_val_e = add( t_frac_plus_eps_e, 6 ); Word16 com_e = s_max( 0, center_val_e ); center_val = W_add( W_shr( center_val, sub( com_e, center_val_e ) ), W_shl( 1, sub( 30, com_e ) ) ); // exp(center_val_e) snc0 = extract_l( W_shl_sat_l( center_val, sub( com_e, 31 ) ) ); #endif /* OPT_MASA_DEC_V2_NBE */ /* Run convolution forward and backward from mid point */ p_mid_fx = input_fx + t; // Qx p_forward_fx = p_mid_fx + 1; // Qx Loading @@ -270,16 +258,12 @@ static void sincResample_fx( move32(); /* Advance fractional time */ #ifndef OPT_MASA_DEC_V2_NBE t_frac_fx = BASOP_Util_Add_Mant32Exp( t_frac_fx, t_frac_e, t_step_fx, t_step_e, &t_frac_e ); // exp( t_frac_fx ) #else /* OPT_MASA_DEC_V2_NBE */ t_frac_fx_acc = W_add( t_frac_fx_acc, t_step_fx ); // t_step_e Word16 hdrm = W_norm( t_frac_fx_acc ); hdrm = sub( hdrm, 32 ); t_frac_fx = W_shl_sat_l( t_frac_fx_acc, hdrm ); t_frac_e = sub( t_step_e, hdrm ); move16(); #endif /* OPT_MASA_DEC_V2_NBE */ } return; Loading Loading @@ -316,9 +300,7 @@ void TDREND_firfilt_fx( Word32 step_fx /* Q31 */, gain_tmp_fx /* Q31 */, gain_delta_fx /* Q30 */; Word16 tmp_e; Word64 tmp64_fx; #ifdef OPT_MASA_DEC_V1_NBE Word16 shift = sub( filter_e, 32 ); #endif /* OPT_MASA_DEC_V1_NBE */ gain_delta_fx = L_sub( Gain_fx, prevGain_fx ); // Q30 step_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( gain_delta_fx, subframe_length, &tmp_e ) ); // exp(tmp_e) tmp_e = sub( tmp_e, Q30 ); Loading @@ -332,18 +314,10 @@ void TDREND_firfilt_fx( Copy32( signal_fx + add( sub( subframe_length, filterlength ), 1 ), mem_fx, sub( filterlength, 1 ) ); /* Update memory for next frame */ // Qx /* Convolution */ #ifdef OPT_MASA_DEC_V1_NBE FOR( i = 0; i < intp_count; i++ ) #else /* OPT_MASA_DEC_V1_NBE */ FOR( i = 0; i < subframe_length; i++ ) #endif /* OPT_MASA_DEC_V1_NBE */ { tmp64_fx = 0; move64(); #ifndef OPT_MASA_DEC_V1_NBE tmp_e = 0; move16(); #endif /* OPT_MASA_DEC_V1_NBE */ p_tmp_fx = p_signal_fx + i; // Qx p_filter_fx = filter_fx; // exp(filter_e) Loading @@ -356,24 +330,12 @@ void TDREND_firfilt_fx( } // This is done to keep the output Q same as input Q for signal #ifdef OPT_MASA_DEC_V1_NBE tmp_fx = W_shl_sat_l( tmp64_fx, shift ); // Qx #else /* OPT_MASA_DEC_V1_NBE */ tmp64_fx = W_shl( tmp64_fx, filter_e ); // Qx + 32 tmp_fx = W_extract_h( tmp64_fx ); // Qx #endif /* OPT_MASA_DEC_V1_NBE */ /* Apply linear gain interpolation in case of abrupt gain changes */ gain_tmp_fx = L_add_sat( gain_tmp_fx, step_fx ); /* Saturating values which just exceeds 1, Q31*/ signal_fx[i] = Mpy_32_32( tmp_fx, gain_tmp_fx ); // Qx move32(); #ifndef OPT_MASA_DEC_V1_NBE IF( LT_16( i, intp_count ) ) { v_add_fx( filter_fx, filter_delta_fx, filter_fx, filterlength ); // exp(filter_e) } } #else /* OPT_MASA_DEC_V1_NBE */ v_add_fx( filter_fx, filter_delta_fx, filter_fx, filterlength ); // exp(filter_e) } FOR( ; i < subframe_length; i++ ) Loading @@ -399,7 +361,6 @@ void TDREND_firfilt_fx( signal_fx[i] = Mpy_32_32( tmp_fx, gain_tmp_fx ); // Qx move32(); } #endif /* OPT_MASA_DEC_V1_NBE */ return; } Loading
lib_com/options.h +0 −2 Original line number Diff line number Diff line Loading @@ -77,8 +77,6 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ #define OPT_MCT_ENC_V3_BE #define OPT_BIN_REND_V2_NBE #define OPT_MASA_DEC_V1_NBE #define OPT_MASA_DEC_V2_NBE #define OPT_MCT_ENC_48KB_NBE #define OPT_MCH_DEC_V1_BE #define OPT_MCT_ENC_V2_NBE Loading
lib_rend/ivas_objectRenderer_hrFilt_fx.c +0 −112 Original line number Diff line number Diff line Loading @@ -254,7 +254,6 @@ static void GenerateFilter_fx( move16(); FOR( p = 0; p < num_ev_idx; p++ ) { #ifdef OPT_MASA_DEC_V1_NBE Word32 expt = L_shl_sat( modelEval->elevBfVec_fx[p], 1 ); FOR( i = 0; i < num_az_idx[p]; i++ ) { Loading @@ -263,80 +262,35 @@ static void GenerateFilter_fx( BM_idx[qp + i] = add( model->azim_start_idx[EvIdx[p]], AzIdx[p][i] ); move16(); } #else /* OPT_MASA_DEC_V1_NBE */ FOR( i = 0; i < num_az_idx[p]; i++ ) { modelEval->BM_fx[add( qp, i )] = L_shl( Mpy_32_32( modelEval->elevBfVec_fx[p], modelEval->azimBfVec_fx[p][i] ), 1 ); /*Q30 - ( Q30 * 2 - 31 )*/ // Q30 move32(); BM_idx[add( qp, i )] = add( model->azim_start_idx[EvIdx[p]], AzIdx[p][i] ); move16(); } #endif /* OPT_MASA_DEC_V1_NBE */ qp = add( qp, num_az_idx[p] ); } #ifdef OPT_MASA_DEC_V1_NBE Word16 expL = add( model->AlphaL_e, 1 ); Word16 expR = add( model->AlphaR_e, 1 ); BMEnergiesL_e = add( model->EL_e, 2 ); BMEnergiesR_e = add( model->ER_e, 2 ); #endif /* OPT_MASA_DEC_V1_NBE */ /* Compute HR filters, approximate optimized model evaluation */ FOR( iSec = 0; iSec < HRTF_MODEL_N_SECTIONS; iSec++ ) { #ifndef OPT_MASA_DEC_V1_NBE ETotL = 0; move32(); ETotR = 0; move32(); ESynL = 0; move32(); ESynR = 0; move32(); ETotL_e = 0; move16(); ETotR_e = 0; move16(); ESynR_e = 0; move16(); ESynL_e = 0; move16(); BMEnergiesL_e = add( model->EL_e, 2 ); BMEnergiesR_e = add( model->ER_e, 2 ); #else /* OPT_MASA_DEC_V1_NBE */ Word64 temp1 = 0; move64(); Word64 temp2 = 0; move64(); #endif /* OPT_MASA_DEC_V1_NBE */ /* Energy is precalculated part updated with square of BM value. Store index for sorting */ FOR( i = 0; i < qp; i++ ) { #ifdef OPT_MASA_DEC_V1_NBE modelEval->BMEnergiesL[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->EL_fx[( iSec * model->AlphaN ) + BM_idx[i]] ); // exp: model->EL_e + 2 modelEval->BMEnergiesR[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->ER_fx[( iSec * model->AlphaN ) + BM_idx[i]] ); // exp: model->ER_e + 2 #else /* OPT_MASA_DEC_V1_NBE */ modelEval->BMEnergiesL[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->EL_fx[add( i_mult( iSec, model->AlphaN ), BM_idx[i] )] ); // exp: model->EL_e + 2 modelEval->BMEnergiesR[i].val_fx = Mpy_32_32( Mpy_32_32( modelEval->BM_fx[i], modelEval->BM_fx[i] ) /*Q29*/, model->ER_fx[add( i_mult( iSec, model->AlphaN ), BM_idx[i] )] ); // exp: model->ER_e + 2 #endif /* OPT_MASA_DEC_V1_NBE */ move32(); move32(); modelEval->BMEnergiesL[i].i = i; move16(); modelEval->BMEnergiesR[i].i = i; move16(); #ifndef OPT_MASA_DEC_V1_NBE ETotL = BASOP_Util_Add_Mant32Exp( ETotL, ETotL_e, modelEval->BMEnergiesL[i].val_fx, BMEnergiesL_e, &ETotL_e ); ETotR = BASOP_Util_Add_Mant32Exp( ETotR, ETotR_e, modelEval->BMEnergiesR[i].val_fx, BMEnergiesR_e, &ETotR_e ); #else /* OPT_MASA_DEC_V1_NBE */ temp1 = W_add( temp1, modelEval->BMEnergiesL[i].val_fx ); // BMEnergiesL_e temp2 = W_add( temp2, modelEval->BMEnergiesR[i].val_fx ); // BMEnergiesR_e #endif /* OPT_MASA_DEC_V1_NBE */ } #ifdef OPT_MASA_DEC_V1_NBE ETotL_e = W_norm( temp1 ); ETotL_e = sub( ETotL_e, 32 ); ETotL = W_shl_sat_l( temp1, ETotL_e ); Loading @@ -346,21 +300,12 @@ static void GenerateFilter_fx( ETotR_e = sub( ETotR_e, 32 ); ETotR = W_shl_sat_l( temp2, ETotR_e ); ETotR_e = sub( BMEnergiesR_e, ETotR_e ); #endif /* OPT_MASA_DEC_V1_NBE */ /* Number of basis components actually used. */ p = s_min( HRTF_MODEL_N_CPTS_VAR[iSec], qp ); SkipSmallest_ValueIndex_fx( modelEval->UseIndsL, modelEval->BMEnergiesL, qp, sub( qp, p ) ); SkipSmallest_ValueIndex_fx( modelEval->UseIndsR, modelEval->BMEnergiesR, qp, sub( qp, p ) ); #ifndef OPT_MASA_DEC_V1_NBE /* Account for lost energy */ FOR( i = 0; i < p; i++ ) { ESynL = BASOP_Util_Add_Mant32Exp( ESynL, ESynL_e, modelEval->BMEnergiesL[modelEval->UseIndsL[i]].val_fx, BMEnergiesL_e, &ESynL_e ); ESynR = BASOP_Util_Add_Mant32Exp( ESynR, ESynR_e, modelEval->BMEnergiesR[modelEval->UseIndsR[i]].val_fx, BMEnergiesR_e, &ESynR_e ); } #else /* OPT_MASA_DEC_V1_NBE */ temp1 = 0; move64(); temp2 = 0; Loading @@ -382,49 +327,20 @@ static void GenerateFilter_fx( ESynR = W_shl_sat_l( temp2, ESynR_e ); ESynR_e = sub( BMEnergiesR_e, ESynR_e ); #endif /* OPT_MASA_DEC_V1_NBE */ tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( ETotL, ESynL, &ScaleL_e ) ); ScaleL_e = add( ScaleL_e, sub( ETotL_e, ESynL_e ) ); ScaleL = Sqrt32( tmp32, &ScaleL_e ); #ifdef OPT_MASA_DEC_V1_NBE ScaleL_e = sub( ScaleL_e, 1 ); #endif /* OPT_MASA_DEC_V1_NBE */ tmp32 = L_deposit_h( BASOP_Util_Divide3232_Scale( ETotR, ESynR, &ScaleR_e ) ); ScaleR_e = add( ScaleR_e, sub( ETotR_e, ESynR_e ) ); ScaleR = Sqrt32( tmp32, &ScaleR_e ); #ifdef OPT_MASA_DEC_V1_NBE ScaleR_e = sub( ScaleR_e, 1 ); #endif /* OPT_MASA_DEC_V1_NBE */ /* Build using only the most energetic components. */ FOR( k = model->iSecFirst[iSec]; k <= model->iSecLast[iSec]; k++ ) { #ifndef OPT_MASA_DEC_V1_NBE modelEval->hrfModL_fx[k] = 0; move32(); modelEval->hrfModR_fx[k] = 0; move32(); tmp_hrfModL_e = 0; move16(); tmp_hrfModR_e = 0; move16(); Word32 index; FOR( i = 0; i < p; i++ ) { index = L_add( BM_idx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i], imult3216( model->AlphaN, k ) ); tmp32 = Mpy_32_32( modelEval->BM_fx[modelEval->BMEnergiesL[modelEval->UseIndsL[i]].i], model->AlphaL_fx[index] ); modelEval->hrfModL_fx[k] = BASOP_Util_Add_Mant32Exp( modelEval->hrfModL_fx[k], tmp_hrfModL_e, tmp32, add( model->AlphaL_e, 1 ), &tmp_hrfModL_e ); move32(); index = L_add( BM_idx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i], imult3216( model->AlphaN, k ) ); tmp32 = Mpy_32_32( modelEval->BM_fx[modelEval->BMEnergiesR[modelEval->UseIndsR[i]].i], model->AlphaR_fx[index] ); modelEval->hrfModR_fx[k] = BASOP_Util_Add_Mant32Exp( modelEval->hrfModR_fx[k], tmp_hrfModR_e, tmp32, add( model->AlphaR_e, 1 ), &tmp_hrfModR_e ); move32(); } #else /* OPT_MASA_DEC_V1_NBE */ temp1 = 0; move64(); temp2 = 0; Loading Loading @@ -459,7 +375,6 @@ static void GenerateFilter_fx( move16(); } #endif /* OPT_MASA_DEC_V1_NBE */ /* Account for lost energy */ modelEval->hrfModL_fx[k] = Mpy_32_32( modelEval->hrfModL_fx[k], ScaleL ); move32(); Loading @@ -467,13 +382,8 @@ static void GenerateFilter_fx( move32(); /* NOTE: Assuming that finally, hrfMod values will be <= 1. Hence making it Q30 */ #ifdef OPT_MASA_DEC_V1_NBE modelEval->hrfModL_fx[k] = L_shl( modelEval->hrfModL_fx[k], add( tmp_hrfModL_e, ScaleL_e ) ); // assuming Q30 modelEval->hrfModR_fx[k] = L_shl( modelEval->hrfModR_fx[k], add( tmp_hrfModR_e, ScaleR_e ) ); // assuming Q30 #else /* OPT_MASA_DEC_V1_NBE */ modelEval->hrfModL_fx[k] = L_shl( modelEval->hrfModL_fx[k], sub( add( tmp_hrfModL_e, ScaleL_e ), 1 ) ); // assuming Q30 modelEval->hrfModR_fx[k] = L_shl( modelEval->hrfModR_fx[k], sub( add( tmp_hrfModR_e, ScaleR_e ), 1 ) ); // assuming Q30 #endif /* OPT_MASA_DEC_V1_NBE */ // move32(); move32(); } Loading Loading @@ -604,18 +514,12 @@ static void GenerateITD_fx( } ELSE { #ifdef OPT_MASA_DEC_V2_NBE Word16 temp_e = add( imult1616( EvIdx[p], model->azimDim3 ), elev_offset ); #endif /* OPT_MASA_DEC_V2_NBE */ FOR( i = 0; i < num_az_idx; i++ ) { modelEval->BM_ITD_fx[qp + i] = L_shl( Mpy_32_32( modelEval->elevBfVecITD_fx[p], modelEval->azimBfVecITD_fx[i] ), 1 ); // Q30 move32(); #ifdef OPT_MASA_DEC_V2_NBE BM_idx[qp + i] = add( temp_e, AzIdx[i] ); #else /* OPT_MASA_DEC_V2_NBE */ BM_idx[qp + i] = add( add( imult1616( EvIdx[p], model->azimDim3 ), elev_offset ), AzIdx[i] ); #endif /* OPT_MASA_DEC_V2_NBE */ move16(); } qp = add( qp, num_az_idx ); Loading @@ -630,35 +534,19 @@ static void GenerateITD_fx( } /* Matrix multiplcation (row x column) */ #ifndef OPT_MASA_DEC_V2_NBE modelEval->itdMod_fx = 0; move16(); itdMod_e = 0; move16(); #else /* OPT_MASA_DEC_V2_NBE */ Word64 temp = 0; move64(); Word16 res_e = add( model->W_e, 1 ); #endif /* OPT_MASA_DEC_V2_NBE */ FOR( i = 0; i < qp; i++ ) { index = BM_idx[i]; move32(); #ifndef OPT_MASA_DEC_V2_NBE Word16 tmp_e; modelEval->itdMod_fx = BASOP_Util_Add_Mant32Exp( modelEval->itdMod_fx, itdMod_e, Mpy_32_32( modelEval->BM_ITD_fx[i], model->W_fx[index] ), add( model->W_e, 1 ), &tmp_e ); itdMod_e = tmp_e; move16(); #else /* OPT_MASA_DEC_V2_NBE */ temp = W_add( temp, Mpy_32_32( modelEval->BM_ITD_fx[i], model->W_fx[index] ) ); #endif /* OPT_MASA_DEC_V2_NBE */ } #ifdef OPT_MASA_DEC_V2_NBE itdMod_e = W_norm( temp ); itdMod_e = sub( itdMod_e, 32 ); modelEval->itdMod_fx = W_shl_sat_l( temp, itdMod_e ); itdMod_e = sub( res_e, itdMod_e ); #endif /* OPT_MASA_DEC_V2_NBE */ Word32 tmp32 = Mpy_32_16_1( modelEval->itdMod_fx, model->resamp_factor_fx ); // Q = 31 - ( itdMod_e + 1 ) Word16 tmp_q = sub( 30, itdMod_e ); Loading
lib_rend/ivas_objectRenderer_sfx_fx.c +0 −39 Original line number Diff line number Diff line Loading @@ -191,9 +191,7 @@ static void sincResample_fx( Word16 t_step_e; Word32 t_frac_fx; Word16 t_frac_e; #ifdef OPT_MASA_DEC_V2_NBE Word64 t_frac_fx_acc; #endif /* OPT_MASA_DEC_V2_NBE */ Word64 tmp64_fx; // Qx + 32 const Word32 *p_mid_fx; const Word32 *p_forward_fx; Loading @@ -215,10 +213,8 @@ static void sincResample_fx( /* Compute fractional time step */ t_step_fx = L_deposit_h( BASOP_Util_Divide1616_Scale( length_in, length_out, &t_step_e ) ); // exp(t_step_e) #ifdef OPT_MASA_DEC_V2_NBE t_frac_fx_acc = 0; move64(); #endif /* OPT_MASA_DEC_V2_NBE */ t_frac_fx = 0; move32(); t_frac_e = 0; Loading @@ -232,20 +228,12 @@ static void sincResample_fx( /* Calculate the sinc-index for the center value of the sinc */ Word16 center_val_e; #ifndef OPT_MASA_DEC_V2_NBE Word32 center_val; center_val = BASOP_Util_Add_Mant32Exp( t_frac_plus_eps, t_frac_plus_eps_e, L_negate( L_deposit_h( t ) ), 15, ¢er_val_e ); // exp(center_val_e) center_val_e = add( center_val_e, 6 ); // center_val * SFX_SPAT_BIN_NUM_SUBSAMPLES (i.e. 64) center_val = BASOP_Util_Add_Mant32Exp( center_val, center_val_e, ONE_IN_Q29, 1, ¢er_val_e ); // exp(center_val_e) snc0 = extract_l( L_shr( center_val, sub( 31, center_val_e ) ) ); // Q0 #else /* OPT_MASA_DEC_V2_NBE */ Word64 center_val; center_val = W_sub( t_frac_plus_eps, W_shl( t, sub( 31, t_frac_plus_eps_e ) ) ); // exp(center_val_e) center_val_e = add( t_frac_plus_eps_e, 6 ); Word16 com_e = s_max( 0, center_val_e ); center_val = W_add( W_shr( center_val, sub( com_e, center_val_e ) ), W_shl( 1, sub( 30, com_e ) ) ); // exp(center_val_e) snc0 = extract_l( W_shl_sat_l( center_val, sub( com_e, 31 ) ) ); #endif /* OPT_MASA_DEC_V2_NBE */ /* Run convolution forward and backward from mid point */ p_mid_fx = input_fx + t; // Qx p_forward_fx = p_mid_fx + 1; // Qx Loading @@ -270,16 +258,12 @@ static void sincResample_fx( move32(); /* Advance fractional time */ #ifndef OPT_MASA_DEC_V2_NBE t_frac_fx = BASOP_Util_Add_Mant32Exp( t_frac_fx, t_frac_e, t_step_fx, t_step_e, &t_frac_e ); // exp( t_frac_fx ) #else /* OPT_MASA_DEC_V2_NBE */ t_frac_fx_acc = W_add( t_frac_fx_acc, t_step_fx ); // t_step_e Word16 hdrm = W_norm( t_frac_fx_acc ); hdrm = sub( hdrm, 32 ); t_frac_fx = W_shl_sat_l( t_frac_fx_acc, hdrm ); t_frac_e = sub( t_step_e, hdrm ); move16(); #endif /* OPT_MASA_DEC_V2_NBE */ } return; Loading Loading @@ -316,9 +300,7 @@ void TDREND_firfilt_fx( Word32 step_fx /* Q31 */, gain_tmp_fx /* Q31 */, gain_delta_fx /* Q30 */; Word16 tmp_e; Word64 tmp64_fx; #ifdef OPT_MASA_DEC_V1_NBE Word16 shift = sub( filter_e, 32 ); #endif /* OPT_MASA_DEC_V1_NBE */ gain_delta_fx = L_sub( Gain_fx, prevGain_fx ); // Q30 step_fx = L_deposit_h( BASOP_Util_Divide3232_Scale( gain_delta_fx, subframe_length, &tmp_e ) ); // exp(tmp_e) tmp_e = sub( tmp_e, Q30 ); Loading @@ -332,18 +314,10 @@ void TDREND_firfilt_fx( Copy32( signal_fx + add( sub( subframe_length, filterlength ), 1 ), mem_fx, sub( filterlength, 1 ) ); /* Update memory for next frame */ // Qx /* Convolution */ #ifdef OPT_MASA_DEC_V1_NBE FOR( i = 0; i < intp_count; i++ ) #else /* OPT_MASA_DEC_V1_NBE */ FOR( i = 0; i < subframe_length; i++ ) #endif /* OPT_MASA_DEC_V1_NBE */ { tmp64_fx = 0; move64(); #ifndef OPT_MASA_DEC_V1_NBE tmp_e = 0; move16(); #endif /* OPT_MASA_DEC_V1_NBE */ p_tmp_fx = p_signal_fx + i; // Qx p_filter_fx = filter_fx; // exp(filter_e) Loading @@ -356,24 +330,12 @@ void TDREND_firfilt_fx( } // This is done to keep the output Q same as input Q for signal #ifdef OPT_MASA_DEC_V1_NBE tmp_fx = W_shl_sat_l( tmp64_fx, shift ); // Qx #else /* OPT_MASA_DEC_V1_NBE */ tmp64_fx = W_shl( tmp64_fx, filter_e ); // Qx + 32 tmp_fx = W_extract_h( tmp64_fx ); // Qx #endif /* OPT_MASA_DEC_V1_NBE */ /* Apply linear gain interpolation in case of abrupt gain changes */ gain_tmp_fx = L_add_sat( gain_tmp_fx, step_fx ); /* Saturating values which just exceeds 1, Q31*/ signal_fx[i] = Mpy_32_32( tmp_fx, gain_tmp_fx ); // Qx move32(); #ifndef OPT_MASA_DEC_V1_NBE IF( LT_16( i, intp_count ) ) { v_add_fx( filter_fx, filter_delta_fx, filter_fx, filterlength ); // exp(filter_e) } } #else /* OPT_MASA_DEC_V1_NBE */ v_add_fx( filter_fx, filter_delta_fx, filter_fx, filterlength ); // exp(filter_e) } FOR( ; i < subframe_length; i++ ) Loading @@ -399,7 +361,6 @@ void TDREND_firfilt_fx( signal_fx[i] = Mpy_32_32( tmp_fx, gain_tmp_fx ); // Qx move32(); } #endif /* OPT_MASA_DEC_V1_NBE */ return; }