Loading lib_dec/ivas_stereo_dft_dec_dmx.c +71 −29 Original line number Diff line number Diff line Loading @@ -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 ) { Loading @@ -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(); } Loading @@ -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++ ) Loading @@ -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(); } } Loading @@ -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 ); Loading Loading @@ -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(); Loading @@ -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(); Loading @@ -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 */ Loading @@ -348,22 +367,28 @@ void stereo_dft_unify_dmx_fx( { /*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) */ 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] ); Loading Loading @@ -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; Loading @@ -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 ); } } Loading @@ -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 ) ) { Loading lib_dec/ivas_stereo_dft_dec_fx.c +436 −226 File changed.Preview size limit exceeded, changes collapsed. Show changes lib_dec/ivas_stereo_dft_plc_fx.c +75 −39 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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 ); } Loading @@ -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 ) ); } Loading @@ -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 ); Loading @@ -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; Loading @@ -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 ); Loading @@ -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 ) { Loading Loading @@ -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 */ } Loading @@ -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; Loading @@ -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 ) ) Loading @@ -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(); Loading @@ -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(); Loading @@ -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; Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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 */ { Loading @@ -451,7 +476,8 @@ static void ivas_peakfinder_fx( move16(); peakMag[*cInd] = tempMag; move32(); ( *cInd )++; ( *cInd ) = add( *( cInd ), 1 ); move16(); } /* Create output */ Loading @@ -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(); Loading Loading @@ -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(); } Loading Loading @@ -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(); Loading @@ -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(); } } Loading Loading @@ -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; Loading Loading @@ -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 ) ); } Loading Loading @@ -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++ ) { Loading lib_dec/ivas_stereo_eclvq_dec.c +18 −11 Original line number Diff line number Diff line Loading @@ -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 ); Loading Loading @@ -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 ); } Loading @@ -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 ) ) Loading @@ -339,6 +341,7 @@ void ECSQ_decode( } output[i] = sym; move16(); } } ELSE Loading @@ -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 { Loading @@ -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(); } } } Loading lib_dec/ivas_stereo_ica_dec.c +32 −12 Original line number Diff line number Diff line Loading @@ -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 ) ) Loading @@ -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(); Loading @@ -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 ) ); } Loading @@ -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; Loading Loading @@ -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 ) ) Loading @@ -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 Loading @@ -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 )) ); } Loading @@ -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 ) Loading Loading @@ -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(); } } Loading @@ -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 ) ); Loading Loading
lib_dec/ivas_stereo_dft_dec_dmx.c +71 −29 Original line number Diff line number Diff line Loading @@ -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 ) { Loading @@ -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(); } Loading @@ -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++ ) Loading @@ -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(); } } Loading @@ -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 ); Loading Loading @@ -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(); Loading @@ -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(); Loading @@ -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 */ Loading @@ -348,22 +367,28 @@ void stereo_dft_unify_dmx_fx( { /*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) */ 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] ); Loading Loading @@ -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; Loading @@ -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 ); } } Loading @@ -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 ) ) { Loading
lib_dec/ivas_stereo_dft_dec_fx.c +436 −226 File changed.Preview size limit exceeded, changes collapsed. Show changes
lib_dec/ivas_stereo_dft_plc_fx.c +75 −39 Original line number Diff line number Diff line Loading @@ -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(); Loading @@ -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 ); } Loading @@ -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 ) ); } Loading @@ -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 ); Loading @@ -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; Loading @@ -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 ); Loading @@ -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 ) { Loading Loading @@ -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 */ } Loading @@ -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; Loading @@ -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 ) ) Loading @@ -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(); Loading @@ -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(); Loading @@ -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; Loading @@ -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; Loading Loading @@ -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(); Loading @@ -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 */ { Loading @@ -451,7 +476,8 @@ static void ivas_peakfinder_fx( move16(); peakMag[*cInd] = tempMag; move32(); ( *cInd )++; ( *cInd ) = add( *( cInd ), 1 ); move16(); } /* Create output */ Loading @@ -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(); Loading Loading @@ -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(); } Loading Loading @@ -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(); Loading @@ -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(); } } Loading Loading @@ -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; Loading Loading @@ -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 ) ); } Loading Loading @@ -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++ ) { Loading
lib_dec/ivas_stereo_eclvq_dec.c +18 −11 Original line number Diff line number Diff line Loading @@ -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 ); Loading Loading @@ -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 ); } Loading @@ -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 ) ) Loading @@ -339,6 +341,7 @@ void ECSQ_decode( } output[i] = sym; move16(); } } ELSE Loading @@ -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 { Loading @@ -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(); } } } Loading
lib_dec/ivas_stereo_ica_dec.c +32 −12 Original line number Diff line number Diff line Loading @@ -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 ) ) Loading @@ -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(); Loading @@ -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 ) ); } Loading @@ -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; Loading Loading @@ -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 ) ) Loading @@ -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 Loading @@ -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 )) ); } Loading @@ -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 ) Loading Loading @@ -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(); } } Loading @@ -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 ) ); Loading