diff --git a/lib_dec/ivas_stereo_dft_dec_dmx.c b/lib_dec/ivas_stereo_dft_dec_dmx.c index 27ee4f81728fe71125dbb72888ac3667422e40a0..7250baa6b8fedfb20fe93dbf2b596a554cc0da55 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx.c @@ -184,7 +184,7 @@ void stereo_dft_unify_dmx_fx( pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); /* Stereo residual PLC */ - IF( GT_16( hStereoDft->res_cod_band_max, 0 ) ) + IF( hStereoDft->res_cod_band_max > 0 ) { IF( !st0->bfi ) { @@ -192,6 +192,7 @@ void stereo_dft_unify_dmx_fx( { Copy32( pDFT_RES, hStereoDft->res_mem_fx, shl( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ) ); hStereoDft->q_res_mem = hStereoDft->q_dft; + move16(); hStereoDft->time_offs = 0; move16(); } @@ -202,16 +203,20 @@ void stereo_dft_unify_dmx_fx( move16(); pPredGain = hStereoDft->res_pred_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); hStereoDft->past_DMX_pos = ( sub( add( hStereoDft->past_DMX_pos, STEREO_DFT_PAST_MAX ), 1 ) ) % STEREO_DFT_PAST_MAX; + move16(); stereo_dft_generate_res_pred_fx( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + k * STEREO_DFT32MS_N_MAX, &stop, st0->bfi ); stereo_dft_res_ecu_fx( hStereoDft, pDFT_RES, DFT_PRED_RES, k, output_frame, prev_bfi, dmx_nrg, &num_plocs, plocs, plocsi, input_mem ); hStereoDft->q_res_cod_mem_fx = hStereoDft->q_dft; + move16(); } } /* Apply active DMX */ DFT_L[0] = pDFT_DMX[0]; + move32(); DFT_R[0] = pDFT_DMX[0]; + move32(); /* upmix residual part */ FOR( b = 0; b < hStereoDft->res_cod_band_max; b++ ) @@ -224,12 +229,16 @@ void stereo_dft_unify_dmx_fx( tmp = Madd_32_16( pDFT_RES[2 * i], pDFT_DMX[2 * i], g ); DFT_L[2 * i] = L_add( pDFT_DMX[2 * i], tmp ); + move32(); DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); + move32(); tmp = Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g ); DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); + move32(); DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); + move32(); } } @@ -243,15 +252,19 @@ void stereo_dft_unify_dmx_fx( Word16 exp_sum_nrg_l, exp_sum_nrg_R, exp_dot_prod_abs, exp_sum_nrg_Mid; Word32 sum_nrg_L_32, sum_nrg_R_32, dot_prod_real_32, dot_prod_img_32; Word64 sum_nrg_L = 0, sum_nrg_R = 0; + move64(); + move64(); Word64 dot_prod_real = 0, dot_prod_img = 0; + move64(); + move64(); FOR( j = hStereoDft->band_limits[b]; j < hStereoDft->band_limits[b + 1]; j++ ) { - sum_nrg_L = W_add( sum_nrg_L, W_add( W_mult_32_32( DFT_L[2 * j], DFT_L[2 * j] ), W_mult_32_32( DFT_L[2 * j + 1], DFT_L[2 * j + 1] ) ) ); - sum_nrg_R = W_add( sum_nrg_R, W_add( W_mult_32_32( DFT_R[2 * j], DFT_R[2 * j] ), W_mult_32_32( DFT_R[2 * j + 1], DFT_R[2 * j + 1] ) ) ); + sum_nrg_L = W_add( sum_nrg_L, W_add( W_mult_32_32( DFT_L[2 * j], DFT_L[2 * j] ), W_mult_32_32( DFT_L[add( shl( j, 1 ), 1 )], DFT_L[add( shl( j, 1 ), 1 )] ) ) ); + sum_nrg_R = W_add( sum_nrg_R, W_add( W_mult_32_32( DFT_R[2 * j], DFT_R[2 * j] ), W_mult_32_32( DFT_R[add( shl( j, 1 ), 1 )], DFT_R[add( shl( j, 1 ), 1 )] ) ) ); - dot_prod_real = W_add( dot_prod_real, W_add( W_mult_32_32( DFT_L[2 * j], DFT_R[2 * j] ), W_mult_32_32( DFT_L[2 * j + 1], DFT_R[2 * j + 1] ) ) ); - dot_prod_img = W_add( dot_prod_img, W_sub( W_mult_32_32( DFT_L[2 * j + 1], DFT_R[2 * j] ), W_mult_32_32( DFT_L[2 * j], DFT_R[2 * j + 1] ) ) ); + dot_prod_real = W_add( dot_prod_real, W_add( W_mult_32_32( DFT_L[2 * j], DFT_R[2 * j] ), W_mult_32_32( DFT_L[2 * j + 1], DFT_R[add( shl( j, 1 ), 1 )] ) ) ); + dot_prod_img = W_add( dot_prod_img, W_sub( W_mult_32_32( DFT_L[add( shl( j, 1 ), 1 )], DFT_R[2 * j] ), W_mult_32_32( DFT_L[2 * j], DFT_R[add( shl( j, 1 ), 1 )] ) ) ); } norm_sum_nrg_L = W_norm( sum_nrg_L ); @@ -280,28 +293,31 @@ void stereo_dft_unify_dmx_fx( Word32 tmp_nrg_L = Sqrt32( sum_nrg_L_32, &exp_sum_nrg_l ); Word32 tmp_nrg_R = Sqrt32( sum_nrg_R_32, &exp_sum_nrg_R ); Word16 exp_sum_abs = exp_sum_nrg_l; + move16(); - IF( GT_16( exp_sum_nrg_R, exp_sum_nrg_l ) ) + if ( GT_16( exp_sum_nrg_R, exp_sum_nrg_l ) ) { exp_sum_abs = exp_sum_nrg_R; move16(); } exp_sum_abs = add( exp_sum_abs, 1 ); - sum_abs = L_add( L_shr( tmp_nrg_L, exp_sum_abs - exp_sum_nrg_l ), L_shr( tmp_nrg_R, exp_sum_abs - exp_sum_nrg_R ) ); + sum_abs = L_add( L_shr( tmp_nrg_L, sub( exp_sum_abs, exp_sum_nrg_l ) ), L_shr( tmp_nrg_R, sub( exp_sum_abs, exp_sum_nrg_R ) ) ); dot_prod_abs = Sqrt32( L_add( Mpy_32_32( dot_prod_real_32, dot_prod_real_32 ), Mpy_32_32( dot_prod_img_32, dot_prod_img_32 ) ), &exp_dot_prod_abs ); - Word32 num = L_add( L_shr( L_add( sum_nrg_L_32, sum_nrg_R_32 ), 1 ), L_shr( dot_prod_abs, ( 31 - exp_dot_prod_abs ) - q_sum_nrg_L ) ); + Word32 num = L_add( L_shr( L_add( sum_nrg_L_32, sum_nrg_R_32 ), 1 ), L_shr( dot_prod_abs, sub( sub( 31, exp_dot_prod_abs ), q_sum_nrg_L ) ) ); Word16 E_num = sub( 31, q_sum_nrg_L ); Word32 num_sqrt = Sqrt32( num, &E_num ); Word16 exp_wR = exp_sum_abs; move16(); - IF( LT_16( exp_sum_abs, E_num ) ) + if ( LT_16( exp_sum_abs, E_num ) ) { exp_wR = E_num; move16(); } Word16 wR_temp; - IF( EQ_32( num_sqrt, 0 ) && EQ_32( sum_abs, 0 ) ) + test(); + test(); + IF( num_sqrt == 0 && sum_abs == 0 ) { wR_temp = 6364; // 0.776887059 in Q13 move16(); @@ -313,19 +329,22 @@ void stereo_dft_unify_dmx_fx( } ELSE { - wR_temp = shr( divide3232( L_shr( num_sqrt, exp_wR - E_num ), L_shr( sum_abs, exp_wR - exp_sum_abs ) ), 2 ); + wR_temp = shr( divide3232( L_shr( num_sqrt, sub( exp_wR, E_num ) ), L_shr( sum_abs, sub( exp_wR, exp_sum_abs ) ) ), 2 ); } Word32 sum_nrg_Mid_sqrt = Sqrt32( sum_nrg_Mid, &exp_sum_nrg_Mid ); Word16 exp_wL = exp_sum_abs; - IF( LT_16( exp_sum_abs, exp_sum_nrg_Mid ) ) + move16(); + if ( LT_16( exp_sum_abs, exp_sum_nrg_Mid ) ) { exp_wL = exp_sum_nrg_Mid; move16(); } Word16 wL_temp; - IF( EQ_32( sum_nrg_Mid_sqrt, 0 ) && EQ_32( sum_abs, 0 ) ) + test(); + test(); + IF( sum_nrg_Mid_sqrt == 0 && sum_abs == 0 ) { wL_temp = 6364; move16(); @@ -337,7 +356,7 @@ void stereo_dft_unify_dmx_fx( } ELSE { - wL_temp = shr( divide3232( L_shr( sum_nrg_Mid_sqrt, exp_wL - exp_sum_nrg_Mid ), L_shr( sum_abs, exp_wL - exp_sum_abs ) ), 1 ); + wL_temp = shr( divide3232( L_shr( sum_nrg_Mid_sqrt, sub( exp_wL, exp_sum_nrg_Mid ) ), L_shr( sum_abs, sub( exp_wL, exp_sum_abs ) ) ), 1 ); } wR = wR_temp; /* Q13 */ @@ -347,23 +366,29 @@ void stereo_dft_unify_dmx_fx( FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) { /*DMX Mapping*/ - pDFT_DMX[2 * i] = L_shl( Mpy_32_32( L_add( Mpy_32_16_1( DFT_L[2 * i], wL ), Mpy_32_16_1( DFT_R[2 * i], wR ) ), INV_SQRT_2_Q31 ), Q2 ); /* Q(hStereoDft->q_dft) */ + pDFT_DMX[2 * i] = L_shl( Mpy_32_32( L_add( Mpy_32_16_1( DFT_L[2 * i], wL ), Mpy_32_16_1( DFT_R[2 * i], wR ) ), INV_SQRT_2_Q31 ), Q2 ); /* Q(hStereoDft->q_dft) */ + move32(); pDFT_DMX[2 * i + 1] = L_shl( Mpy_32_32( L_add( Mpy_32_16_1( DFT_L[2 * i + 1], wL ), Mpy_32_16_1( DFT_R[2 * i + 1], wR ) ), INV_SQRT_2_Q31 ), Q2 ); /* Q(hStereoDft->q_dft) */ + move32(); } } Copy32( pDFT_DMX, DFT[0] + i_mult( k, STEREO_DFT32MS_N_MAX ), hStereoDft->NFFT ); /* Update DFT_past_DMX, needed for stereo filling used by stereo residual PLC */ hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX; + move16(); Copy32( pDFT_DMX, hStereoDft->DFT_past_DMX_fx[hStereoDft->past_DMX_pos], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); hStereoDft->q_DFT_past_DMX_fx[hStereoDft->past_DMX_pos] = hStereoDft->q_dft; + test(); IF( st0->bfi && !prev_bfi ) { Word16 idx_k0, idx_k1; Word16 q_shift0; Word16 q_shift1; idx_k0 = ( add( hStereoDft->past_DMX_pos, 1 ) ) % STEREO_DFT_PAST_MAX; + move16(); idx_k1 = ( add( idx_k0, 1 ) ) % STEREO_DFT_PAST_MAX; + move16(); q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k0] ); q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k1] ); @@ -656,6 +681,7 @@ void add_HB_to_mono_dmx_fx( Word32 temp_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; Word32 winSlope_fx = 0; + move32(); Word32 alpha_fx; const Word16 *win_dft_fx; int32_t output_Fs; @@ -674,41 +700,51 @@ void add_HB_to_mono_dmx_fx( memTransitionHB_fx = hCPE->hStereoDftDmx->memTransitionHB_fx; memOffset = NS2SA( output_Fs, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS ); + move16(); - IF( EQ_16( hCPE->hCoreCoder[0]->core, ACELP_CORE ) && GT_32( hCPE->hCoreCoder[0]->extl_brate, 0 ) ) + test(); + IF( hCPE->hCoreCoder[0]->core == ACELP_CORE && GT_32( hCPE->hCoreCoder[0]->extl_brate, 0 ) ) { /* Resampled LB and HB offset */ - Copy32( outputHB, temp_fx + memOffset, output_frame - memOffset ); + Copy32( outputHB, temp_fx + memOffset, sub( output_frame, memOffset ) ); decoderDelay = NS2SA( output_Fs, IVAS_DEC_DELAY_NS ); + move16(); - IF( NE_16( last_core, ACELP_CORE ) ) + IF( last_core != ACELP_CORE ) { /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */ icbweOLASize = NS2SA( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); + move16(); FOR( i = 0; i < decoderDelay; i++ ) { temp_fx[i] = 0; + move32(); } assert( icbweOLASize > 0 ); - switch ( output_Fs ) + SWITCH( output_Fs ) { case 48000: winSlope_fx = 17895698; // Q30 - break; + move32(); + BREAK; case 32000: winSlope_fx = 26843546; - break; + move32(); + BREAK; case 16000: winSlope_fx = 53687092; - break; + move32(); + BREAK; } alpha_fx = winSlope_fx; // Q30 - FOR( ; i < decoderDelay + icbweOLASize; i++ ) + move32(); + FOR( ; i < add( decoderDelay, icbweOLASize ); i++ ) { temp_fx[i] = L_shl( Mpy_32_32( temp_fx[i], alpha_fx ), 1 ); + move32(); alpha_fx = L_add_sat( alpha_fx, winSlope_fx ); } } @@ -719,29 +755,35 @@ void add_HB_to_mono_dmx_fx( v_add_32( temp_fx, output, output, output_frame ); - Copy32( outputHB + output_frame - memOffset, memOutHB_fx, memOffset ); + Copy32( outputHB + sub( output_frame, memOffset ), memOutHB_fx, memOffset ); win_dft_fx = hCPE->hStereoDft->win32ms_fx; dftOvlLen = hCPE->hStereoDft->dft32ms_ovl; + move16(); /* Preparing buffers in anticipation of an ACELP to TCX switch */ j = 0; + move16(); FOR( i = 0; i < memOffset; i++ ) { - memTransitionHB_fx[i] = Mpy_32_16_1( memOutHB_fx[i], win_dft_fx[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )] ); - j++; + memTransitionHB_fx[i] = Mpy_32_16_1( memOutHB_fx[i], win_dft_fx[i_mult( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) )] ); + move32(); + j = add( j, 1 ); } FOR( i = 0; j < dftOvlLen; i++ ) { - memTransitionHB_fx[memOffset + i] = Mpy_32_16_1( outputHB[output_frame - i - 1], win_dft_fx[STEREO_DFT32MS_STEP * ( dftOvlLen - 1 - j )] ); - j++; + memTransitionHB_fx[add( memOffset, i )] = Mpy_32_16_1( outputHB[sub( output_frame, i ) - 1], win_dft_fx[i_mult( STEREO_DFT32MS_STEP, ( sub( dftOvlLen, add( 1, j ) ) ) )] ); + move32(); + j = add( j, 1 ); } } ELSE { - IF( EQ_16( last_core, ACELP_CORE ) ) + IF( last_core == ACELP_CORE ) { + test(); + test(); /* This is generated in the ACELP frame and windowed. This process is akin to GenTransition for IC-BWE */ IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) && EQ_16( hCPE->nchan_out, 1 ) && EQ_16( hCPE->hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) { diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index f319c2703084905df60033fe480b3669848388fd..6f0775a9a561e53c505923c6d44abdb45a902d29 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -102,14 +102,14 @@ void stereo_dft_dec_reset_fx( #endif /*Configuration*/ - set_s( hStereoDft->prm_res, hStereoDft->hConfig->prm_res, STEREO_DFT_DEC_DFT_NB ); + set16_fx( hStereoDft->prm_res, hStereoDft->hConfig->prm_res, STEREO_DFT_DEC_DFT_NB ); /* SIDE_GAIN */ - set_s( hStereoDft->side_gain_index, 15, STEREO_DFT_BAND_MAX ); - set_s( hStereoDft->side_gain_index_previous, 15, STEREO_DFT_BAND_MAX ); + set16_fx( hStereoDft->side_gain_index, 15, STEREO_DFT_BAND_MAX ); + set16_fx( hStereoDft->side_gain_index_previous, 15, STEREO_DFT_BAND_MAX ); /*residual prediction*/ - set_s( hStereoDft->res_pred_mode, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_DEC_DFT_NB ); + set16_fx( hStereoDft->res_pred_mode, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_DEC_DFT_NB ); FOR( i = 0; i < STEREO_DFT_PAST_MAX; i++ ) { set32_fx( hStereoDft->DFT_past_DMX_fx[i], 0, STEREO_DFT32MS_N_32k ); @@ -121,7 +121,7 @@ void stereo_dft_dec_reset_fx( hStereoDft->past_DMX_pos = 0; move16(); - set_s( hStereoDft->res_pred_index_previous, 0, STEREO_DFT_BAND_MAX ); + set16_fx( hStereoDft->res_pred_index_previous, 0, STEREO_DFT_BAND_MAX ); FOR( i = 0; i < STEREO_DFT_BAND_MAX; i++ ) { @@ -132,7 +132,7 @@ void stereo_dft_dec_reset_fx( set32_fx( hStereoDft->res_gains_ind_fx[1], 0, STEREO_DFT_BAND_MAX ); /*residual coding*/ - set_s( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_DEC_DFT_NB ); + set16_fx( hStereoDft->res_cod_mode, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_DEC_DFT_NB ); hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->hConfig->band_res][hStereoDft->hConfig->res_cod_mode]; set32_fx( hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k ); hStereoDft->q_res_cod_mem_fx = Q16; @@ -283,21 +283,24 @@ static void stereo_dft_dec_open_fx( ) { /*Sizes*/ - hStereoDft->N = extract_l( STEREO_DFT_HOP_MAX * output_Fs / 48000 ); + // hStereoDft->N = (Word16) ( STEREO_DFT_HOP_MAX * output_Fs / 48000 ); + hStereoDft->N = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT_HOP_MAX ), 44740 ) ); + move16(); /*Init. DFT sizes*/ - hStereoDft->NFFT = extract_l( STEREO_DFT32MS_N_MAX * output_Fs / 48000 ); + hStereoDft->NFFT = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_N_MAX ), 44740 ) ); + move16(); hStereoDft->dft_trigo_8k_fx = dft_trigo_32k_fx; hStereoDft->dft_trigo_12k8_fx = dft_trigo_12k8_fx; hStereoDft->dft_trigo_16k_fx = dft_trigo_32k_fx; - hStereoDft->dft32ms_ovl = extract_l( ( STEREO_DFT32MS_OVL_MAX * output_Fs ) / 48000 ); + hStereoDft->dft32ms_ovl = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 ) ); hStereoDft->win232ms_8k_fx = dft_win232ms_8k_fx; hStereoDft->win232ms_12k8_fx = dft_win232ms_12k8_fx; hStereoDft->win232ms_16k_fx = dft_win232ms_16k_fx; - hStereoDft->dft32ms_ovl2 = extract_l( ( STEREO_DFT32MS_OVL2_MAX * output_Fs ) / 48000 ); + hStereoDft->dft32ms_ovl2 = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL2_MAX ), 44740 ) ); hStereoDft->win32ms_8k_fx = dft_win232ms_8k_fx + 1; hStereoDft->win32ms_12k8_fx = dft_win232ms_12k8_fx + 1; hStereoDft->win32ms_16k_fx = dft_win232ms_16k_fx + 1; @@ -439,6 +442,7 @@ static void stereo_dft_dequantize_res_gains_fx( const Word16 N ) { Word16 i, index; + Word16 tmp; FOR( i = 0; i < N; i++ ) { @@ -447,10 +451,27 @@ static void stereo_dft_dequantize_res_gains_fx( move16(); ind2[i] = check_bounds_s( ind2[i], 0, 7 ); move16(); - index = add( shl( LE_16( ind1[i], 15 ) ? sub( 15, ind1[i] ) : sub( ind1[i], 15 ), 3 ), ind2[i] ); - move16(); - gout[i] = LE_16( ind1[i], 15 ) ? L_negate( dft_res_gains_q_fx[index][0] ) : dft_res_gains_q_fx[index][0]; - move16(); + IF( LE_16( ind1[i], 15 ) ) + { + tmp = sub( 15, ind1[i] ); + } + ELSE + { + tmp = sub( ind1[i], 15 ); + } + // index = add( shl( LE_16( ind1[i], 15 ) ? sub( 15, ind1[i] ) : sub( ind1[i], 15 ), 3 ), ind2[i] ); + index = add( shl( tmp, 3 ), ind2[i] ); + // gout[i] = LE_16( ind1[i], 15 ) ? L_negate( dft_res_gains_q_fx[index][0] ) : dft_res_gains_q_fx[index][0]; + IF( LE_16( ind1[i], 15 ) ) + { + gout[i] = L_negate( dft_res_gains_q_fx[index][0] ); + move16(); + } + ELSE + { + gout[i] = dft_res_gains_q_fx[index][0]; + move16(); + } rout[i] = dft_res_gains_q_fx[index][1]; move16(); } @@ -472,6 +493,7 @@ static void stereo_dft_dequantize_res_gains_f_fx( const Word16 N ) { Word16 i, i1, j1, sign, ji, ij; + Word32 L_tmp; Word32 fi, fj; FOR( i = 0; i < N; i++ ) @@ -483,22 +505,64 @@ static void stereo_dft_dequantize_res_gains_f_fx( move32(); /* compensate for the offset and extract/remove sign of first index */ - sign = LT_32( ind1[i], L_shl( 15, Q26 ) ) ? -1 : 1; - move16(); - i1 = extract_l( L_shr( ( LT_32( ind1[i], L_shl( 15, Q26 ) ) ? L_sub( L_shl( 15, Q26 ), ind1[i] ) : L_sub( ind1[i], L_shl( 15, Q26 ) ) ), Q26 ) ); - fi = L_sub( ( LT_32( ind1[i], L_shl( 15, Q26 ) ) ? L_sub( L_shl( 15, Q26 ), ind1[i] ) : L_sub( ind1[i], L_shl( 15, Q26 ) ) ), L_shl( i1, Q26 ) ); + // sign = LT_32( ind1[i], L_shl( 15, Q26 ) ) ? -1 : 1; + IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) ) + { + sign = -1; + move16(); + } + ELSE + { + sign = 1; + move16(); + } + IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) ) + { + L_tmp = L_sub( L_shl( 15, Q26 ), ind1[i] ); + } + ELSE + { + L_tmp = L_sub( ind1[i], L_shl( 15, Q26 ) ); + } + i1 = extract_l( L_shr( ( L_tmp ), Q26 ) ); + IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) ) + { + L_tmp = L_sub( L_shl( 15, Q26 ), ind1[i] ); + } + ELSE + { + L_tmp = L_sub( ind1[i], L_shl( 15, Q26 ) ); + } + fi = L_sub( ( L_tmp ), L_shl( i1, Q26 ) ); move16(); j1 = extract_l( L_shr( ind2[i], Q26 ) ); fj = L_sub( ind2[i], L_shl( j1, Q26 ) ); /* choose base indices for interpolation */ - ji = extract_l( L_min( fj < ONE_IN_Q25 ? j1 : j1 + 1, 7 ) ); - ij = extract_l( L_min( fi < ONE_IN_Q25 ? i1 : i1 + 1, 15 ) ); + // ji = extract_l( L_min( fj < ONE_IN_Q25 ? j1 : j1 + 1, 7 ) ); + IF( LT_32( fj, ONE_IN_Q25 ) ) + { + ji = extract_l( L_min( j1, 7 ) ); + } + ELSE + { + ji = extract_l( L_min( add( j1, 1 ), 7 ) ); + } + + // ij = extract_l( L_min( fi < ONE_IN_Q25 ? i1 : i1 + 1, 15 ) ); + IF( LT_32( fi, ONE_IN_Q25 ) ) + { + ij = extract_l( L_min( i1, 15 ) ); + } + ELSE + { + ij = extract_l( L_min( add( i1, 1 ), 15 ) ); + } /* interpolate values from table */ IF( LT_16( i1, 15 ) ) { - gout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fi, Q5 ) ), dft_res_gains_q_fx[( i1 << 3 ) + ji][0] ), dft_res_gains_q_fx[( ( i1 + 1 ) << 3 ) + ji][0], L_shl( fi, Q5 ) ); + gout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fi, Q5 ) ), dft_res_gains_q_fx[add( shl( i1, 3 ), ji )][0] ), dft_res_gains_q_fx[add( shl( add( i1, 1 ), 3 ), ji )][0], L_shl( fi, Q5 ) ); move32(); IF( EQ_16( sign, -1 ) ) { @@ -519,12 +583,12 @@ static void stereo_dft_dequantize_res_gains_f_fx( IF( LT_16( j1, 7 ) ) { - rout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fj, Q5 ) ), dft_res_gains_q_fx[( ij << 3 ) + j1][1] ), L_shl( fj, Q5 ), dft_res_gains_q_fx[( ij << 3 ) + j1 + 1][1] ); + rout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fj, Q5 ) ), dft_res_gains_q_fx[add( shl( ij, 3 ), j1 )][1] ), L_shl( fj, Q5 ), dft_res_gains_q_fx[add( add( shl( ij, 3 ), j1 ), 1 )][1] ); move32(); } ELSE { - rout[i] = dft_res_gains_q_fx[( ij << 3 ) + 7][1]; + rout[i] = dft_res_gains_q_fx[add( shl( ij, 3 ), 7 )][1]; move32(); } } @@ -579,10 +643,10 @@ void stereo_dft_dec_update_fx( } /* Load new configurations */ - set_s( hStereoDft->band_res + k_offset, hStereoDft->hConfig->band_res, STEREO_DFT_NBDIV ); - set_s( hStereoDft->prm_res + k_offset, hStereoDft->hConfig->prm_res, STEREO_DFT_NBDIV ); - set_s( hStereoDft->res_pred_mode + k_offset, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_NBDIV ); - set_s( hStereoDft->res_cod_mode + k_offset, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_NBDIV ); + set16_fx( hStereoDft->band_res + k_offset, hStereoDft->hConfig->band_res, STEREO_DFT_NBDIV ); + set16_fx( hStereoDft->prm_res + k_offset, hStereoDft->hConfig->prm_res, STEREO_DFT_NBDIV ); + set16_fx( hStereoDft->res_pred_mode + k_offset, hStereoDft->hConfig->res_pred_mode, STEREO_DFT_NBDIV ); + set16_fx( hStereoDft->res_cod_mode + k_offset, hStereoDft->hConfig->res_cod_mode, STEREO_DFT_NBDIV ); /*Update attack info*/ IF( hStereoDft->attackPresent ) @@ -679,7 +743,10 @@ void stereo_dft_dec_synthesize_fx( set_val_Word32( output, 0, NS2SA( outputFs, FRAME_SIZE_NS ) ); /* deactivating the spectrum scrambling on active speech */ - IF( ( EQ_16( chan, 0 ) && GT_16( hCPE->hCoreCoder[0]->last_coder_type, UNVOICED ) ) || EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) || LT_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) + test(); + test(); + test(); + if ( ( EQ_16( chan, 0 ) && GT_16( hCPE->hCoreCoder[0]->last_coder_type, UNVOICED ) ) || EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) || LT_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) { hCPE->stereo_switching_counter = 10; move16(); @@ -691,7 +758,7 @@ void stereo_dft_dec_synthesize_fx( Word16 tmp = extract_l( L_max( (Word16) 0xF333, L_min( (Word16) 0x3333, hCPE->lt_es_em_fx ) ) ); hCPE->NbFrameMod = extract_h( L_add( L_mult0( 12, tmp ), 0x0000D99A ) ); /* -0.1: -0.4 ; -0.1 -> 0, 0.4 -> 6*/ } - moffset = max( 0, 6 - hCPE->NbFrameMod ); + moffset = s_max( 0, sub( 6, hCPE->NbFrameMod ) ); /*-----------------------------------------------------------------* * Synthesis @@ -700,7 +767,7 @@ void stereo_dft_dec_synthesize_fx( trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); FOR( i = 0; i < shr( NFFT, 2 ); i++ ) { - trigo_dec[i] = hStereoDft->dft_trigo_fx[i * trigo_step]; + trigo_dec[i] = hStereoDft->dft_trigo_fx[i_mult( i, trigo_step )]; move16(); trigo_dec[sub( shr( NFFT, 1 ), i )] = hStereoDft->dft_trigo_fx[i * trigo_step]; move16(); @@ -711,11 +778,16 @@ void stereo_dft_dec_synthesize_fx( FOR( k = 0; k < STEREO_DFT_NBDIV; k++ ) { /* scrambling the spectrum */ + test(); + test(); + test(); + test(); + test(); IF( LE_16( hCPE->stereo_switching_counter, 6 ) && EQ_16( chan, 1 ) && ( GT_32( hCPE->lt_es_em_fx, (Word16) 0xCCCD ) || GT_16( hCPE->NbFrameMod, 4 ) ) ) { - FOR( i = 3; i < NFFT - moffset - 1; i++ ) + FOR( i = 3; i < sub( sub( NFFT, moffset ), 1 ); i++ ) { - p_DFT[i] = L_negate( p_DFT[i + moffset + 1] ); + p_DFT[i] = L_negate( p_DFT[add( add( i, moffset ), 1 )] ); move32(); } } @@ -723,19 +795,19 @@ void stereo_dft_dec_synthesize_fx( { FOR( i = sub( 16, hCPE->NbFrameMod ); i < sub( NFFT, add( moffset, 1 ) ); i++ ) { - p_DFT[i - 2] = L_negate( p_DFT[i + moffset + 1] ); + p_DFT[i - 2] = L_negate( p_DFT[add( add( i, moffset ), 1 )] ); move32(); } } /*IFFT*/ scale_dft = getScaleFactor32( p_DFT, NFFT ); - scale_dft = find_guarded_bits_fx( NFFT ) - scale_dft; + scale_dft = sub( find_guarded_bits_fx( NFFT ), scale_dft ); v_shr( p_DFT, scale_dft, p_DFT, NFFT ); - rfft_fx( p_DFT, trigo_dec, NFFT, +1 ); + rfft_fx( p_DFT, trigo_dec, NFFT, 1 ); v_shr( p_DFT, negate( scale_dft ), p_DFT, NFFT ); - IF( EQ_16( k, 0 ) ) + IF( k == 0 ) { offset = 0; move16(); @@ -743,19 +815,19 @@ void stereo_dft_dec_synthesize_fx( /* Left OLA - 3.125ms */ FOR( i = 0; i < ovl; i++ ) { - output[offset + i] = Madd_32_16( L_shr( hCPE->output_mem_fx[chan][i], sub( hCPE->q_output_mem_fx[chan], hCPE->hStereoDft->q_dft ) ), p_DFT[zp + i], win[STEREO_DFT32MS_STEP * i] ); + output[add( offset, i )] = Madd_32_16( L_shr( hCPE->output_mem_fx[chan][i], sub( hCPE->q_output_mem_fx[chan], hCPE->hStereoDft->q_dft ) ), p_DFT[add( zp, i )], win[STEREO_DFT32MS_STEP * i] ); move32(); } /* Flat Portion */ FOR( i = ovl; i < flat_portion_end; i++ ) { - output[offset + i] = p_DFT[zp + i]; + output[add( offset, i )] = p_DFT[add( zp, i )]; move32(); } /* Right OLA */ FOR( i = 0; i < ovl2; i++ ) { - ola_buff[i] = Mpy_32_16_1( p_DFT[NFFT - zp - ovl2 + i], win2[ovl2 - 1 - i] ); + ola_buff[i] = Mpy_32_16_1( p_DFT[add( sub( NFFT, add( zp, ovl2 ) ), i )], win2[sub( sub( ovl2, i ), 1 )] ); move32(); } } @@ -767,22 +839,23 @@ void stereo_dft_dec_synthesize_fx( /* Left OLA */ FOR( i = 0; i < ovl2; i++ ) { - output[offset + i] = Madd_32_16( ola_buff[i], p_DFT[zp + i], win2[i] ); + output[add( offset, i )] = Madd_32_16( ola_buff[i], p_DFT[add( zp, i )], win2[i] ); move32(); } /* Flat Portion */ - FOR( i = ovl2; i < NFFT - 2 * zp - ovl; i++ ) + FOR( i = ovl2; i < sub( NFFT, add( shl( zp, 1 ), ovl ) ); i++ ) { - output[offset + i] = p_DFT[zp + i]; + output[add( offset, i )] = p_DFT[add( zp, i )]; move32(); } /* Right OLA - 3.125ms */ FOR( i = 0; i < ovl; i++ ) { - hCPE->output_mem_fx[chan][i] = Mpy_32_16_1( p_DFT[NFFT - zp - ovl + i], win[STEREO_DFT32MS_STEP * ( ovl - 1 - i )] ); + hCPE->output_mem_fx[chan][i] = Mpy_32_16_1( p_DFT[add( sub( NFFT, add( zp, ovl ) ), i )], win[i_mult( STEREO_DFT32MS_STEP, ( sub( sub( ovl, i ), 1 ) ) )] ); move32(); } hCPE->q_output_mem_fx[chan] = hCPE->hStereoDft->q_dft; + move16(); } p_DFT += STEREO_DFT32MS_N_MAX; } @@ -819,12 +892,13 @@ void stereo_dft_dec_smooth_parameters_fx( k_offset = STEREO_DFT_OFFSET; move16(); + test(); IF( hStereoDft->frame_sid_nodata || prev_sid_nodata ) { k = 1; FOR( b = 0; b < hStereoDft->nbands; b++ ) { - *( hStereoDft->side_gain_fx + ( ( add( k, k_offset ) ) - 1 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->side_gain_fx + ( add( k, k_offset ) ) * STEREO_DFT_BAND_MAX + b ); + *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), 1 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ) ); move32(); } @@ -889,13 +963,15 @@ void stereo_dft_dec_smooth_parameters_fx( } /* xfade */ + test(); + test(); IF( NE_32( hStereoDft->ipd_xfade_prev_fx, hStereoDft->ipd_xfade_target_fx ) && LT_16( hStereoDft->ipd_xfade_counter, STEREO_DFT_ITD_CNG_XFADE ) && LE_32( hStereoDft->last_active_element_brate, 24400 ) ) { hStereoDft->gipd_fx[add( k, k_offset )] = L_add( hStereoDft->ipd_xfade_prev_fx, hStereoDft->ipd_xfade_step_fx ); move32(); hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[add( k, k_offset )]; move32(); - hStereoDft->ipd_xfade_counter++; + hStereoDft->ipd_xfade_counter = add( hStereoDft->ipd_xfade_counter, 1 ); } } ELSE @@ -914,7 +990,7 @@ void stereo_dft_dec_smooth_parameters_fx( FOR( k2 = 1; k2 < hStereoDft->prm_res[add( k, k_offset )]; k2++ ) { - hStereoDft->gipd_fx[( add( k, k_offset ) ) - k2] = hStereoDft->gipd_fx[add( k, k_offset )]; + hStereoDft->gipd_fx[sub( add( k, k_offset ), k2 )] = hStereoDft->gipd_fx[add( k, k_offset )]; move32(); } @@ -970,7 +1046,7 @@ void stereo_dft_dec_smooth_parameters_fx( } FOR( k2 = 1; k2 < hStereoDft->prm_res[add( k, k_offset )]; k2++ ) { - hStereoDft->itd_fx[( add( k, k_offset ) ) - k2] = hStereoDft->itd_fx[add( k, k_offset )]; + hStereoDft->itd_fx[sub( add( k, k_offset ), k2 )] = hStereoDft->itd_fx[add( k, k_offset )]; move32(); } @@ -1049,14 +1125,16 @@ void stereo_dft_dec_smooth_parameters_fx( move16(); tmps2 = (Word16) L_shr( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], Q26 ); move16(); - stereo_dft_dequantize_res_gains_fx( &tmps1, &tmps2, hStereoDft->side_gain_fx + ( add( k, k_offset ) ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( add( k, k_offset ) ) * STEREO_DFT_BAND_MAX + b, 1 ); + stereo_dft_dequantize_res_gains_fx( &tmps1, &tmps2, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); + test(); + test(); IF( hStereoDft->attackPresent ) { hStereoDft->res_gains_ind_fx[1][b] = Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x6666 ); move32(); } - ELSE IF( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] < ONE_IN_Q27 ) ) ) /* Assuming Maximum Q of res_gains_ind_fx is Q26 */ + ELSE IF( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( LT_32( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], ONE_IN_Q27 ) ) ) ) /* Assuming Maximum Q of res_gains_ind_fx is Q26 */ { hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x4CCD ), hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], (Word16) 0x3333 ); @@ -1070,12 +1148,14 @@ void stereo_dft_dec_smooth_parameters_fx( move32(); } - stereo_dft_dequantize_res_gains_f_fx( &hStereoDft->res_gains_ind_fx[0][b], &hStereoDft->res_gains_ind_fx[1][b], &tmp, hStereoDft->res_pred_gain_fx + ( add( k, k_offset ) ) * STEREO_DFT_BAND_MAX + b, 1 ); + stereo_dft_dequantize_res_gains_f_fx( &hStereoDft->res_gains_ind_fx[0][b], &hStereoDft->res_gains_ind_fx[1][b], &tmp, hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); } /* Smoothing of prediction gains between ftrames */ FOR( ; b < hStereoDft->nbands; b++ ) { + test(); + test(); IF( hStereoDft->attackPresent ) { hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; @@ -1128,7 +1208,7 @@ void stereo_dft_dec_smooth_parameters_fx( IF( !hStereoDft->recovery_flg ) { - stereo_dft_dequantize_res_gains_f_fx( &hStereoDft->res_gains_ind_fx[0][b], &hStereoDft->res_gains_ind_fx[1][b], hStereoDft->side_gain_fx + ( add( k, k_offset ) ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( add( k, k_offset ) ) * STEREO_DFT_BAND_MAX + b, 1 ); + stereo_dft_dequantize_res_gains_f_fx( &hStereoDft->res_gains_ind_fx[0][b], &hStereoDft->res_gains_ind_fx[1][b], hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); } } @@ -1138,10 +1218,12 @@ void stereo_dft_dec_smooth_parameters_fx( IF( LT_32( diff_ipd, -EVS_PI_FX_Q27 ) ) { pgIpd[0] = L_add( pgIpd[0], EVS_2PI_FX_Q27 ); + move32(); } ELSE IF( GT_32( diff_ipd, EVS_PI_FX_Q27 ) ) { pgIpd[0] = L_sub( pgIpd[0], EVS_2PI_FX_Q27 ); + move32(); } IF( !hStereoDft->attackPresent ) @@ -1149,23 +1231,23 @@ void stereo_dft_dec_smooth_parameters_fx( IF( hStereoDft->wasTransient ) { pgIpd[0] = L_add( Mpy_32_16_1( pgIpd[0], (Word16) 0x6666 ), Mpy_32_16_1( pgIpd[-hStereoDft->prm_res[add( k, k_offset )]], (Word16) ( 0x199A ) ) ); - move16(); + move32(); } ELSE { pgIpd[0] = L_add( L_shr( pgIpd[0], 1 ), L_shr( pgIpd[-hStereoDft->prm_res[add( k, k_offset )]], 1 ) ); - move16(); + move32(); } } IF( !hStereoDft->attackPresent ) { - pSideGain = hStereoDft->side_gain_fx + ( add( k, k_offset ) ) * STEREO_DFT_BAND_MAX; + pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); FOR( b = 0; b < hStereoDft->res_cod_band_max; b++ ) { pSideGain[b] = Madd_32_16( Mpy_32_16_1( pSideGain[b], dft_res_cod_alpha_fx[b] ), - pSideGain[b - hStereoDft->prm_res[add( k, k_offset )] * STEREO_DFT_BAND_MAX], + pSideGain[sub( b, i_mult( hStereoDft->prm_res[add( k, k_offset )], STEREO_DFT_BAND_MAX ) )], sub( (Word16) 0x7FFF, dft_res_cod_alpha_fx[b] ) ); move32(); } @@ -1183,27 +1265,31 @@ void stereo_dft_dec_smooth_parameters_fx( } ELSE { - *( pInterpol ) = *( hStereoDft->gipd_fx + ( add( k, k_offset ) - hStereoDft->prm_res[add( k, k_offset )] ) ); + *( pInterpol ) = *( hStereoDft->gipd_fx + sub( add( k, k_offset ), hStereoDft->prm_res[add( k, k_offset )] ) ); move32(); } FOR( b = 0; b < hStereoDft->nbands; b++ ) { - *( hStereoDft->res_pred_gain_fx + sub( add( k, k_offset ), k2 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->res_pred_gain_fx + ( add( k, k_offset ) - hStereoDft->prm_res[add( k, k_offset )] ) * STEREO_DFT_BAND_MAX + b ); + *( hStereoDft->res_pred_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->res_pred_gain_fx + add( i_mult( sub( add( k, k_offset ), hStereoDft->prm_res[add( k, k_offset )] ), STEREO_DFT_BAND_MAX ), b ) ); move32(); + test(); + test(); + test(); + test(); IF( b < hStereoDft->res_cod_band_max || hStereoDft->attackPresent || hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && LT_32( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], ONE_IN_Q27 ) ) ) { - *( hStereoDft->side_gain_fx + sub( add( k, k_offset ), k2 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->side_gain_fx + ( add( k, k_offset ) ) * STEREO_DFT_BAND_MAX + b ); + *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ) ); move32(); } ELSE { - *( hStereoDft->side_gain_fx + sub( add( k, k_offset ), k2 ) * STEREO_DFT_BAND_MAX + b ) = *( hStereoDft->side_gain_fx + ( add( k, k_offset ) - hStereoDft->prm_res[add( k, k_offset )] ) * STEREO_DFT_BAND_MAX + b ); + *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), hStereoDft->prm_res[add( k, k_offset )] ), STEREO_DFT_BAND_MAX ), b ) ); move32(); } } - hStereoDft->itd_fx[( add( k, k_offset ) ) - k2] = hStereoDft->itd_fx[add( k, k_offset )]; + hStereoDft->itd_fx[sub( add( k, k_offset ), k2 )] = hStereoDft->itd_fx[add( k, k_offset )]; move32(); } /*end of interpolation*/ } @@ -1242,6 +1328,7 @@ void stereo_dft_dec_res_fx( { set_val_Word32( hCPE->hStereoDft->res_cod_mem_fx, 0, STEREO_DFT_OVL_8k ); hCPE->hStereoDft->q_res_cod_mem_fx = Q16; + move16(); set_val_Word32( hCPE->input_mem_fx[1], 0, NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) ); set_val_Word16( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k ); hCPE->hStereoDft->hBpf->pst_mem_deemp_err_fx = 0; @@ -1256,7 +1343,6 @@ void stereo_dft_dec_res_fx( /*OLA*/ /*overlapping parts*/ Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q16 ); - move16(); FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ ) { win[i] = extract_h( L_add( hCPE->hStereoDft->res_cod_mem_fx[i], L_shl( L_mult( win[i], hCPE->hStereoDft->win_8k_fx[i] ), q_shift ) ) ); @@ -1264,7 +1350,7 @@ void stereo_dft_dec_res_fx( hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); move32(); } - IF( NE_16( q_shift, 0 ) ) + IF( q_shift != 0 ) { v_shr_16( &win[STEREO_DFT_OVL_8k], negate( q_shift ), &win[STEREO_DFT_OVL_8k], L_FRAME8k ); } @@ -1275,6 +1361,7 @@ void stereo_dft_dec_res_fx( { /* For first good frame, ola memory contains extended ECU buffer -- need to crossfade instead of OLA */ step = 468; /* 1 / STEREO_DFT_OVL_8k in Q15 */ + move16(); fac = 0; move16(); FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ ) @@ -1291,7 +1378,7 @@ void stereo_dft_dec_res_fx( Copy( win, out_16, L_FRAME8k ); - IF( EQ_16( hCPE->hCoreCoder[0]->core, ACELP_CORE ) ) + IF( hCPE->hCoreCoder[0]->core == ACELP_CORE ) { /* bass post-filter */ bass_psfilter_fx( hCPE->hStereoDft->hBpf, hCPE->hCoreCoder[0]->Opt_AMR_WB, out_16, L_FRAME8k, hCPE->hCoreCoder[0]->old_pitch_buf_16_fx + ( L_FRAME8k / STEREO_DFT_L_SUBFR_8k ), hCPE->hCoreCoder[0]->bpf_off, @@ -1318,7 +1405,7 @@ void stereo_dft_dec_res_fx( v_sub_32( output, bpf_error_signal_8k, output, L_FRAME8k ); } } - ELSE IF( EQ_16( hCPE->hCoreCoder[0]->last_core, ACELP_CORE ) ) + ELSE IF( hCPE->hCoreCoder[0]->last_core == ACELP_CORE ) { set_val_Word16( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k ); hCPE->hStereoDft->hBpf->pst_mem_deemp_err_fx = 0; @@ -1404,6 +1491,14 @@ void stereo_dft_dec_fx( stop = shr( STEREO_DFT32MS_N_32k, 1 ); /* Analyze nature of current frame */ + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); hStereoDft->trans = (Word16) ( ( EQ_16( st0->clas_dec, ONSET ) || EQ_16( st0->clas_dec, SIN_ONSET ) || EQ_16( st0->clas_dec, UNVOICED_CLAS ) || EQ_16( st0->clas_dec, UNVOICED_TRANSITION ) ) || LE_16( st0->stab_fac_fx, (Word16) 0x2000 ) ) || ( ( EQ_16( st0->core, TCX_20_CORE ) && ( EQ_16( st0->hTcxCfg->tcx_last_overlap_mode, MIN_OVERLAP ) || EQ_16( st0->hTcxCfg->tcx_last_overlap_mode, HALF_OVERLAP ) ) ) || EQ_16( st0->core, TCX_10_CORE ) ); move16(); @@ -1417,12 +1512,13 @@ void stereo_dft_dec_fx( The prev_old_bfi still holds the prev_bfi for the current frame. */ /* make sure number of bands corresponds to output bwidth in case it is lower than parameter bwidth */ move16(); - IF( LT_16( output_frame, inner_frame_tbl[st0->bwidth] ) && EQ_16( sba_dirac_stereo_flag, 0 ) ) + test(); + IF( LT_16( output_frame, inner_frame_tbl[st0->bwidth] ) && ( sba_dirac_stereo_flag == 0 ) ) { hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); } - IF( EQ_16( st0->bfi, 0 ) ) + IF( st0->bfi == 0 ) { /* Smoothing for the current frame */ IF( sba_dirac_stereo_flag ) @@ -1439,7 +1535,7 @@ void stereo_dft_dec_fx( move32(); IF( prev_bfi ) { - dmx_nrg = stereo_dft_dmx_swb_nrg_fx( DFT[0], DFT[0] + STEREO_DFT32MS_N_MAX, min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), 0, 0 ); + dmx_nrg = stereo_dft_dmx_swb_nrg_fx( DFT[0], DFT[0] + STEREO_DFT32MS_N_MAX, s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), 0, 0 ); } @@ -1489,6 +1585,7 @@ void stereo_dft_dec_fx( #endif /* Use coarse band partition in inactive frames */ + test(); IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { NFFT_inner = i_mult( ( STEREO_DFT32MS_N_MAX / L_FRAME48k ), inner_frame_tbl[st0->bwidth] ); @@ -1501,18 +1598,19 @@ void stereo_dft_dec_fx( hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX; } + test(); IF( !( sba_dirac_stereo_flag && GE_16( nchan_transport, 2 ) ) ) { - stereo_dft_generate_res_pred_fx( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + k * STEREO_DFT32MS_N_MAX, &stop, st0->bfi ); + stereo_dft_generate_res_pred_fx( hStereoDft, samp_ratio, pDFT_DMX, DFT_PRED_RES, pPredGain, k, DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ), &stop, st0->bfi ); } - IF( GT_16( hStereoDft->res_cod_band_max, 0 ) ) + IF( hStereoDft->res_cod_band_max > 0 ) { IF( !st0->bfi ) { IF( EQ_16( k, 1 ) ) { - Copy32( pDFT_RES, hStereoDft->res_mem_fx, 2 * hStereoDft->band_limits[hStereoDft->res_cod_band_max] ); + Copy32( pDFT_RES, hStereoDft->res_mem_fx, shl( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ) ); hStereoDft->time_offs = 0; move16(); } @@ -1525,6 +1623,7 @@ void stereo_dft_dec_fx( /* Apply active DMX */ /* pDFT_RES is used for the second channel in inactive frames */ + test(); IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { DFT_L[0] = pDFT_DMX[0]; @@ -1540,7 +1639,8 @@ void stereo_dft_dec_fx( move32(); } - IF( hStereoDft->frame_sid_nodata || EQ_16( st0->VAD, 0 ) ) + test(); + if ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) ) { hFdCngDec->cna_nbands = 0; move16(); @@ -1550,6 +1650,7 @@ void stereo_dft_dec_fx( { g = extract_h( pSideGain[b] ); move16(); + test(); IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { g = hStereoDft->g_state_fx[b]; @@ -1557,7 +1658,9 @@ void stereo_dft_dec_fx( } /* store side gains from inactive frames for later use by the stereo CNA */ - IF( LT_16( hStereoDft->band_limits[b], L_FRAME16k ) && ( hStereoDft->frame_sid_nodata || EQ_16( st0->VAD, 0 ) ) ) + test(); + test(); + IF( LT_16( hStereoDft->band_limits[b], L_FRAME16k ) && ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) ) ) { hFdCngDec->cna_nbands = add( b, 1 ); move16(); @@ -1568,6 +1671,8 @@ void stereo_dft_dec_fx( } /* No residual coding in inactive frames, instead pDFT_RES is used for the second channel */ + test(); + test(); IF( GE_16( b, hStereoDft->res_cod_band_max ) && !hStereoDft->frame_sid_nodata && !( sba_dirac_stereo_flag && hMdDec ) ) { /*filter non-coded frequencies. It removes some MDCT frequency aliasing*/ @@ -1580,6 +1685,8 @@ void stereo_dft_dec_fx( } } + test(); + test(); IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { /* Low pass filter coherence */ @@ -1597,7 +1704,7 @@ void stereo_dft_dec_fx( gamma = BASOP_Util_Divide3232_Scale( gamma, sub( MAX_16, gamma ), &q_loc1 ); l_gamma = L_deposit_l( gamma ); op1 = L_add( l_gamma, L_shr( L_deposit_l( sub( MAX_16, mult( g, g ) ) ), q_loc1 ) ); - q_loc1 = Q16 + q_loc1; + q_loc1 = add( Q16, q_loc1 ); q_loc2 = q_loc1; op1 = Sqrt32( op1, &q_loc1 ); op2 = Sqrt32( l_gamma, &q_loc2 ); @@ -1623,9 +1730,9 @@ void stereo_dft_dec_fx( DFT_R[2 * i] = Msub_32_16( Msub_32_16( pDFT_DMX[2 * i], pDFT_DMX[2 * i], g ), pDFT_RES[2 * i], gamma ); move32(); - DFT_L[2 * i + 1] = Madd_32_16( Madd_32_16( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1], g ), pDFT_RES[2 * i + 1], gamma ); + DFT_L[add( shl( i, 1 ), 1 )] = Madd_32_16( Madd_32_16( pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )], g ), pDFT_RES[add( shl( i, 1 ), 1 )], gamma ); move32(); - DFT_R[2 * i + 1] = Msub_32_16( Msub_32_16( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1], g ), pDFT_RES[2 * i + 1], gamma ); + DFT_R[add( shl( i, 1 ), 1 )] = Msub_32_16( Msub_32_16( pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )], g ), pDFT_RES[add( shl( i, 1 ), 1 )], gamma ); move32(); } @@ -1652,6 +1759,7 @@ void stereo_dft_dec_fx( IF( EQ_16( c0, ONE_IN_Q14 ) ) { c0 = MAX_16; + move16(); } ELSE { @@ -1661,8 +1769,8 @@ void stereo_dft_dec_fx( FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) { /*rotate L*/ - tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[2 * i + 1], s0 ); - DFT_L[2 * i + 1] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[2 * i + 1], c0 ); + tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[add( shl( i, 1 ), 1 )], s0 ); + DFT_L[add( shl( i, 1 ), 1 )] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[add( shl( i, 1 ), 1 )], c0 ); move32(); DFT_L[2 * i] = tmp; move32(); @@ -1686,47 +1794,47 @@ void stereo_dft_dec_fx( move32(); DFT_R[2 * i] = 0; move32(); - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[add( shl( i, 1 ), 1 )] ); move32(); - DFT_L[2 * i + 1] = DFT_W; + DFT_L[add( shl( i, 1 ), 1 )] = DFT_W; move32(); - DFT_R[2 * i + 1] = 0; + DFT_R[add( shl( i, 1 ), 1 )] = 0; move32(); } FOR( i = hStereoDft->band_limits[b]; i < min( stop, hStereoDft->band_limits[b + 1] ); i++ ) { - DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ), - L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS], - L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS], - hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ), + DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ), + L_add( hStereoDft->mixer_mat_smooth_fx[0][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + L_add( hStereoDft->mixer_mat_smooth_fx[0][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + hStereoDft->mixer_mat_smooth_fx[0][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), DFT_PRED_RES[2 * i] ); DFT_L[2 * i] = DFT_W; move32(); DFT_R[2 * i] = 0; move32(); - DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ), - L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS], - L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS], - hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ), - DFT_PRED_RES[2 * i + 1] ); - DFT_L[2 * i + 1] = DFT_W; + DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ), + L_add( hStereoDft->mixer_mat_smooth_fx[0][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + L_add( hStereoDft->mixer_mat_smooth_fx[0][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + hStereoDft->mixer_mat_smooth_fx[0][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), + DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); + DFT_L[add( shl( i, 1 ), 1 )] = DFT_W; move32(); - DFT_R[2 * i + 1] = 0; + DFT_R[add( shl( i, 1 ), 1 )] = 0; move32(); } FOR( ; i < hStereoDft->band_limits[b + 1]; i++ ) { - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); DFT_L[2 * i] = DFT_W; move32(); DFT_R[2 * i] = 0; move32(); - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); - DFT_L[2 * i + 1] = DFT_W; + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); + DFT_L[add( shl( i, 1 ), 1 )] = DFT_W; move32(); - DFT_R[2 * i + 1] = 0; + DFT_R[add( shl( i, 1 ), 1 )] = 0; move32(); } } @@ -1736,16 +1844,16 @@ void stereo_dft_dec_fx( { i = 0; move16(); - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); - DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); + DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); move32(); DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); move32(); - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); - DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); + DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); move32(); @@ -1754,15 +1862,15 @@ void stereo_dft_dec_fx( } FOR( i = hStereoDft->band_limits[b]; i < min( stop, hStereoDft->band_limits[b + 1] ); i++ ) { - DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ), - L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS], - L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS], - hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ), + DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ), + L_add( hStereoDft->mixer_mat_smooth_fx[0][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + L_add( hStereoDft->mixer_mat_smooth_fx[0][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + hStereoDft->mixer_mat_smooth_fx[0][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), DFT_PRED_RES[2 * i] ); - DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ), - L_add( hStereoDft->mixer_mat_smooth_fx[1][1][b + k * IVAS_MAX_NUM_BANDS], - L_add( hStereoDft->mixer_mat_smooth_fx[1][2][b + k * IVAS_MAX_NUM_BANDS], - hStereoDft->mixer_mat_smooth_fx[1][3][b + k * IVAS_MAX_NUM_BANDS] ) ), + DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ), + L_add( hStereoDft->mixer_mat_smooth_fx[1][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + L_add( hStereoDft->mixer_mat_smooth_fx[1][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + hStereoDft->mixer_mat_smooth_fx[1][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), DFT_PRED_RES[2 * i] ); DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); @@ -1770,38 +1878,38 @@ void stereo_dft_dec_fx( DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); move32(); - DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ), - L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS], - L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS], - hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ), - DFT_PRED_RES[2 * i + 1] ); - DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ), - L_add( hStereoDft->mixer_mat_smooth_fx[1][1][b + k * IVAS_MAX_NUM_BANDS], - L_add( hStereoDft->mixer_mat_smooth_fx[1][2][b + k * IVAS_MAX_NUM_BANDS], - hStereoDft->mixer_mat_smooth_fx[1][3][b + k * IVAS_MAX_NUM_BANDS] ) ), - DFT_PRED_RES[2 * i + 1] ); - - DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); + DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ), + L_add( hStereoDft->mixer_mat_smooth_fx[0][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + L_add( hStereoDft->mixer_mat_smooth_fx[0][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + hStereoDft->mixer_mat_smooth_fx[0][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), + DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); + DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ), + L_add( hStereoDft->mixer_mat_smooth_fx[1][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + L_add( hStereoDft->mixer_mat_smooth_fx[1][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], + hStereoDft->mixer_mat_smooth_fx[1][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), + DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); + + DFT_L[add( shl( i, 1 ), 1 )] = L_add( DFT_W, DFT_Y ); move32(); - DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); + DFT_R[add( shl( i, 1 ), 1 )] = L_sub( DFT_W, DFT_Y ); move32(); } FOR( ; i < hStereoDft->band_limits[b + 1]; i++ ) { - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); - DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); + DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); move32(); DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); move32(); - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); - DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); + DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); - DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); + DFT_L[add( shl( i, 1 ), 1 )] = L_add( DFT_W, DFT_Y ); move32(); - DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); + DFT_R[add( shl( i, 1 ), 1 )] = L_sub( DFT_W, DFT_Y ); move32(); } } @@ -1815,40 +1923,40 @@ void stereo_dft_dec_fx( DFT_W = pDFT_DMX[2 * i]; move32(); - DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); + DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); move32(); DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); move32(); - DFT_W = pDFT_DMX[2 * i + 1]; + DFT_W = pDFT_DMX[add( shl( i, 1 ), 1 )]; move32(); - DFT_Y = Madd_32_32( pDFT_DMX1[2 * i + 1], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); + DFT_Y = Madd_32_32( pDFT_DMX1[add( shl( i, 1 ), 1 )], hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); - DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); + DFT_L[add( shl( i, 1 ), 1 )] = L_add( DFT_W, DFT_Y ); move32(); - DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); + DFT_R[add( shl( i, 1 ), 1 )] = L_sub( DFT_W, DFT_Y ); move32(); } FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) { DFT_W = pDFT_DMX[2 * i]; move32(); - DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); + DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); move32(); DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); move32(); - DFT_W = pDFT_DMX[2 * i + 1]; + DFT_W = pDFT_DMX[add( shl( i, 1 ), 1 )]; move32(); - DFT_Y = Madd_32_32( pDFT_DMX1[2 * i + 1], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); + DFT_Y = Madd_32_32( pDFT_DMX1[add( shl( i, 1 ), 1 )], hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); - DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); + DFT_L[add( shl( i, 1 ), 1 )] = L_add( DFT_W, DFT_Y ); move32(); - DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); + DFT_R[add( shl( i, 1 ), 1 )] = L_sub( DFT_W, DFT_Y ); move32(); } } @@ -1868,11 +1976,11 @@ void stereo_dft_dec_fx( DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); move32(); - tmp = L_add( Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g ), DFT_PRED_RES[2 * i + 1] ); + tmp = L_add( Madd_32_16( pDFT_RES[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )], g ), DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); - DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); + DFT_L[add( shl( i, 1 ), 1 )] = L_add( pDFT_DMX[add( shl( i, 1 ), 1 )], tmp ); move32(); - DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); + DFT_R[add( shl( i, 1 ), 1 )] = L_sub( pDFT_DMX[add( shl( i, 1 ), 1 )], tmp ); move32(); } @@ -1887,16 +1995,17 @@ void stereo_dft_dec_fx( tmp = Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g ); - DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); + DFT_L[add( shl( i, 1 ), 1 )] = L_add( pDFT_DMX[add( shl( i, 1 ), 1 )], tmp ); move32(); - DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); + DFT_R[add( shl( i, 1 ), 1 )] = L_sub( pDFT_DMX[add( shl( i, 1 ), 1 )], tmp ); move32(); } /* Active Upmix */ - IF( NE_32( pgIpd[0], 0 ) ) + IF( pgIpd[0] != 0 ) { Word32 theta = pgIpd[0]; + move32(); WHILE( GT_32( theta, EVS_2PI_FX_Q27 ) ) { theta = L_sub( theta, EVS_2PI_FX_Q27 ); @@ -1917,6 +2026,7 @@ void stereo_dft_dec_fx( IF( EQ_16( c0, ONE_IN_Q14 ) ) { c0 = MAX_16; + move16(); } ELSE { @@ -1926,8 +2036,8 @@ void stereo_dft_dec_fx( FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) { /*rotate L*/ - tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[2 * i + 1], s0 ); - DFT_L[2 * i + 1] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[2 * i + 1], c0 ); + tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[add( shl( i, 1 ), 1 )], s0 ); + DFT_L[add( shl( i, 1 ), 1 )] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[add( shl( i, 1 ), 1 )], c0 ); move32(); DFT_L[2 * i] = tmp; move32(); @@ -1936,12 +2046,14 @@ void stereo_dft_dec_fx( } } - IF( hStereoDft->frame_sid_nodata || EQ_16( st0->VAD, 0 ) ) + test(); + if ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) ) { hFdCngDec->cna_band_limits[hFdCngDec->cna_nbands] = hStereoDft->band_limits[hFdCngDec->cna_nbands]; move16(); } + test(); IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { hStereoCng->first_SID = 0; @@ -2007,6 +2119,7 @@ void stereo_dft_dec_fx( IF( GT_16( hFdCngDec->cna_rescale_fact_fx, 0 ) ) { Word16 q_scale_fact0 = 0; + move16(); Word16 op = Sqrt16( shr( hFdCngDec->cna_rescale_fact_fx, 1 ), &q_scale_fact0 ); move16(); scale_fact0 = L_mult0( shr( output_frame, 1 ), op ); @@ -2034,22 +2147,25 @@ void stereo_dft_dec_fx( gamma = coh; move16(); gamma = BASOP_Util_Divide3232_Scale( gamma, sub( (Word16) 0x7FFF, gamma ), &q_gamma ); - IF( EQ_16( gamma, 0 ) ) + if ( gamma == 0 ) { q_gamma = 0; + move16(); } l_gamma = L_deposit_l( gamma ); op1 = L_add( l_gamma, L_shr( L_deposit_l( sub( MAX_16, mult( g, g ) ) ), q_gamma ) ); - q_loc2 = Q16 + q_gamma; + q_loc2 = add( Q16, q_gamma ); q_loc1 = q_loc2; + move16(); op1 = Sqrt32( op1, &q_loc1 ); op2 = Sqrt32( l_gamma, &q_loc2 ); - IF( NE_32( op2, 0 ) ) + IF( op2 != 0 ) { IF( NE_16( q_loc1, q_loc2 ) ) { op2 = L_shl( op2, sub( q_loc2, q_loc1 ) ); q_loc2 = q_loc1; + move16(); } gamma = extract_h( L_sub( op1, op2 ) ); gamma = shl( gamma, q_loc2 ); @@ -2062,6 +2178,7 @@ void stereo_dft_dec_fx( ELSE { gamma = 0; + move16(); } FOR( i = s_max( hFdCngDec->cna_band_limits[b], shr( hFdCngCom->startBand, 1 ) ); i < s_min( hFdCngDec->cna_band_limits[b + 1], ( L_FRAME16k ) >> 1 ); i++ ) @@ -2072,7 +2189,9 @@ void stereo_dft_dec_fx( lev2 = *ptr_per++; move32(); - IF( GT_32( lev1, 0 ) && GT_32( lev2, 0 ) && GT_32( Mpy_32_16_1( L_max( lev1, lev2 ), (Word16) 0x6AAB ), L_min( lev1, lev2 ) ) ) + test(); + test(); + IF( ( lev1 > 0 ) && ( lev2 > 0 ) && GT_32( Mpy_32_16_1( L_max( lev1, lev2 ), (Word16) 0x6AAB ), L_min( lev1, lev2 ) ) ) { /* take the minimum of two adjacent frequency bins */ cna_level = L_min( lev1, lev2 ); @@ -2127,9 +2246,11 @@ void stereo_dft_dec_fx( } /* Update memories */ - hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + 1 ) & ( STEREO_DFT_PAST_MAX - 1 ); + hStereoDft->past_DMX_pos = s_and( ( add( hStereoDft->past_DMX_pos, 1 ) ), ( STEREO_DFT_PAST_MAX - 1 ) ); + move16(); Copy32( pDFT_DMX, hStereoDft->DFT_past_DMX_fx[hStereoDft->past_DMX_pos], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); hStereoDft->q_DFT_past_DMX_fx[hStereoDft->past_DMX_pos] = hStereoDft->q_dft; + move16(); IF( pPredGain ) { stereo_dft_adapt_sf_delay_fx( hStereoDft, pPredGain ); @@ -2187,7 +2308,8 @@ static void stereo_dft_compute_td_stefi_params_fx( bres = hStereoDft->band_res[1]; move16(); - IF( NE_16( hStereoDft->core_hist[1], ACELP_CORE ) || hStereoDft->wasTransient ) + test(); + IF( ( hStereoDft->core_hist[1] != ACELP_CORE ) || hStereoDft->wasTransient ) { hStereoDft->td_gain_fx[0] = 0; move32(); @@ -2203,9 +2325,10 @@ static void stereo_dft_compute_td_stefi_params_fx( move16(); WHILE( GT_16( hStereoDft->band_limits[b], bin0 ) ) { - b--; + b = sub( b, 1 ); } band0 = b; + move16(); /* calculate averages over high bands */ pred_g = pred_gain_avg = 0; @@ -2215,7 +2338,7 @@ static void stereo_dft_compute_td_stefi_params_fx( move16(); wsum = 0; move32(); - shift_g = Q15 - norm_s( sub( hStereoDft->nbands, band0 ) ); + shift_g = sub( Q15, norm_s( sub( hStereoDft->nbands, band0 ) ) ); FOR( b = band0; b < hStereoDft->nbands; b++ ) { IF( LT_32( L_min( hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 1, pdmx_ind )][b], hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 2, pdmx_ind )][b] ), 0 ) ) @@ -2235,7 +2358,7 @@ static void stereo_dft_compute_td_stefi_params_fx( dft_res_pred_weights_fx[bres][b - band0] ), shift_g ) ); - nbands++; + nbands = add( nbands, 1 ); wsum = L_add( wsum, dft_res_pred_weights_fx[bres][b - band0] ); #ifdef DBG_TD_STEFI printf( "frame: %d\tband: %-2d\tpred_gain1: %f\tpred_gain2: %f\tppg1: %f\tppg2: %f\n", frame, b, hStereoDft->res_pred_gain[b + STEREO_DFT_BAND_MAX], hStereoDft->res_pred_gain[b + 2 * STEREO_DFT_BAND_MAX], hStereoDft->past_res_pred_gain[STEREO_DFT_TD_STEFI_SUBFR_DELAY - 2][b], hStereoDft->past_res_pred_gain[d_short - 1][b] ); @@ -2267,29 +2390,33 @@ static void stereo_dft_compute_td_stefi_params_fx( { pred_gain_avg = L_shl( pred_gain_avg, q_div ); q_pred_gain_avg = 15; + move16(); } ELSE { q_pred_gain_avg = sub( 15, q_div ); - ; } nrg_DMX = hStereoDft->hb_nrg_fx[0]; + move32(); nrg_pred_DMX = hStereoDft->hb_nrg_fx[1]; + move32(); op1 = BASOP_Util_Divide3232_Scale( L_add( EPSILON_FIX, nrg_DMX ), L_add( EPSILON_FIX, nrg_pred_DMX ), &q_div ); - q_sqrt = Q16 + q_div; + q_sqrt = add( Q16, q_div ); op1 = Sqrt32( op1, &q_sqrt ); g2 = Mpy_32_32( pred_g, op1 ); IF( LT_16( q_sqrt, 0 ) ) { g2 = L_shl( g2, q_sqrt ); q_sqrt = 0; + move16(); } - ELSE IF( NE_16( q_sqrt, 0 ) ) + ELSE IF( q_sqrt != 0 ) { IF( LT_32( L_shr( pred_gain_avg, q_sqrt ), g2 ) ) { g2 = pred_gain_avg; + move32(); } ELSE { @@ -2382,6 +2509,7 @@ void stereo_dft_generate_res_pred_fx( /* variables for enhanced stereo filling */ Word16 norm_fac, q_norm_fac = 0, lim_norm_fac; + move16(); Word16 q_sqrt; Word16 alpha; // gain_limit; @@ -2397,9 +2525,18 @@ void stereo_dft_generate_res_pred_fx( push_wmops( "gen_respred" ); /* smoothing and limiting parameters */ - alpha = hStereoDft->wasTransient ? 0 : (Word16) ( 0x199A ); /* no smoothing after transients */ + // alpha = hStereoDft->wasTransient ? 0 : (Word16) ( 0x199A ); /* no smoothing after transients */ + IF( hStereoDft->wasTransient ) + { + alpha = 0; + move16(); + } + ELSE + { + alpha = (Word16) ( 0x199A ); + move16(); + } // gain_limit = 0x7FFF; // 2.0 in Q14 - move16(); /* residual prediction only used up to 16 kHz (SWB) */ nbands_respred = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); @@ -2413,7 +2550,7 @@ void stereo_dft_generate_res_pred_fx( move16(); WHILE( GE_16( hStereoDft->band_limits[b], bin0 ) ) { - b--; + b = sub( b, 1 ); } band0 = b; move16(); @@ -2453,10 +2590,10 @@ void stereo_dft_generate_res_pred_fx( /* Saturating below calculations (to be rechecked?) */ dmx_nrg = L_add_sat( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), - pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ) ); + pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )] ) ); rev_nrg = L_add_sat( rev_nrg, Madd_32_32( Mpy_32_32( ap_filt_DMX[2 * i], ap_filt_DMX[2 * i] ), - ap_filt_DMX[2 * i + 1], ap_filt_DMX[2 * i + 1] ) ); + ap_filt_DMX[add( shl( i, 1 ), 1 )], ap_filt_DMX[add( shl( i, 1 ), 1 )] ) ); } IF( LT_16( hStereoDft->q_smoothed_nrg, hStereoDft->q_dft ) ) { @@ -2481,39 +2618,56 @@ void stereo_dft_generate_res_pred_fx( { norm_fac = BASOP_Util_Divide3232_Scale( hStereoDft->smooth_dmx_nrg_fx[b], hStereoDft->smooth_res_nrg_fx[b], &q_norm_fac ); norm_fac = Sqrt16( norm_fac, &q_norm_fac ); - IF( NE_16( norm_fac, 0 ) ) + IF( norm_fac != 0 ) { /* gain compressor */ - IF( LE_16( q_norm_fac, -Q1 ) || ( EQ_16( q_norm_fac, Q1 ) && GT_16( (Word16) 0x3333, norm_fac ) ) || ( EQ_16( q_norm_fac, 0 ) && GT_16( (Word16) 0x6666, norm_fac ) ) ) + test(); + test(); + test(); + test(); + test(); + test(); + test(); + test(); + IF( LE_16( q_norm_fac, -Q1 ) || ( EQ_16( q_norm_fac, Q1 ) && GT_16( (Word16) 0x3333, norm_fac ) ) || ( ( q_norm_fac == 0 ) && GT_16( (Word16) 0x6666, norm_fac ) ) ) { lim_norm_fac = (Word16) 0x5000; + move16(); } - ELSE IF( GT_16( q_norm_fac, Q1 ) || ( EQ_16( q_norm_fac, Q1 ) && LT_16( (Word16) 0x5000, norm_fac ) ) || ( EQ_16( q_norm_fac, 0 ) && GT_16( (Word16) 0x6666, norm_fac ) ) ) + ELSE IF( GT_16( q_norm_fac, Q1 ) || ( EQ_16( q_norm_fac, Q1 ) && LT_16( (Word16) 0x5000, norm_fac ) ) || ( ( q_norm_fac == 0 ) && GT_16( (Word16) 0x6666, norm_fac ) ) ) { lim_norm_fac = (Word16) 0x3333; + move16(); } ELSE { lim_norm_fac = norm_fac; + move16(); } IF( EQ_16( lim_norm_fac, norm_fac ) ) { norm_fac = ONE_IN_Q14; + move16(); q_norm_fac = Q1; + move16(); } ELSE { norm_fac = extract_l( L_shr( L_mult0( norm_fac, lim_norm_fac ), Q15 ) ); q_norm_fac = add( q_norm_fac, 1 ); - IF( LT_16( q_norm_fac, 0 ) ) + test(); + IF( q_norm_fac < 0 ) { norm_fac = shl( norm_fac, q_norm_fac ); q_norm_fac = 0; + move16(); } ELSE IF( GT_16( q_norm_fac, 2 ) && LT_16( norm_s( norm_fac ), sub( q_norm_fac, Q1 ) ) ) { norm_fac = MAX_16; + move16(); q_norm_fac = Q1; + move16(); } } } @@ -2521,14 +2675,16 @@ void stereo_dft_generate_res_pred_fx( ELSE { norm_fac = MAX_16; + move16(); q_norm_fac = Q1; + move16(); } FOR( i = hStereoDft->band_limits[b]; i < s_min( hStereoDft->band_limits[b + 1], bin0 ); i++ ) { DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i] ), q_norm_fac ); move32(); - DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i + 1] ), q_norm_fac ); + DFT_PRED_RES[add( shl( i, 1 ), 1 )] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[add( shl( i, 1 ), 1 )] ), q_norm_fac ); move32(); } } @@ -2536,13 +2692,14 @@ void stereo_dft_generate_res_pred_fx( IF( GT_16( hStereoDft->q_smoothed_nrg, hStereoDft->q_dft ) ) { hStereoDft->q_smoothed_nrg = hStereoDft->q_dft; + move16(); } #endif } ELSE IF( EQ_16( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET], STEREO_DFT_RESPRED_STEFI ) ) { /* stefi in lowband */ - set_l( DFT_PRED_RES, 0, 2 * hStereoDft->band_limits[lb_stefi_start_band] ); + set32_fx( DFT_PRED_RES, 0, shl( hStereoDft->band_limits[lb_stefi_start_band], 1 ) ); FOR( b = lb_stefi_start_band; b <= band0; b++ ) { @@ -2552,7 +2709,7 @@ void stereo_dft_generate_res_pred_fx( move16(); /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/ - d_short_ind = max( d_short_ind, d_long_ind ); + d_short_ind = s_max( d_short_ind, d_long_ind ); move16(); /* Even number of window sliding (assymmetric OLA) */ @@ -2563,7 +2720,9 @@ void stereo_dft_generate_res_pred_fx( d_long = sub( STEREO_DFT_PAST_MAX, d_long_ind ); d_short_ind = add( add( d_short_ind, hStereoDft->past_DMX_pos ), 1 ) % STEREO_DFT_PAST_MAX; + move16(); d_long_ind = add( add( d_long_ind, hStereoDft->past_DMX_pos ), 1 ) % STEREO_DFT_PAST_MAX; + move16(); g_short = hStereoDft->stefi_short_gain_fx; move16(); @@ -2580,6 +2739,7 @@ void stereo_dft_generate_res_pred_fx( } /* Avoid transient components */ + test(); IF( EQ_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], EVS_LW_MIN ) && EQ_32( hStereoDft->past_res_pred_gain_fx[d_long_ind][b], EVS_LW_MIN ) ) { g_long = 0; @@ -2602,7 +2762,7 @@ void stereo_dft_generate_res_pred_fx( move16(); } - IF( GT_16( s_max( g_short, g_long ), 0 ) ) + IF( s_max( g_short, g_long ) > 0 ) { Word16 q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] ); Word16 q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_long_ind] ); @@ -2612,20 +2772,21 @@ void stereo_dft_generate_res_pred_fx( move32(); FOR( i = hStereoDft->band_limits[b]; i < min( bin0, hStereoDft->band_limits[b + 1] ); i++ ) { - dmx_nrg = Madd_32_32( Madd_32_32( dmx_nrg, pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ); + dmx_nrg = Madd_32_32( Madd_32_32( dmx_nrg, pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); DFT_PRED_RES[2 * i] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i], g_long ), q_shift1 ) ); move32(); - DFT_PRED_RES[2 * i + 1] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i + 1], g_long ), q_shift1 ) ); + DFT_PRED_RES[add( shl( i, 1 ), 1 )] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][add( shl( i, 1 ), 1 )], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][add( shl( i, 1 ), 1 )], g_long ), q_shift1 ) ); move32(); - past_dmx_nrg = Madd_32_32( Madd_32_32( past_dmx_nrg, DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[2 * i + 1], DFT_PRED_RES[2 * i + 1] ); + past_dmx_nrg = Madd_32_32( Madd_32_32( past_dmx_nrg, DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[add( shl( i, 1 ), 1 )], DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); } IF( !bfi || GE_16( b, hStereoDft->res_cod_band_max ) ) { Word16 q_div; Word16 op; - op = BASOP_Util_Divide3232_Scale( ( 1 + dmx_nrg ), ( 1 + past_dmx_nrg ), &q_div ); + op = BASOP_Util_Divide3232_Scale( L_add( 1, dmx_nrg ), L_add( 1, past_dmx_nrg ), &q_div ); q_sqrt = q_div; + move16(); norm_fac = Sqrt16( op, &q_sqrt ); g2 = Mpy_32_16_1( pPredGain[b], norm_fac ); IF( LE_32( q_sqrt, norm_l( g2 ) ) ) @@ -2638,6 +2799,7 @@ void stereo_dft_generate_res_pred_fx( Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( MAX_16, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ), g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); q_sqrt = 0; + move16(); } ELSE { @@ -2646,13 +2808,14 @@ void stereo_dft_generate_res_pred_fx( g2 = Madd_32_16( Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ), hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); q_sqrt = 0; + move16(); } FOR( i = hStereoDft->band_limits[b]; i < min( bin0, hStereoDft->band_limits[b + 1] ); i++ ) { DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[2 * i] ), q_sqrt ); move32(); - DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[2 * i + 1] ), q_sqrt ); + DFT_PRED_RES[add( shl( i, 1 ), 1 )] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[add( shl( i, 1 ), 1 )] ), q_sqrt ); move32(); } } @@ -2667,13 +2830,14 @@ void stereo_dft_generate_res_pred_fx( IF( GT_16( hStereoDft->band_limits[nbands_respred], bin0 ) ) { /* apply stereo filling in ACELP BWE region */ - IF( EQ_16( hStereoDft->core_hist[0], ACELP_CORE ) && EQ_16( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2], ACELP_CORE ) ) + test(); + IF( ( hStereoDft->core_hist[0] == ACELP_CORE ) && ( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2] == ACELP_CORE ) ) { /* ACELP -> ACELP: nothing to do */ *stop = bin0; move16(); } - ELSE IF( EQ_16( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2], ACELP_CORE ) ) + ELSE IF( hStereoDft->core_hist[STEREO_DFT_STEFFI_DELAY_SHORT / 2] == ACELP_CORE ) { /* ACELP -> TCX/HQ core transition */ /* calculate high band energy only */ @@ -2681,57 +2845,73 @@ void stereo_dft_generate_res_pred_fx( move32(); FOR( i = bin0; i < shr( hStereoDft->NFFT, 1 ); i++ ) { - dmx_nrg = L_add( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ) ); + dmx_nrg = L_add( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )] ) ); } hStereoDft->hb_nrg_fx[0] = dmx_nrg, L_shr( hStereoDft->NFFT, 1 ); + move32(); *stop = bin0; move16(); } - ELSE IF( EQ_16( hStereoDft->core_hist[0], ACELP_CORE ) ) + ELSE IF( hStereoDft->core_hist[0] == ACELP_CORE ) { /* TCX/HQ core -> ACELP transition */ /* apply short delay only and blend to long/short gain */ dmx_nrg = hStereoDft->hb_nrg_subr_fx[k]; + move32(); d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_TD_STEFI_SUBFR_DELAY; + move16(); - d_short_ind = add( d_short_ind, add( hStereoDft->past_DMX_pos, 1 ) ) & ( STEREO_DFT_PAST_MAX - 1 ); + d_short_ind = s_and( add( d_short_ind, add( hStereoDft->past_DMX_pos, 1 ) ), ( STEREO_DFT_PAST_MAX - 1 ) ); /* calculate high band energy of past dmx */ // past_dmx_nrg = EPSILON_FIX; past_dmx_nrg = 0; + move32(); FOR( i = bin0; i < s_min( shr( hStereoDft->NFFT, 1 ), STEREO_DFT32MS_N_32k / 2 ); i++ ) { - past_dmx_nrg = L_add( past_dmx_nrg, Madd_32_32( Mpy_32_32( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i] ), hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1] ) ); + past_dmx_nrg = L_add( past_dmx_nrg, Madd_32_32( Mpy_32_32( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i] ), hStereoDft->DFT_past_DMX_fx[d_short_ind][add( shl( i, 1 ), 1 )], hStereoDft->DFT_past_DMX_fx[d_short_ind][add( shl( i, 1 ), 1 )] ) ); } past_dmx_nrg = L_shl( past_dmx_nrg, shl( sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] ), 1 ) ); - IF( EQ_32( past_dmx_nrg, 0 ) ) + IF( past_dmx_nrg == 0 ) { past_dmx_nrg = EPSILON_FX; + move32(); } FOR( b = band0; b < nbands_respred; b++ ) { - g_short = LT_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], 0 ) ? 0 : add( ONE_IN_Q14, shr( hStereoDft->stefi_short_gain_fx, 1 ) ); + // g_short = LT_32( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], 0 ) ? 0 : add( ONE_IN_Q14, shr( hStereoDft->stefi_short_gain_fx, 1 ) ); + IF( hStereoDft->past_res_pred_gain_fx[d_short_ind][b] < 0 ) + { + g_short = 0; + move16(); + } + ELSE + { + g_short = add( ONE_IN_Q14, shr( hStereoDft->stefi_short_gain_fx, 1 ) ); + } - IF( GT_16( g_short, 0 ) ) + IF( g_short > 0 ) { Word16 q_divide, q_shift; - Word32 op = BASOP_Util_Divide3232_Scale( ( EPSILON_FIX + dmx_nrg ), ( EPSILON_FIX + past_dmx_nrg ), &q_divide ); - q_norm_fac = Q16 + q_divide + hStereoDft->q_hb_nrg_subr; + Word32 op = BASOP_Util_Divide3232_Scale( L_add( EPSILON_FIX, dmx_nrg ), L_add( EPSILON_FIX, past_dmx_nrg ), &q_divide ); + q_norm_fac = add( add( Q16, q_divide ), hStereoDft->q_hb_nrg_subr ); op = Sqrt32( op, &q_norm_fac ); g2 = Mpy_32_32( pPredGain[b], op ); pred_gain_avg = Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ); - IF( LT_16( q_norm_fac, 0 ) ) + IF( q_norm_fac < 0 ) { g2 = L_shl( g2, q_norm_fac ); q_norm_fac = 0; + move16(); } - ELSE IF( NE_16( q_norm_fac, 0 ) ) + ELSE IF( q_norm_fac != 0 ) { IF( LT_32( L_shr( pred_gain_avg, q_norm_fac ), g2 ) ) { g2 = pred_gain_avg; + move32(); } ELSE { @@ -2753,7 +2933,7 @@ void stereo_dft_generate_res_pred_fx( { DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( g2, hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i] ), q_shift ); move32(); - DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( g2, hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1] ), q_shift ); + DFT_PRED_RES[add( shl( i, 1 ), 1 )] = L_shl( Mpy_32_32( g2, hStereoDft->DFT_past_DMX_fx[d_short_ind][add( shl( i, 1 ), 1 )] ), q_shift ); move32(); } } @@ -2763,7 +2943,7 @@ void stereo_dft_generate_res_pred_fx( move16(); end = min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); move16(); - set_l( DFT_PRED_RES + 2 * begin, 0, 2 * ( end - begin ) ); + set32_fx( DFT_PRED_RES + shl( begin, 1 ), 0, shl( sub( end, begin ), 1 ) ); } } } @@ -2857,17 +3037,18 @@ void stereo_dft_generate_res_pred_fx( move32(); FOR( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) { - dmx_nrg = L_add( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ) ); + dmx_nrg = L_add( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )] ) ); DFT_PRED_RES[2 * i] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i], g_long ), q_shift1 ) ); move32(); - DFT_PRED_RES[2 * i + 1] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i + 1], g_long ), q_shift1 ) ); + DFT_PRED_RES[add( shl( i, 1 ), 1 )] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][add( shl( i, 1 ), 1 )], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][add( shl( i, 1 ), 1 )], g_long ), q_shift1 ) ); move32(); past_dmx_nrg = L_add( past_dmx_nrg, Madd_32_32( Mpy_32_32( DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[2 * i + 1], DFT_PRED_RES[2 * i + 1] ) ); } op1 = L_deposit_h( BASOP_Util_Divide3232_Scale( ( EPSILON_FIX + dmx_nrg ), ( EPSILON_FIX + past_dmx_nrg ), &q_div ) ); q_norm_fac = q_div; + move16(); op1 = Sqrt32( op1, &q_norm_fac ); IF( GT_16( q_norm_fac, 16 ) ) { @@ -2885,7 +3066,7 @@ void stereo_dft_generate_res_pred_fx( { DFT_PRED_RES[2 * i] = Mpy_32_32( g2, DFT_PRED_RES[2 * i] ); move32(); - DFT_PRED_RES[2 * i + 1] = Mpy_32_32( g2, DFT_PRED_RES[2 * i + 1] ); + DFT_PRED_RES[add( shl( i, 1 ), 1 )] = Mpy_32_32( g2, DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); move32(); } } @@ -2893,7 +3074,7 @@ void stereo_dft_generate_res_pred_fx( { begin = s_max( hStereoDft->band_limits[b], bin0 ); end = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); - set_l( DFT_PRED_RES + 2 * begin, 0, 2 * ( end - begin ) ); + set32_fx( DFT_PRED_RES + shl( begin, 1 ), 0, shl( sub( end, begin ), 1 ) ); } } } @@ -2902,14 +3083,15 @@ void stereo_dft_generate_res_pred_fx( /* update buffers */ FOR( b = hStereoDft->res_pred_band_min; b < hStereoDft->nbands; b++ ) { + test(); IF( hStereoDft->attackPresent || hStereoDft->wasTransient ) { - hStereoDft->past_res_pred_gain_fx[( hStereoDft->past_DMX_pos + 1 ) & ( STEREO_DFT_PAST_MAX - 1 )][b] = MIN_32; + hStereoDft->past_res_pred_gain_fx[s_and( add( hStereoDft->past_DMX_pos, 1 ), ( STEREO_DFT_PAST_MAX - 1 ) )][b] = MIN_32; move32(); } ELSE { - hStereoDft->past_res_pred_gain_fx[( hStereoDft->past_DMX_pos + 1 ) & ( STEREO_DFT_PAST_MAX - 1 )][b] = pPredGain[b]; + hStereoDft->past_res_pred_gain_fx[s_and( add( hStereoDft->past_DMX_pos, 1 ), ( STEREO_DFT_PAST_MAX - 1 ) )][b] = pPredGain[b]; move32(); } } @@ -2961,13 +3143,15 @@ static void stereo_dft_adapt_sf_delay_fx( { hStereoDft->lt_pred_gain_fx = L_shr( hStereoDft->lt_pred_gain_fx, sub( q_guard, hStereoDft->q_lt_pred_gain ) ); hStereoDft->q_lt_pred_gain = q_guard; + move16(); } ELSE { sum_pg = L_shr( sum_pg, sub( hStereoDft->q_lt_pred_gain, q_guard ) ); q_guard = hStereoDft->q_lt_pred_gain; + move16(); } - IF( GT_32( sum_pg, 0 ) ) + IF( sum_pg > 0 ) { /* Calculate mean of the prediction gain */ hStereoDft->lt_pred_gain_fx = Madd_32_16( Mpy_32_16_1( sum_pg, STEREO_DFT_LT_PREDGAIN_UPD_FX ), hStereoDft->lt_pred_gain_fx, sub( MAX_16, STEREO_DFT_LT_PREDGAIN_UPD_FX ) ); @@ -2984,7 +3168,7 @@ static void stereo_dft_adapt_sf_delay_fx( IF( GT_32( hStereoDft->lt_pred_gain_fx, 0 ) ) { Word32 opr2 = L_deposit_h( BASOP_Util_Divide3232_Scale( hStereoDft->lt_pred_gain_variation_fx, hStereoDft->lt_pred_gain_fx, &q_div ) ); - IF( LT_16( q_div, 0 ) ) + IF( q_div < 0 ) { opr2 = L_shl( opr2, q_div ); q_div = 0; @@ -2993,6 +3177,7 @@ static void stereo_dft_adapt_sf_delay_fx( IF( LT_32( L_shr( STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2, q_div ), opr2 ) ) { var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2; + move32(); } ELSE { @@ -3044,16 +3229,20 @@ static void stereo_dft_adapt_sf_delay_fx( /* Adapt the stereo filling delay by interpolating between two delay taps, one at the shortest delay and one at the longest delay */ hStereoDft->stefi_short_gain_fx = extract_l( L_shr( L_sub( L_shl( STEREO_DFT_STEFFI_DELAY_LONG, Q15 ), target_delay ), 1 ) ); q_sqrt = 0; + move16(); IF( hStereoDft->stefi_short_gain_fx == MIN_16 ) { hStereoDft->stefi_short_gain_fx = MAX_16; + move16(); hStereoDft->stefi_long_gain_fx = 0; + move16(); } ELSE { op = hStereoDft->stefi_short_gain_fx; + move16(); hStereoDft->stefi_long_gain_fx = Sqrt16( sub( MAX_16, mult( op, op ) ), &q_sqrt ); - IF( NE_16( q_sqrt, 0 ) ) + IF( q_sqrt != 0 ) { hStereoDft->stefi_long_gain_fx = shl( hStereoDft->stefi_long_gain_fx, q_sqrt ); } @@ -3105,6 +3294,7 @@ void stereo_dft_dec_sid_coh_fx( } } alpha_fx = dft_cng_alpha_bits_fx[alpha_step][alpha_index]; /*Q-15*/ + move16(); } ELSE { @@ -3115,7 +3305,7 @@ void stereo_dft_dec_sid_coh_fx( FOR( i = *nb_bits; i < nr_of_sid_stereo_bits; i++ ) { get_next_indice_fx( st, 1 ); - ( *nb_bits )++; + ( *nb_bits ) = add( ( *nb_bits ), 1 ); } } @@ -3157,7 +3347,7 @@ void stereo_dft_dec_sid_coh_fx( cohBandq_fx[b] = 8192; move16(); } - ELSE IF( LT_16( cohBandq_fx[b], 0 ) ) + ELSE IF( cohBandq_fx[b] < 0 ) { cohBandq_fx[b] = 0; move16(); @@ -3172,7 +3362,7 @@ void stereo_dft_dec_sid_coh_fx( FOR( i = *nb_bits; i < nr_of_sid_stereo_bits; i++ ) { get_next_indice_fx( st, 1 ); - ( *nb_bits )++; + ( *nb_bits ) = add( ( *nb_bits ), 1 ); } return; } @@ -3335,14 +3525,16 @@ void stereo_dft_dec_read_BS_fx( ELSE { hStereoDft->attackPresent = get_next_indice_fx( st, 1 ); - ( *nb_bits )++; + ( *nb_bits ) = add( ( *nb_bits ), 1 ); } /* read res_cod_mode from bitstream */ + test(); IF( EQ_16( bwidth, WB ) && hStereoDft->hConfig->ada_wb_res_cod_mode ) { hStereoDft->res_cod_mode[k_offset] = get_next_indice_fx( st, 1 ); - ( *nb_bits )++; + move16(); + ( *nb_bits ) = add( ( *nb_bits ), 1 ); } /* read number of bands in the bitstream - depends on the audio bandwidth and not to output_Fs */ @@ -3380,16 +3572,19 @@ void stereo_dft_dec_read_BS_fx( hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]]; move16(); - hStereoDft->res_cod_line_max = (Word16) L_shr( ( ( 1 << Q13 ) /*0.5f Q-14*/ + L_shl( L_mult0( sub( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ), divide1616( shr( output_frame, 1 ), ( hStereoDft->NFFT ) ) ) /*Q-14*/, 1 ) ), Q14 ); + hStereoDft->res_cod_line_max = (Word16) L_shr( L_add( ( 1 << Q13 ) /*0.5f Q-14*/, L_shl( L_mult0( sub( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ), divide1616( shr( output_frame, 1 ), ( hStereoDft->NFFT ) ) ) /*Q-14*/, 1 ) ), Q14 ); + move16(); hStereoDft->res_cod_line_max = shl( shr( hStereoDft->res_cod_line_max, 3 ), 3 ); + move16(); hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); + move16(); /*Copy config. for all DFT frames*/ - set16_fx( hStereoDft->band_res + k_offset + 1, hStereoDft->band_res[k_offset], N_div - 1 ); - set16_fx( hStereoDft->prm_res + k_offset + 1, hStereoDft->prm_res[k_offset], N_div - 1 ); - set16_fx( hStereoDft->res_pred_mode + k_offset + 1, hStereoDft->res_pred_mode[k_offset], N_div - 1 ); - set16_fx( hStereoDft->res_cod_mode + k_offset + 1, hStereoDft->res_cod_mode[k_offset], N_div - 1 ); + set16_fx( hStereoDft->band_res + add( k_offset, 1 ), hStereoDft->band_res[k_offset], sub( N_div, 1 ) ); + set16_fx( hStereoDft->prm_res + add( k_offset, 1 ), hStereoDft->prm_res[k_offset], sub( N_div, 1 ) ); + set16_fx( hStereoDft->res_pred_mode + add( k_offset, 1 ), hStereoDft->res_pred_mode[k_offset], sub( N_div, 1 ) ); + set16_fx( hStereoDft->res_cod_mode + add( k_offset, 1 ), hStereoDft->res_cod_mode[k_offset], sub( N_div, 1 ) ); /*------------------------------------------------------------------* * Read DFT stereo parameters @@ -3399,11 +3594,12 @@ void stereo_dft_dec_read_BS_fx( FOR( k = hStereoDft->prm_res[k_offset] - 1; k < N_div; k += hStereoDft->prm_res[k + k_offset] ) { /* reset parameters */ - set_zero_fx( hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); + set_zero_fx( hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), STEREO_DFT_BAND_MAX ); hStereoDft->gipd_fx[k + k_offset] = 0; move32(); - set_zero_fx( hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); + set_zero_fx( hStereoDft->res_pred_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), STEREO_DFT_BAND_MAX ); + test(); IF( !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) ) { /*------------------------------------------------------------------* @@ -3422,7 +3618,7 @@ void stereo_dft_dec_read_BS_fx( n_bits = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->side_gain_flag_1 ); nb = add( nb, n_bits ); - IF( EQ_16( hStereoDft->side_gain_flag_1, 0 ) ) + IF( hStereoDft->side_gain_flag_1 == 0 ) { b = read_BS_adapt_GR_sg( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2, dft_maps_sg ); n_bits = add( n_bits, b ); @@ -3454,6 +3650,7 @@ void stereo_dft_dec_read_BS_fx( hStereoDft->side_gain_index_previous[b] = ind1[b]; move16(); hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX] = L_shl( ind1[b], 26 ); + move32(); } st->next_bit_pos = add( st->next_bit_pos, n_bits ); @@ -3474,7 +3671,7 @@ void stereo_dft_dec_read_BS_fx( IF( itd_mode ) { ( *nb_bits ) = add( ( *nb_bits ), read_itd( st, &I ) ); - stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + k + k_offset, st->output_Fs ); + stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + add( k, k_offset ), st->output_Fs ); } } ELSE IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 - SID_FORMAT_NBITS ) ) ) @@ -3482,7 +3679,7 @@ void stereo_dft_dec_read_BS_fx( itd_mode = get_next_indice_fx( st, STEREO_DFT_ITD_MODE_NBITS ); ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS ); /*ITD mode flag: 1bit*/ - hStereoDft->itd_fx[k + k_offset] = 0; + hStereoDft->itd_fx[add( k, k_offset )] = 0; move32(); IF( itd_mode ) { @@ -3491,7 +3688,7 @@ void stereo_dft_dec_read_BS_fx( ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_SID_ITD_NBITS + 1 ); I = shl( I, STEREO_DFT_SID_ITD_FAC ); I = add( I, shl( sign_flag, 8 ) ); - stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + k + k_offset, st->output_Fs ); + stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + add( k, k_offset ), st->output_Fs ); } } @@ -3511,12 +3708,13 @@ void stereo_dft_dec_read_BS_fx( move16(); nb = add( nb, 1 ); n_bits = add( n_bits, 1 ); - IF( EQ_16( hStereoDft->no_ipd_flag, 0 ) ) + IF( hStereoDft->no_ipd_flag == 0 ) { ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_GIPD_NBITS ); + move16(); nb = add( nb, STEREO_DFT_GIPD_NBITS ); n_bits = add( n_bits, STEREO_DFT_GIPD_NBITS ); - stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + ( k + k_offset ), 1, STEREO_DFT_GIPD_NBITS ); + stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + add( k, k_offset ), 1, STEREO_DFT_GIPD_NBITS ); } } ELSE IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS - SID_FORMAT_NBITS ) ) ) @@ -3526,12 +3724,13 @@ void stereo_dft_dec_read_BS_fx( move16(); nb = add( nb, 1 ); n_bits = add( n_bits, 1 ); - IF( EQ_16( hStereoDft->no_ipd_flag, 0 ) ) + IF( hStereoDft->no_ipd_flag == 0 ) { ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_SID_GIPD_NBITS ); + move16(); nb = add( nb, STEREO_DFT_SID_GIPD_NBITS ); n_bits = add( n_bits, STEREO_DFT_SID_GIPD_NBITS ); - stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + ( k + k_offset ), 1, STEREO_DFT_SID_GIPD_NBITS ); + stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + add( k, k_offset ), 1, STEREO_DFT_SID_GIPD_NBITS ); } } ELSE @@ -3556,7 +3755,8 @@ void stereo_dft_dec_read_BS_fx( /* Not used in inactive frames */ IF( !hStereoDft->frame_sid_nodata ) { - IF( hStereoDft->res_pred_mode[k + k_offset] && EQ_16( hStereoDft->attackPresent, 0 ) ) + test(); + IF( hStereoDft->res_pred_mode[add( k, k_offset )] && hStereoDft->attackPresent == 0 ) { nbands = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); @@ -3582,7 +3782,7 @@ void stereo_dft_dec_read_BS_fx( nb = add( nb, b ); n_bits = add( n_bits, b ); - IF( EQ_16( hStereoDft->res_pred_flag_0, 0 ) ) + IF( hStereoDft->res_pred_flag_0 == 0 ) { b = read_BS_adapt_GR_rpg( st->bit_stream, nb, ind1_pred, hStereoDft->res_pred_band_min, nbands, &hStereoDft->res_pred_flag_1 ); n_bits = add( n_bits, b ); @@ -3597,6 +3797,7 @@ void stereo_dft_dec_read_BS_fx( FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ ) { ind1_pred[b] = add( ind1_pred[b], hStereoDft->res_pred_index_previous[b] ); + move16(); } } ELSE @@ -3604,6 +3805,7 @@ void stereo_dft_dec_read_BS_fx( FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ ) { ind1_pred[b] = get_value( &st->bit_stream[nb], STEREO_DFT_RES_GAINS_BITS ); + move16(); nb = add( nb, STEREO_DFT_RES_GAINS_BITS ); n_bits = add( n_bits, STEREO_DFT_RES_GAINS_BITS ); } @@ -3614,7 +3816,7 @@ void stereo_dft_dec_read_BS_fx( { I = 0; move16(); - stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); hStereoDft->res_pred_index_previous[b] = I; move16(); hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; @@ -3625,19 +3827,21 @@ void stereo_dft_dec_read_BS_fx( { I = ind1_pred[b]; move16(); - stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); hStereoDft->res_pred_index_previous[b] = I; move16(); hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl( I, 26 ); + move32(); } FOR( ; b < hStereoDft->nbands; b++ ) { I = 0; move16(); - stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); move16(); hStereoDft->res_pred_index_previous[b] = I; + move16(); hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; move32(); } @@ -3648,10 +3852,11 @@ void stereo_dft_dec_read_BS_fx( { I = 0; move16(); - stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); hStereoDft->res_pred_index_previous[b] = I; move16(); hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl( I, 26 ); + move32(); } } @@ -3667,13 +3872,14 @@ void stereo_dft_dec_read_BS_fx( { I = 0; move16(); - stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, hStereoDft->res_pred_gain_fx + ( k + k_offset ) * STEREO_DFT_BAND_MAX + b, 1 ); + stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); } } } } } + test(); IF( !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) ) { IF( NE_16( hStereoDft->side_gain_flag_1, 2 ) ) @@ -3731,6 +3937,7 @@ void stereo_dft_dec_read_BS_fx( FOR( Word16 c = 0; c < hStereoDft->res_cod_line_max; c++ ) { dec[c] = shl_sat( dec[c], 8 ); + move16(); } ECSQ_dequantize_vector_fx( dec, hStereoDft->res_global_gain_fx, hStereoDft->res_cod_line_max, res_buf_fx ); @@ -3753,11 +3960,14 @@ void stereo_dft_dec_read_BS_fx( pop_wmops(); } + test(); + test(); IF( hStereoDft->frame_sid && !( EQ_16( ivas_format, MASA_FORMAT ) && LE_32( ivas_total_brate, IVAS_SID_5k2 ) ) ) { stereo_dft_dec_sid_coh_fx( st, hStereoDft->nbands, coh_fx, nb_bits ); } + test(); IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_16( ivas_format, MASA_FORMAT ) ) { *nb_bits = (Word16) Mult_32_16( L_sub( element_brate, SID_2k40 ), INV_FRAME_PER_SEC_Q15 ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40; */ diff --git a/lib_dec/ivas_stereo_dft_plc_fx.c b/lib_dec/ivas_stereo_dft_plc_fx.c index 3023b40e903de3ff1f9e3dd937fdbc0a2ba3e6e5..5abf182fe903c9abefabe8efe7ed1641836ac2d7 100644 --- a/lib_dec/ivas_stereo_dft_plc_fx.c +++ b/lib_dec/ivas_stereo_dft_plc_fx.c @@ -85,7 +85,7 @@ void stereo_dft_res_ecu_fx( Word16 trigo_step; Word16 q_fac; - set_l( pDFT_RES, 0, L_FRAME8k ); + set32_fx( pDFT_RES, 0, L_FRAME8k ); L_res = hStereoDft->band_limits[hStereoDft->res_cod_band_max]; move16(); @@ -93,7 +93,7 @@ void stereo_dft_res_ecu_fx( stereo_dft_res_subst_spec_fx( hStereoDft, pDFT_RES, DFT_PRED_RES, hStereoDft->time_offs, L_res, L_FRAME8k, k, num_plocs, plocs, plocsi, k == 0 ); fac = BASOP_Util_Divide3232_Scale( L_FRAME8k, hStereoDft->NFFT, &q_fac ); - IF( GT_16( q_fac, 0 ) ) + IF( q_fac > 0 ) { assert( 0 ); } @@ -102,7 +102,7 @@ void stereo_dft_res_ecu_fx( fac = shl( fac, q_fac ); } - IF( EQ_16( hStereoDft->core_hist[0], ACELP_CORE ) ) + IF( hStereoDft->core_hist[0] == ACELP_CORE ) { fac = extract_l( L_shr( L_mult0( fac, 0x2000 ), 15 ) ); } @@ -111,16 +111,16 @@ void stereo_dft_res_ecu_fx( move16(); FOR( i = 0; i < STEREO_DFT32MS_N_8k / 4; i++ ) { - trigo_dec[i] = hStereoDft->dft_trigo_8k_fx[i * trigo_step]; + trigo_dec[i] = hStereoDft->dft_trigo_8k_fx[i_mult( i, trigo_step )]; move16(); - trigo_dec[STEREO_DFT32MS_N_8k / 2 - i] = hStereoDft->dft_trigo_8k_fx[i * trigo_step]; + trigo_dec[STEREO_DFT32MS_N_8k / 2 - i] = hStereoDft->dft_trigo_8k_fx[i_mult( i, trigo_step )]; move16(); } - trigo_dec[STEREO_DFT32MS_N_8k / 4] = hStereoDft->dft_trigo_8k_fx[STEREO_DFT32MS_N_8k / 4 * trigo_step]; + trigo_dec[STEREO_DFT32MS_N_8k / 4] = hStereoDft->dft_trigo_8k_fx[i_mult( STEREO_DFT32MS_N_8k / 4, trigo_step )]; move16(); /* estimation of res_cod_mem (ola part in imdct residual signal) and input_mem (memory for buffer in DFT analysis)*/ - IF( EQ_16( k, 0 ) ) + IF( k == 0 ) { Copy32( pDFT_RES, res_buf, L_FRAME8k ); stereo_dft_res_subst_spec_fx( hStereoDft, res_buf, DFT_PRED_RES, hStereoDft->time_offs + output_frame, L_res, L_FRAME8k, k, num_plocs, plocs, plocsi, FALSE ); @@ -130,6 +130,7 @@ void stereo_dft_res_ecu_fx( v_multc_fixed_16( res_buf, fac, res_buf, L_FRAME8k ); Copy32( res_buf + ( OFFSET8k - ZP8k ), &hStereoDft->res_cod_mem_fx[0], STEREO_DFT_OVL_8k ); hStereoDft->q_res_cod_mem_fx = hStereoDft->q_dft; + move16(); Copy32( res_buf + ZP8k, input_mem, NS2SA( 8000, STEREO_DFT32MS_OVL_NS ) ); /* Store memory for cross-fade to next frame, in case of good frame */ hStereoDft->q_ip_mem = hStereoDft->q_dft; @@ -138,7 +139,8 @@ void stereo_dft_res_ecu_fx( ELSE { Word16 scale_fac = getScaleFactor32( res_buf, L_FRAME8k ); - Word16 q_shift = 8 - scale_fac; + Word16 q_shift = sub( 8, scale_fac ); + move16(); // Copy32( pDFT_RES, res_buf, L_FRAME8k ); v_shr_32( pDFT_RES, res_buf, L_FRAME8k, q_shift ); @@ -164,7 +166,7 @@ void stereo_dft_res_ecu_fx( hStereoDft->time_offs = add( hStereoDft->time_offs, L_FRAME8k ); } - set_l( DFT_PRED_RES, 0, 2 * L_res ); + set32_fx( DFT_PRED_RES, 0, shl( L_res, 1 ) ); IF( prev_bfi ) { @@ -200,7 +202,7 @@ Word32 imax_pos_fx( ftmp_den2 = L_shl( L_sub( L_sub( L_shl( y2, 1 ), y1 ), y3 ), 1 ); test(); - IF( EQ_32( ftmp_den2, 0 ) || EQ_32( ftmp_den1, 0 ) ) + IF( ( ftmp_den2 == 0 ) || ( ftmp_den1 == 0 ) ) { return ( 0 ); /* early exit with left-most value */ } @@ -219,7 +221,7 @@ Word32 imax_pos_fx( } /* their corresponding normalized locations */ posi = BASOP_Util_Divide3232_Scale( y3_y1, ( ftmp_den2 ), &q_div_posi ); - IF( NE_16( q_div_posi, 0 ) ) + IF( ( q_div_posi != 0 ) ) { posi = L_shl( posi, q_div_posi ); q_div_posi = 0; @@ -229,14 +231,33 @@ Word32 imax_pos_fx( test(); IF( GE_32( posi, L_shr( ONE_IN_Q15, q_div_posi ) ) || LE_32( posi, L_shr( MIN_16, q_div_posi ) ) ) { - posi = GT_32( y3, y1 ) ? ONE_IN_Q15 : MIN_16; - move16(); + // posi = GT_32( y3, y1 ) ? ONE_IN_Q15 : MIN_16; + IF( GT_32( y3, y1 ) ) + { + posi = ONE_IN_Q15; + move32(); + } + ELSE + { + posi = MIN_16; + move32(); + } } ELSE { IF( GE_32( L_shr( y1, q_div_2i ), y2i ) ) { - posi = GT_32( y1, y3 ) ? MIN_16 : ONE_IN_Q15; + // posi = GT_32( y1, y3 ) ? MIN_16 : ONE_IN_Q15; + IF( GT_32( y1, y3 ) ) + { + posi = MIN_16; + move32(); + } + ELSE + { + posi = ONE_IN_Q15; + move32(); + } move16(); } ELSE IF( GE_32( L_shr( y3, q_div_2i ), y2i ) ) @@ -262,17 +283,18 @@ static void ivas_peakfinder_fx( Word32 dx0[L_PROT48k_2], x[L_PROT48k_2 + 1], peakMag[MAX_PLOCS]; Word16 k, i, len, tempLoc = 0, foundPeak, ii, xInd; Word16 *ind, indarr[L_PROT48k_2 + 1], peakLoc[MAX_PLOCS]; + move16(); ind = indarr; move16(); /* Find derivative */ - v_sub_32( x0 + 1, x0, dx0, len0 - 1 ); + v_sub_32( x0 + 1, x0, dx0, sub( len0, 1 ) ); /* This is so we find the first of repeated values */ - FOR( i = 0; i < len0 - 1; i++ ) + FOR( i = 0; i < sub( len0, 1 ); i++ ) { - IF( EQ_32( dx0[i], 0 ) ) + IF( dx0[i] == 0 ) { dx0[i] = -EPSILON_FX; move32(); @@ -288,13 +310,14 @@ static void ivas_peakfinder_fx( { x[k] = x0[0]; move32(); - ind[k++] = 0; + ind[k] = 0; move16(); + k = add( k, 1 ); } - FOR( i = 1; i < len0 - 1; i++ ) + FOR( i = 1; i < sub( len0, 1 ); i++ ) { - IF( LT_32( L_xor( dx0[i - 1], dx0[i] ), 0 ) ) + IF( L_xor( dx0[i - 1], dx0[i] ) < 0 ) { ind[k] = i; move16(); @@ -307,8 +330,9 @@ static void ivas_peakfinder_fx( { ind[k] = sub( len0, 1 ); move16(); - x[k++] = x0[len0 - 1]; + x[k] = x0[sub( len0, 1 )]; move32(); + k = add( k, 1 ); } /* x only has the peaks, valleys, and endpoints */ len = k; @@ -317,7 +341,7 @@ static void ivas_peakfinder_fx( test(); test(); - IF( GT_16( len, 2 ) || ( !endpoints && GT_16( len, 0 ) ) ) + IF( GT_16( len, 2 ) || ( !endpoints && ( len > 0 ) ) ) { /* Set initial parameters for loop */ tempMag = minMag; @@ -411,7 +435,7 @@ static void ivas_peakfinder_fx( move32(); } - ii++; /* Move onto the valley */ + ii = add( ii, 1 ); /* Move onto the valley */ /* Come down at least sel from peak */ test(); @@ -425,7 +449,8 @@ static void ivas_peakfinder_fx( move16(); peakMag[*cInd] = tempMag; move32(); - ( *cInd )++; + ( *cInd ) = add( *( cInd ), 1 ); + move16(); } ELSE IF( LT_32( x[ii], leftMin ) ) /* New left minimum */ { @@ -451,7 +476,8 @@ static void ivas_peakfinder_fx( move16(); peakMag[*cInd] = tempMag; move32(); - ( *cInd )++; + ( *cInd ) = add( *( cInd ), 1 ); + move16(); } /* Create output */ @@ -466,7 +492,17 @@ static void ivas_peakfinder_fx( IF( endpoints ) { /* This is a monotone function where an endpoint is the only peak */ - xInd = GT_32( x[0], x[1] ) ? 0 : 1; + // xInd = GT_32( x[0], x[1] ) ? 0 : 1; + IF( GT_32( x[0], x[1] ) ) + { + xInd = 0; + move16(); + } + ELSE + { + xInd = 1; + move16(); + } move16(); peakMag[0] = x[xInd]; move32(); @@ -546,7 +582,7 @@ void stereo_dft_res_subst_spec_fx( FOR( i = 1; i < L_res; i++ ) { Word32 r = L_shl( p_mem[2 * i], q_res ); - Word32 l = L_shl( p_mem[2 * i + 1], q_res ); + Word32 l = L_shl( p_mem[add( shl( i, 1 ), 1 )], q_res ); abs_res[i] = Madd_32_32( Mpy_32_32( r, r ), l, l ); move32(); } @@ -582,11 +618,11 @@ void stereo_dft_res_subst_spec_fx( FOR( i = 1; i < L_res; i++ ) { s1 = sign_l( pDFT_RES[2 * i] ); - s2 = sign_l( pDFT_RES[2 * i + 1] ); + s2 = sign_l( pDFT_RES[add( shl( i, 1 ), 1 )] ); abs1 = L_abs( pDFT_RES[2 * i] ); - abs2 = L_abs( pDFT_RES[2 * i + 1] ); + abs2 = L_abs( pDFT_RES[add( shl( i, 1 ), 1 )] ); abs3 = L_abs( p_mem[2 * i] ); - abs4 = L_abs( p_mem[2 * i + 1] ); + abs4 = L_abs( p_mem[add( shl( i, 1 ), 1 )] ); // fac = MAX_16; move16(); @@ -598,14 +634,14 @@ void stereo_dft_res_subst_spec_fx( { pDFT_RES[2 * i] = Mpy_32_32( s1, abs4 ); move32(); - pDFT_RES[2 * i + 1] = Mpy_32_32( s2, abs3 ); + pDFT_RES[add( shl( i, 1 ), 1 )] = Mpy_32_32( s2, abs3 ); move32(); } ELSE { pDFT_RES[2 * i] = Mpy_32_32( s1, abs3 ); move32(); - pDFT_RES[2 * i + 1] = Mpy_32_32( s2, abs4 ); + pDFT_RES[add( shl( i, 1 ), 1 )] = Mpy_32_32( s2, abs4 ); move32(); } } @@ -658,14 +694,14 @@ void stereo_dft_res_subst_spec_fx( cos_F = shl_o( getCosWord16( extract_l( corr_phase ) ), 1, &flg_ov ); sin_F = getSinWord16( extract_l( corr_phase ) ); - idx = s_max( 0, plocs[i] - Np ); /* Iterate over plocs[i]-1:plocs[i]+1, considering the edges of the spectrum */ + idx = s_max( 0, sub( plocs[i], Np ) ); /* Iterate over plocs[i]-1:plocs[i]+1, considering the edges of the spectrum */ WHILE( ( idx < add( add( plocs[i], Np ), 1 ) ) && LT_16( idx, L_res ) ) { - pDFT_RES[2 * idx] = Msub_32_16( Mpy_32_16_1( p_mem[2 * idx], cos_F ), p_mem[2 * idx + 1], sin_F ); + pDFT_RES[2 * idx] = Msub_32_16( Mpy_32_16_1( p_mem[2 * idx], cos_F ), p_mem[add( shl( idx, 1 ), 1 )], sin_F ); move32(); - pDFT_RES[2 * idx + 1] = Mpy_32_32( conj_sign, Madd_32_16( Mpy_32_16_1( p_mem[2 * idx], sin_F ), p_mem[2 * idx + 1], cos_F ) ); + pDFT_RES[add( shl( idx, 1 ), 1 )] = Mpy_32_32( conj_sign, Madd_32_16( Mpy_32_16_1( p_mem[2 * idx], sin_F ), p_mem[add( shl( idx, 1 ), 1 )], cos_F ) ); move32(); - idx++; + idx = add( idx, 1 ); } } return; @@ -696,7 +732,7 @@ void stereo_dft_res_ecu_burst_att_fx( move16(); /* attenuation of residual; follow attenuation of DMX */ - IF( EQ_16( hStereoDft->core_hist[0], ACELP_CORE ) ) + IF( hStereoDft->core_hist[0] == ACELP_CORE ) { fac = Mpy_32_16_1( Sqrt32( L_deposit_h( BASOP_Util_Divide3232_Scale( dmx_nrg, hStereoDft->past_dmx_nrg_fx, &q_fac ) ), &exponent ), (Word16) ( 0x0CCD ) ); } @@ -724,13 +760,13 @@ Word32 stereo_dft_dmx_swb_nrg_fx( const Word16 q0, const Word16 q1 ) { - int16_t i; + Word16 i; Word32 dmx_nrg; dmx_nrg = EPSILON_FIX; move32(); test(); - IF( EQ_16( q0, 0 ) && EQ_16( q1, 0 ) ) + IF( q0 == 0 && q1 == 0 ) { FOR( i = 0; i < shr( frame_length, 1 ); i++ ) { diff --git a/lib_dec/ivas_stereo_eclvq_dec.c b/lib_dec/ivas_stereo_eclvq_dec.c index 4094ced1ae04ffbca7aff1efcade89b2019d1ccd..eb43309924b8253cf4f2d17a98254b3b7429797a 100644 --- a/lib_dec/ivas_stereo_eclvq_dec.c +++ b/lib_dec/ivas_stereo_eclvq_dec.c @@ -89,22 +89,24 @@ static Word16 arith_decode_elias_mod( Word16 n, n_bits, bit; n_bits = 0; + move16(); bit = rc_uni_dec_read_bit( rc_st_dec ); - WHILE( EQ_16( bit, 0 ) ) + WHILE( bit == 0 ) { bit = rc_uni_dec_read_bit( rc_st_dec ); - ++n_bits; + n_bits = add( n_bits, 1 ); IF( EQ_16( n_bits, 17 ) ) { /* bitstream error encountered */ rc_st_dec->bit_error_detected = 1; + move16(); return 0; } } - IF( EQ_16( n_bits, 0 ) ) + IF( n_bits == 0 ) { /* code for 0 is 10 and code for 1 is 11 */ n = rc_uni_dec_read_bit( rc_st_dec ); @@ -316,9 +318,9 @@ void ECSQ_decode( { sym = arith_decode_prob_escape( rc_st_dec, tab_vals_cum_freq, tab_vals_sym_freq, ECSQ_TAB_VALS_SIZE ); - IF( NE_16( shift, 0 ) ) + IF( shift != 0 ) { - IF( GT_16( sym, 0 ) || GT_16( shift, 4 ) ) + IF( ( sym > 0 ) || ( shift > 4 ) ) { lsbs = rc_uni_dec_read_bits( rc_st_dec, shift ); } @@ -329,7 +331,7 @@ void ECSQ_decode( sym = s_or( shl( sym, shift ), lsbs ); } - IF( NE_16( sym, 0 ) ) + IF( sym != 0 ) { /* map the sign bit to +1 or -1 and then multiply */ IF( rc_uni_dec_read_bit( rc_st_dec ) ) @@ -339,6 +341,7 @@ void ECSQ_decode( } output[i] = sym; + move16(); } } ELSE @@ -347,17 +350,20 @@ void ECSQ_decode( nonzero = rc_uni_dec_read_bits( rc_st_dec, 2 ); left1 = nonzero; + move16(); left0 = sub( add( sub( seg_stop, seg_start ), 1 ), nonzero ); FOR( i = seg_start; i <= seg_stop; ++i ) { - IF( EQ_16( left1, 0 ) ) + IF( left1 == 0 ) { sym = 0; + move16(); } - ELSE IF( EQ_16( left0, 0 ) ) + ELSE IF( left0 == 0 ) { sym = 1; + move16(); } ELSE { @@ -365,21 +371,22 @@ void ECSQ_decode( sym = rc_uni_dec_read_bit_prob_fast( rc_st_dec, count0, ECSQ_PROB_BITS ); } - IF( NE_16( sym, 0 ) ) + IF( sym != 0 ) { /* map the sign bit to +1 or -1 and then multiply */ IF( rc_uni_dec_read_bit( rc_st_dec ) ) { sym = negate( sym ); } - --left1; + left1 = sub( left1, 1 ); } ELSE { - --left0; + left0 = sub( left0, 1 ); } output[i] = sym; + move16(); } } } diff --git a/lib_dec/ivas_stereo_ica_dec.c b/lib_dec/ivas_stereo_ica_dec.c index 804a5a68f660f82f496a0c8e5a5a22229ed77027..62bbbcdda0c06825f3d650ac32da86ab0e3e05fc 100644 --- a/lib_dec/ivas_stereo_ica_dec.c +++ b/lib_dec/ivas_stereo_ica_dec.c @@ -142,7 +142,16 @@ void stereo_tca_dec_fx( IF( EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { hStereoTCA->corrLagStats = extract_l( L_abs( L_shr( hCPE->hStereoDft->itd_fx[1], Q15 ) ) ); - hStereoTCA->refChanIndx = GE_32( hCPE->hStereoDft->itd_fx[1], 0 ) ? ( L_CH_INDX ) : ( R_CH_INDX ); + // hStereoTCA->refChanIndx = GE_32( hCPE->hStereoDft->itd_fx[1], 0 ) ? ( L_CH_INDX ) : ( R_CH_INDX ); + IF( hCPE->hStereoDft->itd_fx[1] >= 0 ) + { + hStereoTCA->refChanIndx = ( L_CH_INDX ); + } + ELSE + { + hStereoTCA->refChanIndx = ( R_CH_INDX ); + } + move16(); move16(); } ELSE IF( EQ_16( hCPE->element_mode, IVAS_CPE_MDCT ) ) @@ -152,12 +161,20 @@ void stereo_tca_dec_fx( itd = hCPE->hStereoMdct->itd_fx; move32(); hStereoTCA->corrLagStats = extract_l( L_abs( L_shr( itd, Q15 ) ) ); - hStereoTCA->refChanIndx = GE_32( itd, 0 ) ? ( L_CH_INDX ) : ( R_CH_INDX ); + // hStereoTCA->refChanIndx = GE_32( itd, 0 ) ? ( L_CH_INDX ) : ( R_CH_INDX ); + IF( GE_32( itd, 0 ) ) + { + hStereoTCA->refChanIndx = ( L_CH_INDX ); + } + ELSE + { + hStereoTCA->refChanIndx = ( R_CH_INDX ); + } move16(); } test(); - IF( NE_16( hStereoTCA->refChanIndx, hStereoTCA->prevRefChanIndx ) && NE_16( hStereoTCA->corrLagStats, 0 ) ) + IF( NE_16( hStereoTCA->refChanIndx, hStereoTCA->prevRefChanIndx ) && ( hStereoTCA->corrLagStats != 0 ) ) { bothChannelShift = 1; move16(); @@ -182,7 +199,7 @@ void stereo_tca_dec_fx( move16(); } - IF( NE_16( currentNCShift, 0 ) ) + IF( currentNCShift != 0 ) { currentNCShift = add( mult( 19660 /* 0.6 in Q15 */, prevNCShift ), mult( 13106 /* 0.4 in Q15 */, currentNCShift ) ); } @@ -207,8 +224,7 @@ void stereo_tca_dec_fx( /* identify target signal to adjust for shift variations */ test(); test(); - test(); - IF( ( EQ_16( prevNCShift, 0 ) && EQ_16( hStereoTCA->refChanIndx, R_CH_INDX ) ) || EQ_16( hStereoTCA->prevRefChanIndx, R_CH_INDX ) ) + IF( ( ( prevNCShift == 0 ) && EQ_16( hStereoTCA->refChanIndx, R_CH_INDX ) ) || EQ_16( hStereoTCA->prevRefChanIndx, R_CH_INDX ) ) { ref_fx = ptrChanR_fx; target_fx = ptrChanL_fx; @@ -645,8 +661,9 @@ void stereo_tca_scale_R_channel_fx( { Word16 temp_a = (Word16) L_shr( hCPE->hStereoDftDmx->targetGain_fx, (Word16) 16 ); Word16 temp_a_q = 2; + move16(); tempF1_fx = Inv16( temp_a, &temp_a_q ); - tempF1_fx = L_shl( tempF1_fx, ( 31 - 4 ) - ( 15 - temp_a_q ) ); + tempF1_fx = L_shl( tempF1_fx, sub( ( 31 - 4 ), sub( 15, temp_a_q ) ) ); } IF( EQ_32( hCPE->hStereoDftDmx->prevTargetGain_fx, ONE_IN_Q29 ) ) @@ -658,8 +675,9 @@ void stereo_tca_scale_R_channel_fx( { Word16 temp_b = (Word16) L_shr( hCPE->hStereoDftDmx->prevTargetGain_fx, 16 ); Word16 temp_b_q = 2; + move16(); tempF_fx = Inv16( temp_b, &temp_b_q ); - tempF_fx = L_shl( tempF_fx, ( 31 - 4 ) - ( 15 - temp_b_q ) ); + tempF_fx = L_shl( tempF_fx, sub( ( 31 - 4 ), sub( 15, temp_b_q ) ) ); } } ELSE @@ -674,8 +692,9 @@ void stereo_tca_scale_R_channel_fx( { Word16 temp_a = (Word16) L_shr( hStereoTCA->targetGain_fx, (Word16) 16 ); Word16 temp_a_q = 2; + move16(); tempF1_fx = Inv16( temp_a, &temp_a_q ); - tempF1_fx = L_shl( tempF1_fx, ( 31 - 4 ) - ( 15 - temp_a_q ) ); + tempF1_fx = L_shl( tempF1_fx, sub( ( 31 - 4 ), sub( 15, temp_a_q ) ) ); } @@ -688,8 +707,9 @@ void stereo_tca_scale_R_channel_fx( { Word16 temp_b = (Word16) L_shr( hStereoTCA->prevTargetGain_fx, (Word16) 16 ); Word16 temp_b_q = 2; + move16(); tempF_fx = Inv16( temp_b, &temp_b_q ); - tempF_fx = L_shl( tempF_fx, ( 31 - 4 ) - ( 15 - temp_b_q ) ); + tempF_fx = L_shl( tempF_fx, sub( ( 31 - 4 ), sub( 15, temp_b_q ) ) ); } } SWITCH( output_Fs ) @@ -734,7 +754,7 @@ void stereo_tca_scale_R_channel_fx( Word32 slope_gain_ascend = ( j * winSlope_fx ); Word32 left_res = Mpy_32_32( slope_gain_decend, output_fx[i_fx] ); Word32 right_res = Mpy_32_32( slope_gain_ascend, output_fx[i_fx] ); - output_fx[i_fx] = left_res + right_res; + output_fx[i_fx] = L_add( left_res, right_res ); move32(); } } @@ -743,7 +763,7 @@ void stereo_tca_scale_R_channel_fx( FOR( j = 0; i_fx < flat_old + l_ica_ovl; ( i_fx++, j++ ) ) { Word32 slope_gain_decend = L_sub( ONE_IN_Q31, j * winSlope_fx ); - Word32 slope_gain_ascend = ( j * winSlope_fx ); + Word32 slope_gain_ascend = imult3216( winSlope_fx, j ); Word32 left_res = Mpy_32_32( slope_gain_decend, output_fx[i_fx] ); Word32 right_res = Mpy_32_32( slope_gain_ascend, output_fx[i_fx] ); output_fx[i_fx] = L_add_sat( L_shl_sat( Mpy_32_32( tempF_fx, left_res ), 4 ), L_shl_sat( Mpy_32_32( right_res, tempF1_fx ), 4 ) ); diff --git a/lib_dec/ivas_stereo_icbwe_dec.c b/lib_dec/ivas_stereo_icbwe_dec.c index 199647063d914fd381e9a33902af09fdf232a3b3..80f9655bf933077628dc594e9210c53c4b832a1b 100644 --- a/lib_dec/ivas_stereo_icbwe_dec.c +++ b/lib_dec/ivas_stereo_icbwe_dec.c @@ -538,7 +538,7 @@ static Word16 FindScale( maximum_abs_32_fx( buff, len, &maxVal ); norm_shift = norm_l( maxVal ); - IF( EQ_32( maxVal, 0 ) ) + if ( maxVal == 0 ) { norm_shift = 31; move16(); @@ -628,14 +628,14 @@ void stereo_icBWE_dec_fx( move32(); maximum_abs_32_fx( synthRef_fx, output_frame, &maxVal ); synthRef_shift = norm_l( maxVal ); - IF( EQ_32( maxVal, 0 ) ) + if ( maxVal == 0 ) { synthRef_shift = 31; move16(); } synthRef_shift = sub( synthRef_shift, shr( add( find_guarded_bits_fx( output_frame ), 1 ), 1 ) ); test(); - IF( EQ_16( st->core, ACELP_CORE ) || EQ_16( st->last_core, ACELP_CORE ) ) + IF( st->core == ACELP_CORE || st->last_core == ACELP_CORE ) { FOR( i = 0; i < output_frame / 2; i++ ) { @@ -670,7 +670,9 @@ void stereo_icBWE_dec_fx( set32_fx( hCPE->hStereoDft->hb_stefi_sig_fx + hCPE->hStereoDft->hb_stefi_delay, 0, output_frame ); #ifdef MSAN_FIX hCPE->hStereoDft->hb_nrg_subr_fx[0] = 0; + move32(); hCPE->hStereoDft->hb_nrg_subr_fx[1] = 0; + move32(); #endif // MSAN_FIX } hCPE->hStereoDft->hb_nrg_subr_fx[0] = ( Mpy_32_16_1( hCPE->hStereoDft->hb_nrg_subr_fx[0], shl( hCPE->hStereoDft->NFFT / 2, 6 ) ) ); // 2 * (Qx + SynthRef_shift) - 40 // 2 * (Qx + SynthRef_shift) - 31 - 15 @@ -693,7 +695,7 @@ void stereo_icBWE_dec_fx( test(); test(); test(); - IF( NE_16( st->core, ACELP_CORE ) || EQ_16( st->extl, -1 ) || ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && NE_16( hCPE->hCoreCoder[0]->tdm_LRTD_flag, 0 ) ) ) + IF( st->core != ACELP_CORE || EQ_16( st->extl, -1 ) || ( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) && NE_16( hCPE->hCoreCoder[0]->tdm_LRTD_flag, 0 ) ) ) { return; } @@ -708,11 +710,11 @@ void stereo_icBWE_dec_fx( /* core switching reset */ test(); - IF( NE_16( st->last_core, ACELP_CORE ) || EQ_16( st->bwidth, (Word16) WB ) ) + IF( st->last_core != ACELP_CORE || EQ_16( st->bwidth, (Word16) WB ) ) { ic_bwe_dec_reset_fx( hStereoICBWE ); - IF( NE_16( st->last_core, ACELP_CORE ) ) + IF( st->last_core != ACELP_CORE ) { hStereoICBWE->prevSpecMapping_fx = 0; move16(); @@ -789,7 +791,7 @@ void stereo_icBWE_dec_fx( } } - IF( EQ_16( st->bfi, 0 ) ) + IF( st->bfi == 0 ) { hStereoICBWE->refChanIndx_bwe = get_next_indice_fx( st, STEREO_ICBWE_REFBITS ); IF( EQ_16( st->flag_ACELP16k, 1 ) ) @@ -876,7 +878,7 @@ void stereo_icBWE_dec_fx( } // nbSubFr = ( st->flag_ACELP16k == 0 ) ? NB_SUBFR : NB_SUBFR16k; - IF( EQ_16( st->flag_ACELP16k, 0 ) ) + IF( st->flag_ACELP16k == 0 ) { nbSubFr = NB_SUBFR; move16(); @@ -920,11 +922,11 @@ void stereo_icBWE_dec_fx( // common Q for addition L_nlExc16k = L_deposit_l( hStereoICBWE->nlExc16k_fx[k] ); // prev_q_bwe_exc - 16 L_mixExc16k = L_deposit_l( hStereoICBWE->mixExc16k_fx[k] ); // Q_exc - L_nlExc16k = L_shl( L_nlExc16k, Q_icBWE - ( st->prev_Q_bwe_exc - 16 ) ); // Q_icBWE + L_nlExc16k = L_shl( L_nlExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 16 ) ) ) ); // Q_icBWE #ifndef FIX_736_BWE_SECT_C L_mixExc16k = L_shl( L_mixExc16k, Q_icBWE - st->Q_exc ); // Q_icBWE #else - L_mixExc16k = L_shl( L_mixExc16k, Q_icBWE - ( st->prev_Q_bwe_exc - 25 ) ); // Q_icBWE + L_mixExc16k = L_shl( L_mixExc16k, sub( Q_icBWE, ( sub( st->prev_Q_bwe_exc, 25 ) ) ) ); // Q_icBWE #endif excSHB_nonref_fx[k] = L_add( Mpy_32_16_1( L_nlExc16k, temp1_fx ), Mpy_32_16_1( L_mixExc16k, temp2_fx ) ); // Q_icBWE move32(); @@ -1043,7 +1045,7 @@ void stereo_icBWE_dec_fx( tmp = sub( tmp, 9 ); Scale_sig32( shb_synth_nonref_fx, L_FRAME16k + L_SHB_LAHEAD, tmp - Q_syn_shb ); - hStereoICBWE->memShbSpecMapping_fx = L_shl( hStereoICBWE->memShbSpecMapping_fx, tmp - hStereoICBWE->prev_Q_memshbspec ); + hStereoICBWE->memShbSpecMapping_fx = L_shl( hStereoICBWE->memShbSpecMapping_fx, sub( tmp, hStereoICBWE->prev_Q_memshbspec ) ); hStereoICBWE->prev_Q_memshbspec = tmp; move16(); @@ -1126,7 +1128,7 @@ void stereo_icBWE_dec_fx( icbweM2Ref_fx = gsMapping_fx; move16(); - IF( EQ_16( hStereoICBWE->refChanIndx_bwe, L_CH_INDX ) ) + IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) { IF( GE_16( ratio_L_fx, 3276 ) ) @@ -1159,7 +1161,7 @@ void stereo_icBWE_dec_fx( #ifdef FIX_TMP_714 tmp = mult_r( ratio_L_fx, ratio_L_fx ); // Q15 #else - tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 + tmp = mult_r( sub( 32767, ratio_L_fx ), sub( 32767, ratio_L_fx ) ); // Q15 #endif tmp = mult_r( tmp, gsMapping_fx ); // Q14 tmp = mult_r( tmp, gsMapping_fx ); // Q13 @@ -1290,7 +1292,7 @@ void stereo_icBWE_dec_fx( icbweM2Ref_fx = gsMapping_fx; move16(); - IF( EQ_16( hStereoICBWE->refChanIndx_bwe, L_CH_INDX ) ) + IF( hStereoICBWE->refChanIndx_bwe == L_CH_INDX ) { IF( GE_16( ratio_L_fx, 3276 ) ) { @@ -1680,6 +1682,7 @@ void stereo_icBWE_decproc_fx( Word32 temp0_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )], temp1_fx[L_FRAME48k + NS2SA( 48000, IVAS_DEC_DELAY_NS - DELAY_BWE_TOTAL_NS )]; Word32 winSlope_fx = 0, alpha_fx; + move32(); const Word16 *win_dft_fx; Word32 extl_brate, output_Fs; @@ -1789,7 +1792,7 @@ void stereo_icBWE_decproc_fx( } test(); - IF( EQ_16( core, ACELP_CORE ) && GT_32( extl_brate, 0 ) ) + IF( EQ_16( core, ACELP_CORE ) && extl_brate > 0 ) { refChanIndx_bwe = hStereoICBWE->refChanIndx_bwe; move16(); @@ -1833,13 +1836,13 @@ void stereo_icBWE_decproc_fx( } } /* Resampled LB and HB offset */ - Copy32( outputHB[refChanIndx_bwe], temp0_fx + memOffset, output_frame - memOffset ); - Copy32( outputHB[!refChanIndx_bwe], temp1_fx + memOffset, output_frame - memOffset ); + Copy32( outputHB[refChanIndx_bwe], temp0_fx + memOffset, sub( output_frame, memOffset ) ); + Copy32( outputHB[!refChanIndx_bwe], temp1_fx + memOffset, sub( output_frame, memOffset ) ); decoderDelay = NS2SA( output_Fs, IVAS_DEC_DELAY_NS ); test(); - IF( NE_16( last_core, ACELP_CORE ) && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) + IF( last_core != ACELP_CORE && EQ_16( hCPE->element_mode, IVAS_CPE_DFT ) ) { /* hb_synth of mid band is faded out in the 1.25 ms prior to DFT analysis and the icbwe is faded in time domain */ icbweOLASize = NS2SA( output_Fs, STEREO_DFT_DELAY_DEC_BWE_NS ); @@ -1870,7 +1873,7 @@ void stereo_icBWE_decproc_fx( } alpha_fx = winSlope_fx; // Q30 move32(); - FOR( ; i < decoderDelay + icbweOLASize; i++ ) + FOR( ; i < add( decoderDelay, icbweOLASize ); i++ ) { temp0_fx[i] = L_shl_sat( Mpy_32_32( temp0_fx[i], alpha_fx ), 1 ); // Q11 move32(); @@ -1883,18 +1886,21 @@ void stereo_icBWE_decproc_fx( { IF( NE_16( refChanIndx_bwe, hStereoICBWE->prev_refChanIndx_bwe ) ) { - IF( GT_16( memOffset, 0 ) ) + IF( memOffset > 0 ) { SWITCH( memOffset ) { case 15: winSlope_fx = 71582792; + move32(); BREAK; case 30: winSlope_fx = 35791396; + move32(); BREAK; case 45: winSlope_fx = 23860930; // Q30 + move32(); BREAK; } // memOffset for 16K 32K 48K are 15 30 45 respectively.camera @@ -1961,7 +1967,7 @@ void stereo_icBWE_decproc_fx( move32(); hStereoICBWE->memTransitionHB_fx[1][i] = Mpy_32_16_1( hStereoICBWE->memOutHB_fx[1][i], win_dft_fx[tmp_mul] ); move32(); - j++; + j = add( j, 1 ); } FOR( i = 0; j < dftOvlLen; i++ ) @@ -1971,7 +1977,7 @@ void stereo_icBWE_decproc_fx( move32(); hStereoICBWE->memTransitionHB_fx[1][memOffset + i] = Mpy_32_16_1( outputHB[1][output_frame - i - 1], win_dft_fx[tmp_mul] ); move32(); - j++; + j = add( j, 1 ); } } @@ -1980,7 +1986,7 @@ void stereo_icBWE_decproc_fx( } ELSE { - IF( EQ_16( last_core, ACELP_CORE ) ) + IF( last_core == ACELP_CORE ) { IF( EQ_16( hCPE->element_mode, IVAS_CPE_TD ) ) { diff --git a/lib_dec/ivas_stereo_mdct_core_dec.c b/lib_dec/ivas_stereo_mdct_core_dec.c index 3248c93237194e8d8551dd7e54d785a44244e733..de1bb794dd505d605881f6a9e68037a83fe7d69b 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec.c +++ b/lib_dec/ivas_stereo_mdct_core_dec.c @@ -85,11 +85,15 @@ void convert_coeffs_to_higher_res_fx( tmp1 = Mpy_32_32( POINT_5_Q31, ( L_add( in2[i], in1[i] ) ) ); tmp2 = Mpy_32_32( POINT_5_Q31, ( L_sub( in2[i], in1[i] ) ) ); out[2 * i] = tmp1; + move32(); out[2 * i + 1] = tmp2; + move32(); tmp1 = Mpy_32_32( POINT_5_Q31, ( L_sub( in2[i], in1[i] ) ) ); tmp2 = Mpy_32_32( POINT_5_Q31, ( L_add( in2[i], in1[i] ) ) ); out[2 * i + 2] = tmp1; + move32(); out[2 * i + 3] = tmp2; + move32(); } } ELSE @@ -97,9 +101,13 @@ void convert_coeffs_to_higher_res_fx( FOR( i = 0; i < len; i += 2 ) { out[2 * i] = Mpy_32_32( POINT_5_Q31, ( L_add( in2[i], in1[i] ) ) ); + move32(); out[2 * i + 1] = Mpy_32_32( POINT_5_Q31, ( L_sub( in2[i], in1[i] ) ) ); + move32(); out[2 * i + 2] = Mpy_32_32( POINT_5_Q31, ( L_sub( in2[i + 1], in1[i + 1] ) ) ); + move32(); out[2 * i + 3] = Mpy_32_32( POINT_5_Q31, ( L_add( in2[i + 1], in1[i + 1] ) ) ); + move32(); } } diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 37f8c7983b18f321e0a77a5332e333ba503351bf..88b25b872c2d102c3f5cba574d55ec96fe382443 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -63,11 +63,11 @@ static void run_min_stats_fx( Decoder_State **sts, Word32 *x[CPE_CHANNELS][NB_DI *-------------------------------------------------------------------*/ static void stereo_mdct_dec_stereo_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - int16_t ms_mask[2][MAX_SFB] /* o : bandwise MS mask */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word16 ms_mask[2][MAX_SFB] /* o : bandwise MS mask */ ) { - int16_t availableBits; + Word16 availableBits; Decoder_State **sts; sts = hCPE->hCoreCoder; @@ -75,14 +75,14 @@ static void stereo_mdct_dec_stereo_fx( parse_stereo_from_bitstream( hCPE->hStereoMdct, hCPE->hCoreCoder, 0, hCPE->hStereoMdct->isSBAStereoMode, hCPE->hCoreCoder[0], ms_mask ); /*Split available bits between channels */ - availableBits = sts[0]->bits_frame_channel + sts[1]->bits_frame_channel - sts[0]->next_bit_pos - sts[0]->core * ( NF_GAIN_BITS + SMDCT_MINIMUM_ARITH_BITS ) - sts[1]->core * ( NF_GAIN_BITS + SMDCT_MINIMUM_ARITH_BITS ); + availableBits = sub( sub( sub( add( sts[0]->bits_frame_channel, sts[1]->bits_frame_channel ), sts[0]->next_bit_pos ), i_mult( sts[0]->core, ( NF_GAIN_BITS + SMDCT_MINIMUM_ARITH_BITS ) ) ), i_mult( sts[1]->core, ( NF_GAIN_BITS + SMDCT_MINIMUM_ARITH_BITS ) ) ); splitAvailableBits_fx( availableBits, hCPE->hStereoMdct->split_ratio, hCPE->hStereoMdct->isSBAStereoMode, &sts[0]->bits_frame_channel, &sts[1]->bits_frame_channel ); - sts[0]->bits_frame_channel += sts[0]->core * SMDCT_MINIMUM_ARITH_BITS; - sts[1]->bits_frame_channel += sts[1]->core * SMDCT_MINIMUM_ARITH_BITS; + sts[0]->bits_frame_channel = add( sts[0]->bits_frame_channel, i_mult( sts[0]->core, SMDCT_MINIMUM_ARITH_BITS ) ); + sts[1]->bits_frame_channel = add( sts[1]->bits_frame_channel, i_mult( sts[1]->core, SMDCT_MINIMUM_ARITH_BITS ) ); - sts[1]->bit_stream = &sts[0]->bit_stream[sts[0]->next_bit_pos + sts[0]->bits_frame_channel + sts[0]->core * NF_GAIN_BITS]; + sts[1]->bit_stream = &sts[0]->bit_stream[add( add( sts[0]->next_bit_pos, sts[0]->bits_frame_channel ), i_mult( sts[0]->core, NF_GAIN_BITS ) )]; return; } @@ -179,18 +179,18 @@ void stereo_mdct_core_dec_fx( set_s( param_lpc[ch], 0, NPRM_LPC_NEW ); } - set_s( ms_mask[0], 0, MAX_SFB ); - set_s( ms_mask[1], 0, MAX_SFB ); + set16_fx( ms_mask[0], 0, MAX_SFB ); + set16_fx( ms_mask[1], 0, MAX_SFB ); initMdctStereoDecData_fx( hCPE->hStereoMdct, sts[0]->igf, sts[0]->hIGFDec->igfData.igfInfo.grid, hCPE->element_brate, sts[0]->bwidth ); hCPE->hStereoMdct->isSBAStereoMode = ( ( EQ_16( st_ivas->ivas_format, SBA_FORMAT ) || EQ_16( st_ivas->ivas_format, SBA_ISM_FORMAT ) ) && EQ_16( st_ivas->nchan_transport, 2 ) ); move16(); - IF( EQ_16( bfi, 0 ) ) + IF( bfi == 0 ) { ivas_mdct_dec_side_bits_frame_channel_fx( hCPE, param_lpc, p_param, hCPE->hCoreCoder[0], nTnsBitsTCX10, param, 0, 0 ); - IF( NE_16( sts[0]->igf, 0 ) ) + IF( sts[0]->igf != 0 ) { FOR( ch = 0; ch < nChannels; ch++ ) { @@ -203,9 +203,11 @@ void stereo_mdct_core_dec_fx( } ELSE { - mvs2s( hCPE->hStereoMdct->prev_ms_mask[0], ms_mask[0], MAX_SFB ); - mvs2s( hCPE->hStereoMdct->prev_ms_mask[1], ms_mask[1], MAX_SFB ); + Copy( hCPE->hStereoMdct->prev_ms_mask[0], ms_mask[0], MAX_SFB ); + Copy( hCPE->hStereoMdct->prev_ms_mask[1], ms_mask[1], MAX_SFB ); + test(); + test(); IF( NE_16( sts[0]->core, TCX_10_CORE ) && NE_16( sts[1]->core, TCX_10_CORE ) ) { hCPE->hStereoMdct->mdct_stereo_mode[1] = SMDCT_DUAL_MONO; @@ -241,7 +243,17 @@ void stereo_mdct_core_dec_fx( FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - Word16 subFrames = ( hCPE->hCoreCoder[ch]->core == TCX_10_CORE ) ? NB_DIV : 1; + Word16 subFrames; + // Word16 subFrames = ( hCPE->hCoreCoder[ch]->core == TCX_10_CORE ) ? NB_DIV : 1; + IF( ( hCPE->hCoreCoder[ch]->core == TCX_10_CORE ) ) + { + subFrames = NB_DIV; + } + ELSE + { + subFrames = 1; + } + move16(); FOR( k = 0; k < subFrames; ++k ) { Scale_sig32( x_fx[ch][k], x_len[ch][k], sub( x_e[ch][k], 20 ) ); @@ -261,19 +273,23 @@ void stereo_mdct_core_dec_fx( FOR( k = 0; k < nSubframes[ch]; k++ ) { L_spec[ch] = idiv1616( sts[ch]->hTcxCfg->tcx_coded_lines, nSubframes[ch] ); + move16(); init_tcx_info_fx( sts[ch], sts[ch]->L_frame / nSubframes[ch], sts[ch]->hTcxDec->L_frameTCX / nSubframes[ch], k, bfi, &tcx_offset[ch], &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] ); } } /* IGF decoding */ - IF( NE_16( sts[0]->igf, 0 ) || NE_16( sts[1]->igf, 0 ) ) + test(); + IF( sts[0]->igf || sts[1]->igf ) { IF( NE_16( sts[0]->core, sts[1]->core ) ) { FOR( ch = 0; ch < nChannels; ch++ ) { st = sts[ch]; + test(); + test(); IF( !bfi || ( bfi && NE_16( st->core, ACELP_CORE ) ) ) { FOR( k = 0; k < nSubframes[ch]; k++ ) @@ -287,15 +303,17 @@ void stereo_mdct_core_dec_fx( } } } - ELSE IF( NE_16( sts[0]->core, ACELP_CORE ) ) + ELSE IF( sts[0]->core != ACELP_CORE ) { assert( EQ_16( nSubframes[0], nSubframes[1] ) ); FOR( k = 0; k < nSubframes[0]; k++ ) { - IF( ( NE_16( hCPE->hStereoMdct->IGFStereoMode[k], SMDCT_DUAL_MONO ) || NE_16( hCPE->hStereoMdct->mdct_stereo_mode[k], SMDCT_DUAL_MONO ) ) && EQ_16( hCPE->hStereoMdct->isSBAStereoMode, 0 ) ) + test(); + test(); + IF( ( NE_16( hCPE->hStereoMdct->IGFStereoMode[k], SMDCT_DUAL_MONO ) || NE_16( hCPE->hStereoMdct->mdct_stereo_mode[k], SMDCT_DUAL_MONO ) ) && hCPE->hStereoMdct->isSBAStereoMode == 0 ) { - assert( ( EQ_16( sts[0]->core, sts[1]->core ) ) || ( EQ_16( hCPE->hStereoMdct->mdct_stereo_mode[0], SMDCT_DUAL_MONO ) ) ); + assert( ( EQ_16( sts[0]->core, sts[1]->core ) ) || ( hCPE->hStereoMdct->mdct_stereo_mode[0] == SMDCT_DUAL_MONO ) ); /* stereo IGF decoding */ decoder_tcx_IGF_stereo_fx( sts, hCPE->hStereoMdct, ms_mask, x_fx, x_e, x_len, L_frame[0], left_rect[0], k, bfi, 0 /* MCT_flag */ ); @@ -331,19 +349,21 @@ void stereo_mdct_core_dec_fx( * Stereo processing *--------------------------------------------------------------------------------*/ - IF( EQ_16( bfi, 0 ) ) + IF( !bfi ) { FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { Word32 sns_int_scf_fx[FDNS_NPTS]; Word16 scf_fx[FDNS_NPTS], scf_e[FDNS_NPTS]; Word16 norm; + Word32 L_tmp; st = sts[ch]; FOR( k = 0; k < nSubframes[ch]; k++ ) { sns_interpolate_scalefactors_fx( sns_int_scf_fx, &Aq_fx_32[ch][k * M], DEC ); + test(); IF( st->hTonalMDCTConc != NULL && EQ_16( add( k, 1 ), nSubframes[ch] ) ) { x_e[ch][k] = 20; @@ -352,7 +372,9 @@ void stereo_mdct_core_dec_fx( { norm = norm_l( sns_int_scf_fx[j] ); scf_e[j] = sub( 15, norm ); + move16(); scf_fx[j] = extract_h( L_shl( sns_int_scf_fx[j], norm ) ); + move16(); } Word16 s = getScaleFactor32( x_fx[ch][k], L_frameTCX[ch] ); Scale_sig32( x_fx[ch][k], L_frameTCX[ch], s ); @@ -361,16 +383,32 @@ void stereo_mdct_core_dec_fx( } } - TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, L_frameTCX[ch], ( st->hTcxDec->tcxltp_last_gain_unmodified > 0 ) ? st->old_fpitch : 0, bfi, bfi && st->tonal_mdct_plc_active ); + IF( ( st->hTcxDec->tcxltp_last_gain_unmodified > 0 ) ) + { + L_tmp = st->old_fpitch; + } + ELSE + { + L_tmp = 0; + } + move32(); + + // TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, L_frameTCX[ch], ( st->hTcxDec->tcxltp_last_gain_unmodified > 0 ) ? st->old_fpitch : 0, bfi, bfi && st->tonal_mdct_plc_active ); + TonalMDCTConceal_UpdateState( st->hTonalMDCTConc, L_frameTCX[ch], L_tmp, bfi, bfi && st->tonal_mdct_plc_active ); } - mvs2s( ms_mask[0], hCPE->hStereoMdct->prev_ms_mask[0], MAX_SFB ); - mvs2s( ms_mask[1], hCPE->hStereoMdct->prev_ms_mask[1], MAX_SFB ); + Copy( ms_mask[0], hCPE->hStereoMdct->prev_ms_mask[0], MAX_SFB ); + Copy( ms_mask[1], hCPE->hStereoMdct->prev_ms_mask[1], MAX_SFB ); } - IF( ( EQ_16( bfi, 0 ) || ( NE_16( sts[0]->core, ACELP_CORE ) || NE_16( sts[1]->core, ACELP_CORE ) ) ) && EQ_16( hCPE->hStereoMdct->isSBAStereoMode, 0 ) ) + test(); + test(); + test(); + IF( ( !bfi || ( sts[0]->core != ACELP_CORE || sts[1]->core != ACELP_CORE ) ) && !hCPE->hStereoMdct->isSBAStereoMode ) { Word16 q_x_1 = 11, q_x_0 = 11; + move16(); + move16(); stereo_decoder_tcx_fx( hCPE->hStereoMdct, ms_mask, x_0_fx[1], x_fx[0], x_fx[1], &hCPE->hStereoMdct->mdct_stereo_mode[0], sts[0]->core, sts[1]->core, sts[0]->igf, L_frameTCX[0], L_frameTCX[1], 0, sts[0]->last_core, sts[1]->last_core, 0, &q_x_1, &q_x_0 ); } @@ -379,11 +417,21 @@ void stereo_mdct_core_dec_fx( FOR( Word16 ind = 0; ind < 2; ind++ ) { - Word16 nSubFrames = EQ_16( hCPE->hCoreCoder[ind]->core, TCX_20_CORE ) ? 1 : NB_DIV; + Word16 nSubFrames; + // Word16 nSubFrames = EQ_16( hCPE->hCoreCoder[ind]->core, TCX_20_CORE ) ? 1 : NB_DIV; + IF( EQ_16( hCPE->hCoreCoder[ind]->core, TCX_20_CORE ) ) + { + nSubFrames = 1; + } + ELSE + { + nSubFrames = NB_DIV; + } + move16(); Scale_sig32( x_fx[ind][0], shr( L_FRAME_MAX, sub( nSubFrames, 1 ) ), sub( x_e[ind][0], 20 ) ); x_e[ind][0] = 20; move16(); - IF( nSubFrames == 2 ) + IF( EQ_16( nSubFrames, 2 ) ) { Scale_sig32( x_fx[ind][1], shr( L_FRAME_MAX, 1 ), sub( x_e[ind][1], 20 ) ); x_e[ind][1] = 20; @@ -391,6 +439,8 @@ void stereo_mdct_core_dec_fx( } } + test(); + test(); IF( EQ_16( st_ivas->renderer_type, RENDERER_MC_PARAMMC ) && ( EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_MONO ) || EQ_16( st_ivas->hDecoderConfig->output_config, IVAS_AUDIO_CONFIG_STEREO ) ) ) { ivas_ls_setup_conversion_process_mdct_param_mc_fx( st_ivas, x_fx, x_e ); @@ -398,6 +448,10 @@ void stereo_mdct_core_dec_fx( run_min_stats_fx( sts, x_fx, x_e ); + test(); + test(); + test(); + test(); IF( EQ_16( hCPE->nchan_out, 1 ) && ( EQ_16( bfi, 0 ) || ( NE_16( bfi, 0 ) && NE_16( sts[0]->core, ACELP_CORE ) && NE_16( sts[1]->core, ACELP_CORE ) ) ) ) { apply_dmx_weights_fx( hCPE, x_fx, sts[0]->transform_type, sts[1]->transform_type ); @@ -406,6 +460,7 @@ void stereo_mdct_core_dec_fx( Word16 s; FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { + test(); IF( sts[ch]->hFdCngDec && sts[ch]->hFdCngDec->hFdCngCom ) { s = getScaleFactor32( sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN ); @@ -417,6 +472,7 @@ void stereo_mdct_core_dec_fx( scale_sig32( sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevel, FFTCLDFBLEN, s ); sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevelExp = sub( sts[ch]->hFdCngDec->hFdCngCom->cngNoiseLevelExp, s ); } + test(); IF( sts[ch]->hFdCngDec && sts[ch]->hFdCngDec->hFdCngCom ) { sts[ch]->hFdCngDec->hFdCngCom->likelihood_noisy_speech = extract_h( sts[ch]->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx ); @@ -436,11 +492,11 @@ void stereo_mdct_core_dec_fx( ivas_mdct_core_reconstruct_fx( hCPE, x_fx, signal_outFB_tmp_fx, fUseTns, 0, Q11, 17 ); - mvl2l( signal_out_tmp_fx[0], signal_out_fx[0], L_FRAME48k ); - mvl2l( signal_out_tmp_fx[1], signal_out_fx[1], L_FRAME48k ); + Copy32( signal_out_tmp_fx[0], signal_out_fx[0], L_FRAME48k ); + Copy32( signal_out_tmp_fx[1], signal_out_fx[1], L_FRAME48k ); - mvs2s( signal_outFB_tmp_fx[0], signal_outFB_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX ); - mvs2s( signal_outFB_tmp_fx[1], signal_outFB_fx[1], hCPE->hCoreCoder[1]->hTcxDec->L_frameTCX ); + Copy( signal_outFB_tmp_fx[0], signal_outFB_fx[0], hCPE->hCoreCoder[0]->hTcxDec->L_frameTCX ); + Copy( signal_outFB_tmp_fx[1], signal_outFB_fx[1], hCPE->hCoreCoder[1]->hTcxDec->L_frameTCX ); pop_wmops(); return; @@ -667,36 +723,87 @@ static void apply_dmx_weights_fx( Word32 *sig[CPE_CHANNELS][NB_DIV], *pTmp[CPE_CHANNELS][NB_DIV]; nChannels = CPE_CHANNELS; + move16(); frameSize = hCPE->hStereoMdct->stbParamsTCX20.sfbOffset[hCPE->hStereoMdct->stbParamsTCX20.sfbCnt]; + move16(); transform_type[0][0] = transform_type_left[0]; + move16(); transform_type[0][1] = transform_type_left[1]; + move16(); transform_type[1][0] = transform_type_right[0]; + move16(); transform_type[1][1] = transform_type_right[1]; + move16(); /* set overall frequency resolution of (sub)frame to maximum of (sub)frame, requires conversion if both channels are not the same */ - IF( transform_type[0][0] == TCX_20 || transform_type[1][0] == TCX_20 ) + test(); + test(); + IF( EQ_16( transform_type[0][0], TCX_20 ) || EQ_16( transform_type[1][0], TCX_20 ) ) { /* use TCX20 band config for TCX20 in both channels and mixed frames */ sfbConf = &hCPE->hStereoMdct->stbParamsTCX20; nsub = nsub2[0] = nsub2[1] = 1; /* overall TCX 20 */ + move16(); + move16(); + move16(); tcx_10_only = 0; + move16(); } ELSE { /* use TCX10 band config only if none of the channels is TCX20 */ sfbConf = &hCPE->hStereoMdct->stbParamsTCX10; nsub = 2; + move16(); /* set resolution per subframe, subdivide again if subframe is TCX5 in both channels */ - nsub2[0] = ( transform_type[0][0] == TCX_5 && transform_type[1][0] == TCX_5 ) ? 2 : 1; - nsub2[1] = ( transform_type[0][1] == TCX_5 && transform_type[1][1] == TCX_5 ) ? 2 : 1; + // nsub2[0] = ( transform_type[0][0] == TCX_5 && transform_type[1][0] == TCX_5 ) ? 2 : 1; + test(); + IF( EQ_16( transform_type[0][0], TCX_5 ) && EQ_16( transform_type[1][0], TCX_5 ) ) + { + nsub2[0] = 2; + move16(); + } + ELSE + { + nsub2[0] = 1; + move16(); + } + // nsub2[1] = ( transform_type[0][1] == TCX_5 && transform_type[1][1] == TCX_5 ) ? 2 : 1; + test(); + IF( EQ_16( transform_type[0][1], TCX_5 ) && EQ_16( transform_type[1][1], TCX_5 ) ) + { + nsub2[1] = 2; + move16(); + } + ELSE + { + nsub2[1] = 1; + move16(); + } tcx_10_only = 1; + move16(); } /* for subframes with only TCX5 in both channels number of coefficients is only half (in 2 quarterframes) */ - numCoeffs[0] = ( nsub2[0] == 1 ) ? sfbConf->sfbOffset[sfbConf->sfbCnt] : sfbConf->sfbOffset[sfbConf->sfbCnt] / 2; - numCoeffs[1] = ( nsub2[1] == 1 ) ? sfbConf->sfbOffset[sfbConf->sfbCnt] : sfbConf->sfbOffset[sfbConf->sfbCnt] / 2; - + // numCoeffs[0] = ( nsub2[0] == 1 ) ? sfbConf->sfbOffset[sfbConf->sfbCnt] : sfbConf->sfbOffset[sfbConf->sfbCnt] / 2; + IF( EQ_16( nsub2[0], 1 ) ) + { + numCoeffs[0] = sfbConf->sfbOffset[sfbConf->sfbCnt]; + } + ELSE + { + numCoeffs[0] = shr( sfbConf->sfbOffset[sfbConf->sfbCnt], 1 ); + } + // numCoeffs[1] = ( nsub2[1] == 1 ) ? sfbConf->sfbOffset[sfbConf->sfbCnt] : sfbConf->sfbOffset[sfbConf->sfbCnt] / 2; + IF( EQ_16( nsub2[1], 1 ) ) + { + numCoeffs[1] = sfbConf->sfbOffset[sfbConf->sfbCnt]; + } + ELSE + { + numCoeffs[1] = shr( sfbConf->sfbOffset[sfbConf->sfbCnt], 1 ); + } /* initially, set pointers to input; if conversion occurs in (sub)frame, set to convertRes */ sig[0][0] = pTmp[0][0] = x[0][0]; sig[0][1] = pTmp[0][1] = x[0][1]; @@ -708,19 +815,21 @@ static void apply_dmx_weights_fx( { FOR( k = 0; k < NB_DIV; k++ ) { - IF( transform_type[ch][k] == TCX_5 && nsub2[k] == 1 ) + test(); + IF( EQ_16( transform_type[ch][k], TCX_5 ) && EQ_16( nsub2[k], 1 ) ) { /* subframe is TCX5, but TCX10 or TCX20 in other channel -> convert channel with TCX5 to TCX10 resolution */ - pTmp[ch][k] = sig[ch][k] = convertRes[ch] + k * frameSize / 2; - convert_coeffs_to_higher_res_fx( x[ch][k], x[ch][k] + frameSize / 4, pTmp[ch][k], frameSize / 4 ); + pTmp[ch][k] = sig[ch][k] = convertRes[ch] + i_mult( k, shr( frameSize, 1 ) ); + convert_coeffs_to_higher_res_fx( x[ch][k], x[ch][k] + shr( frameSize, 2 ), pTmp[ch][k], shr( frameSize, 2 ) ); } } - IF( transform_type[ch][0] != TCX_20 && nsub == 1 ) + test(); + IF( NE_16( transform_type[ch][0], TCX_20 ) && EQ_16( nsub, 1 ) ) { /* TCX20 and TCX10 in same frame -> convert channel with TCX10 to TCX20 resolution */ sig[ch][0] = convertRes[ch]; - convert_coeffs_to_higher_res_fx( pTmp[ch][0], pTmp[ch][1], sig[ch][0], frameSize / 2 ); + convert_coeffs_to_higher_res_fx( pTmp[ch][0], pTmp[ch][1], sig[ch][0], shr( frameSize, 1 ) ); } } @@ -732,10 +841,13 @@ static void apply_dmx_weights_fx( FOR( l = 0; l < nsub2[k]; l++ ) { // mdst[ch][k][l * numCoeffs[k]] = mdst[ch][k][( l + 1 ) * numCoeffs[k] - 1] = 0.f; - mdst[ch][k][l * numCoeffs[k]] = mdst[ch][k][( l + 1 ) * numCoeffs[k] - 1] = 0; + mdst[ch][k][i_mult( l, numCoeffs[k] )] = mdst[ch][k][sub( i_mult( add( l, 1 ), numCoeffs[k] ), 1 )] = 0; + move32(); + move32(); FOR( i = l * numCoeffs[k] + 1; i < ( l + 1 ) * numCoeffs[k] - 1; i++ ) { - mdst[ch][k][i] = sig[ch][k][i + 1] - sig[ch][k][i - 1]; + mdst[ch][k][i] = L_sub( sig[ch][k][i + 1], sig[ch][k][i - 1] ); + move32(); } } } @@ -743,6 +855,7 @@ static void apply_dmx_weights_fx( /* compute and apply bandwise weigths for active downmix (similar to DFT Stereo) */ stop_tcx5 = 0; + move16(); FOR( b = 0; b < sfbConf->sfbCnt; b++ ) { Word16 w[CPE_CHANNELS][4]; @@ -752,11 +865,38 @@ static void apply_dmx_weights_fx( FOR( l = 0; l < nsub2[k]; l++ ) { Word64 sum_nrg_L = 0, sum_nrg_R = 0; + move64(); + move64(); Word64 dot_prod_real = 0, dot_prod_imag = 0; + move64(); + move64(); Word32 sum_nrg_Mid, sum_abs, dot_prod_abs; + Word16 val_div = 0; - start = l * numCoeffs[k] + sfbConf->sfbOffset[b] / nsub2[k]; - stop = l * numCoeffs[k] + sfbConf->sfbOffset[b + 1] / nsub2[k]; + IF( sfbConf->sfbOffset[b] == 0 ) + { + val_div = 0; + move16(); + } + ELSE + { + val_div = idiv1616( sfbConf->sfbOffset[b], nsub2[k] ); + move16(); + } + start = add( i_mult( l, numCoeffs[k] ), val_div ); + + IF( sfbConf->sfbOffset[b + 1] == 0 ) + { + val_div = 0; + move16(); + } + ELSE + { + val_div = idiv1616( sfbConf->sfbOffset[b + 1], nsub2[k] ); + move16(); + } + + stop = add( i_mult( l, numCoeffs[k] ), val_div ); /* compute band energies and cross correlation */ FOR( i = start; i < stop; i++ ) @@ -773,84 +913,102 @@ static void apply_dmx_weights_fx( Word16 norm_dot_prod_imag = W_norm( dot_prod_imag ); Word16 guard_bit = find_guarded_bits_fx( 4 ); - Word16 min_norm = min( min( min( norm_sum_nrg_L, norm_sum_nrg_R ), norm_dot_prod_real ), norm_dot_prod_imag ) - guard_bit; + Word16 min_norm = sub( s_min( s_min( s_min( norm_sum_nrg_L, norm_sum_nrg_R ), norm_dot_prod_real ), norm_dot_prod_imag ), guard_bit ); Word32 sum_nrg_L_32 = W_extract_h( W_shl( sum_nrg_L, min_norm ) ); Word32 sum_nrg_R_32 = W_extract_h( W_shl( sum_nrg_R, min_norm ) ); Word32 dot_prod_real_32 = W_extract_h( W_shl( dot_prod_real, min_norm ) ); Word32 dot_prod_imag_32 = W_extract_h( W_shl( dot_prod_imag, min_norm ) ); - Word16 q_sum_nrg_L = 23 + min_norm - 32; - Word16 q_sum_nrg_R = 23 + min_norm - 32; - Word16 q_dot_prod_real = 23 + min_norm - 32; + Word16 q_sum_nrg_L = sub( add( 23, min_norm ), 32 ); + Word16 q_sum_nrg_R = sub( add( 23, min_norm ), 32 ); + Word16 q_dot_prod_real = sub( add( 23, min_norm ), 32 ); - Word16 E_sum_nrg_l = 31 - q_sum_nrg_L; - Word16 E_sum_nrg_R = 31 - q_sum_nrg_R; - Word16 E_dot_prod_abs = 31 - ( q_dot_prod_real * 2 - 31 ); - Word16 E_sum_nrg_Mid = 31 - q_sum_nrg_L; - sum_nrg_Mid = max( 0, L_add( L_add( sum_nrg_L_32, sum_nrg_R_32 ), L_shl( dot_prod_real_32, 1 ) ) ); + Word16 E_sum_nrg_l = sub( 31, q_sum_nrg_L ); + Word16 E_sum_nrg_R = sub( 31, q_sum_nrg_R ); + Word16 E_dot_prod_abs = sub( 31, sub( shl( q_dot_prod_real, 1 ), 31 ) ); + Word16 E_sum_nrg_Mid = sub( 31, q_sum_nrg_L ); + sum_nrg_Mid = L_max( 0, L_add( L_add( sum_nrg_L_32, sum_nrg_R_32 ), L_shl( dot_prod_real_32, 1 ) ) ); Word32 tmp_nrg_L = Sqrt32( sum_nrg_L_32, &E_sum_nrg_l ); Word32 tmp_nrg_R = Sqrt32( sum_nrg_R_32, &E_sum_nrg_R ); Word16 max_e_sum_abs = E_sum_nrg_l; - IF( E_sum_nrg_R > E_sum_nrg_l ) + move16(); + IF( GT_16( E_sum_nrg_R, E_sum_nrg_l ) ) { max_e_sum_abs = E_sum_nrg_R; + move16(); } - max_e_sum_abs = max_e_sum_abs + 1; + max_e_sum_abs = add( max_e_sum_abs, 1 ); sum_abs = L_add( L_shr( tmp_nrg_L, max_e_sum_abs - E_sum_nrg_l ), L_shr( tmp_nrg_R, max_e_sum_abs - E_sum_nrg_R ) ); dot_prod_abs = Sqrt32( L_add( Mpy_32_32( dot_prod_real_32, dot_prod_real_32 ), Mpy_32_32( dot_prod_imag_32, dot_prod_imag_32 ) ), &E_dot_prod_abs ); Word32 num = L_add( L_shr( L_add( sum_nrg_L_32, sum_nrg_R_32 ), 1 ), L_shr( dot_prod_abs, ( 31 - E_dot_prod_abs ) - q_sum_nrg_L ) ); - Word16 E_num = 31 - q_sum_nrg_L; + Word16 E_num = sub( 31, q_sum_nrg_L ); Word32 num_sqrt = Sqrt32( num, &E_num ); Word16 e_full_w = max_e_sum_abs; - IF( max_e_sum_abs < E_num ) + move16(); + IF( LT_16( max_e_sum_abs, E_num ) ) { e_full_w = E_num; + move16(); } Word16 full_w_up; + test(); + test(); IF( num_sqrt == 0 && sum_abs == 0 ) { full_w_up = 6364; // 0.776887059 in Q13 + move16(); } ELSE IF( num_sqrt == 0 && sum_abs != 0 ) { full_w_up = 5793; // 0.707106769 in Q13 + move16(); } ELSE { - full_w_up = shr( divide3232( L_shr( num_sqrt, e_full_w - E_num ), L_shr( sum_abs, e_full_w - max_e_sum_abs ) ), 2 ); + full_w_up = shr( divide3232( L_shr( num_sqrt, sub( e_full_w, E_num ) ), L_shr( sum_abs, sub( e_full_w, max_e_sum_abs ) ) ), 2 ); } Word32 sum_nrg_Mid_sqrt = Sqrt32( sum_nrg_Mid, &E_sum_nrg_Mid ); Word16 e_full_down = max_e_sum_abs; - IF( max_e_sum_abs < E_sum_nrg_Mid ) + move16(); + IF( LT_16( max_e_sum_abs, E_sum_nrg_Mid ) ) { e_full_down = E_sum_nrg_Mid; + move16(); } Word16 full_w_down; + test(); + test(); IF( sum_nrg_Mid_sqrt == 0 && sum_abs == 0 ) { full_w_down = 6364; + move16(); } ELSE IF( sum_nrg_Mid_sqrt == 0 && sum_abs != 0 ) { full_w_down = 5793; + move16(); } ELSE { - full_w_down = shr( divide3232( L_shr( sum_nrg_Mid_sqrt, e_full_down - E_sum_nrg_Mid ), L_shr( sum_abs, e_full_down - max_e_sum_abs ) ), 1 ); + full_w_down = shr( divide3232( L_shr( sum_nrg_Mid_sqrt, sub( e_full_down, E_sum_nrg_Mid ) ), L_shr( sum_abs, sub( e_full_down, max_e_sum_abs ) ) ), 1 ); } IF( hCPE->hStereoMdct->reverse_dmx == 0 ) { - w[1][2 * k + l] = full_w_up; - w[0][2 * k + l] = add( w[1][2 * k + l], mult( 23170 /*sqrt(2.0f in Q14)*/, sub( 16384 /* 1.0f in Q14 */, full_w_down ) ) ); + w[1][add( 2 * k, l )] = full_w_up; + move16(); + w[0][add( 2 * k, l )] = add( w[1][add( 2 * k, l )], mult( 23170 /*sqrt(2.0f in Q14)*/, sub( 16384 /* 1.0f in Q14 */, full_w_down ) ) ); + move16(); } ELSE { - w[0][2 * k + l] = full_w_up; - w[1][2 * k + l] = add( w[0][2 * k + l], mult( 23170 /*sqrt(2.0f in Q14)*/, sub( 16384 /* 1.0f in Q14 */, full_w_down ) ) ); + w[0][add( 2 * k, l )] = full_w_up; + move16(); + w[1][add( 2 * k, l )] = add( w[0][add( 2 * k, l )], mult( 23170 /*sqrt(2.0f in Q14)*/, sub( 16384 /* 1.0f in Q14 */, full_w_down ) ) ); + move16(); } } } @@ -858,51 +1016,69 @@ static void apply_dmx_weights_fx( /* apply weights to channels with their original frequency resolutions */ FOR( ch = 0; ch < CPE_CHANNELS; ch++ ) { - IF( transform_type[ch][0] == TCX_20 ) + IF( EQ_16( transform_type[ch][0], TCX_20 ) ) { FOR( i = sfbConf->sfbOffset[b]; i < sfbConf->sfbOffset[b + 1]; i++ ) { x[ch][0][i] = L_shl( Mpy_32_16_1( x[ch][0][i], w[ch][0] ), 2 ); + move32(); } } ELSE { start = sfbConf->sfbOffset[b]; + move16(); stop = sfbConf->sfbOffset[b + 1]; + move16(); IF( !tcx_10_only ) /* TCX20 band config is used */ { - start /= 2; - stop /= 2; + start = shr( start, 1 ); + stop = shr( stop, 1 ); } FOR( k = 0; k < NB_DIV; k++ ) { - w_idx = ( nsub == 1 ) ? 0 : 2 * k; - IF( transform_type[ch][k] == TCX_10 ) + // w_idx = ( nsub == 1 ) ? 0 : 2 * k; + IF( EQ_16( nsub, 1 ) ) + { + w_idx = 0; + move16(); + } + ELSE + { + w_idx = shl( k, 1 ); + move16(); + } + + IF( EQ_16( transform_type[ch][k], TCX_10 ) ) { FOR( i = start; i < stop; i++ ) { x[ch][k][i] = L_shl( Mpy_32_16_1( x[ch][k][i], w[ch][w_idx] ), 2 ); + move32(); } } ELSE /* TCX_5 */ { start_tcx5 = stop_tcx5; - stop_tcx5 = ( stop + 1 ) / 2; + move16(); + stop_tcx5 = shr( add( stop, 1 ), 1 ); FOR( i = start_tcx5; i < stop_tcx5; i++ ) { x[ch][k][i] = L_shl( Mpy_32_16_1( x[ch][k][i], w[ch][w_idx] ), 2 ); + move32(); } - IF( nsub2[k] == 2 ) + IF( EQ_16( nsub2[k], 2 ) ) { - w_idx++; + w_idx = add( w_idx, 1 ); } FOR( i = start_tcx5; i < stop_tcx5; i++ ) { - x[ch][k][i + ( frameSize >> 2 )] = L_shl( Mpy_32_16_1( x[ch][k][i + ( frameSize >> 2 )], w[ch][w_idx] ), 2 ); + x[ch][k][add( i, shr( frameSize, 2 ) )] = L_shl( Mpy_32_16_1( x[ch][k][add( i, shr( frameSize, 2 ) )], w[ch][w_idx] ), 2 ); + move32(); } } } @@ -926,17 +1102,26 @@ static void run_min_stats_fx( Word32 *x[CPE_CHANNELS][NB_DIV], /* i/o: MDCT Spectrum */ Word16 x_e[CPE_CHANNELS][NB_DIV] ) { - int16_t ch, will_estimate_noise_on_channel[CPE_CHANNELS], save_VAD[CPE_CHANNELS]; + Word16 ch, will_estimate_noise_on_channel[CPE_CHANNELS], save_VAD[CPE_CHANNELS]; Word32 power_spec[L_FRAME16k]; Word16 power_spec_16[L_FRAME16k], power_spec_e = 0; + move16(); Word32 *spec_in; Word16 spec_e; /* Check if the minimum statistics would run on the respective channels. They are run on inactive TCX20 channels */ - will_estimate_noise_on_channel[0] = sts[0]->core == TCX_20_CORE && !sts[0]->VAD; - will_estimate_noise_on_channel[1] = sts[1]->core == TCX_20_CORE && !sts[1]->VAD; + test(); + test(); + will_estimate_noise_on_channel[0] = EQ_16( sts[0]->core, TCX_20_CORE ) && !sts[0]->VAD; + will_estimate_noise_on_channel[1] = EQ_16( sts[1]->core, TCX_20_CORE ) && !sts[1]->VAD; + test(); + test(); + move16(); + move16(); save_VAD[0] = sts[0]->VAD; + move16(); save_VAD[1] = sts[1]->VAD; + move16(); /* The first loop calculates the power spectra needed in the minimum statistics (MS) noise estimation. This is only needed if the MS would run at all on at least one of the channels. If they run on both channels, we need to calculate two distinct power spectra @@ -948,6 +1133,8 @@ static void run_min_stats_fx( Decoder_State *st; st = sts[ch]; + test(); + test(); IF( !sts[0]->bfi && ( will_estimate_noise_on_channel[0] || will_estimate_noise_on_channel[1] ) ) { /* if noise estimation is expected to run on this channel, compute power spectrum from it, @@ -963,6 +1150,7 @@ static void run_min_stats_fx( spec_e = x_e[( ch + 1 ) % 2][0]; /* patch VAD to zero so that estimation runs, will later be restored */ st->VAD = 0; + move16(); } /* Compute power spectrum twice if estimation will run on both channels. If only on one channel, it is @@ -971,15 +1159,16 @@ static void run_min_stats_fx( { Word16 tmp16 = getScaleFactor32( spec_in, L_FRAME16k ); /* calculate power spectrum from MDCT coefficients and estimated MDST coeffs */ - power_spec[0] = W_extract_h( W_shl( W_mult_32_32( spec_in[0], spec_in[0] ), tmp16 - 4 ) ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31 */ - power_spec[L_FRAME16k - 1] = W_extract_h( W_shl( W_mult_32_32( spec_in[L_FRAME16k - 1], spec_in[L_FRAME16k - 1] ), tmp16 - 4 ) ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31 */ + power_spec[0] = W_extract_h( W_shl( W_mult_32_32( spec_in[0], spec_in[0] ), sub( tmp16, 4 ) ) ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31 */ + power_spec[L_FRAME16k - 1] = W_extract_h( W_shl( W_mult_32_32( spec_in[L_FRAME16k - 1], spec_in[L_FRAME16k - 1] ), sub( tmp16, 4 ) ) ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31 */ FOR( Word16 i = 1; i < L_FRAME16k - 1; i++ ) { Word32 mdst; - mdst = L_sub( spec_in[i + 1], spec_in[i - 1] ); /* Q31 - x_e */ - power_spec[i] = L_add( W_extract_h( W_shl( W_mult_32_32( spec_in[i], spec_in[i] ), tmp16 - 4 ) ), W_extract_h( W_shl( W_mult_32_32( mdst, mdst ), tmp16 - 4 ) ) ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31*/ + mdst = L_sub( spec_in[i + 1], spec_in[i - 1] ); /* Q31 - x_e */ + power_spec[i] = L_add( W_extract_h( W_shl( W_mult_32_32( spec_in[i], spec_in[i] ), sub( tmp16, 4 ) ) ), W_extract_h( W_shl( W_mult_32_32( mdst, mdst ), sub( tmp16, 4 ) ) ) ); /* 2 * (Q31 - x_e) + tmp16 - Q4 - Q31*/ + move32(); } - power_spec_e = add( 4, shl( spec_e, 1 ) ) - tmp16; + power_spec_e = sub( add( 4, shl( spec_e, 1 ) ), tmp16 ); } Copy_Scale_sig32_16( power_spec, power_spec_16, L_FRAME16k, 0 ); @@ -990,8 +1179,11 @@ static void run_min_stats_fx( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = extract_h( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx ); st->lp_noise = st->hFdCngDec->lp_noise; + move32(); } + test(); + test(); IF( will_estimate_noise_on_channel[0] || will_estimate_noise_on_channel[1] || st->bfi ) { // for ( int p = 0; p < FFTCLDFBLEN; p++ ) @@ -1005,7 +1197,16 @@ static void run_min_stats_fx( // Scale_sig32(power_spec, L_FRAME16k, sub(power_spec_e, 31)); // power_spec_e = 31; /*=================================================*/ - ApplyFdCng_ivas_fx( NULL, 0, st->bfi ? NULL : power_spec, sub( 31, power_spec_e ), NULL, NULL, NULL, st, st->bfi, 0 ); + Word32 *arr_tmp; + IF( st->bfi ) + { + arr_tmp = NULL; + } + ELSE + { + arr_tmp = power_spec; + } + ApplyFdCng_ivas_fx( NULL, 0, arr_tmp, sub( 31, power_spec_e ), NULL, NULL, NULL, st, st->bfi, 0 ); /*=================================================*/ } diff --git a/lib_rend/ivas_reflections.c b/lib_rend/ivas_reflections.c index ee55961046fb8436e98f75bd366941fe2f028821..b06de85c6568ce3136cd1e14a1cde690d0ec78df 100644 --- a/lib_rend/ivas_reflections.c +++ b/lib_rend/ivas_reflections.c @@ -55,6 +55,17 @@ #define ER_NUM_REF 6 +#ifdef IVAS_FLOAT_FIXED +static UWord16 LC_mixing_5_1[5] = { 0, 1, 2, 0, 1 }; + +static UWord16 LC_mixing_7_1[7] = { 0, 1, 2, 3, 4, 3, 4 }; + +static UWord16 LC_mixing_5_1_2[7] = { 0, 1, 2, 3, 4, 0, 1 }; + +static UWord16 LC_mixing_5_1_4[9] = { 0, 1, 2, 3, 4, 0, 1, 2, 3 }; + +static UWord16 LC_mixing_7_1_4[11] = { 0, 1, 2, 3, 4, 3, 4, 0, 1, 2, 3 }; +#else static uint16_t LC_mixing_5_1[5] = { 0, 1, 2, 0, 1 }; static uint16_t LC_mixing_7_1[7] = { 0, 1, 2, 3, 4, 3, 4 }; @@ -64,6 +75,7 @@ static uint16_t LC_mixing_5_1_2[7] = { 0, 1, 2, 3, 4, 0, 1 }; static uint16_t LC_mixing_5_1_4[9] = { 0, 1, 2, 3, 4, 0, 1, 2, 3 }; static uint16_t LC_mixing_7_1_4[11] = { 0, 1, 2, 3, 4, 3, 4, 0, 1, 2, 3 }; +#endif /*-----------------------------------------------------------------------------------------* @@ -142,15 +154,15 @@ ivas_error ivas_er_init( /* Set to defaults for shoebox */ reflections->is_ready = 0; + move16(); reflections->audio_config = IVAS_AUDIO_CONFIG_INVALID; - reflections->is_cartesian = 0; - reflections->is_relative = 1; - reflections->shoebox_data.n_ref = ER_NUM_REF; move16(); + reflections->is_cartesian = 0; move16(); + reflections->is_relative = 1; move16(); + reflections->shoebox_data.n_ref = ER_NUM_REF; move16(); - move32(); /* Store scene origin if present */ @@ -175,11 +187,11 @@ ivas_error ivas_er_init( return error; } - IF( ( reflections->closest_ch_idx = (uint16_t *) malloc( reflections->n_total_reflections * sizeof( uint16_t ) ) ) == NULL ) + IF( ( reflections->closest_ch_idx = (UWord16 *) malloc( reflections->n_total_reflections * sizeof( UWord16 ) ) ) == NULL ) { return IVAS_ERR_FAILED_ALLOC; } - set_s( (int16_t *) reflections->closest_ch_idx, 0, reflections->n_total_reflections ); + set16_fx( (Word16 *) reflections->closest_ch_idx, 0, reflections->n_total_reflections ); IF( NE_32( ( error = getAudioConfigNumChannels( reflections->audio_config, &( reflections->nchan_out ) ) ), IVAS_ERR_OK ) ) { @@ -252,9 +264,9 @@ ivas_error ivas_er_set_reflections_mode( FOR( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) { - reflections->source_positions_fx[3 * ch] = ls_azimuth_CICP2_idx[ch]; - reflections->source_positions_fx[1 + ( 3 * ch )] = ls_elevation_CICP2_idx[ch]; - reflections->source_positions_fx[2 + ( 3 * ch )] = ER_RADIUS_FX; + reflections->source_positions_fx[i_mult( 3, ch )] = ls_azimuth_CICP2_idx[ch]; + reflections->source_positions_fx[add( 1, i_mult( 3, ch ) )] = ls_elevation_CICP2_idx[ch]; + reflections->source_positions_fx[add( 2, i_mult( 3, ch ) )] = ER_RADIUS_FX; move32(); move32(); move32(); @@ -270,9 +282,9 @@ ivas_error ivas_er_set_reflections_mode( FOR( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) { - reflections->source_positions_fx[3 * ch] = ls_azimuth_CICP6_idx[ch]; - reflections->source_positions_fx[1 + ( 3 * ch )] = ls_elevation_CICP6_idx[ch]; - reflections->source_positions_fx[2 + ( 3 * ch )] = ER_RADIUS_FX; + reflections->source_positions_fx[i_mult( 3, ch )] = ls_azimuth_CICP6_idx[ch]; + reflections->source_positions_fx[add( 1, i_mult( 3, ch ) )] = ls_elevation_CICP6_idx[ch]; + reflections->source_positions_fx[add( 2, i_mult( 3, ch ) )] = ER_RADIUS_FX; move32(); move32(); move32(); @@ -287,9 +299,9 @@ ivas_error ivas_er_set_reflections_mode( move16(); FOR( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) { - reflections->source_positions_fx[3 * ch] = ls_azimuth_CICP12_idx[ch]; - reflections->source_positions_fx[1 + ( 3 * ch )] = ls_elevation_CICP12_idx[ch]; - reflections->source_positions_fx[2 + ( 3 * ch )] = ER_RADIUS_FX; + reflections->source_positions_fx[i_mult( 3, ch )] = ls_azimuth_CICP12_idx[ch]; + reflections->source_positions_fx[add( 1, i_mult( 3, ch ) )] = ls_elevation_CICP12_idx[ch]; + reflections->source_positions_fx[add( 2, i_mult( 3, ch ) )] = ER_RADIUS_FX; move32(); move32(); move32(); @@ -304,9 +316,9 @@ ivas_error ivas_er_set_reflections_mode( move16(); FOR( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) { - reflections->source_positions_fx[3 * ch] = ls_azimuth_CICP14_idx[ch]; - reflections->source_positions_fx[1 + ( 3 * ch )] = ls_elevation_CICP14_idx[ch]; - reflections->source_positions_fx[2 + ( 3 * ch )] = ER_RADIUS_FX; + reflections->source_positions_fx[i_mult( 3, ch )] = ls_azimuth_CICP14_idx[ch]; + reflections->source_positions_fx[add( 1, i_mult( 3, ch ) )] = ls_elevation_CICP14_idx[ch]; + reflections->source_positions_fx[add( 2, i_mult( 3, ch ) )] = ER_RADIUS_FX; move32(); move32(); move32(); @@ -321,9 +333,9 @@ ivas_error ivas_er_set_reflections_mode( move16(); FOR( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) { - reflections->source_positions_fx[3 * ch] = ls_azimuth_CICP16_idx[ch]; - reflections->source_positions_fx[1 + ( 3 * ch )] = ls_elevation_CICP16_idx[ch]; - reflections->source_positions_fx[2 + ( 3 * ch )] = ER_RADIUS_FX; + reflections->source_positions_fx[i_mult( 3, ch )] = ls_azimuth_CICP16_idx[ch]; + reflections->source_positions_fx[add( 1, i_mult( 3, ch ) )] = ls_elevation_CICP16_idx[ch]; + reflections->source_positions_fx[add( 2, i_mult( 3, ch ) )] = ER_RADIUS_FX; move32(); move32(); move32(); @@ -338,9 +350,9 @@ ivas_error ivas_er_set_reflections_mode( move16(); FOR( ch = 0; ch < reflections->shoebox_data.n_sources; ch++ ) { - reflections->source_positions_fx[3 * ch] = ls_azimuth_CICP19_idx[ch]; - reflections->source_positions_fx[1 + ( 3 * ch )] = ls_elevation_CICP19_idx[ch]; - reflections->source_positions_fx[2 + ( 3 * ch )] = ER_RADIUS_FX; + reflections->source_positions_fx[i_mult( 3, ch )] = ls_azimuth_CICP19_idx[ch]; + reflections->source_positions_fx[add( 1, i_mult( 3, ch ) )] = ls_elevation_CICP19_idx[ch]; + reflections->source_positions_fx[add( 2, i_mult( 3, ch ) )] = ER_RADIUS_FX; move32(); move32(); move32(); @@ -626,11 +638,8 @@ ivas_error ivas_er_encoder_init( p_z_src_fx = Mpy_32_32( src_pos_ptr_fx[2], shoebox_sin_cos_tbl_fx[( src_pos_ptr_fx[1] )][0] ); //.29 = .30 * .30 p_x_src_fx = L_shr( p_x_src_fx, 14 ); - move32(); p_y_src_fx = L_shr( p_y_src_fx, 14 ); - move32(); p_z_src_fx = L_shr( p_z_src_fx, 15 ); - move32(); tmp_data = L_sub( p_x_src_fx, p_x_fx ); tmp16 = extract_l( tmp_data ); // Q.14 @@ -648,20 +657,21 @@ ivas_error ivas_er_encoder_init( tmp16 = shr( tmp16, 1 ); // Q.13 tmp_fx = L_mac( tmp_fx, tmp16, tmp16 ); // Q.27 q_format = Q31 - Q27; + move16(); dist_fx = Sqrt32( tmp_fx, &q_format ); - IF( EQ_32( dist_fx, 0 ) ) + if ( dist_fx == 0 ) { q_format = 0; move16(); } - IF( LE_16( q_format, 0 ) ) + IF( q_format <= 0 ) { dist_fx = L_shl( dist_fx, q_format ); // Q31 q_format = 0; move16(); } /* Save index of closest channel */ - IF( EQ_16( src_idx, 0 ) ) + IF( src_idx == 0 ) { min_dist_fx = dist_fx; min_qformat = q_format; @@ -743,20 +753,29 @@ ivas_error ivas_er_compute_reflections( { FOR( j = 0; j < reflections->shoebox_data.n_ref; j++ ) { - tmp_fx = reflections->shoebox_data.times.data_fx[j + ( i * reflections->shoebox_data.n_ref )]; + tmp_fx = reflections->shoebox_data.times.data_fx[add( j, i_mult( i, reflections->shoebox_data.n_ref ) )]; tmp_fx_lo = extract_l( tmp_fx ); Mpy_32_16_uu( tmp_fx, (UWord16) reflections->output_Fs_fx, &tmp_fx1, &tmp_fx_lo ); tmp_fx1 = (UWord32) L_add( tmp_fx1, 0x20 ); tmp_fx1 = L_shr( tmp_fx1, 6 ); - reflections->shoebox_data.times.data_fx[j + ( i * reflections->shoebox_data.n_ref )] = tmp_fx1; - circ_len = ( (UWord16) tmp_fx1 > circ_len ) ? (UWord16) tmp_fx1 : circ_len; + reflections->shoebox_data.times.data_fx[add( j, i_mult( i, reflections->shoebox_data.n_ref ) )] = tmp_fx1; + move32(); + // circ_len = ( (UWord16) tmp_fx1 > circ_len ) ? (UWord16) tmp_fx1 : circ_len; + IF( GT_32( u_extract_l( tmp_fx1 ), circ_len ) ) + { + circ_len = u_extract_l( tmp_fx1 ); + } } } /* If max delay is less than max frame size, use max frame size to compute circ buffer length */ - circ_len = ( circ_len > (UWord16) reflections->max_frame_size ) ? circ_len : (UWord16) reflections->max_frame_size; - circ_len += (UWord16) reflections->max_frame_size; + IF( LE_32( circ_len, u_extract_l( reflections->max_frame_size ) ) ) + { + circ_len = u_extract_l( reflections->max_frame_size ); + } + + circ_len = u_extract_l( UL_addNsD( circ_len, reflections->max_frame_size ) ); /* If circ buffers exist and size is the same, reset memory to all zeros */ /* If size is different, reallocate circ buffers */ @@ -768,10 +787,10 @@ ivas_error ivas_er_compute_reflections( } IF( reflections->circ_buffers ) { - IF( reflections->circ_len == circ_len ) + IF( EQ_32( reflections->circ_len, circ_len ) ) { /* circ buffers exist and size is the same */ - set32_fx( reflections->circ_buffers, 0, reflections->shoebox_data.n_sources * reflections->circ_len ); + set32_fx( reflections->circ_buffers, 0, i_mult( reflections->shoebox_data.n_sources, reflections->circ_len ) ); } ELSE { @@ -779,7 +798,7 @@ ivas_error ivas_er_compute_reflections( reflections->circ_len = circ_len; move16(); free( reflections->circ_buffers ); - IF( ( reflections->circ_buffers = (Word32 *) malloc( reflections->shoebox_data.n_sources * reflections->circ_len * sizeof( Word32 ) ) ) == NULL ) + IF( ( reflections->circ_buffers = (Word32 *) malloc( i_mult( reflections->shoebox_data.n_sources, reflections->circ_len ) * sizeof( Word32 ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections buffers" ); } @@ -791,7 +810,7 @@ ivas_error ivas_er_compute_reflections( /* circ buffers do not exist */ reflections->circ_len = circ_len; move16(); - IF( ( reflections->circ_buffers = (Word32 *) malloc( reflections->shoebox_data.n_sources * reflections->circ_len * sizeof( Word32 ) ) ) == NULL ) + IF( ( reflections->circ_buffers = (Word32 *) malloc( i_mult( reflections->shoebox_data.n_sources, reflections->circ_len ) * sizeof( Word32 ) ) ) == NULL ) { return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Early Reflections buffers" ); } @@ -799,10 +818,11 @@ ivas_error ivas_er_compute_reflections( } /* Initialize circular buffer insertion point */ - reflections->circ_insert = reflections->circ_len - (UWord16) reflections->max_frame_size; + reflections->circ_insert = u_extract_l( UL_subNsD( reflections->circ_len, reflections->max_frame_size ) ); /* Get total reflections number */ - reflections->n_total_reflections = reflections->shoebox_data.n_sources * reflections->shoebox_data.n_ref; + reflections->n_total_reflections = (UWord16) i_mult( reflections->shoebox_data.n_sources, reflections->shoebox_data.n_ref ); + move16(); /* Check that reflection buffers were allocated */ IF( NE_32( error, IVAS_ERR_OK ) ) @@ -933,12 +953,13 @@ ivas_error ivas_er_process( } /* should not arrive here if reflections are disabled but in case it does just do nothing */ - IF( reflections->use_er != 1 ) + IF( NE_32( reflections->use_er, 1 ) ) { return error; } /* Ensure all reflection memory is allocated */ + test(); IF( !reflections->circ_buffers || !reflections->is_ready ) { return IVAS_ERR_INIT_ERROR; @@ -967,19 +988,41 @@ ivas_error ivas_er_process( FOR( i = 0; i < reflections->shoebox_data.n_sources; i++ ) { /* Pull correct circular buffer depending on complexity mode */ - buf_ch_idx = ( reflections->lowComplexity == 1 ) ? reflections->LC_mixing[i] : i; - buffer_ch = &( reflections->circ_buffers[buf_ch_idx * reflections->circ_len] ); + // buf_ch_idx = ( reflections->lowComplexity == 1 ) ? reflections->LC_mixing[i] : i; + IF( EQ_32( reflections->lowComplexity, 1 ) ) + { + buf_ch_idx = reflections->LC_mixing[i]; + move16(); + } + ELSE + { + buf_ch_idx = i; + move16(); + } + buffer_ch = &( reflections->circ_buffers[i_mult( buf_ch_idx, reflections->circ_len )] ); /* Skip LFE from input buffer */ - in_ch_idx = ( i >= LFE_CHANNEL ) ? i + 1 : i; + // in_ch_idx = ( i >= LFE_CHANNEL ) ? i + 1 : i; + IF( GE_32( i, LFE_CHANNEL ) ) + { + in_ch_idx = add( i, 1 ); + } + ELSE + { + in_ch_idx = i; + move16(); + } samp_idx = reflections->circ_insert; + move16(); /* If less than number of reflection sources, overwrite buffer */ - IF( i == buf_ch_idx ) + IF( EQ_32( i, buf_ch_idx ) ) { FOR( j = 0; j < subframe_size; j++ ) { - buffer_ch[samp_idx++] = io[in_ch_idx][j + subframe_offset]; + buffer_ch[samp_idx] = io[in_ch_idx][add( j, subframe_offset )]; + move32(); + samp_idx = add( samp_idx, 1 ); samp_idx = samp_idx % reflections->circ_len; } } @@ -988,8 +1031,9 @@ ivas_error ivas_er_process( { FOR( j = 0; j < subframe_size; j++ ) { - buffer_ch[samp_idx] = L_add( io[in_ch_idx][j + subframe_offset], buffer_ch[samp_idx] ); - samp_idx++; + buffer_ch[samp_idx] = L_add( io[in_ch_idx][add( j, subframe_offset )], buffer_ch[samp_idx] ); + move32(); + samp_idx = add( samp_idx, 1 ); samp_idx = samp_idx % reflections->circ_len; } } @@ -1004,37 +1048,42 @@ ivas_error ivas_er_process( FOR( i = 0; i < n_ref_sources; i++ ) { /* Access correct row of input circ buffer */ - buffer_ch = &( reflections->circ_buffers[i * reflections->circ_len] ); + buffer_ch = &( reflections->circ_buffers[i_mult( i, reflections->circ_len )] ); /* Loop through reflections */ FOR( j = 0; j < n_ref; j++ ) { - ref_no = j + ( i * n_ref ); + ref_no = (UWord16) add( j, i_mult( i, n_ref ) ); + move16(); ref_gain = (Word32) reflections->shoebox_data.gains.data_fx[ref_no]; + move32(); ref_delay = (UWord16) reflections->shoebox_data.times.data_fx[ref_no]; + move16(); ref_out_idx = reflections->closest_ch_idx[ref_no]; + move16(); /* Determine start idx of reflection in circ buffer based on current insert idx and reflection delay */ - samp_idx = (Word16) reflections->circ_insert - ref_delay; - IF( LT_16( samp_idx, 0 ) ) + samp_idx = sub( reflections->circ_insert, ref_delay ); + if ( LT_16( samp_idx, 0 ) ) { - samp_idx = add( (Word16) reflections->circ_len, samp_idx ); + samp_idx = add( reflections->circ_len, samp_idx ); } /* Pull reflection from circ buffer and apply gain */ FOR( k = 0; k < subframe_size; k++ ) { temp = Mpy_32_32( buffer_ch[samp_idx], ref_gain ); - io[ref_out_idx][k + subframe_offset] = L_add( temp, io[ref_out_idx][k + subframe_offset] ); - samp_idx++; + io[ref_out_idx][add( k, subframe_offset )] = L_add( temp, io[ref_out_idx][add( k, subframe_offset )] ); + samp_idx = add( samp_idx, 1 ); samp_idx = samp_idx % reflections->circ_len; } } } /* Increment circular buffer start index */ - reflections->circ_insert = ( reflections->circ_insert + subframe_size ) % reflections->circ_len; + reflections->circ_insert = (UWord16) ( add( reflections->circ_insert, subframe_size ) ) % reflections->circ_len; + move16(); return error; } #else diff --git a/lib_rend/ivas_render_config.c b/lib_rend/ivas_render_config.c index 30b00be592716e9710879030af046b18b842205a..65525868cda2a86d8b92cb0e44390c5a6f28f5da 100644 --- a/lib_rend/ivas_render_config.c +++ b/lib_rend/ivas_render_config.c @@ -138,15 +138,21 @@ ivas_error ivas_render_config_init_from_rom_fx( ) { Word16 i; + test(); IF( hRenderConfig == NULL || *hRenderConfig == NULL ) { return IVAS_ERROR( IVAS_ERR_UNEXPECTED_NULL_POINTER, "Unexpected null pointer while attempting to fill renderer configuration from ROM" ); } ( *hRenderConfig )->roomAcoustics.override = FALSE; + move16(); ( *hRenderConfig )->roomAcoustics.nBands = IVAS_REVERB_DEFAULT_N_BANDS; + move16(); ( *hRenderConfig )->roomAcoustics.acousticPreDelay_fx = IVAS_REVERB_DEFAULT_PRE_DELAY_FX; + move32(); ( *hRenderConfig )->roomAcoustics.inputPreDelay_fx = IVAS_REVERB_DEFAULT_INPUT_DELAY_FX; + move32(); ( *hRenderConfig )->roomAcoustics.use_er = IVAS_REVERB_DEFAULT_USE_ER; + move16(); set32_fx( &( *hRenderConfig )->roomAcoustics.pFc_input_fx[0], 0, CLDFB_NO_CHANNELS_MAX ); set32_fx( &( *hRenderConfig )->roomAcoustics.pAcoustic_rt60_fx[0], 0, CLDFB_NO_CHANNELS_MAX ); set32_fx( &( *hRenderConfig )->roomAcoustics.pAcoustic_dsr_fx[0], 0, CLDFB_NO_CHANNELS_MAX ); @@ -158,9 +164,12 @@ ivas_error ivas_render_config_init_from_rom_fx( /*Q6*/ FOR( i = 0; i < MAX_NUM_OBJECTS; i++ ) { - ( *hRenderConfig )->directivity_fx[i * 3] = 23040; /* Front cone */ - ( *hRenderConfig )->directivity_fx[i * 3 + 1] = 23040; /* Back cone */ - ( *hRenderConfig )->directivity_fx[i * 3 + 2] = 64; /* Back attenuation */ + ( *hRenderConfig )->directivity_fx[i_mult( i, 3 )] = 23040; /* Front cone */ + move16(); + ( *hRenderConfig )->directivity_fx[add( i_mult( i, 3 ), 1 )] = 23040; /* Back cone */ + move16(); + ( *hRenderConfig )->directivity_fx[add( i_mult( i, 3 ), 2 )] = 64; /* Back attenuation */ + move16(); } return IVAS_ERR_OK; @@ -191,9 +200,9 @@ ivas_error ivas_render_config_init_from_rom( for ( i = 0; i < MAX_NUM_OBJECTS; i++ ) { - ( *hRenderConfig )->directivity[i * 3] = 360.0f; /* Front cone */ - ( *hRenderConfig )->directivity[i * 3 + 1] = 360.0f; /* Back cone */ - ( *hRenderConfig )->directivity[i * 3 + 2] = 1.0f; /* Back attenuation */ + ( *hRenderConfig )->directivity[i_mult( i, 3 )] = 360.0f; /* Front cone */ + ( *hRenderConfig )->directivity[add( i_mult( i, 3 ), 1 )] = 360.0f; /* Back cone */ + ( *hRenderConfig )->directivity[add( i_mult( i, 3 ), 2 )] = 1.0f; /* Back attenuation */ } return IVAS_ERR_OK; diff --git a/lib_rend/ivas_reverb.c b/lib_rend/ivas_reverb.c index 35752d092687a6503159ca8b99fb08ed830d63e0..127dd83268ce80e5a91a1c1e71e948b7991173b5 100644 --- a/lib_rend/ivas_reverb.c +++ b/lib_rend/ivas_reverb.c @@ -109,10 +109,17 @@ static Word16 wrap_rad_fixed( #define MAX_NR_OUTPUTS ( 2 ) +#ifdef IVAS_FLOAT_FIXED +const Word16 init_loop_delay[IVAS_REV_MAX_NR_BRANCHES] = { 37, 31, 29, 23, 19, 17, 13, 11 }; +const Word16 default_loop_delay_48k[IVAS_REV_MAX_NR_BRANCHES] = { 2309, 1861, 1523, 1259, 1069, 919, 809, 719 }; +const Word16 default_loop_delay_32k[IVAS_REV_MAX_NR_BRANCHES] = { 1531, 1237, 1013, 839, 709, 613, 541, 479 }; +const Word16 default_loop_delay_16k[IVAS_REV_MAX_NR_BRANCHES] = { 769, 619, 509, 421, 353, 307, 269, 239 }; +#else const int16_t init_loop_delay[IVAS_REV_MAX_NR_BRANCHES] = { 37, 31, 29, 23, 19, 17, 13, 11 }; const int16_t default_loop_delay_48k[IVAS_REV_MAX_NR_BRANCHES] = { 2309, 1861, 1523, 1259, 1069, 919, 809, 719 }; const int16_t default_loop_delay_32k[IVAS_REV_MAX_NR_BRANCHES] = { 1531, 1237, 1013, 839, 709, 613, 541, 479 }; const int16_t default_loop_delay_16k[IVAS_REV_MAX_NR_BRANCHES] = { 769, 619, 509, 421, 353, 307, 269, 239 }; +#endif /*------------------------------------------------------------------------------------------* * Local Struct definition @@ -402,6 +409,7 @@ static void ivas_binaural_reverb_setReverbTimes_fx( move16(); hReverb->binRend_RandNext = (UWord16) BIN_REND_RANDOM_SEED; + move16(); hReverb->highestBinauralCoherenceBin = 0; move16(); @@ -415,12 +423,12 @@ static void ivas_binaural_reverb_setReverbTimes_fx( L_tmp = Mpy_32_16_1( output_Fs, tmp ); binCenterFreq_exp = add( 31, exp ); binCenterFreq_fx = L_shr( L_tmp, 1 ); // divide by 2 - IF( EQ_16( bin, 0 ) ) + IF( bin == 0 ) { diffuseFieldICC_fx = ONE_IN_Q31; move32(); } - ELSE IF( BASOP_Util_Cmp_Mant32Exp( binCenterFreq_fx, binCenterFreq_exp, 2700, 31 ) == -1 ) + ELSE IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( binCenterFreq_fx, binCenterFreq_exp, 2700, 31 ), -1 ) ) { /* binCenterFreq / 550.0f */ L_tmp = Mpy_32_32( binCenterFreq_fx, 3904516 /* 1 / 550 in Q31 */ ); @@ -470,18 +478,21 @@ static void ivas_binaural_reverb_setReverbTimes_fx( IF( diffuseFieldICC_fx > 0 ) { exp = tmpVal_exp; + move16(); L_tmp = Sqrt32( L_abs( tmpVal_fx ), &exp ); hReverb->binauralCoherenceCrossmixGains_fx[bin] = L_shl( L_tmp, exp ); // Q31 } ELSE { exp = tmpVal_exp; + move16(); L_tmp = Sqrt32( L_abs( tmpVal_fx ), &exp ); hReverb->binauralCoherenceCrossmixGains_fx[bin] = L_negate( L_shl( L_tmp, exp ) ); // Q31 } /* hReverb->binauralCoherenceDirectGains[bin] = sqrtf( 1.0f - fabsf( tmpVal ) ); */ exp = tmpVal_exp; + move16(); L_tmp = L_sub( ONE_IN_Q31, L_abs( tmpVal_fx ) ); L_tmp = Sqrt32( L_abs( L_tmp ), &exp ); hReverb->binauralCoherenceDirectGains_fx[bin] = L_shl( L_tmp, exp ); // making as Q31 @@ -493,7 +504,7 @@ static void ivas_binaural_reverb_setReverbTimes_fx( L_tmp = Mpy_32_16_1( -1610612736, tmp ); // * -3 scale = add( 2, scale ); L_tmp = Mpy_32_32( 1783446563, L_tmp ); // scale + 2 - attenuationFactorPerSample_fx = BASOP_util_Pow2( L_tmp, scale + 2, &attenuationFactorPerSample_exp ); + attenuationFactorPerSample_fx = BASOP_util_Pow2( L_tmp, add( scale, 2 ), &attenuationFactorPerSample_exp ); Word32 tmp_mul; scale = norm_l( hReverb->loopBufLength[bin] ); @@ -501,8 +512,8 @@ static void ivas_binaural_reverb_setReverbTimes_fx( L_tmp = BASOP_Util_Log2( attenuationFactorPerSample_fx ); L_tmp = L_add( L_tmp, L_shl( (Word32) attenuationFactorPerSample_exp, 25 ) ); L_tmp = Mpy_32_32( L_tmp, tmp_mul ); - hReverb->loopAttenuationFactor_fx[bin] = BASOP_util_Pow2( L_tmp, 6 + 31 - scale, &exp ); - hReverb->loopAttenuationFactor_fx[bin] = L_shl( hReverb->loopAttenuationFactor_fx[bin], exp ); // making as Q31 + L_tmp = BASOP_util_Pow2( L_tmp, sub( 6 + 31, scale ), &exp ); + hReverb->loopAttenuationFactor_fx[bin] = L_shl( L_tmp, exp ); // making as Q31 attenuationFactorPerSampleSq_fx = Mpy_32_32( attenuationFactorPerSample_fx, attenuationFactorPerSample_fx ); attenuationFactorPerSampleSq_exp = attenuationFactorPerSample_exp + attenuationFactorPerSample_exp; @@ -546,12 +557,13 @@ static void ivas_binaural_reverb_setReverbTimes_fx( L_tmp = Mpy_32_32( L_tmp, 214748364 ); // exp + 0 L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, exp, currentEnergy_fx, currentEnergy_exp, &exp ); energyBuildup_fx = BASOP_Util_Add_Mant32Exp( energyBuildup_fx, energyBuildup_exp, L_tmp, exp, &energyBuildup_exp ); - IF( BASOP_Util_Cmp_Mant32Exp( energyBuildup_fx, energyBuildup_exp, 0, 0 ) >= 0 ) /* A new filter tap is added at this condition */ + IF( energyBuildup_fx >= 0 ) /* A new filter tap is added at this condition */ { - IF( BASOP_Util_Cmp_Mant32Exp( energyBuildup_fx, energyBuildup_exp, 1, 31 ) >= 0 ) + IF( ( BASOP_Util_Cmp_Mant32Exp( energyBuildup_fx, energyBuildup_exp, 1, 31 ) > 0 ) ) { /* Four efficient phase operations: n*pi/2, n=0,1,2,3 */ hReverb->tapPhaseShiftType[bin][ch][tap] = (Word16) ( binRend_rand( hReverb ) % 4 ); + move16(); /* Set the tapPointer to point to the determined sample at the loop buffer */ hReverb->tapPointersReal_fx[bin][ch][tap] = &( hReverb->loopBufReal_fx[bin][sample] ); @@ -577,13 +589,17 @@ static void ivas_binaural_reverb_setReverbTimes_fx( reverb_exp = 0; move16(); hReverb->reverbEqGains_fx[bin] = Sqrt32( revEnes_fx[bin], &reverb_exp ); /* Determined reverb spectrum */ + move32(); hReverb->reverbEqGains_fx[bin] = BASOP_Util_Add_Mant32Exp( hReverb->reverbEqGains_fx[bin], reverb_exp, 0, 0, &reverb_exp ); + move32(); tmp = BASOP_Util_Divide3232_Scale( intendedEnergy_fx, actualizedEnergy_fx, &tmp_exp ); tmp_exp = add( tmp_exp, sub( intendedEnergy_exp, actualizedEnergy_exp ) ); hReverb->reverbEqGains_fx[bin] = BASOP_Util_Add_Mant32Exp( hReverb->reverbEqGains_fx[bin], reverb_exp, 0, 0, &reverb_exp ); + move32(); L_tmp = Sqrt32( L_deposit_h( tmp ), &tmp_exp ); hReverb->reverbEqGains_fx[bin] = Mpy_32_32( hReverb->reverbEqGains_fx[bin], L_tmp ); + move32(); reverb_exp = add( reverb_exp, tmp_exp ); L_tmp = BASOP_Util_Add_Mant32Exp( 1073741824, 1, L_negate( attenuationFactorPerSampleSq_fx ), attenuationFactorPerSampleSq_exp, &tmp_exp ); @@ -591,8 +607,10 @@ static void ivas_binaural_reverb_setReverbTimes_fx( tmp_exp = add( tmp_exp, 0 ); L_tmp = Sqrt32( L_tmp, &tmp_exp ); hReverb->reverbEqGains_fx[bin] = Mpy_32_32( L_tmp, hReverb->reverbEqGains_fx[bin] ); + move32(); reverb_exp = add( reverb_exp, tmp_exp ); hReverb->reverbEqGains_fx[bin] = L_shl( hReverb->reverbEqGains_fx[bin], reverb_exp ); // making as Q31 + move32(); } return; } @@ -613,19 +631,21 @@ static ivas_error compute_feedback_matrix_fx( Word16 i, j, x; u = MATRIX_CONSTANT; + move32(); pFeedbackMatrix[0] = u; + move32(); FOR( x = 1; x < n; x += x ) { FOR( i = 0; i < x; i++ ) { FOR( j = 0; j < x; j++ ) { - pFeedbackMatrix[( i + x ) * n + j] = pFeedbackMatrix[i * n + j]; + pFeedbackMatrix[add( i_mult( add( i, x ), n ), j )] = pFeedbackMatrix[add( i_mult( i, n ), j )]; move32(); - pFeedbackMatrix[i * n + j + x] = pFeedbackMatrix[i * n + j]; + pFeedbackMatrix[i_mult( i, n ) + j + x] = pFeedbackMatrix[add( i_mult( i, n ), j )]; move32(); - pFeedbackMatrix[( i + x ) * n + j + x] = -pFeedbackMatrix[i * n + j]; + pFeedbackMatrix[add( add( i_mult( add( i, x ), n ), j ), x )] = L_negate( pFeedbackMatrix[add( i_mult( i, n ), j )] ); move32(); } } @@ -656,7 +676,7 @@ static void compute_2_out_extract_matrix_fx( { pExtractMatrix[i] = 1; move16(); - pExtractMatrix[i + n] = ff; + pExtractMatrix[add( i, n )] = ff; move16(); ff = negate( ff ); } @@ -911,6 +931,7 @@ static ivas_error set_base_config( static Word32 calc_dmx_gain_fx( void ) { const Word32 gain = DMX_GAIN; + move32(); return gain; } #else @@ -939,18 +960,18 @@ static void calc_predelay_fx( { Word16 predelay, fbdelay, output_frame; predelay = round_fx( L_shl( Mult_32_32( L_shl( output_Fs, 15 ), acoustic_predelay_sec ), 5 ) ); - output_frame = (Word16) Mult_32_16( output_Fs, INV_FRAME_PER_SEC_Q15 ); + output_frame = extract_l( Mult_32_16( output_Fs, INV_FRAME_PER_SEC_Q15 ) ); fbdelay = pParams->pLoop_delays[sub( pParams->nr_loops, 1 )]; move16(); predelay = sub( predelay, fbdelay ); - IF( LT_16( predelay, 0 ) ) + if ( predelay < 0 ) { predelay = 0; move16(); } - IF( LT_16( output_frame, predelay ) ) + if ( LT_16( output_frame, predelay ) ) { predelay = output_frame; move16(); @@ -1025,8 +1046,10 @@ static ivas_error compute_t60_coeffs_fx( FOR( bin_idx = 0; bin_idx < tf_T60_len; bin_idx++ ) { norm_f_fx[bin_idx] = BASOP_Util_Divide3232_Scale( pFc_fx[bin_idx], freq_Nyquist_fx, &norm_f_e ); + move16(); norm_f_e = add( norm_f_e, sub( 17, 31 ) ); norm_f_fx[bin_idx] = shl( norm_f_fx[bin_idx], sub( norm_f_e, 1 ) ); // making Q14 + move16(); } FOR( loop_idx = 0; loop_idx < pParams->nr_loops; loop_idx++ ) @@ -1038,9 +1061,12 @@ static ivas_error compute_t60_coeffs_fx( FOR( bin_idx = 0; bin_idx < tf_T60_len; bin_idx++ ) { tmp = BASOP_Util_Divide3232_Scale( L_deposit_h( loop_delay_sec_fx ), targetT60_fx[bin_idx], &target_gains_db_exp[bin_idx] ); - target_gains_db_exp[bin_idx] = target_gains_db_exp[bin_idx] + ( loop_delay_sec_fx_exp - targetT60_e[bin_idx] ); - target_gains_db_fx[bin_idx] = mult( -30720, tmp ); // -60 in Q9 -> -30720 + target_gains_db_exp[bin_idx] = add( target_gains_db_exp[bin_idx], sub( loop_delay_sec_fx_exp, targetT60_e[bin_idx] ) ); + move16(); + target_gains_db_fx[bin_idx] = mult( -30720, tmp ); // -60 in Q9 -> -30720 + move16(); target_gains_db_exp[bin_idx] = add( target_gains_db_exp[bin_idx], 6 ); // Q9 -> e6 + move16(); tmp = BASOP_Util_Cmp_Mant32Exp( L_deposit_h( target_gains_db_fx[bin_idx] ), target_gains_db_exp[bin_idx], -2013265920, 7 ); IF( tmp < 0 ) @@ -1052,8 +1078,8 @@ static ivas_error compute_t60_coeffs_fx( } } - pCoeffs_a_fx = &pParams->pT60_filter_coeff_fx[2 * len * loop_idx + len]; - pCoeffs_b_fx = &pParams->pT60_filter_coeff_fx[2 * len * loop_idx]; + pCoeffs_a_fx = &pParams->pT60_filter_coeff_fx[add( shl( i_mult( len, loop_idx ), 1 ), len )]; + pCoeffs_b_fx = &pParams->pT60_filter_coeff_fx[shl( i_mult( len, loop_idx ), 1 )]; Word16 val = target_gains_db_exp[0]; move16(); @@ -1066,9 +1092,10 @@ static ivas_error compute_t60_coeffs_fx( FOR( Word16 i = 0; i < nr_fc_fft_filter; i++ ) { target_gains_db_fx[i] = shr( target_gains_db_fx[i], sub( val, target_gains_db_exp[i] ) ); + move16(); } - IF( ( error = calc_jot_t60_coeffs_fx( target_gains_db_fx, val, tf_T60_len, norm_f_fx, pCoeffs_a_fx, pCoeffs_b_fx, extract_l( freq_Nyquist_fx ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = calc_jot_t60_coeffs_fx( target_gains_db_fx, val, tf_T60_len, norm_f_fx, pCoeffs_a_fx, pCoeffs_b_fx, extract_l( freq_Nyquist_fx ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -1078,6 +1105,7 @@ static ivas_error compute_t60_coeffs_fx( FOR( loop_idx = 0; loop_idx < pParams->nr_loops; loop_idx++ ) { pParams->pLoop_delays[loop_idx] = sub( pParams->pLoop_delays[loop_idx], len ); + move16(); } return error; } @@ -1253,6 +1281,7 @@ static void calc_low_shelf_first_order_filter_fx( L_tmp = L_shl( L_tmp, shift ); tmp = extract_h( L_tmp ); pNum[0] = tmp; + move16(); norm_num0 = sub( tan_exp, sub( shift, 16 ) ); L_tmp = L_sub( tan_val, L_shl( 1, ( sub( 15, tan_exp ) ) ) ); @@ -1260,6 +1289,7 @@ static void calc_low_shelf_first_order_filter_fx( L_tmp = L_shl( L_tmp, shift ); tmp = extract_h( L_tmp ); pNum[1] = tmp; + move16(); norm_num1 = sub( tan_exp, sub( shift, 16 ) ); tmp = BASOP_Util_Divide1616_Scale( tan_val, gain_fx, &exp ); @@ -1269,6 +1299,7 @@ static void calc_low_shelf_first_order_filter_fx( L_tmp = L_shl( L_tmp, shift ); tmp = extract_h( L_tmp ); pDen[0] = tmp; + move16(); norm_den0 = sub( exp, sub( shift, 16 ) ); tmp = BASOP_Util_Divide1616_Scale( tan_val, gain_fx, &exp ); @@ -1278,23 +1309,31 @@ static void calc_low_shelf_first_order_filter_fx( L_tmp = L_shl( L_tmp, shift ); tmp = extract_h( L_tmp ); pDen[1] = tmp; + move16(); norm_den1 = sub( exp, sub( shift, 16 ) ); } /* Normalize and adjust gain to match target amplitudes */ pNum[0] = mult( BASOP_Util_Divide1616_Scale( pNum[0], pDen[0], &exp ), lin_gain_hf ); + move16(); norm_num0 = add( exp, sub( norm_num0, norm_den0 ) ); pNum[1] = mult( BASOP_Util_Divide1616_Scale( pNum[1], pDen[0], &exp ), lin_gain_hf ); + move16(); norm_num1 = add( exp, sub( norm_num1, norm_den0 ) ); pDen[1] = BASOP_Util_Divide1616_Scale( pDen[1], pDen[0], &exp ); + move16(); norm_den1 = add( exp, sub( norm_den1, norm_den0 ) ); - pNum[0] = shr( pNum[0], 1 - norm_num0 ); - pNum[1] = shr( pNum[1], 1 - norm_num1 ); - pDen[1] = shr( pDen[1], 1 - norm_den1 ); + pNum[0] = shr( pNum[0], sub( 1, norm_num0 ) ); + move16(); + pNum[1] = shr( pNum[1], sub( 1, norm_num1 ) ); + move16(); + pDen[1] = shr( pDen[1], sub( 1, norm_den1 ) ); + move16(); pDen[0] = shl( 1, 14 ); + move16(); return; } @@ -1392,10 +1431,10 @@ static ivas_error calc_jot_t60_coeffs_fx( Word16 ref_hf_min_norm_fx = BASOP_Util_Divide1616_Scale( REF_HF_MIN_FX, fNyquist_fx, &scale3 ); Word16 ref_hf_max_norm_fx = BASOP_Util_Divide1616_Scale( REF_HF_MAX_FX, fNyquist_fx, &scale4 ); - ref_lf_min_norm_fx = shl( ref_lf_min_norm_fx, scale1 - 1 ); // Q14 - ref_lf_max_norm_fx = shl( ref_lf_max_norm_fx, scale2 - 1 ); - ref_hf_min_norm_fx = shl( ref_hf_min_norm_fx, scale3 - 1 ); - ref_hf_max_norm_fx = shl( ref_hf_max_norm_fx, scale4 - 1 ); + ref_lf_min_norm_fx = shl( ref_lf_min_norm_fx, sub( scale1, 1 ) ); // Q14 + ref_lf_max_norm_fx = shl( ref_lf_max_norm_fx, sub( scale2, 1 ) ); + ref_hf_min_norm_fx = shl( ref_hf_min_norm_fx, sub( scale3, 1 ) ); + ref_hf_max_norm_fx = shl( ref_hf_max_norm_fx, sub( scale4, 1 ) ); Word32 L_tmp; Word16 f0_fx, tmp_fx, lf_target_gain_dB_fx, hf_target_gain_dB_fx, mid_crossing_gain_dB_fx; @@ -1424,11 +1463,13 @@ static ivas_error calc_jot_t60_coeffs_fx( FOR( f_idx = 0; f_idx < nrFrequencies; f_idx++ ) { + test(); IF( GE_16( pFrequencies_fx[f_idx], ref_lf_min_norm_fx ) && LE_16( pFrequencies_fx[f_idx], ref_lf_max_norm_fx ) ) { L_tmpl = L_add( L_tmpl, pH_dB_fx[f_idx] ); n_points_lf = add( n_points_lf, 1 ); } + test(); IF( GE_16( pFrequencies_fx[f_idx], ref_hf_min_norm_fx ) && LE_16( pFrequencies_fx[f_idx], ref_hf_max_norm_fx ) ) { L_tmph = L_add( L_tmph, pH_dB_fx[f_idx] ); @@ -1440,13 +1481,16 @@ static ivas_error calc_jot_t60_coeffs_fx( tmp_fx = extract_h( L_tmpl ); expl = sub( e, sub( shift, 16 ) ); lf_target_gain_dB_fx = tmp_fx; + move16(); shift = norm_l( L_tmph ); L_tmph = L_shl( L_tmph, shift ); tmp_fx = extract_h( L_tmph ); exph = sub( e, sub( shift, 16 ) ); hf_target_gain_dB_fx = tmp_fx; + move16(); + test(); IF( ( n_points_lf == 0 ) || ( n_points_hf == 0 ) ) { return IVAS_ERR_INTERNAL; @@ -1484,11 +1528,11 @@ static ivas_error calc_jot_t60_coeffs_fx( tmp_fx = mult( lf_target_gain_dB_fx, 5443 ); // expl L_tmp = BASOP_util_Pow2( L_deposit_h( tmp_fx ), expl, &e ); - lin_gain_lf_fx = (Word16) L_shr( L_tmp, 16 - e ); + lin_gain_lf_fx = extract_l( L_shr( L_tmp, sub( 16, e ) ) ); tmp_fx = mult( hf_target_gain_dB_fx, 5443 ); // exph L_tmp = BASOP_util_Pow2( L_deposit_h( tmp_fx ), exph, &e ); - lin_gain_hf_fx = (Word16) L_shr( L_tmp, sub( 16, e ) ); + lin_gain_hf_fx = extract_l( L_shr( L_tmp, sub( 16, e ) ) ); /* call low-pass iir shelf */ calc_low_shelf_first_order_filter_fx( pCoeffB_fx, pCoeffA_fx, f0_fx, lin_gain_lf_fx, lin_gain_hf_fx ); @@ -1510,27 +1554,27 @@ static ivas_error initialize_reverb_filters_fx( error = IVAS_ERR_OK; /* init correlation and coloration filters */ - IF( ( error = ivas_reverb_t2f_f2t_init( &hReverb->fft_filter_ols, hReverb->fft_size, hReverb->fft_subblock_size ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_reverb_t2f_f2t_init( &hReverb->fft_filter_ols, hReverb->fft_size, hReverb->fft_subblock_size ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_correl_0, hReverb->fft_size ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_correl_0, hReverb->fft_size ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_correl_1, hReverb->fft_size ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_correl_1, hReverb->fft_size ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_color_0, hReverb->fft_size ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_color_0, hReverb->fft_size ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_color_1, hReverb->fft_size ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = ivas_reverb_fft_filter_init( &hReverb->fft_filter_color_1, hReverb->fft_size ) ), IVAS_ERR_OK ) ) { return error; } @@ -1639,7 +1683,7 @@ static ivas_error set_feedback_delay_fx( const UWord16 branch, const Word16 fb_delay ) { - IF( branch >= hReverb->nr_of_branches ) + IF( GE_32( branch, hReverb->nr_of_branches ) ) { return IVAS_ERR_INTERNAL; } @@ -1683,7 +1727,7 @@ static ivas_error set_feedback_gain_fx( const Word32 *pGain ) { UWord16 gain_idx; - IF( branch >= hReverb->nr_of_branches ) + IF( GE_32( branch, hReverb->nr_of_branches ) ) { return IVAS_ERR_INTERNAL; } @@ -1691,6 +1735,7 @@ static ivas_error set_feedback_gain_fx( FOR( gain_idx = 0; gain_idx < hReverb->nr_of_branches; gain_idx++ ) { hReverb->gain_matrix_fx[branch][gain_idx] = pGain[gain_idx]; + move32(); } return IVAS_ERR_OK; @@ -1849,7 +1894,7 @@ static ivas_error set_mixer_level_fx( const Word16 level[] ) { UWord16 branch_idx; - IF( channel >= BINAURAL_CHANNELS ) + IF( GE_32( channel, BINAURAL_CHANNELS ) ) { return IVAS_ERR_INTERNAL; } @@ -1857,6 +1902,7 @@ static ivas_error set_mixer_level_fx( FOR( branch_idx = 0; branch_idx < hReverb->nr_of_branches; branch_idx++ ) { hReverb->mixer_fx[channel][branch_idx] = level[branch_idx]; + move16(); } return IVAS_ERR_OK; @@ -1927,7 +1973,8 @@ static void set_fft_and_datablock_sizes_fx( assert( 0 ); /* unsupported block size */ } - hReverb->fft_subblock_size = subframe_len / hReverb->num_fft_subblocks; + hReverb->fft_subblock_size = (UWord16) idiv1616( subframe_len, hReverb->num_fft_subblocks ); + move16(); return; } @@ -2117,7 +2164,7 @@ static void set_reverb_acoustic_data_fx( // 23 in Q26 tmp_flag = BASOP_Util_Cmp_Mant32Exp( L_deposit_h( exp_argument_fx ), exp_argument_e, 1543503872, 5 ); - IF( GT_16( tmp_flag, 0 ) ) + IF( tmp_flag > 0 ) { exp_argument_fx = 23552; move16(); @@ -2126,10 +2173,10 @@ static void set_reverb_acoustic_data_fx( } tmp_flag = BASOP_Util_Cmp_Mant32Exp( L_deposit_h( exp_argument_fx ), exp_argument_e, 0, 31 ); - IF( LT_16( tmp_flag, 0 ) ) + IF( tmp_flag < 0 ) { tmp_flag = BASOP_Util_Cmp_Mant32Exp( L_deposit_h( negate( exp_argument_fx ) ), exp_argument_e, 1543503872, 5 ); - IF( LT_16( tmp_flag, 0 ) ) + IF( tmp_flag < 0 ) { exp_argument_fx = -23552; move16(); @@ -2269,19 +2316,19 @@ static ivas_error setup_FDN_branches_fx( { FOR( branch_idx = 0; branch_idx < pParams->nr_loops; branch_idx++ ) { - pCoef_a = &pParams->pT60_filter_coeff_fx[2 * nr_coefs * branch_idx + nr_coefs]; /*Q14*/ - pCoef_b = &pParams->pT60_filter_coeff_fx[2 * nr_coefs * branch_idx]; /*Q14*/ + pCoef_b = &pParams->pT60_filter_coeff_fx[shl( i_mult( nr_coefs, branch_idx ), 1 )]; /*Q14*/ + pCoef_a = &pParams->pT60_filter_coeff_fx[add( shl( i_mult( nr_coefs, branch_idx ), 1 ), nr_coefs )]; /*Q14*/ - IF( ( error = set_t60_filter( hReverb, branch_idx, nr_coefs, pCoef_a, pCoef_b ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_t60_filter( hReverb, branch_idx, nr_coefs, pCoef_a, pCoef_b ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = set_feedback_delay_fx( hReverb, branch_idx, pParams->pLoop_delays[branch_idx] ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_feedback_delay_fx( hReverb, branch_idx, pParams->pLoop_delays[branch_idx] ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = set_feedback_gain_fx( hReverb, branch_idx, &( pParams->pLoop_feedback_matrix_fx[branch_idx * pParams->nr_loops] ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_feedback_gain_fx( hReverb, branch_idx, &( pParams->pLoop_feedback_matrix_fx[i_mult( branch_idx, pParams->nr_loops )] ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -2290,7 +2337,7 @@ static ivas_error setup_FDN_branches_fx( FOR( channel_idx = 0; channel_idx < pParams->nr_outputs; channel_idx++ ) { - IF( ( error = set_mixer_level_fx( hReverb, channel_idx, &( pParams->pLoop_extract_matrix_fx[channel_idx * pParams->nr_loops] ) ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_mixer_level_fx( hReverb, channel_idx, &( pParams->pLoop_extract_matrix_fx[i_mult( channel_idx, pParams->nr_loops )] ) ) ), IVAS_ERR_OK ) ) { return error; } @@ -2405,7 +2452,7 @@ ivas_error ivas_reverb_open_fx( return IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Crend Reverberator " ); } - IF( ( error = set_base_config_fx( ¶ms, output_Fs ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_base_config_fx( ¶ms, output_Fs ) ), IVAS_ERR_OK ) ) { return error; } @@ -2449,6 +2496,7 @@ ivas_error ivas_reverb_open_fx( params.pFc_fx[bin_idx] = W_extract_l( W_mult0_32_32( freq_step_fx, bin_idx ) ); /*Q14*/ } + test(); IF( hHrtf == NULL && lr_energy_and_iac_fx != NULL ) { params.pHrtf_avg_pwr_response_l_const_fx = lr_energy_and_iac_fx[0]; @@ -2468,17 +2516,23 @@ ivas_error ivas_reverb_open_fx( FOR( Word16 i = 0; i < nr_fc_fft_filter; i++ ) { params.pRt60_fx[i] = L_abs( params.pRt60_fx[i] ); + move32(); params.pDsr_fx[i] = L_abs( params.pDsr_fx[i] ); + move32(); } /* set reverb acoustic configuration based on renderer config */ pState->pConfig.roomAcoustics.override = hRenderConfig->roomAcoustics.override; + move16(); pState->pConfig.roomAcoustics.nBands = hRenderConfig->roomAcoustics.nBands; + move16(); - IF( hRenderConfig->roomAcoustics.use_er == 1 ) + IF( EQ_16( hRenderConfig->roomAcoustics.use_er, 1 ) ) { pState->pConfig.roomAcoustics.use_er = hRenderConfig->roomAcoustics.use_er; + move16(); pState->pConfig.roomAcoustics.lowComplexity = hRenderConfig->roomAcoustics.lowComplexity; + move32(); } /* set up input downmix */ @@ -2489,7 +2543,7 @@ ivas_error ivas_reverb_open_fx( /* set up jot reverb 60 filters - must be set up after set_reverb_acoustic_data() */ - IF( ( error = compute_t60_coeffs_fx( ¶ms, nr_fc_fft_filter, output_Fs ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = compute_t60_coeffs_fx( ¶ms, nr_fc_fft_filter, output_Fs ) ), IVAS_ERR_OK ) ) { return error; } @@ -2504,12 +2558,16 @@ ivas_error ivas_reverb_open_fx( FOR( int i = 0; i < nr_fc_fft_filter; i++ ) { params.pDsr_fx[i] = L_shl( params.pDsr_fx[i], params.pDsr_e[i] ); + move32(); pHrtf_avg_pwr_response_l_const[i] = L_shl( params.pHrtf_avg_pwr_response_l_const_fx[i], 5 ); /*Q23+5*/ + move32(); pHrtf_avg_pwr_response_r_const[i] = L_shl( params.pHrtf_avg_pwr_response_r_const_fx[i], 5 ); /*Q23+5*/ + move32(); } FOR( int i = 0; i < lenT60_filter_coeff; i++ ) { pT60_filter_coeff[i] = L_shl_sat( params.pT60_filter_coeff_fx[i], 17 ); + move32(); } ivas_reverb_calc_color_levels_fx( output_Fs, nr_fc_fft_filter, params.nr_loops, params.pFc_fx, params.pDsr_fx, pHrtf_avg_pwr_response_l_const, pHrtf_avg_pwr_response_r_const, params.pLoop_delays, pT60_filter_coeff, pColor_target_l_fx, pColor_target_r_fx ); @@ -2519,7 +2577,7 @@ ivas_error ivas_reverb_open_fx( free( pT60_filter_coeff ); /* Defining appropriate windowing parameters for FFT filters to prevent aliasing */ - fft_hist_size = pState->fft_size - pState->fft_subblock_size; + fft_hist_size = sub( pState->fft_size, pState->fft_subblock_size ); transition_start = round_fx( L_mult0( FFT_FILTER_WND_FLAT_REGION_FX, fft_hist_size ) ); transition_length = round_fx( L_mult0( FFT_FILTER_WND_TRANS_REGION_FX, fft_hist_size ) ); @@ -2533,11 +2591,13 @@ ivas_error ivas_reverb_open_fx( move16(); /* clear & init jot reverb fft filters */ - IF( ( error = initialize_reverb_filters_fx( pState ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = initialize_reverb_filters_fx( pState ) ), IVAS_ERR_OK ) ) { return error; } Word16 q_pFft_wf_filter_ch0_fx = 23, q_pFft_wf_filter_ch1_fx = 23; + move16(); + move16(); IF( pState->do_corr_filter ) { q_pFft_wf_filter_ch0_fx = 31; @@ -2548,17 +2608,22 @@ ivas_error ivas_reverb_open_fx( FOR( int i = 0; i < nr_fc_fft_filter; i++ ) { pFft_wf_filter_ch0_fx[i][0] = L_shl_sat( pFft_wf_filter_ch0_fx[i][0], 8 ); + move32(); pFft_wf_filter_ch0_fx[i][1] = L_shl_sat( pFft_wf_filter_ch0_fx[i][1], 8 ); + move32(); } FOR( int i = 0; i < nr_fc_fft_filter; i++ ) { pFft_wf_filter_ch1_fx[i][0] = L_shl_sat( pFft_wf_filter_ch1_fx[i][0], 8 ); + move32(); pFft_wf_filter_ch1_fx[i][1] = L_shl_sat( pFft_wf_filter_ch1_fx[i][1], 8 ); + move32(); } #ifdef MSAN_FIX FOR( int i = 0; i < shl( sub( nr_fc_fft_filter, 1 ), 1 ); i++ ) { pTime_window_fx[i] = L_shr( pTime_window_fx[i], 1 ); /*Scaling signal down to 30*/ + move32(); } #else FOR( int i = 0; i < RV_FILTER_MAX_FFT_SIZE; i++ ) @@ -2568,31 +2633,36 @@ ivas_error ivas_reverb_open_fx( #endif // MSAN_FIX Word32 *pHrtf_inter_aural_coherence_const = (Word32 *) malloc( nr_fc_fft_filter * sizeof( Word32 ) ); - FOR( int i = 0; i < nr_fc_fft_filter; i++ ) + FOR( Word16 i = 0; i < nr_fc_fft_filter; i++ ) { pHrtf_inter_aural_coherence_const[i] = L_shl( params.pHrtf_inter_aural_coherence_const_fx[i], 3 ); /*Scaling up to Q30*/ + move32(); } ivas_reverb_calc_correl_filters_fx( pHrtf_inter_aural_coherence_const, pTime_window_fx, pState->fft_size, 0, pFft_wf_filter_ch0_fx, pFft_wf_filter_ch1_fx, &q_pFft_wf_filter_ch0_fx, &q_pFft_wf_filter_ch1_fx ); free( pHrtf_inter_aural_coherence_const ); - FOR( int i = 0; i < nr_fc_fft_filter; i++ ) + FOR( Word16 i = 0; i < nr_fc_fft_filter; i++ ) { - pFft_wf_filter_ch0_fx[i][0] = L_shl( pFft_wf_filter_ch0_fx[i][0], 31 - q_pFft_wf_filter_ch0_fx ); - pFft_wf_filter_ch0_fx[i][1] = L_shl( pFft_wf_filter_ch0_fx[i][1], 31 - q_pFft_wf_filter_ch0_fx ); + pFft_wf_filter_ch0_fx[i][0] = L_shl( pFft_wf_filter_ch0_fx[i][0], sub( 31, q_pFft_wf_filter_ch0_fx ) ); + move32(); + pFft_wf_filter_ch0_fx[i][1] = L_shl( pFft_wf_filter_ch0_fx[i][1], sub( 31, q_pFft_wf_filter_ch0_fx ) ); + move32(); } - FOR( int i = 0; i < nr_fc_fft_filter; i++ ) + FOR( Word16 i = 0; i < nr_fc_fft_filter; i++ ) { - pFft_wf_filter_ch1_fx[i][0] = L_shl( pFft_wf_filter_ch1_fx[i][0], 31 - q_pFft_wf_filter_ch1_fx ); - pFft_wf_filter_ch1_fx[i][1] = L_shl( pFft_wf_filter_ch1_fx[i][1], 31 - q_pFft_wf_filter_ch1_fx ); + pFft_wf_filter_ch1_fx[i][0] = L_shl( pFft_wf_filter_ch1_fx[i][0], sub( 31, q_pFft_wf_filter_ch1_fx ) ); + move32(); + pFft_wf_filter_ch1_fx[i][1] = L_shl( pFft_wf_filter_ch1_fx[i][1], sub( 31, q_pFft_wf_filter_ch1_fx ) ); + move32(); } /* Copying the computed FFT correlation filters to the fft_filter components */ - IF( ( error = set_correl_fft_filter_fx( pState, 0, pFft_wf_filter_ch0_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_correl_fft_filter_fx( pState, 0, pFft_wf_filter_ch0_fx ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = set_correl_fft_filter_fx( pState, 1, pFft_wf_filter_ch1_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_correl_fft_filter_fx( pState, 1, pFft_wf_filter_ch1_fx ) ), IVAS_ERR_OK ) ) { return error; } @@ -2603,25 +2673,29 @@ ivas_error ivas_reverb_open_fx( ivas_reverb_calc_color_filters_fx( pColor_target_l_fx, pColor_target_r_fx, pTime_window_fx, pState->fft_size, 0, pFft_wf_filter_ch0_fx, pFft_wf_filter_ch1_fx, &q_pFft_wf_filter_ch0_fx, &q_pFft_wf_filter_ch1_fx ); FOR( int i = 0; i < nr_fc_fft_filter; i++ ) { - pFft_wf_filter_ch0_fx[i][0] = L_shl( pFft_wf_filter_ch0_fx[i][0], 31 - q_pFft_wf_filter_ch0_fx ); - pFft_wf_filter_ch0_fx[i][1] = L_shl( pFft_wf_filter_ch0_fx[i][1], 31 - q_pFft_wf_filter_ch0_fx ); + pFft_wf_filter_ch0_fx[i][0] = L_shl( pFft_wf_filter_ch0_fx[i][0], sub( 31, q_pFft_wf_filter_ch0_fx ) ); + move32(); + pFft_wf_filter_ch0_fx[i][1] = L_shl( pFft_wf_filter_ch0_fx[i][1], sub( 31, q_pFft_wf_filter_ch0_fx ) ); + move32(); } FOR( int i = 0; i < nr_fc_fft_filter; i++ ) { - pFft_wf_filter_ch1_fx[i][0] = L_shl( pFft_wf_filter_ch1_fx[i][0], 31 - q_pFft_wf_filter_ch1_fx ); - pFft_wf_filter_ch1_fx[i][1] = L_shl( pFft_wf_filter_ch1_fx[i][1], 31 - q_pFft_wf_filter_ch1_fx ); + pFft_wf_filter_ch1_fx[i][0] = L_shl( pFft_wf_filter_ch1_fx[i][0], sub( 31, q_pFft_wf_filter_ch1_fx ) ); + move32(); + pFft_wf_filter_ch1_fx[i][1] = L_shl( pFft_wf_filter_ch1_fx[i][1], sub( 31, q_pFft_wf_filter_ch1_fx ) ); + move32(); } Scale_sig32( params.pHrtf_inter_aural_coherence_fx, nr_fc_fft_filter, 4 ); /*Scaling ( *hReverb )->fft_filter_color_0.fft_spectrum_fx to Q31*/ Scale_sig32( params.pFc_fx, nr_fc_fft_filter, 17 ); /*Scaling ( *hReverb )->fft_filter_color_1.fft_spectrum_fx to Q31*/ /* Copying the computed FFT colorations filters to the fft_filter components */ - IF( ( error = set_color_fft_filter_fx( pState, 0, pFft_wf_filter_ch0_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_color_fft_filter_fx( pState, 0, pFft_wf_filter_ch0_fx ) ), IVAS_ERR_OK ) ) { return error; } - IF( ( error = set_color_fft_filter_fx( pState, 1, pFft_wf_filter_ch1_fx ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = set_color_fft_filter_fx( pState, 1, pFft_wf_filter_ch1_fx ) ), IVAS_ERR_OK ) ) { return error; } @@ -2630,7 +2704,7 @@ ivas_error ivas_reverb_open_fx( ivas_rev_delay_line_init( &( pState->predelay_line ), pState->pPredelay_buffer_fx, params.pre_delay, predelay_bf_len ); /* set up feedback delay network */ - IF( ( error = setup_FDN_branches_fx( pState, ¶ms ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = setup_FDN_branches_fx( pState, ¶ms ) ), IVAS_ERR_OK ) ) { return error; } @@ -2843,6 +2917,7 @@ void ivas_reverb_close( hReverb = *hReverb_in; + test(); IF( hReverb_in == NULL || *hReverb_in == NULL ) { return; @@ -2999,7 +3074,7 @@ static void reverb_block_fx( FOR( branch_idx = 0; branch_idx < nr_branches; branch_idx++ ) { - ppOutput_fx[branch_idx] = (Word32 *) Output_fx + branch_idx * inner_bsize; + ppOutput_fx[branch_idx] = (Word32 *) Output_fx + i_mult( branch_idx, inner_bsize ); } FOR( k = 0; k < bsize; k += inner_bsize ) @@ -3019,14 +3094,16 @@ static void reverb_block_fx( { Word32 *pOutput_i_fx = &ppOutput_fx[i][0]; Word16 mixer_0_i = hReverb->mixer_fx[0][i]; + move16(); Word16 mixer_1_i = hReverb->mixer_fx[1][i]; + move16(); /* output and feedback are same, get sample from delay line ... */ ivas_rev_delay_line_get_sample_blk_fx( &( hReverb->delay_line[i] ), inner_bsize, pTemp_fx ); ivas_reverb_iir_filt_2taps_feed_blk_fx( &( hReverb->t60[i] ), inner_bsize, pTemp_fx, ppOutput_fx[i] ); FOR( ns = 0; ns < inner_bsize; ns++ ) { - pO0[ns] = L_add( pOutput_i_fx[ns] * mixer_0_i, pO0[ns] ); /* mixer ch 0 */ - pO1[ns] = L_add( pOutput_i_fx[ns] * mixer_1_i, pO1[ns] ); /* mixer ch 1 */ + pO0[ns] = L_add( imult3216( pOutput_i_fx[ns], mixer_0_i ), pO0[ns] ); /* mixer ch 0 */ + pO1[ns] = L_add( imult3216( pOutput_i_fx[ns], mixer_1_i ), pO1[ns] ); /* mixer ch 1 */ } } @@ -3059,7 +3136,9 @@ static void reverb_block_fx( FOR( k = 0; k < hReverb->fft_filter_ols.block_size; k++ ) { pOut0_fx[k] = (Word32) L_shr( pOut0_fx[k], ( r_shift ) ); + move32(); pOut1_fx[k] = (Word32) L_shr( pOut1_fx[k], ( r_shift ) ); + move32(); } /* Applying FFT filter to each sub-frame */ FOR( blk_idx = 0; blk_idx < hReverb->num_fft_subblocks; blk_idx++ ) @@ -3179,6 +3258,7 @@ static ivas_error downmix_input_block_fx( { Word16 i, s, nchan_transport; Word32 dmx_gain_fx = hReverb->dmx_gain_fx; + move32(); SWITCH( input_audio_config ) { case IVAS_AUDIO_CONFIG_STEREO: @@ -3195,12 +3275,14 @@ static ivas_error downmix_input_block_fx( nchan_transport = audioCfg2channels( input_audio_config ); FOR( s = 0; s < hReverb->full_block_size; s++ ) { - Word32 temp = pcm_in[0][input_offset + s]; + Word32 temp = pcm_in[0][add( input_offset, s )]; + move32(); FOR( i = 1; i < nchan_transport; i++ ) { - temp = L_add( temp, pcm_in[i][input_offset + s] ); + temp = L_add( temp, pcm_in[i][add( input_offset, s )] ); } - pPcm_out[s] = Mpy_32_32( dmx_gain_fx, L_shl_sat( temp, 7 ) ) << 1; + pPcm_out[s] = L_shl( Mpy_32_32( dmx_gain_fx, L_shl_sat( temp, 7 ) ), 1 ); + move32(); } BREAK; } @@ -3212,6 +3294,7 @@ static ivas_error downmix_input_block_fx( FOR( s = 0; s < hReverb->full_block_size; s++ ) { pPcm_out[s] = Mpy_32_32( dmx_gain_fx, L_shl_sat( pcm_in[0][input_offset + s], 8 ) ); + move32(); } BREAK; } @@ -3297,13 +3380,14 @@ static void predelay_block_fx( { UWord16 i, idx, n_samples, blk_size; UWord16 max_blk_size = (UWord16) hReverb->predelay_line.Delay; - IF( max_blk_size < 2 ) + IF( LT_32( max_blk_size, 2 ) ) { IF( max_blk_size == 0 ) /* zero-length delay line: just copy the data from input to output */ { FOR( i = 0; i < hReverb->full_block_size; i++ ) { pOutput[i] = pInput[i]; + move32(); } } ELSE /* 1-sample length delay line: feed the data sample-by-sample */ @@ -3311,6 +3395,7 @@ static void predelay_block_fx( FOR( i = 0; i < hReverb->full_block_size; i++ ) { pOutput[i] = ivas_rev_delay_line_get_sample_fx( &( hReverb->predelay_line ) ); + move32(); ivas_rev_delay_line_feed_sample_fx( &( hReverb->predelay_line ), pInput[i] ); } } @@ -3318,18 +3403,23 @@ static void predelay_block_fx( ELSE /* multiple-sample length delay line: use block processing */ { idx = 0; + move16(); n_samples = hReverb->full_block_size; - WHILE( n_samples > 0 ) + WHILE( GT_16( n_samples, 0 ) ) { blk_size = n_samples; - IF( blk_size > max_blk_size ) + move16(); + if ( GT_16( blk_size, max_blk_size ) ) { blk_size = max_blk_size; + move16(); } ivas_rev_delay_line_get_sample_blk_fx( &( hReverb->predelay_line ), blk_size, &pOutput[idx] ); ivas_rev_delay_line_feed_sample_blk_fx( &( hReverb->predelay_line ), blk_size, &pInput[idx] ); - idx += blk_size; - n_samples -= blk_size; + idx = (UWord16) UL_addNsD( idx, blk_size ); + move16(); + n_samples = (UWord16) UL_subNsD( n_samples, blk_size ); + move16(); } } @@ -3407,8 +3497,10 @@ static void mix_output_block_fx( FOR( i = 0; i < hReverb->full_block_size; i++ ) { - pOutL[i] = L_add( pInL[i], ( ( pOutL[i] ) >> 2 ) ); - pOutR[i] = L_add( pInR[i], ( ( pOutR[i] ) >> 2 ) ); + pOutL[i] = L_add( pInL[i], ( L_shr( pOutL[i], 2 ) ) ); + move32(); + pOutR[i] = L_add( pInR[i], ( L_shr( pOutR[i], 2 ) ) ); + move32(); } return; @@ -3457,7 +3549,7 @@ ivas_error ivas_reverb_process_fx( Word32 tmp0_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp1_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES], tmp2_fx[L_FRAME48k / MAX_PARAM_SPATIAL_SUBFRAMES]; ivas_error error; - IF( ( error = downmix_input_block_fx( hReverb, pcm_in_fx, input_audio_config, tmp1_fx, i_ts * hReverb->full_block_size ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = downmix_input_block_fx( hReverb, pcm_in_fx, input_audio_config, tmp1_fx, i_ts * hReverb->full_block_size ) ), IVAS_ERR_OK ) ) { return error; } @@ -3472,8 +3564,8 @@ ivas_error ivas_reverb_process_fx( } ELSE { - mvr2r_Word32( tmp1_fx, &pcm_out_fx[0][i_ts * hReverb->full_block_size], hReverb->full_block_size ); - mvr2r_Word32( tmp2_fx, &pcm_out_fx[1][i_ts * hReverb->full_block_size], hReverb->full_block_size ); + mvr2r_Word32( tmp1_fx, &pcm_out_fx[0][i_mult( i_ts, hReverb->full_block_size )], hReverb->full_block_size ); + mvr2r_Word32( tmp2_fx, &pcm_out_fx[1][i_mult( i_ts, hReverb->full_block_size )], hReverb->full_block_size ); } return IVAS_ERR_OK; @@ -3716,8 +3808,8 @@ void ivas_binaural_reverb_processSubframe_fx( FOR( bin = 0; bin < hReverb->numBins; bin++ ) { /* Move the data forwards by blockSize (i.e. by the frame size of 16 CLDFB slots) */ - mvl2l( hReverb->loopBufReal_fx[bin], hReverb->loopBufReal_fx[bin] + numSlots, hReverb->loopBufLength[bin] ); - mvl2l( hReverb->loopBufImag_fx[bin], hReverb->loopBufImag_fx[bin] + numSlots, hReverb->loopBufLength[bin] ); + Copy32( hReverb->loopBufReal_fx[bin], hReverb->loopBufReal_fx[bin] + numSlots, hReverb->loopBufLength[bin] ); + Copy32( hReverb->loopBufImag_fx[bin], hReverb->loopBufImag_fx[bin] + numSlots, hReverb->loopBufLength[bin] ); /* Add the data from the end of the loop to the beginning, with an attenuation factor * according to RT60. This procedure generates an IIR decaying response. The response @@ -3739,16 +3831,20 @@ void ivas_binaural_reverb_processSubframe_fx( Word32 temp_1 = Mpy_32_32( hReverb->preDelayBufferReal_fx[idx][bin], hReverb->reverbEqGains_fx[bin] ); Word32 temp_2 = Mpy_32_32( hReverb->preDelayBufferImag_fx[idx][bin], hReverb->reverbEqGains_fx[bin] ); hReverb->loopBufReal_fx[bin][invertSampleIndex] = L_add( hReverb->loopBufReal_fx[bin][invertSampleIndex], temp_1 ); + move32(); hReverb->loopBufImag_fx[bin][invertSampleIndex] = L_add( hReverb->loopBufImag_fx[bin][invertSampleIndex], temp_2 ); + move32(); hReverb->preDelayBufferReal_fx[idx][bin] = 0; + move32(); hReverb->preDelayBufferImag_fx[idx][bin] = 0; + move32(); } /* Add every second input channel as is to the pre-delay buffer, and every second input channel with * 90 degrees phase shift to reduce energy imbalances between coherent and incoherent sounds */ FOR( ch = 0; ch < numInChannels; ch++ ) { - IF( ch % 2 ) + IF( s_and( ch, 1 ) ) { v_add_fixed( hReverb->preDelayBufferReal_fx[idx], inReal[ch][sample], hReverb->preDelayBufferReal_fx[idx], hReverb->numBins, 0 ); v_add_fixed( hReverb->preDelayBufferImag_fx[idx], inImag[ch][sample], hReverb->preDelayBufferImag_fx[idx], hReverb->numBins, 0 ); @@ -3759,7 +3855,8 @@ void ivas_binaural_reverb_processSubframe_fx( v_add_fixed( hReverb->preDelayBufferImag_fx[idx], inReal[ch][sample], hReverb->preDelayBufferImag_fx[idx], hReverb->numBins, 0 ); } } - idx = ( idx + 1 ) % hReverb->preDelayBufferLength; + idx = add( idx, 1 ) % hReverb->preDelayBufferLength; + move16(); } hReverb->preDelayBufferIndex = idx; move16(); @@ -3776,8 +3873,8 @@ void ivas_binaural_reverb_processSubframe_fx( phaseShiftTypePr = hReverb->tapPhaseShiftType[bin][ch]; /* Flush output */ - set_l( hReverb->outputBufferReal_fx[bin][ch], 0, numSlots ); - set_l( hReverb->outputBufferImag_fx[bin][ch], 0, numSlots ); + set32_fx( hReverb->outputBufferReal_fx[bin][ch], 0, numSlots ); + set32_fx( hReverb->outputBufferImag_fx[bin][ch], 0, numSlots ); /* Add from temporally decaying sparse tap locations the audio to the output. */ FOR( tapIdx = 0; tapIdx < hReverb->taps[bin][ch]; tapIdx++ ) @@ -3823,10 +3920,14 @@ void ivas_binaural_reverb_processSubframe_fx( rightIm_fx = L_add( Mpy_32_32( hReverb->binauralCoherenceDirectGains_fx[bin], hReverb->outputBufferImag_fx[bin][1][sample] ), Mpy_32_32( hReverb->binauralCoherenceCrossmixGains_fx[bin], hReverb->outputBufferImag_fx[bin][0][sample] ) ); - hReverb->outputBufferReal_fx[bin][0][sample] = leftRe_fx; // Q_in + hReverb->outputBufferReal_fx[bin][0][sample] = leftRe_fx; // Q_in + move32(); hReverb->outputBufferReal_fx[bin][1][sample] = rightRe_fx; // Q_in - hReverb->outputBufferImag_fx[bin][0][sample] = leftIm_fx; // Q_in + move32(); + hReverb->outputBufferImag_fx[bin][0][sample] = leftIm_fx; // Q_in + move32(); hReverb->outputBufferImag_fx[bin][1][sample] = rightIm_fx; // Q_in + move32(); } } } @@ -3936,6 +4037,7 @@ static ivas_error ivas_binaural_reverb_open_fx( Word32 L_tmp_BufLength = L_shl( L_shr( Mpy_32_32( revTimes_fx[bin], 1258291200 /*150.0 in Q23*/ ), 23 ), 23 ); L_tmp_BufLength = L_add( Mpy_32_32( 1556925645 /*1.45 in Q30*/, L_tmp_BufLength ), ONE_IN_Q22 ); hReverb->loopBufLength[bin] = (Word16) L_shr( L_tmp_BufLength, 22 ); + move16(); hReverb->loopBufLength[bin] = s_min( hReverb->loopBufLength[bin], hReverb->loopBufLengthMax[bin] ); /* Sparse Filter Tap Locations */ @@ -3948,7 +4050,7 @@ static ivas_error ivas_binaural_reverb_open_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural Reverberator\n" ) ); } - set_s( hReverb->tapPhaseShiftType[bin][chIdx], 0, len ); + set16_fx( hReverb->tapPhaseShiftType[bin][chIdx], 0, len ); IF( ( hReverb->tapPointersReal_fx[bin][chIdx] = (Word32 **) malloc( len * sizeof( Word32 * ) ) ) == NULL ) { @@ -4184,7 +4286,7 @@ ivas_error ivas_binaural_reverb_open_fastconv_fx( float ene_flt[CLDFB_NO_CHANNELS_MAX]; revTimes = t60; revEne = ene; - if ( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfFastConv, internal_config, false, sampling_rate, t60_flt, ene_flt ) ) != IVAS_ERR_OK ) + if ( NE_32( ( error = ivas_reverb_prepare_cldfb_params( roomAcoustics, hHrtfFastConv, internal_config, false, sampling_rate, t60_flt, ene_flt ) ), IVAS_ERR_OK ) ) { return error; } @@ -4282,6 +4384,7 @@ ivas_error ivas_binaural_reverb_open_parambin( // } // preDelay = (int16_t) roundf( 48000.0f * roomAcoustics->acousticPreDelay / CLDFB_NO_CHANNELS_MAX ); preDelay = (Word16) L_shr_r( Mpy_32_32( 1677721600 /*800 in Q21*/, roomAcoustics->acousticPreDelay_fx /*Q27*/ ), Q17 ); + move16(); } ELSE { diff --git a/lib_rend/ivas_reverb_delay_line.c b/lib_rend/ivas_reverb_delay_line.c index bb55a95cad172ee30611e891b308e56764e1b9ac..d24bbe1ec3233e9fbbdd526863dd555d5176e831 100644 --- a/lib_rend/ivas_reverb_delay_line.c +++ b/lib_rend/ivas_reverb_delay_line.c @@ -92,8 +92,9 @@ void ivas_rev_delay_line_feed_sample_fx( Word32 input /* i : the sample to feed */ ) { - pDelay->pBuffer_fx[pDelay->BufferPos++] = input; - move32(); + pDelay->pBuffer_fx[pDelay->BufferPos] = input; + pDelay->BufferPos = u_extract_l( UL_addNsD( pDelay->BufferPos, 1 ) ); + move16(); IF( GE_32( pDelay->BufferPos, pDelay->Delay ) ) { @@ -233,7 +234,7 @@ void ivas_rev_delay_line_feed_sample_blk_fx( Word32 *pDst, *pSrc; UWord16 i, pos; - pos = (UWord16) pDelay->BufferPos; + pos = pDelay->BufferPos; move16(); IF( GT_32( L_add( pos, blk_size ), pDelay->Delay ) ) /* splitting block in 2 if it exceeds buffer end limit */ @@ -242,7 +243,9 @@ void ivas_rev_delay_line_feed_sample_blk_fx( UWord16 blk_size_2; /* 2nd block at the beginning of the buffer */ blk_size_1 = (UWord16) L_sub( pDelay->Delay, pos ); + move16(); blk_size_2 = (UWord16) L_sub( blk_size, blk_size_1 ); + move16(); pDst = &pDelay->pBuffer_fx[pos]; FOR( i = 0; i < blk_size_1; i++ ) { @@ -268,6 +271,7 @@ void ivas_rev_delay_line_feed_sample_blk_fx( move32(); } pos = (UWord16) L_add( pos, blk_size ); + move16(); } pDelay->BufferPos = pos; move16(); @@ -330,7 +334,9 @@ void ivas_rev_delay_line_get_sample_blk_fx( UWord16 blk_size_2; /* 2nd block at the beginning of the buffer */ blk_size_1 = (UWord16) L_sub( pDelay->Delay, pos ); + move16(); blk_size_2 = (UWord16) L_sub( blk_size, blk_size_1 ); + move16(); pSrc = &pDelay->pBuffer_fx[pos]; IF( EQ_16( gain, ONE_IN_Q14 ) ) { @@ -352,12 +358,14 @@ void ivas_rev_delay_line_get_sample_blk_fx( FOR( i = 0; i < blk_size_1; i++ ) { output[i] = L_shl( Mpy_32_16_r( pSrc[i], gain ), 1 ); + move32(); } pSrc = &pDelay->pBuffer_fx[0]; pDst = &output[blk_size_1]; FOR( i = 0; i < blk_size_2; i++ ) { pDst[i] = L_shl( Mpy_32_16_r( pSrc[i], gain ), 1 ); + move32(); } } } @@ -378,6 +386,7 @@ void ivas_rev_delay_line_get_sample_blk_fx( FOR( i = 0; i < blk_size; i++ ) { output[i] = L_shl( Mpy_32_16_r( pSrc[i], gain ), 1 ); + move32(); } } } diff --git a/lib_rend/ivas_reverb_fft_filter.c b/lib_rend/ivas_reverb_fft_filter.c index 5a734186b73a4bcbacb77fb95708bac089d51108..62ab464da4838c13afa711e1ec6da6b571ffd2d4 100644 --- a/lib_rend/ivas_reverb_fft_filter.c +++ b/lib_rend/ivas_reverb_fft_filter.c @@ -73,22 +73,22 @@ UWord16 int_log2( if ( powerOf2 & 0x00FF ) { - l2 -= 8; + l2 = sub( l2, 8 ); } if ( powerOf2 & 0x0F0F ) { - l2 -= 4; + l2 = sub( l2, 4 ); } if ( powerOf2 & 0x3333 ) { - l2 -= 2; + l2 = sub( l2, 2 ); } if ( powerOf2 & 0x5555 ) { - l2 -= 1; + l2 = sub( l2, 1 ); } return l2; @@ -143,28 +143,34 @@ static void fft_wrapper_2ch_fx( Word32 *buffer_R_fx, const Word16 fft_size ) { - const Word16 half_sz = fft_size >> 1; + const Word16 half_sz = shr( fft_size, 1 ); Word16 k, mirror_k; Word32 left_re_fx, left_im_fx, right_re_fx, right_im_fx; DoRTFTn_fx_ivas( buffer_L_fx, buffer_R_fx, fft_size ); /* separating left and right channel spectra */ - buffer_L_fx[0] = buffer_L_fx[0] << 1; - buffer_R_fx[0] = buffer_R_fx[0] << 1; - for ( k = 1; k < half_sz; k++ ) + buffer_L_fx[0] = L_shl( buffer_L_fx[0], 1 ); + move32(); + buffer_R_fx[0] = L_shl( buffer_R_fx[0], 1 ); + move32(); + FOR( k = 1; k < half_sz; k++ ) { - mirror_k = fft_size - k; + mirror_k = sub( fft_size, k ); left_re_fx = ( L_add( buffer_L_fx[k], buffer_L_fx[mirror_k] ) ); left_im_fx = ( L_sub( buffer_R_fx[k], buffer_R_fx[mirror_k] ) ); right_re_fx = ( L_add( buffer_R_fx[k], buffer_R_fx[mirror_k] ) ); - right_im_fx = -( L_sub( buffer_L_fx[k], buffer_L_fx[mirror_k] ) ); + right_im_fx = L_negate( ( L_sub( buffer_L_fx[k], buffer_L_fx[mirror_k] ) ) ); buffer_L_fx[k] = left_re_fx; + move32(); buffer_R_fx[k] = right_re_fx; + move32(); buffer_L_fx[mirror_k] = left_im_fx; + move32(); buffer_R_fx[mirror_k] = right_im_fx; + move32(); } return; @@ -220,23 +226,31 @@ static void ifft_wrapper_2ch_fx( const Word16 fft_size ) { Word32 buffer_L_re, buffer_L_im, buffer_R_re, buffer_R_im; - const Word16 half_sz = fft_size >> 1; + const Word16 half_sz = shr( fft_size, 1 ); Word16 k, mirror_k; /* Re-arranging and adding spectra in order to obtain L/R signals as re/im ifft outputs */ - for ( k = 1; k < half_sz; k++ ) + FOR( k = 1; k < half_sz; k++ ) { - mirror_k = fft_size - k; + mirror_k = sub( fft_size, k ); buffer_L_re = buffer_L[k]; + move32(); buffer_L_im = buffer_L[mirror_k]; + move32(); buffer_R_re = buffer_R[k]; + move32(); buffer_R_im = buffer_R[mirror_k]; + move32(); buffer_L[k] = L_add( buffer_L_re, buffer_R_im ); + move32(); buffer_L[mirror_k] = L_sub( buffer_L_re, buffer_R_im ); + move32(); buffer_R[k] = L_sub( buffer_R_re, buffer_L_im ); + move32(); buffer_R[mirror_k] = L_add( buffer_R_re, buffer_L_im ); + move32(); } DoRTFTn_fx_ivas( buffer_L, buffer_R, fft_size ); @@ -295,32 +309,33 @@ static void ifft_wrapper_2ch( * Initializes t2t_f2t struct and clears history *-----------------------------------------------------------------------------------------*/ -int16_t ivas_reverb_t2f_f2t_init( +Word16 ivas_reverb_t2f_f2t_init( ivas_reverb_t2f_f2t_t *t2f_f2t, const Word16 fft_size, const Word16 block_size ) { - if ( fft_size > RV_FILTER_MAX_FFT_SIZE ) + IF( GT_16( fft_size, RV_FILTER_MAX_FFT_SIZE ) ) { return 1; } - if ( ( block_size > fft_size ) || ( fft_size - block_size > RV_FILTER_MAX_HISTORY ) ) + test(); + IF( GT_16( block_size, fft_size ) || GT_16( sub( fft_size, block_size ), RV_FILTER_MAX_HISTORY ) ) { return 2; } t2f_f2t->log2_fft_size = int_log2( fft_size ); - if ( ( 1 << t2f_f2t->log2_fft_size ) != fft_size ) + IF( NE_16( shl( 1, t2f_f2t->log2_fft_size ), fft_size ) ) { return 3; /* fft_size not a power of 2 */ } t2f_f2t->fft_size = fft_size; t2f_f2t->block_size = block_size; - t2f_f2t->hist_size = t2f_f2t->fft_size - t2f_f2t->block_size; + t2f_f2t->hist_size = sub( t2f_f2t->fft_size, t2f_f2t->block_size ); - if ( t2f_f2t->hist_size > RV_FILTER_MAX_HISTORY ) + IF( GT_16( t2f_f2t->hist_size, RV_FILTER_MAX_HISTORY ) ) { t2f_f2t->hist_size = RV_FILTER_MAX_HISTORY; } @@ -343,10 +358,12 @@ void ivas_reverb_t2f_f2t_ClearHistory( Word32 *hist_L = t2f_f2t->fft_history_L_fx; Word32 *hist_R = t2f_f2t->fft_history_R_fx; - for ( i = 0; i < t2f_f2t->hist_size; i++ ) + FOR( i = 0; i < t2f_f2t->hist_size; i++ ) { hist_L[i] = 0; + move32(); hist_R[i] = 0; + move32(); } return; @@ -431,34 +448,42 @@ void ivas_reverb_t2f_f2t_in_fx( { Word16 i; Word16 hlen = t2f_f2t->hist_size; + move16(); Word16 bsiz = t2f_f2t->block_size; + move16(); Word32 *hist_L = t2f_f2t->fft_history_L_fx; Word32 *hist_R = t2f_f2t->fft_history_R_fx; Word32 *pL, *pR; /* copy history to buffer */ - for ( i = 0; i < hlen; i++ ) + FOR( i = 0; i < hlen; i++ ) { buffer_L[i] = hist_L[i]; + move16(); buffer_R[i] = hist_R[i]; + move16(); } /* copy input to buffer */ pL = &buffer_L[hlen]; pR = &buffer_R[hlen]; - for ( i = 0; i < bsiz; i++ ) + FOR( i = 0; i < bsiz; i++ ) { pL[i] = input_L[i]; + move32(); pR[i] = input_R[i]; + move32(); } /* copy buffer to history */ pL = &buffer_L[bsiz]; pR = &buffer_R[bsiz]; - for ( i = 0; i < hlen; i++ ) + FOR( i = 0; i < hlen; i++ ) { hist_L[i] = pL[i]; + move32(); hist_R[i] = pR[i]; + move32(); } /* do FFT */ @@ -538,10 +563,12 @@ void ivas_reverb_t2f_f2t_out_fx( ifft_wrapper_2ch_fx( buffer_L, buffer_R, t2f_f2t->fft_size ); - for ( i = 0; i < t2f_f2t->block_size; i++ ) + FOR( i = 0; i < t2f_f2t->block_size; i++ ) { output_L[i] = pL[i]; + move32(); output_R[i] = pR[i]; + move32(); } return; @@ -586,7 +613,7 @@ Word16 ivas_reverb_fft_filter_init( ivas_reverb_fft_filter_t *fft_filter, const Word16 fft_size ) { - if ( fft_size > RV_FILTER_MAX_FFT_SIZE ) + IF( GT_16( fft_size, RV_FILTER_MAX_FFT_SIZE ) ) { return 1; } @@ -634,18 +661,23 @@ void ivas_reverb_fft_filter_ComplexMul_fx( Word32 t; f_spec = fft_filter->fft_size; - h = f_spec >> 1; + h = shr( f_spec, 1 ); spec = fft_filter->fft_spectrum_fx; buffer[0] = Mpy_32_32( spec[0], buffer[0] ); /* real multiply f0 DC */ + move32(); buffer[h] = Mpy_32_32( spec[h], buffer[h] ); /* real multiply f_spec Nyquist */ - j = f_spec - 1; - for ( i = 1; i < h; i++ ) /*actual complex multiply in loop */ + move32(); + j = sub( f_spec, 1 ); + FOR( i = 1; i < h; i++ ) /*actual complex multiply in loop */ { t = buffer[i]; + move32(); buffer[i] = L_sub( Mpy_32_32( t, spec[i] ), Mpy_32_32( buffer[j], spec[j] ) ); + move32(); buffer[j] = L_add( Mpy_32_32( t, spec[j] ), Mpy_32_32( buffer[j], spec[i] ) ); - j--; + move32(); + j = sub( j, 1 ); } return; @@ -698,11 +730,15 @@ void ivas_reverb_fft_filter_ConvertFFTWF_2_FFTR_fx( h = shr( fft_size, 1 ); fft_real[0] = spectrum[0][0]; + move32(); fft_real[h] = spectrum[h][0]; - for ( i = 1; i < h; i++ ) + move32(); + FOR( i = 1; i < h; i++ ) { fft_real[i] = spectrum[i][0]; - fft_real[fft_size - i] = spectrum[i][1]; + move32(); + fft_real[sub( fft_size, i )] = spectrum[i][1]; + move32(); } return; @@ -743,11 +779,14 @@ void ivas_reverb_fft_filter_CrossMix_fx( Word32 t; Word16 i; - for ( i = 0; i < fft_size; i++ ) + FOR( i = 0; i < fft_size; i++ ) { t = buffer0[i]; + move32(); buffer0[i] = L_add( t, buffer1[i] ); + move32(); buffer1[i] = L_sub( t, buffer1[i] ); + move32(); } return; diff --git a/lib_rend/ivas_reverb_filter_design.c b/lib_rend/ivas_reverb_filter_design.c index dd6f2bb2dcd4cd496254b6f771e0b2112bf2de80..8ffc766d4816d78ddfd85a35ffc10e423c40c638 100644 --- a/lib_rend/ivas_reverb_filter_design.c +++ b/lib_rend/ivas_reverb_filter_design.c @@ -250,7 +250,8 @@ static void calc_min_phase_fx( { const Word16 sine_value = getSineWord16R2( mult( add( initial_angle, shl( mult( shl( idx, 8 ), angle_increment ), 5 ) ), 20858 ) ); - pFolded_cepstrum_smoothing_win[idx + half_fft_size - cepstrum_smoothing_extent] = L_mult( sine_value, sine_value ); // q31 + pFolded_cepstrum_smoothing_win[add( idx, sub( half_fft_size, cepstrum_smoothing_extent ) )] = L_mult( sine_value, sine_value ); // q31 + move32(); } /* Padding the rest with zeros */ @@ -264,12 +265,13 @@ static void calc_min_phase_fx( FOR( idx = 0; idx < spectrum_size; idx++ ) { pCepstrum[idx] = Mpy_32_32( L_add( BASOP_Util_Log2( L_add( Mpy_32_32( pSpectrum[idx][0], pSpectrum[idx][0] ), Mpy_32_32( pSpectrum[idx][1], pSpectrum[idx][1] ) ) ), L_shl( 0, 25 ) ), LN_2_Q31 ); /* log2 = 0.693147, q = 31, value = 1488521848 */ // q =26 + move32(); } /* Extending one-sided spectrum to double-sided one */ FOR( idx = spectrum_size; idx < fft_size; idx++ ) { - pCepstrum[idx] = pCepstrum[fft_size - idx]; + pCepstrum[idx] = pCepstrum[sub( fft_size, idx )]; move32(); } Word16 guarded_bits; @@ -279,6 +281,7 @@ static void calc_min_phase_fx( FOR( Word16 j = 0; j < fft_size; j++ ) { pCepstrum[j] = L_shl( pCepstrum[j], *q_pCepstrum ); + move32(); } *q_pCepstrum = add( *q_pCepstrum, 26 ); /* Compute the real pCepstrum of the log amplitude spectrum */ @@ -290,6 +293,7 @@ static void calc_min_phase_fx( FOR( idx = 0; idx < fft_size; idx++ ) { pCepstrum[idx] = Mpy_32_32( pCepstrum[idx], scale_factor ); // q = q_pCepstrum + move32(); } #if 0 guarded_bits = L_norm_arr(pCepstrum, fft_size); @@ -307,8 +311,10 @@ static void calc_min_phase_fx( FOR( idx = 1; idx < half_fft_size; idx++ ) { - pFolded_cepstrum_re[idx] = L_shl( pCepstrum[idx], 1 ); // q = q_pCepstrum + pFolded_cepstrum_re[idx] = L_shl( pCepstrum[idx], 1 ); // q = q_pCepstrum + move32(); pFolded_cepstrum_im[idx] = L_negate( L_shl( pCepstrum[fft_size - idx], 1 ) ); // q = q_pCepstrum + move32(); /* Note: sign inverted because of fft rather than ifft used before */ } pFolded_cepstrum_re[half_fft_size] = pCepstrum[half_fft_size]; // q = q_pCepstrum @@ -329,7 +335,9 @@ static void calc_min_phase_fx( FOR( idx = 0; idx < fft_size; idx++ ) { pFolded_cepstrum_re[idx] = Mpy_32_32( pFolded_cepstrum_re[idx], pFolded_cepstrum_smoothing_win[idx] ); // q = q_pCepstrum + move32(); pFolded_cepstrum_im[idx] = Mpy_32_32( pFolded_cepstrum_im[idx], pFolded_cepstrum_smoothing_win[idx] ); // q = q_pCepstrum + move32(); } /* Convert back and isolate the phase. */ @@ -360,7 +368,8 @@ static void calc_min_phase_fx( /* Copying the img part into the output */ FOR( idx = 1; idx < half_fft_size; idx++ ) { - pMinPhase[idx] = L_add( pFolded_cepstrum_re[fft_size - idx], pFolded_cepstrum_im[idx] ); + pMinPhase[idx] = L_add( pFolded_cepstrum_re[sub( fft_size, idx )], pFolded_cepstrum_im[idx] ); + move32(); } } pMinPhase[0] = 0; @@ -440,7 +449,9 @@ static void calc_min_phase_filter_fx( /* Apply the computed phase */ pH_flt[idx][0] = Mpy_32_16_1( current_ampl, getCosWord16R2( mult( abs_s( (Word16) L_shr( pMin_phase[idx], sub( q_pMin_phase, 13 ) ) ), 20858 ) ) ); // shifting right for next function. + move32(); pH_flt[idx][1] = Mpy_32_16_1( current_ampl, getSineWord16R2( mult( (Word16) L_shr( pMin_phase[idx], sub( q_pMin_phase, 13 ) ), 20858 ) ) ); + move32(); } return; @@ -523,7 +534,7 @@ static void apply_window_fft_fx( /* Img parts */ FOR( idx = 1; idx < half_fft_size; idx++ ) { - pFilter[fft_size - idx] = pH_flt[idx][1]; + pFilter[sub( fft_size, idx )] = pH_flt[idx][1]; move32(); } *q_pFilter = 31; @@ -536,6 +547,7 @@ static void apply_window_fft_fx( FOR( Word16 j = 0; j < fft_size; j++ ) { pFilter[j] = L_shl( pFilter[j], temp ); + move32(); } *q_pFilter = add( *q_pFilter, temp ); } @@ -546,6 +558,7 @@ static void apply_window_fft_fx( FOR( idx = 0; idx < fft_size; idx++ ) { pFilter[idx] = Mpy_32_32( pWindow[idx], pFilter[idx] ); // q = q_pFilter + 30 - 31 + move32(); } *q_pFilter = add( *q_pFilter, sub( 30, 31 ) ); /* Convert back to the frequency domain */ @@ -555,6 +568,7 @@ static void apply_window_fft_fx( FOR( Word16 j = 0; j < fft_size; j++ ) { pFilter[j] = L_shl( pFilter[j], temp ); + move32(); } *q_pFilter = add( *q_pFilter, temp ); } @@ -574,7 +588,7 @@ static void apply_window_fft_fx( { pH_flt[idx][0] = pFilter[idx]; move32(); - pH_flt[idx][1] = pFilter[fft_size - idx]; + pH_flt[idx][1] = pFilter[sub( fft_size, idx )]; move32(); } @@ -666,7 +680,7 @@ static void response_step_limit_fx( const Word32 negative_step_limit_hf = 903441154; // 1.0f / positive_step_limit_hf = 1.26209271246779263; //q = 30 /* Go up from pivot frequency and limit the slope to the maximum given by T. */ - FOR( i = pivot_bin_idx + 1; i < dim_x; i++ ) + FOR( i = add( pivot_bin_idx, 1 ); i < dim_x; i++ ) { Word16 div_e; Word32 desiredChange = L_deposit_h( ( BASOP_Util_Divide3232_Scale( X[i], X[i - 1], &div_e ) ) ); @@ -688,6 +702,7 @@ static void response_step_limit_fx( move32(); temp = W_mult0_32_32( X[i - 1], change ); X[i] = (Word32) W_shr( temp, 30 ); + move32(); } } ELSE @@ -698,12 +713,13 @@ static void response_step_limit_fx( move32(); temp = W_mult0_32_32( X[i - 1], change ); X[i] = (Word32) W_shr( temp, 30 ); + move32(); } } } /* Go down from pivot frequency and limit the slope to the maximum given by T. */ - FOR( i = pivot_bin_idx - 1; i >= 0; i-- ) + FOR( i = sub( pivot_bin_idx, 1 ); i >= 0; i-- ) { Word16 div_e; Word32 desiredChange = L_deposit_h( ( BASOP_Util_Divide3232_Scale( X[i], X[i + 1], &div_e ) ) ); @@ -719,22 +735,24 @@ static void response_step_limit_fx( IF( GE_32( X[i], X[i + 1] ) ) { - IF( GT_32( change, L_shr( positive_step_limit_lf, 30 - desiredChange_q ) ) ) + IF( GT_32( change, L_shr( positive_step_limit_lf, sub( 30, desiredChange_q ) ) ) ) { change = positive_step_limit_lf; // q = 30; move32(); temp = W_mult0_32_32( X[i + 1], change ); X[i] = (Word32) W_shr( temp, 30 ); + move32(); } } ELSE { - IF( LT_32( change, L_shr( negative_step_limit_lf, 30 - desiredChange_q ) ) ) + IF( LT_32( change, L_shr( negative_step_limit_lf, sub( 30, desiredChange_q ) ) ) ) { change = negative_step_limit_lf; // q = 30; move32(); temp = W_mult0_32_32( X[i + 1], change ); X[i] = (Word32) W_shr( temp, 30 ); + move32(); } } } @@ -821,11 +839,12 @@ void ivas_reverb_define_window_fft_fx( { const Word16 sine_value = getSineWord16R2( mult( add( initial_angle, shl( mult( shl( idx, 8 ), angle_increment ), 5 ) ), 20858 ) ); // q31 - pWindow[idx + transitionStart] = L_mult( sine_value, sine_value ); + pWindow[add( idx, transitionStart )] = L_mult( sine_value, sine_value ); + move32(); } /* Padding the rest with zeros */ - FOR( idx = transitionStart + transitionLength; idx < fftLength; idx++ ) + FOR( idx = add( transitionStart, transitionLength ); idx < fftLength; idx++ ) { pWindow[idx] = 0; move32(); @@ -918,6 +937,7 @@ Word16 ivas_reverb_calc_color_filters_fx( FOR( idx = 0; idx <= half_fft_size; idx++ ) { + test(); IF( LT_32( pTargetL[idx], 0 ) || LT_32( pTargetR[idx], 0 ) ) /* Shouldn't have negative gains. */ { return 1; @@ -989,6 +1009,7 @@ Word16 ivas_reverb_calc_correl_filters_fx( half_fft_size = shr( fft_size, 1 ); FOR( idx = 0; idx <= half_fft_size; idx++ ) { + test(); IF( LT_32( pTargetICC[idx], L_negate( ONE_IN_Q30 ) ) || LT_32( ONE_IN_Q30, pTargetICC[idx] ) ) /* Shouldn't have negative gains. */ { return 1; @@ -1000,18 +1021,22 @@ Word16 ivas_reverb_calc_correl_filters_fx( temp = 1; move32(); pU[idx][0] = Sqrt32( L_shr( L_add( ONE_IN_Q30, pTargetICC[idx] ), 1 ), &temp ); + move32(); IF( temp ) { pU[idx][0] = L_shl( pU[idx][0], temp ); + move32(); } pU[idx][1] = 0; move32(); temp = 1; move32(); pV[idx][0] = Sqrt32( L_shr( L_sub( ONE_IN_Q30, pTargetICC[idx] ), 1 ), &temp ); + move32(); IF( temp ) { pV[idx][0] = L_shl( pV[idx][0], temp ); + move32(); } pV[idx][1] = 0; move32(); @@ -1189,7 +1214,9 @@ void ivas_reverb_calc_color_levels_fx( FOR( i = 0; i < nrcoefs; i++ ) { coefA[i] = pT60_filter_coeff[add( i_mult( shl( nrcoefs, 1 ), loop_idx ), add( i, nrcoefs ) )]; // q = 31 - coefB[i] = pT60_filter_coeff[add( i_mult( shl( nrcoefs, 1 ), loop_idx ), i )]; // // q = 31 + move32(); + coefB[i] = pT60_filter_coeff[add( i_mult( shl( nrcoefs, 1 ), loop_idx ), i )]; // // q = 31 + move32(); } t60_e[freq_count] = -100; move16(); @@ -1210,13 +1237,18 @@ void ivas_reverb_calc_color_levels_fx( T60_est = BASOP_Util_Divide3232_Scale( L_shl( i_mult( -3, pLoop_delays[loop_idx] ), 2 ), Mpy_32_32( Mpy_32_32( L_add( BASOP_Util_Log2( H_filter ), L_shl( temp, 25 ) ), LOG10_2_Q31 ), L_shl( output_Fs, 8 ) ), &temp ); // conversion of log2 to log10. T60_est = L_shl( T60_est, 16 ); t60[freq_idx] = BASOP_Util_Add_Mant32Exp( T60_est, temp, t60[freq_idx], t60_e[freq_idx], &result_e ); + move16(); t60_e[freq_idx] = result_e; - t60_e[freq_count] = max( result_e, t60_e[freq_count] ); + move16(); + t60_e[freq_count] = s_max( result_e, t60_e[freq_count] ); + move16(); } FOR( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) { - t60[freq_idx] = L_shr( t60[freq_idx], t60_e[freq_count] - t60_e[freq_idx] ); + t60[freq_idx] = L_shr( t60[freq_idx], sub( t60_e[freq_count], t60_e[freq_idx] ) ); + move32(); t60_e[freq_idx] = t60_e[freq_count]; + move16(); } } @@ -1224,6 +1256,7 @@ void ivas_reverb_calc_color_levels_fx( FOR( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) { t60[freq_idx] = Mpy_32_32( t60[freq_idx], L_shl( loop_count_inverted, 16 ) ); + move32(); } Word16 *pTarget_color_L_e = (Word16 *) malloc( 257 * sizeof( Word16 ) ); @@ -1232,8 +1265,8 @@ void ivas_reverb_calc_color_levels_fx( FOR( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) { Word16 temp, temp1, temp2, temp3 = 0, temp4, temp5; - move32(); - Word32 var1 = divide3232( (Word32) i_mult( -6, minDelay ), L_shr( Mpy_32_32( t60[freq_idx], L_shl( output_Fs, 11 ) ), 11 - t60_e[freq_idx] ) ); + move16(); + Word32 var1 = divide3232( (Word32) i_mult( -6, minDelay ), L_shr( Mpy_32_32( t60[freq_idx], L_shl( output_Fs, 11 ) ), sub( 11, t60_e[freq_idx] ) ) ); var1 = L_mult( (Word16) var1, LOG2_10 ); // q = 29 Word32 A0_square_est = BASOP_util_Pow2( var1, 31 - 29, &temp ); Word16 alpha_e; @@ -1250,6 +1283,7 @@ void ivas_reverb_calc_color_levels_fx( temp4 = 3; div2 = Sqrt32( Mpy_32_32( pAcoustic_dsr[freq_idx], pHrtf_avg_pwr_L[freq_idx] ), &temp4 ); pTarget_color_L[freq_idx] = (Word32) BASOP_Util_Divide3232_Scale( div2, div1, &temp5 ); + move32(); temp5 = add( temp5, sub( temp4, temp3 ) ); pTarget_color_L_e[freq_idx] = temp5; move16(); @@ -1260,6 +1294,7 @@ void ivas_reverb_calc_color_levels_fx( move16(); div2 = Sqrt32( Mpy_32_32( pAcoustic_dsr[freq_idx], pHrtf_avg_pwr_R[freq_idx] ), &temp4 ); pTarget_color_R[freq_idx] = BASOP_Util_Divide3232_Scale( div2, div1, &temp5 ); + move32(); temp5 = add( temp5, sub( temp4, temp3 ) ); pTarget_color_R_e[freq_idx] = temp5; move16(); @@ -1267,7 +1302,9 @@ void ivas_reverb_calc_color_levels_fx( FOR( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) { pTarget_color_R[freq_idx] = L_shr( L_shl( pTarget_color_R[freq_idx], 16 ), sub( 1, pTarget_color_R_e[freq_idx] ) ); // (31 - pTarget_color_R_e[freq_idx]) - 30 + move32(); pTarget_color_L[freq_idx] = L_shr( L_shl( pTarget_color_L[freq_idx], 16 ), sub( 1, pTarget_color_L_e[freq_idx] ) ); // (31 - pTarget_color_L_e[freq_idx]) - 30 + move32(); } /* Limiting the frequency response gradients Find frequency band closest to chosen pivot frequency. */ @@ -1276,7 +1313,7 @@ void ivas_reverb_calc_color_levels_fx( move16(); div1 = BASOP_Util_Divide3232_Scale( L_mult0( 1000, sub( freq_count, 1 ) ), L_shr( output_Fs, 1 ), &temp ); div1 = BASOP_Util_Add_Mant32Exp( L_shl( div1, 16 ), temp, ONE_IN_Q30, 1, &temp ); - idx_pivot = (Word16) L_shr( div1, sub( 31, temp ) ); + idx_pivot = extract_l( L_shr( div1, sub( 31, temp ) ) ); /* Perform step limiting */ response_step_limit_fx( pTarget_color_L, freq_count, RESPONSE_STEP_LIMIT_LF_FX, RESPONSE_STEP_LIMIT_HF_FX, idx_pivot ); @@ -1364,6 +1401,7 @@ void ivas_reverb_interpolate_acoustic_data_fx( Word32 rel_offset; Word16 rel_offset_e; input_idx = 0; + move16(); FOR( output_idx = 0; output_idx < output_table_size; output_idx++ ) { @@ -1393,11 +1431,12 @@ void ivas_reverb_interpolate_acoustic_data_fx( { WHILE( GT_32( pOutput_fc[output_idx], pInput_fc[input_idx + 1] ) ) { - input_idx++; + input_idx = add( input_idx, 1 ); } rel_offset = BASOP_Util_Divide3232_Scale( L_sub( pOutput_fc[output_idx], pInput_fc[input_idx] ), L_sub( pInput_fc[input_idx + 1], pInput_fc[input_idx] ), &rel_offset_e ); // q15 - rel_offset = L_shl_sat( rel_offset, 16 + rel_offset_e ); + rel_offset = L_shl_sat( rel_offset, add( 16, rel_offset_e ) ); rel_offset_e = 0; + move16(); } } Word32 mult1; @@ -1405,11 +1444,13 @@ void ivas_reverb_interpolate_acoustic_data_fx( move16(); mult1 = Mpy_32_32( rel_offset, L_sub( pInput_t60[input_idx + 1], pInput_t60[input_idx] ) ); pOutput_t60[output_idx] = BASOP_Util_Add_Mant32Exp( pInput_t60[input_idx], 5, mult1, add( 5, rel_offset_e ), &mult_e ); // 31 - (31 - rel_offset_e + 26 - 31) + move32(); pOutput_t60_e[output_idx] = mult_e; move16(); mult1 = Mpy_32_32( rel_offset, L_sub( pInput_dsr[input_idx + 1], pInput_dsr[input_idx] ) ); pOutput_dsr[output_idx] = BASOP_Util_Add_Mant32Exp( pInput_dsr[input_idx], 1, mult1, add( 1, rel_offset_e ), &mult_e ); // 31 - (31 - rel_offset_e + 26 - 31) + move32(); pOutput_dsr_e[output_idx] = mult_e; move16(); } @@ -1624,7 +1665,9 @@ void ivas_reverb_get_hrtf_set_properties_fx( Word32 avg_pwr_right[2]; Word32 IA_coherence[2]; - IF( input_audio_config == IVAS_AUDIO_CONFIG_FOA || input_audio_config == IVAS_AUDIO_CONFIG_HOA2 || input_audio_config == IVAS_AUDIO_CONFIG_HOA3 ) + test(); + test(); + IF( EQ_16( input_audio_config, IVAS_AUDIO_CONFIG_FOA ) || EQ_16( input_audio_config, IVAS_AUDIO_CONFIG_HOA2 ) || EQ_16( input_audio_config, IVAS_AUDIO_CONFIG_HOA3 ) ) { is_ambisonics = 1; move16(); @@ -1658,13 +1701,13 @@ void ivas_reverb_get_hrtf_set_properties_fx( move16(); // Word32 tbl_index = BASOP_Util_Divide3232_Scale(L_sub(norm_freq , L_shl(inp_freq_offset, 6)), L_shl(inp_freq_step, 6), &div_q);//q =15 - div_q Word32 tbl_index = Mpy_32_32( L_sub( norm_freq, L_shl( inp_freq_offset, 6 ) ), L_shl( in_freq_count, 22 ) ); // q = 11 - IF( LT_16( div_q, 0 ) ) + IF( div_q < 0 ) { tbl_index = L_shl( tbl_index, div_q ); div_q = 0; move16(); } - IF( LE_32( tbl_index, 0 ) ) /* In case of extrapolation (below 1st bin), choose nearest */ + IF( tbl_index <= 0 ) /* In case of extrapolation (below 1st bin), choose nearest */ { base_idx = 0; move32(); @@ -1730,16 +1773,24 @@ void ivas_reverb_get_hrtf_set_properties_fx( FOR( freq_idx = 0; freq_idx < 2; freq_idx++ ) { combined_channels_L_re[freq_idx] = 0; + move32(); combined_channels_R_re[freq_idx] = 0; + move32(); combined_channels_L_im[freq_idx] = 0; + move32(); combined_channels_R_im[freq_idx] = 0; + move32(); FOR( ch_index = 0; ch_index < 3; ch_index++ ) { combined_channels_L_re[freq_idx] = L_add( combined_channels_L_re[freq_idx], Mpy_32_16_1( ppHrtf_set_L_re[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); + move32(); combined_channels_R_re[freq_idx] = L_add( combined_channels_R_re[freq_idx], Mpy_32_16_1( ppHrtf_set_R_re[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); + move32(); combined_channels_L_im[freq_idx] = L_add( combined_channels_L_im[freq_idx], Mpy_32_16_1( ppHrtf_set_L_im[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); + move32(); combined_channels_R_im[freq_idx] = L_add( combined_channels_R_im[freq_idx], Mpy_32_16_1( ppHrtf_set_R_im[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); + move32(); } } @@ -1761,12 +1812,15 @@ void ivas_reverb_get_hrtf_set_properties_fx( move32(); move32(); move32(); - avg_pwr_left[freq_idx] = L_add( L_shr( L_add( Mpy_32_32( L_re, L_re ), Mpy_32_32( L_im, L_im ) ), 4 ), avg_pwr_left[freq_idx] ); // q = 23 + avg_pwr_left[freq_idx] = L_add( L_shr( L_add( Mpy_32_32( L_re, L_re ), Mpy_32_32( L_im, L_im ) ), 4 ), avg_pwr_left[freq_idx] ); // q = 23 + move32(); avg_pwr_right[freq_idx] = L_add( L_shr( L_add( Mpy_32_32( R_re, R_re ), Mpy_32_32( R_im, R_im ) ), 4 ), avg_pwr_right[freq_idx] ); // q = 23 + move32(); /* Cross product (Re part) */ C_re = L_add( Mpy_32_32( L_re, R_re ), Mpy_32_32( L_im, R_im ) ); // q = 27 IA_coherence[freq_idx] = L_add( C_re, IA_coherence[freq_idx] ); // q = 27 + move32(); } } @@ -1774,9 +1828,12 @@ void ivas_reverb_get_hrtf_set_properties_fx( FOR( freq_idx = 0; freq_idx < 2; freq_idx++ ) { Word16 sqrt_exp = 0; + move16(); Word32 var1; - avg_pwr_left[freq_idx] = Mpy_32_16_1( avg_pwr_left[freq_idx], hrtf_count_inverted ); // q = 23 + avg_pwr_left[freq_idx] = Mpy_32_16_1( avg_pwr_left[freq_idx], hrtf_count_inverted ); // q = 23 + move32(); avg_pwr_right[freq_idx] = Mpy_32_16_1( avg_pwr_right[freq_idx], hrtf_count_inverted ); // q = 23 + move32(); IF( EQ_32( avg_pwr_left[freq_idx], avg_pwr_right[freq_idx] ) ) { var1 = avg_pwr_left[freq_idx]; @@ -1791,18 +1848,25 @@ void ivas_reverb_get_hrtf_set_properties_fx( } Word16 temp; IA_coherence[freq_idx] = BASOP_Util_Divide3232_Scale( Mpy_32_16_1( IA_coherence[freq_idx], hrtf_count_inverted ), L_shl( var1, sqrt_exp ), &temp ); // q =15 - IA_coherence[freq_idx] = L_shl( IA_coherence[freq_idx], 27 - ( 15 - temp ) ); // q = 27 + move32(); + IA_coherence[freq_idx] = L_shl( IA_coherence[freq_idx], sub( 27, sub( 15, temp ) ) ); // q = 27 + move32(); /* Limiting to (0...1) range in case of small numerical errors or negative values */ IA_coherence[freq_idx] = min( IA_coherence[freq_idx], ONE_IN_Q27 ); + move32(); IA_coherence[freq_idx] = max( IA_coherence[freq_idx], 0 ); + move32(); } /* Computing weighted average of 2 nearest values (1 below + 1 above) for linear interpolation */ weight_1st = L_sub( ONE_IN_Q31, relative_pos ); // q = 31 - pOut_avg_pwr_L[out_bin_idx] = L_add( Mpy_32_32( weight_1st, avg_pwr_left[0] ), Mpy_32_32( relative_pos, avg_pwr_left[1] ) ); // q = 23 - pOut_avg_pwr_R[out_bin_idx] = L_add( Mpy_32_32( weight_1st, avg_pwr_right[0] ), Mpy_32_32( relative_pos, avg_pwr_right[1] ) ); // q = 23 + pOut_avg_pwr_L[out_bin_idx] = L_add( Mpy_32_32( weight_1st, avg_pwr_left[0] ), Mpy_32_32( relative_pos, avg_pwr_left[1] ) ); // q = 23 + move32(); + pOut_avg_pwr_R[out_bin_idx] = L_add( Mpy_32_32( weight_1st, avg_pwr_right[0] ), Mpy_32_32( relative_pos, avg_pwr_right[1] ) ); // q = 23 + move32(); out_i_a_coherence[out_bin_idx] = L_add( Mpy_32_32( weight_1st, IA_coherence[0] ), Mpy_32_32( relative_pos, IA_coherence[1] ) ); // q = 27 + move32(); } return;