Loading lib_dec/ivas_mdct_core_dec_fx.c +53 −22 Original line number Diff line number Diff line Loading @@ -1099,10 +1099,8 @@ void ivas_mdct_core_reconstruct_fx( Word16 q_syn = 0; move16(); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 q_win = -2; move16(); Word16 q_winFB = -2; move16(); Word16 q_win; Word16 q_winFB; #else #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT Word16 q_win = -1; Loading Loading @@ -1171,15 +1169,19 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->q_old_synth = 0; move16(); } #ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Copy( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len ); // Q = st->hTcxDec->q_old_synth Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( st->hTcxDec->q_old_synth, st->Q_syn ) ); // Q = st->hTcxDec->q_old_synth #endif q_syn = st->hTcxDec->q_old_synth; move16(); set16_fx( synth_fx, 0, L_FRAME_PLUS + M ); set16_fx( synthFB_fx, 0, L_FRAME_PLUS + M ); IF( st->core != ACELP_CORE ) { #ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 q_win0, q_winFB0; #else Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDACFB ) ); // st->hTcxDec->Q_syn_Overl_TDACFB -> q_win st->hTcxDec->Q_syn_Overl_TDACFB = q_win; move16(); Loading Loading @@ -1209,11 +1211,23 @@ void ivas_mdct_core_reconstruct_fx( init_tcx_info_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], k, bfi, &tcx_offset[ch], &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] ); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN assert( nSubframes[ch] <= 2 ); q_win0 = q_win; move16(); q_winFB0 = q_winFB; move16(); q_win = -2; move16(); q_winFB = -2; move16(); #endif IF( !skip_decoding ) { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN test(); test(); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) { decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, &q_win, &q_winFB, Loading @@ -1224,11 +1238,9 @@ void ivas_mdct_core_reconstruct_fx( decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, &q_win, &q_winFB, st->hTcxDec->kernel_type[k], fUseTns[ch][k], &synth_fx[k * L_frame[ch]], &synthFB_fx[k * L_frameTCX[ch]], bfi, k, 0 ); } // Need to rescale for each subframe, because q_win/q_winFB might change for the next subframe. Other OLA buffers are rescaled each time. Scale_sig( &synth_fx[k * L_frame[ch]], add( L_frame[ch], M ), sub( st->hTcxDec->q_old_synth, q_win ) ); // q_win -> st->hTcxDec->q_old_synth Scale_sig( &synthFB_fx[k * L_frameTCX[ch]], add( L_frameTCX[ch], M ), sub( st->hTcxDec->q_old_synth, q_winFB ) ); // q_winFB -> st->hTcxDec->q_old_synth #else test(); test(); IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) { decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, q_win, Loading Loading @@ -1265,6 +1277,26 @@ void ivas_mdct_core_reconstruct_fx( } } #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN IF ( nSubframes[ch] > 1 ) { Word16 q_winN, q_winFBN; q_winN = s_min( q_win, q_win0 ); q_winFBN = s_min( q_winFB, q_winFB0 ); // Need to rescale for each subframe, because q_win/q_winFB might had changed for the next subframe. Other OLA buffers are rescaled each time. Scale_sig( synth_fx, L_frame[ch], sub( q_winN, q_win0 ) ); // q_win -> st->hTcxDec->q_old_synth Scale_sig( synthFB_fx, L_frameTCX[ch], sub( q_winFBN, q_winFB0 ) ); // q_winFB -> st->hTcxDec->q_old_synth Scale_sig( synth_fx + L_frame[ch], add( L_frame[ch], M ), sub( q_winN, q_win ) ); // q_win -> st->hTcxDec->q_old_synth Scale_sig( synthFB_fx + L_frameTCX[ch], add( L_frameTCX[ch], M ), sub( q_winFBN, q_winFB ) ); // q_winFB -> st->hTcxDec->q_old_synth q_win = q_winN; move16(); q_winFB = q_winFBN; move16(); } Copy_Scale_sig( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len, sub( q_win, st->hTcxDec->q_old_synth ) ); // Q = st->hTcxDec->q_old_synth Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( q_winFB, st->Q_syn ) ); test(); IF( ( bfi == 0 ) && st->hTonalMDCTConc != NULL ) { Loading @@ -1272,18 +1304,17 @@ void ivas_mdct_core_reconstruct_fx( } decoder_tcx_post_ivas_fx( st, synth_fx, synthFB_fx, q_winFB, NULL, bfi, MCT_flag ); // norm(synth_buf) >= q_syn - q_win // norm(synth_buf) + q_win >= q_syn sf = s_min( getScaleFactor16( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ) ), getScaleFactor16( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ) ) ); IF( LT_16( sf, 2 ) ) { q_syn = sub( sf, 2 ); q_syn = add( sf, s_min( q_win, q_winFB ) ); st->Q_syn = q_syn; move16(); } // norm(old_out) >= st->Q_syn - q_win // norm(old_out) + q_win >= st->Q_syn sf = s_min( getScaleFactor16( st->hHQ_core->old_out_fx, L_FRAME48k ), getScaleFactor16( st->hHQ_core->old_out_LB_fx, L_FRAME32k ) ); IF( LT_16( sf, sub( st->Q_syn, q_win ) ) ) { st->Q_syn = add( q_win, sf ); } st->Q_syn = add( sf, s_min( q_win, q_winFB ) ); Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( sub( -1, st->Q_syn ), st->hTcxDec->Q_syn_Overl_TDACFB ) ); // q_winFB -> Q(-1 - st->Q_syn) st->hTcxDec->Q_syn_Overl_TDACFB = sub( -1, st->Q_syn ); Loading @@ -1297,8 +1328,8 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->Q_syn_OverlFB = st->Q_syn; Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl ) ); // q_win -> st->Q_syn st->hTcxDec->Q_syn_Overl = st->Q_syn; Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, st->hTcxDec->q_old_synth ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, st->hTcxDec->q_old_synth ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_winFB ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); #else test(); Loading Loading
lib_dec/ivas_mdct_core_dec_fx.c +53 −22 Original line number Diff line number Diff line Loading @@ -1099,10 +1099,8 @@ void ivas_mdct_core_reconstruct_fx( Word16 q_syn = 0; move16(); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 q_win = -2; move16(); Word16 q_winFB = -2; move16(); Word16 q_win; Word16 q_winFB; #else #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT Word16 q_win = -1; Loading Loading @@ -1171,15 +1169,19 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->q_old_synth = 0; move16(); } #ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Copy( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len ); // Q = st->hTcxDec->q_old_synth Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( st->hTcxDec->q_old_synth, st->Q_syn ) ); // Q = st->hTcxDec->q_old_synth #endif q_syn = st->hTcxDec->q_old_synth; move16(); set16_fx( synth_fx, 0, L_FRAME_PLUS + M ); set16_fx( synthFB_fx, 0, L_FRAME_PLUS + M ); IF( st->core != ACELP_CORE ) { #ifndef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN Word16 q_win0, q_winFB0; #else Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( q_win, st->hTcxDec->Q_syn_Overl_TDACFB ) ); // st->hTcxDec->Q_syn_Overl_TDACFB -> q_win st->hTcxDec->Q_syn_Overl_TDACFB = q_win; move16(); Loading Loading @@ -1209,11 +1211,23 @@ void ivas_mdct_core_reconstruct_fx( init_tcx_info_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], k, bfi, &tcx_offset[ch], &tcx_offsetFB[ch], &L_frame[ch], &L_frameTCX[ch], &left_rect[ch], &L_spec[ch] ); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN assert( nSubframes[ch] <= 2 ); q_win0 = q_win; move16(); q_winFB0 = q_winFB; move16(); q_win = -2; move16(); q_winFB = -2; move16(); #endif IF( !skip_decoding ) { #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN test(); test(); #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) { decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, &q_win, &q_winFB, Loading @@ -1224,11 +1238,9 @@ void ivas_mdct_core_reconstruct_fx( decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, &q_win, &q_winFB, st->hTcxDec->kernel_type[k], fUseTns[ch][k], &synth_fx[k * L_frame[ch]], &synthFB_fx[k * L_frameTCX[ch]], bfi, k, 0 ); } // Need to rescale for each subframe, because q_win/q_winFB might change for the next subframe. Other OLA buffers are rescaled each time. Scale_sig( &synth_fx[k * L_frame[ch]], add( L_frame[ch], M ), sub( st->hTcxDec->q_old_synth, q_win ) ); // q_win -> st->hTcxDec->q_old_synth Scale_sig( &synthFB_fx[k * L_frameTCX[ch]], add( L_frameTCX[ch], M ), sub( st->hTcxDec->q_old_synth, q_winFB ) ); // q_winFB -> st->hTcxDec->q_old_synth #else test(); test(); IF( ( EQ_16( hCPE->nchan_out, 1 ) && EQ_16( st->hTcxDec->kernel_type[k], MDST_IV ) ) || EQ_16( st->hTcxCfg->tcx_last_overlap_mode, TRANSITION_OVERLAP ) ) { decoder_tcx_imdct_fx( st, L_frame_global[ch], L_frame_globalTCX[ch], L_spec[ch], tcx_offset[ch], tcx_offsetFB[ch], L_frame[ch], L_frameTCX[ch], left_rect[ch], x_fx[ch][k], q_x, xn_buf_fx, q_win, Loading Loading @@ -1265,6 +1277,26 @@ void ivas_mdct_core_reconstruct_fx( } } #ifdef FIX_1348_BIT_PRECISION_IMPROVEMENT_QWIN IF ( nSubframes[ch] > 1 ) { Word16 q_winN, q_winFBN; q_winN = s_min( q_win, q_win0 ); q_winFBN = s_min( q_winFB, q_winFB0 ); // Need to rescale for each subframe, because q_win/q_winFB might had changed for the next subframe. Other OLA buffers are rescaled each time. Scale_sig( synth_fx, L_frame[ch], sub( q_winN, q_win0 ) ); // q_win -> st->hTcxDec->q_old_synth Scale_sig( synthFB_fx, L_frameTCX[ch], sub( q_winFBN, q_winFB0 ) ); // q_winFB -> st->hTcxDec->q_old_synth Scale_sig( synth_fx + L_frame[ch], add( L_frame[ch], M ), sub( q_winN, q_win ) ); // q_win -> st->hTcxDec->q_old_synth Scale_sig( synthFB_fx + L_frameTCX[ch], add( L_frameTCX[ch], M ), sub( q_winFBN, q_winFB ) ); // q_winFB -> st->hTcxDec->q_old_synth q_win = q_winN; move16(); q_winFB = q_winFBN; move16(); } Copy_Scale_sig( st->hTcxDec->old_synth, synth_buf_fx, st->hTcxDec->old_synth_len, sub( q_win, st->hTcxDec->q_old_synth ) ); // Q = st->hTcxDec->q_old_synth Copy_Scale_sig( st->hTcxDec->old_synthFB_fx, synth_bufFB_fx, st->hTcxDec->old_synth_lenFB, sub( q_winFB, st->Q_syn ) ); test(); IF( ( bfi == 0 ) && st->hTonalMDCTConc != NULL ) { Loading @@ -1272,18 +1304,17 @@ void ivas_mdct_core_reconstruct_fx( } decoder_tcx_post_ivas_fx( st, synth_fx, synthFB_fx, q_winFB, NULL, bfi, MCT_flag ); // norm(synth_buf) >= q_syn - q_win // norm(synth_buf) + q_win >= q_syn sf = s_min( getScaleFactor16( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ) ), getScaleFactor16( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ) ) ); IF( LT_16( sf, 2 ) ) { q_syn = sub( sf, 2 ); q_syn = add( sf, s_min( q_win, q_winFB ) ); st->Q_syn = q_syn; move16(); } // norm(old_out) >= st->Q_syn - q_win // norm(old_out) + q_win >= st->Q_syn sf = s_min( getScaleFactor16( st->hHQ_core->old_out_fx, L_FRAME48k ), getScaleFactor16( st->hHQ_core->old_out_LB_fx, L_FRAME32k ) ); IF( LT_16( sf, sub( st->Q_syn, q_win ) ) ) { st->Q_syn = add( q_win, sf ); } st->Q_syn = add( sf, s_min( q_win, q_winFB ) ); Scale_sig( st->hTcxDec->syn_Overl_TDACFB, L_FRAME_MAX / 2, sub( sub( -1, st->Q_syn ), st->hTcxDec->Q_syn_Overl_TDACFB ) ); // q_winFB -> Q(-1 - st->Q_syn) st->hTcxDec->Q_syn_Overl_TDACFB = sub( -1, st->Q_syn ); Loading @@ -1297,8 +1328,8 @@ void ivas_mdct_core_reconstruct_fx( st->hTcxDec->Q_syn_OverlFB = st->Q_syn; Scale_sig( st->hTcxDec->syn_Overl, L_FRAME32k / 2, sub( st->Q_syn, st->hTcxDec->Q_syn_Overl ) ); // q_win -> st->Q_syn st->hTcxDec->Q_syn_Overl = st->Q_syn; Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, st->hTcxDec->q_old_synth ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, st->hTcxDec->q_old_synth ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( synth_buf_fx, add( add( st->hTcxDec->old_synth_len, L_FRAME_PLUS ), M ), sub( q_syn, q_win ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( synth_bufFB_fx, add( add( st->hTcxDec->old_synth_lenFB, L_FRAME_PLUS ), M ), sub( q_syn, q_winFB ) ); // st->hTcxDec->q_old_synth -> q_syn Scale_sig( st->syn, M + 1, add( st->Q_syn, 2 ) ); #else test(); Loading