Loading lib_com/cldfb.c +446 −44 File changed.Preview size limit exceeded, changes collapsed. Show changes lib_com/ivas_dirac_com_fx.c +105 −2 Original line number Diff line number Diff line Loading @@ -917,15 +917,16 @@ void computeDiffuseness_fixed( move32(); Word32 *p_tmp; const Word32 *p_tmp_c; #ifndef OPT_SBA_DEC_PATH Word16 min_q_shift1, min_q_shift2, exp1, exp2, q_tmp; Word16 q_ene, q_intensity, q_intensity_slow; #endif /* OPT_SBA_DEC_PATH */ /* Compute Intensity slow and energy slow buffer_intensity and buffer_energy */ set_zero_fx( intensity_slow, i_mult( DIRAC_NUM_DIMS, CLDFB_NO_CHANNELS_MAX ) ); set_zero_fx( intensity_slow_abs, CLDFB_NO_CHANNELS_MAX ); set_zero_fx( energy_slow, CLDFB_NO_CHANNELS_MAX ); #ifndef OPT_SBA_DEC_PATH /* Calculate max possible shift for the buffer buffer_energy and buffer_intensity */ min_q_shift1 = Q31; move16(); Loading Loading @@ -1064,6 +1065,108 @@ void computeDiffuseness_fixed( move32(); } } #else /* OPT_SBA_DEC_PATH */ Word16 gaurd_bits = find_guarded_bits_fx( DIRAC_NO_COL_AVG_DIFF ); Word16 norm_arr = getScaleFactor32( buffer_energy, i_mult( DIRAC_NO_COL_AVG_DIFF, num_freq_bands ) ); Word16 shift_ene = sub( norm_arr, gaurd_bits ); Word16 q_ene = q_factor_energy[0]; // = add(*q_factor_energy, shift_ene); move16(); norm_arr = 31; move16(); FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { FOR( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) { norm_arr = s_min( norm_arr, getScaleFactor32( buffer_intensity[i][j], num_freq_bands ) ); } } Word16 shift_inten = sub( norm_arr, gaurd_bits ); Word16 q_inten = q_factor_intensity[0]; // = add(*q_factor_intensity, shift_inten); move16(); FOR( i = 1; i < DIRAC_NO_COL_AVG_DIFF; ++i ) { q_ene = s_min( q_ene, q_factor_energy[i] ); q_inten = s_min( q_inten, q_factor_intensity[i] ); } q_ene = add( q_ene, shift_ene ); q_inten = add( q_inten, shift_inten ); FOR( i = 0; i < DIRAC_NO_COL_AVG_DIFF; ++i ) { /* Energy slow */ p_tmp_c = buffer_energy + i * num_freq_bands; shift_ene = sub( q_ene, q_factor_energy[i] ); shift_inten = sub( q_inten, q_factor_intensity[i] ); FOR( k = 0; k < num_freq_bands; k++ ) { energy_slow[k] = L_add( energy_slow[k], L_shl( *p_tmp_c, shift_ene ) ); move32(); p_tmp_c++; } /* Intensity slow */ FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) { p_tmp = buffer_intensity[j][i]; FOR( k = 0; k < num_freq_bands; k++ ) { intensity_slow[j * num_freq_bands + k] = L_add( intensity_slow[j * num_freq_bands + k], L_shl( *p_tmp, shift_inten ) ); move32(); p_tmp++; } } } gaurd_bits = shr( add( find_guarded_bits_fx( DIRAC_NUM_DIMS ), 1 ), 1 ); norm_arr = getScaleFactor32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ) ); Word16 shift = sub( norm_arr, gaurd_bits ); scale_sig32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ), shift ); q_inten = add( q_inten, shift ); /* intensity_slow.^2 + intensity_slow_abs*/ FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) { p_tmp = intensity_slow + j * num_freq_bands; FOR( k = 0; k < num_freq_bands; k++ ) { intensity_slow_abs[k] = Madd_32_32( intensity_slow_abs[k], p_tmp[k], p_tmp[k] ); move32(); } } Word16 q_inten_slow = sub( add( q_inten, q_inten ), 31 ); /* Compute Diffuseness */ Word16 exp1, exp2, q_tmp; Word16 diff = sub( 62, q_ene ); p_tmp = intensity_slow_abs; FOR( i = 0; i < num_freq_bands; ++i ) { exp1 = sub( 31, q_inten_slow ); tmp = Sqrt32( p_tmp[i], &exp1 ); tmp = BASOP_Util_Divide3232_Scale_cadence( tmp, L_add( energy_slow[i], EPSILLON_FX ), &exp2 ); q_tmp = sub( diff, add( exp1, exp2 ) ); // bring to Q30 tmp = L_shl_sat( tmp, sub( Q30, q_tmp ) ); diffuseness[i] = L_sub( ONE_IN_Q30, tmp ); move32(); if ( LT_32( diffuseness[i], 0 ) ) { diffuseness[i] = 0; move32(); } } #endif /* OPT_SBA_DEC_PATH */ *q_diffuseness = Q30; move16(); Loading lib_com/ivas_filters_fx.c +14 −3 Original line number Diff line number Diff line Loading @@ -223,7 +223,6 @@ void ivas_filter_process_exp_fx( return; } /*-----------------------------------------------------------------------------------------* * Function ivas_iir_2_filter() * Loading Loading @@ -263,13 +262,25 @@ static void ivas_iir_2_filter_fx( { L_tmp_prod = Mpy_32_32( filter_state->num_fx[stage][j], tmp_pIn_buf_i_fx ); // Q31-L_prod_e L_prod_e = add( filter_state->num_e[stage][j], tmp_pIn_buf_i_e ); #if 1//ndef OPT_SBA_DEC_PATH L_tmp = BASOP_Util_Add_Mant32Exp( filter_state->state_fx[stage][j], filter_state->state_e[stage][j], L_tmp_prod, L_prod_e, &L_tmp_e ); // Q31 - L_tmp_e #else /* OPT_SBA_DEC_PATH */ L_tmp_e = s_max( filter_state->state_e[stage][j], L_prod_e ); L_tmp_e = add( L_tmp_e, 1 ); L_tmp = L_add( L_shr( filter_state->state_fx[stage][j], sub( L_tmp_e, filter_state->state_e[stage][j] ) ), L_shr( L_tmp_prod, sub( L_tmp_e, L_prod_e ) ) ); #endif /* OPT_SBA_DEC_PATH */ L_tmp_prod = Mpy_32_32( filter_state->den_fx[stage][j], pOut_fx[i] ); // Q31 - ( pIn_Out_e[i]+filter_state->den_e[stage][j] ) L_prod_e = add( pIn_Out_e[i], filter_state->den_e[stage][j] ); #if 1//ndef OPT_SBA_DEC_PATH filter_state->state_fx[stage][j - 1] = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_e, L_negate( L_tmp_prod ), L_prod_e, &filter_state->state_e[stage][j - 1] ); // Q31 - filter_state->state_e[stage][j - 1] #else /* OPT_SBA_DEC_PATH */ Word16 com_e = s_max( L_tmp_e, L_prod_e ); filter_state->state_e[stage][j - 1] = add( com_e, 1 ); filter_state->state_fx[stage][j - 1] = L_sub( L_shr( L_tmp, sub( filter_state->state_e[stage][j - 1], L_tmp_e ) ), L_shr( L_tmp_prod, sub( filter_state->state_e[stage][j - 1], L_prod_e ) ) ); move16(); #endif /* OPT_SBA_DEC_PATH */ move32(); /*In case when exponent is less than -31 the value is very small and negligible hence resetting it to zero to avoid exponent overflow*/ IF( LT_16( filter_state->state_e[stage][j - 1], -31 ) ) Loading lib_com/ivas_prot_fx.h +11 −5 Original line number Diff line number Diff line Loading @@ -1094,8 +1094,11 @@ void ivas_mct_dec_mct_fx( void apply_MCT_dec_fx( MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ Decoder_State **sts, /* i/o: decoder state structure */ Word32 *x[MCT_MAX_CHANNELS][NB_DIV], /* i/o: decoded and dequan. spect. input to MCT */ Word16 q_x[MCT_MAX_CHANNELS] ); Word32 *x[MCT_MAX_CHANNELS][NB_DIV] /* i/o: decoded and dequan. spect. input to MCT */ #ifndef OPT_SBA_DEC_PATH , Word16 q_x[MCT_MAX_CHANNELS] #endif /* OPT_SBA_DEC_PATH */ ); void mctStereoIGF_dec_fx( MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ Loading Loading @@ -1129,9 +1132,12 @@ void stereo_decoder_tcx_fx( const Word16 mct_on, /* i : flag mct block (1) or stereo (0) */ const Word16 last_core_l, /* i : last core for left channel */ const Word16 last_core_r, /* i : last core for right channel */ const Word16 tmp_plc_upmix, /* i : indicates temp upmix for PLC decision */ Word16 *q_x_ch2, Word16 *q_x_ch1 ); const Word16 tmp_plc_upmix /* i : indicates temp upmix for PLC decision */ #ifndef OPT_SBA_DEC_PATH ,Word16 *q_x_ch2, Word16 *q_x_ch1 #endif /* OPT_SBA_DEC_PATH */ ); void v_multc_acc_32_16( const Word32 x[], /* i : Input vector */ Loading lib_com/ivas_sns_com_fx.c +10 −3 Original line number Diff line number Diff line Loading @@ -202,7 +202,14 @@ void sns_compute_scf_fx( -Q6 is for division with FDNS_NPTS and -Q1 is to reduce Q by one */ mean = W_shl_sat_l( sum, -Q7 ); // q_out nf = Mpy_32_32( mean, 214748 /* powf( 10.0f, -4.0f ) in Q31 */ ); // q_out nf = L_max( nf, L_shl( 256, sub( q_out, 40 ) ) /* powf( 2.0f, -32.0f ) in Q40 */ ); // q_out IF( LE_32( nf, L_shl_sat( 256, sub( q_out, 40 ) ) ) ) /* powf( 2.0f, -32.0f ) in Q40 */ { nf = 256; move32(); q_out = 40; move16(); } FOR( i = 0; i < FDNS_NPTS; i++ ) { Loading Loading
lib_com/ivas_dirac_com_fx.c +105 −2 Original line number Diff line number Diff line Loading @@ -917,15 +917,16 @@ void computeDiffuseness_fixed( move32(); Word32 *p_tmp; const Word32 *p_tmp_c; #ifndef OPT_SBA_DEC_PATH Word16 min_q_shift1, min_q_shift2, exp1, exp2, q_tmp; Word16 q_ene, q_intensity, q_intensity_slow; #endif /* OPT_SBA_DEC_PATH */ /* Compute Intensity slow and energy slow buffer_intensity and buffer_energy */ set_zero_fx( intensity_slow, i_mult( DIRAC_NUM_DIMS, CLDFB_NO_CHANNELS_MAX ) ); set_zero_fx( intensity_slow_abs, CLDFB_NO_CHANNELS_MAX ); set_zero_fx( energy_slow, CLDFB_NO_CHANNELS_MAX ); #ifndef OPT_SBA_DEC_PATH /* Calculate max possible shift for the buffer buffer_energy and buffer_intensity */ min_q_shift1 = Q31; move16(); Loading Loading @@ -1064,6 +1065,108 @@ void computeDiffuseness_fixed( move32(); } } #else /* OPT_SBA_DEC_PATH */ Word16 gaurd_bits = find_guarded_bits_fx( DIRAC_NO_COL_AVG_DIFF ); Word16 norm_arr = getScaleFactor32( buffer_energy, i_mult( DIRAC_NO_COL_AVG_DIFF, num_freq_bands ) ); Word16 shift_ene = sub( norm_arr, gaurd_bits ); Word16 q_ene = q_factor_energy[0]; // = add(*q_factor_energy, shift_ene); move16(); norm_arr = 31; move16(); FOR( i = 0; i < DIRAC_NUM_DIMS; i++ ) { FOR( j = 0; j < DIRAC_NO_COL_AVG_DIFF; j++ ) { norm_arr = s_min( norm_arr, getScaleFactor32( buffer_intensity[i][j], num_freq_bands ) ); } } Word16 shift_inten = sub( norm_arr, gaurd_bits ); Word16 q_inten = q_factor_intensity[0]; // = add(*q_factor_intensity, shift_inten); move16(); FOR( i = 1; i < DIRAC_NO_COL_AVG_DIFF; ++i ) { q_ene = s_min( q_ene, q_factor_energy[i] ); q_inten = s_min( q_inten, q_factor_intensity[i] ); } q_ene = add( q_ene, shift_ene ); q_inten = add( q_inten, shift_inten ); FOR( i = 0; i < DIRAC_NO_COL_AVG_DIFF; ++i ) { /* Energy slow */ p_tmp_c = buffer_energy + i * num_freq_bands; shift_ene = sub( q_ene, q_factor_energy[i] ); shift_inten = sub( q_inten, q_factor_intensity[i] ); FOR( k = 0; k < num_freq_bands; k++ ) { energy_slow[k] = L_add( energy_slow[k], L_shl( *p_tmp_c, shift_ene ) ); move32(); p_tmp_c++; } /* Intensity slow */ FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) { p_tmp = buffer_intensity[j][i]; FOR( k = 0; k < num_freq_bands; k++ ) { intensity_slow[j * num_freq_bands + k] = L_add( intensity_slow[j * num_freq_bands + k], L_shl( *p_tmp, shift_inten ) ); move32(); p_tmp++; } } } gaurd_bits = shr( add( find_guarded_bits_fx( DIRAC_NUM_DIMS ), 1 ), 1 ); norm_arr = getScaleFactor32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ) ); Word16 shift = sub( norm_arr, gaurd_bits ); scale_sig32( intensity_slow, i_mult( DIRAC_NUM_DIMS, num_freq_bands ), shift ); q_inten = add( q_inten, shift ); /* intensity_slow.^2 + intensity_slow_abs*/ FOR( j = 0; j < DIRAC_NUM_DIMS; ++j ) { p_tmp = intensity_slow + j * num_freq_bands; FOR( k = 0; k < num_freq_bands; k++ ) { intensity_slow_abs[k] = Madd_32_32( intensity_slow_abs[k], p_tmp[k], p_tmp[k] ); move32(); } } Word16 q_inten_slow = sub( add( q_inten, q_inten ), 31 ); /* Compute Diffuseness */ Word16 exp1, exp2, q_tmp; Word16 diff = sub( 62, q_ene ); p_tmp = intensity_slow_abs; FOR( i = 0; i < num_freq_bands; ++i ) { exp1 = sub( 31, q_inten_slow ); tmp = Sqrt32( p_tmp[i], &exp1 ); tmp = BASOP_Util_Divide3232_Scale_cadence( tmp, L_add( energy_slow[i], EPSILLON_FX ), &exp2 ); q_tmp = sub( diff, add( exp1, exp2 ) ); // bring to Q30 tmp = L_shl_sat( tmp, sub( Q30, q_tmp ) ); diffuseness[i] = L_sub( ONE_IN_Q30, tmp ); move32(); if ( LT_32( diffuseness[i], 0 ) ) { diffuseness[i] = 0; move32(); } } #endif /* OPT_SBA_DEC_PATH */ *q_diffuseness = Q30; move16(); Loading
lib_com/ivas_filters_fx.c +14 −3 Original line number Diff line number Diff line Loading @@ -223,7 +223,6 @@ void ivas_filter_process_exp_fx( return; } /*-----------------------------------------------------------------------------------------* * Function ivas_iir_2_filter() * Loading Loading @@ -263,13 +262,25 @@ static void ivas_iir_2_filter_fx( { L_tmp_prod = Mpy_32_32( filter_state->num_fx[stage][j], tmp_pIn_buf_i_fx ); // Q31-L_prod_e L_prod_e = add( filter_state->num_e[stage][j], tmp_pIn_buf_i_e ); #if 1//ndef OPT_SBA_DEC_PATH L_tmp = BASOP_Util_Add_Mant32Exp( filter_state->state_fx[stage][j], filter_state->state_e[stage][j], L_tmp_prod, L_prod_e, &L_tmp_e ); // Q31 - L_tmp_e #else /* OPT_SBA_DEC_PATH */ L_tmp_e = s_max( filter_state->state_e[stage][j], L_prod_e ); L_tmp_e = add( L_tmp_e, 1 ); L_tmp = L_add( L_shr( filter_state->state_fx[stage][j], sub( L_tmp_e, filter_state->state_e[stage][j] ) ), L_shr( L_tmp_prod, sub( L_tmp_e, L_prod_e ) ) ); #endif /* OPT_SBA_DEC_PATH */ L_tmp_prod = Mpy_32_32( filter_state->den_fx[stage][j], pOut_fx[i] ); // Q31 - ( pIn_Out_e[i]+filter_state->den_e[stage][j] ) L_prod_e = add( pIn_Out_e[i], filter_state->den_e[stage][j] ); #if 1//ndef OPT_SBA_DEC_PATH filter_state->state_fx[stage][j - 1] = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_e, L_negate( L_tmp_prod ), L_prod_e, &filter_state->state_e[stage][j - 1] ); // Q31 - filter_state->state_e[stage][j - 1] #else /* OPT_SBA_DEC_PATH */ Word16 com_e = s_max( L_tmp_e, L_prod_e ); filter_state->state_e[stage][j - 1] = add( com_e, 1 ); filter_state->state_fx[stage][j - 1] = L_sub( L_shr( L_tmp, sub( filter_state->state_e[stage][j - 1], L_tmp_e ) ), L_shr( L_tmp_prod, sub( filter_state->state_e[stage][j - 1], L_prod_e ) ) ); move16(); #endif /* OPT_SBA_DEC_PATH */ move32(); /*In case when exponent is less than -31 the value is very small and negligible hence resetting it to zero to avoid exponent overflow*/ IF( LT_16( filter_state->state_e[stage][j - 1], -31 ) ) Loading
lib_com/ivas_prot_fx.h +11 −5 Original line number Diff line number Diff line Loading @@ -1094,8 +1094,11 @@ void ivas_mct_dec_mct_fx( void apply_MCT_dec_fx( MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ Decoder_State **sts, /* i/o: decoder state structure */ Word32 *x[MCT_MAX_CHANNELS][NB_DIV], /* i/o: decoded and dequan. spect. input to MCT */ Word16 q_x[MCT_MAX_CHANNELS] ); Word32 *x[MCT_MAX_CHANNELS][NB_DIV] /* i/o: decoded and dequan. spect. input to MCT */ #ifndef OPT_SBA_DEC_PATH , Word16 q_x[MCT_MAX_CHANNELS] #endif /* OPT_SBA_DEC_PATH */ ); void mctStereoIGF_dec_fx( MCT_DEC_HANDLE hMCT, /* i/o: MCT decoder structure */ Loading Loading @@ -1129,9 +1132,12 @@ void stereo_decoder_tcx_fx( const Word16 mct_on, /* i : flag mct block (1) or stereo (0) */ const Word16 last_core_l, /* i : last core for left channel */ const Word16 last_core_r, /* i : last core for right channel */ const Word16 tmp_plc_upmix, /* i : indicates temp upmix for PLC decision */ Word16 *q_x_ch2, Word16 *q_x_ch1 ); const Word16 tmp_plc_upmix /* i : indicates temp upmix for PLC decision */ #ifndef OPT_SBA_DEC_PATH ,Word16 *q_x_ch2, Word16 *q_x_ch1 #endif /* OPT_SBA_DEC_PATH */ ); void v_multc_acc_32_16( const Word32 x[], /* i : Input vector */ Loading
lib_com/ivas_sns_com_fx.c +10 −3 Original line number Diff line number Diff line Loading @@ -202,7 +202,14 @@ void sns_compute_scf_fx( -Q6 is for division with FDNS_NPTS and -Q1 is to reduce Q by one */ mean = W_shl_sat_l( sum, -Q7 ); // q_out nf = Mpy_32_32( mean, 214748 /* powf( 10.0f, -4.0f ) in Q31 */ ); // q_out nf = L_max( nf, L_shl( 256, sub( q_out, 40 ) ) /* powf( 2.0f, -32.0f ) in Q40 */ ); // q_out IF( LE_32( nf, L_shl_sat( 256, sub( q_out, 40 ) ) ) ) /* powf( 2.0f, -32.0f ) in Q40 */ { nf = 256; move32(); q_out = 40; move16(); } FOR( i = 0; i < FDNS_NPTS; i++ ) { Loading