diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 6e9e94516b4d59028029c0094ecd18a0fc282307..8d39bc559efb9372fdc5264d7318e54555fd8918 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -2033,7 +2033,8 @@ int16_t res_bpf_adapt( Word16 res_bpf_adapt_ivas_fx( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo decoder handle */ const Word32 *bpf_error_signal_8k, /* i : BPF modification signal */ - Word32 res_buf[STEREO_DFT_N_8k] /* i : residual buffer Q12 */ + Word32 res_buf[STEREO_DFT_N_8k], /* i : residual buffer Q_res */ + Word16 q_res ); #endif void bpf_pitch_coherence( diff --git a/lib_dec/bass_psfilter.c b/lib_dec/bass_psfilter.c index 3b161b7822840ce7c124c3ddb724414c3108f42e..47ca645bc800f7b3e21c4bc64d4b06c7f365dd7c 100644 --- a/lib_dec/bass_psfilter.c +++ b/lib_dec/bass_psfilter.c @@ -684,8 +684,8 @@ int16_t res_bpf_adapt( Word16 res_bpf_adapt_ivas_fx( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: DFT stereo decoder handle */ const Word32 *bpf_error_signal_8k, /* i : BPF modification signal */ - Word32 res_buf[STEREO_DFT_N_8k] /* i : residual buffer Q12 */ -) + Word32 res_buf[STEREO_DFT_N_8k], /* i : residual buffer Q12 */ + Word16 q_res ) { Word32 error_nrg; Word32 tmp; @@ -696,7 +696,6 @@ Word16 res_bpf_adapt_ivas_fx( Word16 i_start; Word16 i_end; Word16 bw_inv; - Word16 shift; Word64 W_tmp; IF( EQ_16( hStereoDft->res_cod_band_max, 6 ) ) @@ -726,10 +725,7 @@ Word16 res_bpf_adapt_ivas_fx( W_tmp = W_add_nosat( W_tmp, W_mult0_32_32( res_buf[i], res_buf[i] ) ); } - shift = W_norm( W_tmp ); - W_tmp = W_shl( W_tmp, shift ); - res_hb_nrg = W_extract_h( W_tmp ); - res_hb_nrg = L_shr( res_hb_nrg, sub( add( Q24, shift ), 32 ) ); // Q0 + res_hb_nrg = (Word32) W_shr( W_tmp, shl( q_res, 1 ) ); // Q0 res_hb_nrg = Mpy_32_16_1( res_hb_nrg, bw_inv ); res_hb_nrg = L_add( Mpy_32_16_1( res_hb_nrg, STEREO_DFT_BPF_ADAPT_ALPHA_FX ), Mpy_32_16_1( hStereoDft->res_hb_nrg_mem_fx, sub( MAX_16, STEREO_DFT_BPF_ADAPT_ALPHA_FX ) ) ); hStereoDft->res_hb_nrg_mem_fx = res_hb_nrg; diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 19973a3df292d8cb1dba29c7bb96646eda35db12..87cc8fc2c5ed46753a4d5e515ced74668750874b 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -1403,7 +1403,7 @@ void stereo_dft_dec_res_fx( 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, hCPE->hCoreCoder[0]->stab_fac_fx, &hCPE->hStereoDft->stab_fac_smooth_res_fx, hCPE->hCoreCoder[0]->last_coder_type, 0, bpf_error_signal_8k_16 ); Copy_Scale_sig_16_32( bpf_error_signal_8k_16, bpf_error_signal_8k, L_FRAME8k, Q15 ); - res_bpf_flag = res_bpf_adapt_ivas_fx( hCPE->hStereoDft, bpf_error_signal_8k, res_buf ); + res_bpf_flag = res_bpf_adapt_ivas_fx( hCPE->hStereoDft, bpf_error_signal_8k, res_buf, q_res ); IF( prev_bfi ) { diff --git a/lib_dec/ivas_stereo_dft_plc_fx.c b/lib_dec/ivas_stereo_dft_plc_fx.c index d46c25879334a2e75b976875a27b99a722b31c6a..de5dae9ecb6c0d8fc9ba80fd3ab24bfbc5aded2c 100644 --- a/lib_dec/ivas_stereo_dft_plc_fx.c +++ b/lib_dec/ivas_stereo_dft_plc_fx.c @@ -655,12 +655,12 @@ void stereo_dft_res_subst_spec_fx( Word32 op; Word16 q_div, q_shift; /* For 1st subframe, apply reversed time ECU to get correct analysis window */ - f_frac = extract_l( L_shr( L_sub( plocsi[i], L_shl( plocs[i], Q16 ) ), 1 ) ); - peak_phase = BASOP_util_atan2( p_mem[2 * plocs[i] + 1], p_mem[2 * plocs[i]], 0 ); - phase_tmp = L_sub( peak_phase, mult( f_frac, STEREO_DFT_PLC_PH_C_FX ) ); - phase = L_sub( phase_tmp, mult( f_frac, EVS_PI_FX ) ); - op = L_negate( L_shl( phase, 1 ) ); - corr_phase = L_add( L_add( STEREO_DFT_PLC_STEP21, L_ana ), time_offs ); + f_frac = extract_l( L_shr( L_sub( plocsi[i], L_shl( plocs[i], Q16 ) ), 1 ) ); // Q15 + peak_phase = BASOP_util_atan2( p_mem[2 * plocs[i] + 1], p_mem[2 * plocs[i]], 0 ); // Q13 + phase_tmp = L_sub( peak_phase, mult( f_frac, STEREO_DFT_PLC_PH_C_FX ) ); // Q13 + phase = L_sub( phase_tmp, mult( f_frac, EVS_PI_FX ) ); // Q13 + op = L_negate( L_shl( phase, 1 ) ); // Q13 + corr_phase = L_add( L_add( STEREO_DFT_PLC_STEP21, L_ana ), time_offs ); // Q0 q_shift = norm_l( corr_phase ); corr_phase = Mpy_32_32( L_shl( corr_phase, q_shift ), plocsi[i] ); corr_phase = L_deposit_l( BASOP_Util_Divide3232_Scale( corr_phase, L_ana, &q_div ) ); @@ -680,13 +680,23 @@ void stereo_dft_res_subst_spec_fx( } ELSE { + /* corr_phase = PI2 * ( L_ana + time_offs ) * ( plocsi[i] / L_ana ); */ Word32 op = L_add( L_ana, time_offs ); Word16 q_div; op = Mpy_32_32( L_shl( op, Q15 ), plocsi[i] ); corr_phase = BASOP_Util_Divide3232_Scale( op, L_ana, &q_div ); corr_phase = extract_l( L_and( L_shl( corr_phase, q_div ), MAX_16 ) ); /* For 2nd subframe, do regular phase shift */ - corr_phase = L_negate( L_shr( L_mult0( extract_l( corr_phase ), EVS_PI_FX ), Q14 ) ); + /* Multiplying only with EVS_PI_Fx and taking care of 2 in shift */ + corr_phase = ( L_shr( L_mult0( extract_l( corr_phase ), EVS_PI_FX ), Q14 /* Q13 + Q1*/ ) ); + WHILE( LT_32( corr_phase, -EVS_PI_FX ) ) + { + corr_phase = L_add( L_add( corr_phase, EVS_PI_FX ), EVS_PI_FX ); + } + WHILE( GT_32( corr_phase, EVS_PI_FX ) ) + { + corr_phase = L_sub( L_sub( corr_phase, EVS_PI_FX ), EVS_PI_FX ); + } conj_sign = MAX_32; move32(); }