From 9360ad7d9798ce754693167a593d9e025f9bf2a0 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 27 Jan 2025 15:30:46 +0530 Subject: [PATCH] Fix for 3GPP issue 1190: Frequency overshoot in MDCT-stereo @48kbps WB Link #1190 --- lib_enc/ivas_mdct_core_enc.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib_enc/ivas_mdct_core_enc.c b/lib_enc/ivas_mdct_core_enc.c index a64cf60b3..4fb6108e1 100644 --- a/lib_enc/ivas_mdct_core_enc.c +++ b/lib_enc/ivas_mdct_core_enc.c @@ -520,7 +520,7 @@ static void kernel_switch_update_transforms_fx( Word16 tcx5Win[N_TCX10_MAX / 2 + L_MDCT_OVLP_MAX]; /* temporary buffer for TCX5 windowing */ Word32 tcx5Win_32[N_TCX10_MAX / 2 + L_MDCT_OVLP_MAX]; /* temporary buffer for TCX5 windowing */ Word16 windowedTimeSignal_16[2 + L_FRAME48k]; - Word16 q_shift, q_com; + Word16 q_shift, q_com, q_temp; assert( L_subframe == nSubframes * hTcxCfg->tcx5SizeFB ); @@ -557,7 +557,8 @@ static void kernel_switch_update_transforms_fx( kernel_switch_trafo_fx( tcx5Win_32, sigR, leftOverlap, sub( s /* L_subfr. */, shr( add( leftOverlap, rightOverlap ), 1 ) ), rightOverlap, kernelType ); // *q_windowedTimeSignal + q_shift /* Move both sigR and sigI to common Q */ - q_com = s_min( *q_sig, sub( add( *q_windowedTimeSignal, q_shift ), Q1 ) ); + q_temp = add( sub( add( *q_windowedTimeSignal, q_shift ), Q1 ), L_norm_arr( sigR, L_subframe ) ); + q_com = s_min( *q_sig, q_temp ); scale_sig32( sigR, s, sub( q_com, sub( add( *q_windowedTimeSignal, q_shift ), Q1 ) ) ); scale_sig32( sigR + s, sub( L_subframe, s ), sub( q_com, *q_sig ) ); scale_sig32( sigI, L_subframe, sub( q_com, *q_sig ) ); @@ -579,7 +580,7 @@ static void kernel_switch_update_transforms_fx( } ELSE /* tcxTransType != TCX_5 */ { - Word16 q_shift, q_com; + Word16 q_shift, q_com, q_temp; #ifdef FIX_ISSUE_1157 q_shift = -Q8; #else @@ -590,7 +591,8 @@ static void kernel_switch_update_transforms_fx( kernel_switch_trafo_fx( windowedTimeSignal + 2, sigR, leftOverlap, sub( s /* L_subfr. */, shr( add( leftOverlap, rightOverlap ), 1 ) ), rightOverlap, kernelType ); // *q_windowedTimeSignal + q_shift /* Move both sigR and sigI to common Q */ - q_com = s_min( *q_sig, sub( add( *q_windowedTimeSignal, q_shift ), Q1 ) ); + q_temp = add( sub( add( *q_windowedTimeSignal, q_shift ), Q1 ), L_norm_arr( sigR, L_subframe ) ); + q_com = s_min( *q_sig, q_temp ); scale_sig32( sigR, s, sub( q_com, sub( add( *q_windowedTimeSignal, q_shift ), Q1 ) ) ); scale_sig32( sigR + s, sub( L_subframe, s ), sub( q_com, *q_sig ) ); scale_sig32( sigI, L_subframe, sub( q_com, *q_sig ) ); -- GitLab