diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h index f329d1343cc306433b5257dc77936fb54712d20c..772fdc83ccd53a19d163cf1b939b2a39773b5541 100644 --- a/lib_com/ivas_prot_fx.h +++ b/lib_com/ivas_prot_fx.h @@ -552,13 +552,26 @@ void filter_with_allpass_fx( Word16 q_shift ); +#ifndef FIX_ISSUE_2615_FALSE_SHIFTING Word32 stereo_dft_dmx_swb_nrg_fx( - const Word32 *dmx_k0, /* i : first subframe spectrum */ - const Word32 *dmx_k1, /* i : second subframe spectrum */ + const Word32* dmx_k0, /* i : first subframe spectrum */ + const Word32* dmx_k1, /* i : second subframe spectrum */ const Word16 frame_length, /* i : frame lanegth */ const Word16 q0, - const Word16 q1 + const Word16 q1 ); +#else +Word32 stereo_dft_dmx_swb_nrg_fx( + const Word32* dmx_k0, /* i : first subframe spectrum */ + const Word32* dmx_k1, /* i : second subframe spectrum */ + const Word16 frame_length, /* i : frame lanegth */ + const Word16 q0, + const Word16 q1, + const Word16 q_dft +); +#endif // !FIX_ISSUE_2615_FALSE_SHIFTING + + void stereo_dft_dec_core_switching_fx( CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ diff --git a/lib_com/options.h b/lib_com/options.h index a1b758cfc563aca2adef722e54399cc2355c02f1..84762f0c5d9fe1eff0bf435cf17198ec60f91345 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -96,6 +96,7 @@ #define HARMONIZE_2598_tcx_arith_decode_envelope /* FhG: harmonize tcx_arith_decode_envelope between EVS and IVAS versions */ #define HARMONIZE_2598_tcx_arith_encode_envelope /* FhG: harmonize tcx_arith_encode_envelope between EVS and IVAS versions */ #define FIX_ISSUE_2594_FALSE_COMMENT /* FhG: basop issue 2594: fixing false comments about Q value*/ +#define FIX_ISSUE_2615_FALSE_SHIFTING /* FhG: basop issue 2615: Incorrect shifting in function stereo_dft_dmx_swb_nrg_fx()*/ /* #################### End BE switches ################################## */ diff --git a/lib_dec/ivas_stereo_dft_dec_dmx_fx.c b/lib_dec/ivas_stereo_dft_dec_dmx_fx.c index 125063b3f3daafb5a5e6bd7ddd9a6ecd0a82385e..29512e189c4f522b1a3bf1e3bfb1d4500013f3a9 100644 --- a/lib_dec/ivas_stereo_dft_dec_dmx_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_dmx_fx.c @@ -125,7 +125,11 @@ void stereo_dft_unify_dmx_fx( } IF( prev_bfi ) { +#ifndef FIX_ISSUE_2615_FALSE_SHIFTING 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 ); +#else + 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, hStereoDft->q_dft ); +#endif // !FIX_ISSUE_2615_FALSE_SHIFTING } /* Analyze nature of current frame */ @@ -382,7 +386,11 @@ void stereo_dft_unify_dmx_fx( q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k1] ); /*dmx energy memory*/ +#ifndef FIX_ISSUE_2615_FALSE_SHIFTING hStereoDft->past_dmx_nrg_fx = stereo_dft_dmx_swb_nrg_fx( hStereoDft->DFT_past_DMX_fx[idx_k0], hStereoDft->DFT_past_DMX_fx[idx_k1], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), q_shift0, q_shift1 ); /* 2 * q_dft */ +#else + hStereoDft->past_dmx_nrg_fx = stereo_dft_dmx_swb_nrg_fx( hStereoDft->DFT_past_DMX_fx[idx_k0], hStereoDft->DFT_past_DMX_fx[idx_k1], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), q_shift0, q_shift1, hStereoDft->q_dft ); /* 2 * q_dft */ +#endif // !FIX_ISSUE_2615_FALSE_SHIFTING move32(); } } diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 59307c38db943614163d7db8d1c1c05002259c26..b373fd5083ad7ac515c6a53bc338f9b02788bb5b 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -1936,7 +1936,11 @@ void stereo_dft_dec_fx( move32(); IF( prev_bfi ) { +#ifndef FIX_ISSUE_2615_FALSE_SHIFTING 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 ); /* Q0 */ +#else + 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, hStereoDft->q_dft ); /* Q0 */ +#endif // !FIX_ISSUE_2615_FALSE_SHIFTING } FOR( k = 0; k < N_div; k++ ) @@ -2657,7 +2661,11 @@ void stereo_dft_dec_fx( 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] ); /*dmx energy memory*/ +#ifndef FIX_ISSUE_2615_FALSE_SHIFTING hStereoDft->past_dmx_nrg_fx = stereo_dft_dmx_swb_nrg_fx( hStereoDft->DFT_past_DMX_fx[idx_k0], hStereoDft->DFT_past_DMX_fx[idx_k1], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), q_shift0, q_shift1 ); /* 2 * q_DFT */ +#else + hStereoDft->past_dmx_nrg_fx = stereo_dft_dmx_swb_nrg_fx( hStereoDft->DFT_past_DMX_fx[idx_k0], hStereoDft->DFT_past_DMX_fx[idx_k1], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), q_shift0, q_shift1, hStereoDft->q_dft ); /* 2 * q_DFT */ +#endif // !FIX_ISSUE_2615_FALSE_SHIFTING } stereo_dft_compute_td_stefi_params_fx( hStereoDft, samp_ratio ); diff --git a/lib_dec/ivas_stereo_dft_plc_fx.c b/lib_dec/ivas_stereo_dft_plc_fx.c index 670b19e36cae2a55d2206cc238b62a8c489dd66c..8a5025fedf403a74c3fbde4e82fadc7c2bca2429 100644 --- a/lib_dec/ivas_stereo_dft_plc_fx.c +++ b/lib_dec/ivas_stereo_dft_plc_fx.c @@ -768,12 +768,22 @@ void stereo_dft_res_ecu_burst_att_fx( * ---------------------------------------------------------------*/ /*! r: total energy of downmix with maximum swb bandwidth max */ +#ifndef FIX_ISSUE_2615_FALSE_SHIFTING Word32 stereo_dft_dmx_swb_nrg_fx( const Word32 *dmx_k0, /* i : first subframe spectrum q0*/ const Word32 *dmx_k1, /* i : second subframe spectrum q1*/ const Word16 frame_length, /* i : frame lanegth Q0*/ const Word16 q0, const Word16 q1 ) +#else +Word32 stereo_dft_dmx_swb_nrg_fx( + const Word32 *dmx_k0, /* i : first subframe spectrum q0*/ + const Word32 *dmx_k1, /* i : second subframe spectrum q1*/ + const Word16 frame_length, /* i : frame lanegth Q0*/ + const Word16 q0, + const Word16 q1, + const Word16 q_dft ) +#endif // !FIX_ISSUE_2615_FALSE_SHIFTING { Word16 i; Word32 dmx_nrg; @@ -781,6 +791,7 @@ Word32 stereo_dft_dmx_swb_nrg_fx( dmx_nrg = EPSILON_FIX; move32(); test(); +#ifndef FIX_ISSUE_2615_FALSE_SHIFTING IF( q0 == 0 && q1 == 0 ) { FOR( i = 0; i < frame_length / 2; i++ ) @@ -801,7 +812,15 @@ Word32 stereo_dft_dmx_swb_nrg_fx( 1 ) ); /*3*q0 - 31*/ } } - +#else + FOR( i = 0; i < frame_length / 2; i++ ) + { + dmx_nrg = L_add( dmx_nrg, + L_shr( L_add( L_shl( Madd_32_32( Mpy_32_32( dmx_k0[2 * i], dmx_k0[2 * i] ), dmx_k0[2 * i + 1], dmx_k0[2 * i + 1] ), ( q_dft - q0 ) << 1 ), + L_shl( Madd_32_32( Mpy_32_32( dmx_k1[2 * i], dmx_k1[2 * i] ), dmx_k1[2 * i + 1], dmx_k1[2 * i + 1] ), ( q_dft - q1 ) << 1 ) ), + 1 ) ); /* Q(2*q_dft)*/ + } +#endif // !FIX_ISSUE_2615_FALSE_SHIFTING return dmx_nrg; }