diff --git a/lib_com/prot_fx.h b/lib_com/prot_fx.h index b27655f443eecb4f34515c0eca4ab7679128c13c..b59be807209cc4b7602440cb3c1c8d933007316b 100644 --- a/lib_com/prot_fx.h +++ b/lib_com/prot_fx.h @@ -5962,9 +5962,9 @@ void TonalMDCTConceal_Apply( ); void TonalMDCTConceal_Apply_ivas_fx( - TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ - Word32 *mdctSpectrum, /*IN/OUT*/ - Word16 *mdctSpectrum_exp, /*IN */ + TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ + Word32 *mdctSpectrum, /*IN/OUT*/ + Word16 mdctSpectrum_exp[L_FRAME48k], /*IN */ const PsychoacousticParameters *psychParamsCurrent ); /* Conceals the lost frame using the FD signal previously stored using diff --git a/lib_dec/dec_tcx_fx.c b/lib_dec/dec_tcx_fx.c index 3609184c41328879923530af84b63498a48a0f27..1ccab85534fd2d7b89a8337bc67977c7b3999970 100644 --- a/lib_dec/dec_tcx_fx.c +++ b/lib_dec/dec_tcx_fx.c @@ -4911,39 +4911,30 @@ void decoder_tcx_noiseshaping_igf_fx( set32_fx( x_fx + L_spec, 0, sub( L_frameTCX, L_spec ) ); } - Word16 prev_x_e, curr_x_e; - prev_x_e = *x_e; - move16(); - /* PLC: [TCX: Tonal Concealment] */ test(); test(); IF( bfi && st->tonal_mdct_plc_active && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { - TonalMDCTConceal_Apply_ivas_fx( st->hTonalMDCTConc, x_fx, x_e, st->hTcxCfg->psychParamsCurrent ); + Word16 tmp_x_fx_exp[L_FRAME48k], temp = -MAX_16, i; + move16(); + + set16_fx( tmp_x_fx_exp, *x_e, L_frameTCX ); + TonalMDCTConceal_Apply_ivas_fx( st->hTonalMDCTConc, x_fx, tmp_x_fx_exp, st->hTcxCfg->psychParamsCurrent ); /* If exponent has been updated after TonalMDCTConceal_Apply, then shift the spectrum to common exponent. */ - curr_x_e = *x_e; - move16(); - IF( NE_16( curr_x_e, prev_x_e ) ) + FOR( i = 0; i < L_frameTCX; i++ ) { - *x_e = s_max( curr_x_e, prev_x_e ); + temp = s_max( temp, tmp_x_fx_exp[i] ); + } + + { + *x_e = temp; + move16(); FOR( i = 0; i < L_frameTCX; i++ ) { - Word16 n_idx = st->hTonalMDCTConc->pTCI->numIndexes; - Word16 l_idx = st->hTonalMDCTConc->pTCI->lowerIndex[0]; - Word16 u_idx = st->hTonalMDCTConc->pTCI->upperIndex[n_idx - 1]; - test(); - IF( GE_16( i, l_idx ) && LE_16( i, u_idx ) ) - { - x_fx[i] = L_shr( x_fx[i], sub( *x_e, curr_x_e ) ); - move32(); - } - ELSE - { - x_fx[i] = L_shr( x_fx[i], sub( *x_e, prev_x_e ) ); - move32(); - } + x_fx[i] = L_shr( x_fx[i], sub( temp, tmp_x_fx_exp[i] ) ); + move32(); } } } diff --git a/lib_dec/ivas_mdct_core_dec.c b/lib_dec/ivas_mdct_core_dec.c index bdbea22ea01cdfcd6e1783cece221c24e0cfe004..b4400be0916daedf9eca66aa0c694c2565bc7d90 100644 --- a/lib_dec/ivas_mdct_core_dec.c +++ b/lib_dec/ivas_mdct_core_dec.c @@ -2654,44 +2654,28 @@ void ivas_mdct_core_tns_ns_fx( IF( ( bfi != 0 ) && ( st->tonal_mdct_plc_active != 0 ) ) { - Word16 q_x, q_x_old; - FOR( Word16 i = 0; i < FDNS_NPTS; i++ ) + Word16 tmp_x_fx_exp[L_FRAME48k], temp = -MAX_16, i; + move16(); + FOR( i = 0; i < FDNS_NPTS; i++ ) { st->hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e = s_max( st->hTonalMDCTConc->secondLastBlockData.scaleFactors_max_e, st->hTonalMDCTConc->secondLastBlockData.scaleFactors_exp[i] ); } - q_x_old = sub( 31, x_e[ch][0] ); - TonalMDCTConceal_Apply_ivas_fx( st->hTonalMDCTConc, x_fx[ch][0], &x_e[ch][0], st->hTcxCfg->psychParamsCurrent ); - q_x = sub( 31, x_e[ch][0] ); - // Fix to float - IF( LT_16( q_x_old, q_x ) ) + + set16_fx( tmp_x_fx_exp, x_e[ch][0], L_FRAME48k ); + TonalMDCTConceal_Apply_ivas_fx( st->hTonalMDCTConc, x_fx[ch][0], tmp_x_fx_exp, st->hTcxCfg->psychParamsCurrent ); + + FOR( i = 0; i < L_FRAME48k; i++ ) { - x_e[ch][0] = sub( 31, q_x_old ); - move16(); - FOR( Word16 i = 0; i < st->hTonalMDCTConc->pTCI->numIndexes; i++ ) - { - FOR( Word16 l = st->hTonalMDCTConc->pTCI->lowerIndex[i]; l <= st->hTonalMDCTConc->pTCI->upperIndex[i]; l++ ) - { - x_fx[ch][0][l] = L_shr( x_fx[ch][0][l], sub( q_x, q_x_old ) ); - move32(); - } - } + temp = s_max( temp, tmp_x_fx_exp[i] ); } - ELSE + { - x_e[ch][0] = sub( 31, q_x ); + x_e[ch][0] = temp; move16(); - FOR( Word16 i = 0; i < st->hTonalMDCTConc->pTCI->numIndexes; i++ ) + FOR( i = 0; i < L_FRAME48k; i++ ) { - FOR( Word16 l = 0; l < st->hTonalMDCTConc->pTCI->lowerIndex[i]; l++ ) - { - x_fx[ch][0][l] = L_shr( x_fx[ch][0][l], sub( q_x_old, q_x ) ); - move32(); - } - FOR( Word16 l = st->hTonalMDCTConc->pTCI->upperIndex[i] + 1; l < L_spec[ch]; l++ ) - { - x_fx[ch][0][l] = L_shr( x_fx[ch][0][l], sub( q_x_old, q_x ) ); - move32(); - } + x_fx[ch][0][i] = L_shr( x_fx[ch][0][i], sub( temp, tmp_x_fx_exp[i] ) ); + move32(); } } } diff --git a/lib_dec/tonalMDCTconcealment_fx.c b/lib_dec/tonalMDCTconcealment_fx.c index f4dfca6560a8adba1fdda3d0a13f28495805cc00..9b40b90f30c1f48aba42876b2067e66af471dbff 100644 --- a/lib_dec/tonalMDCTconcealment_fx.c +++ b/lib_dec/tonalMDCTconcealment_fx.c @@ -2913,9 +2913,9 @@ void TonalMDCTConceal_Apply( #ifdef IVAS_FLOAT_FIXED void TonalMDCTConceal_Apply_ivas_fx( - TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ - Word32 *mdctSpectrum, /*IN/OUT*/ - Word16 *mdctSpectrum_exp, /*IN */ + TonalMDCTConcealPtr hTonalMDCTConc, /*IN */ + Word32 *mdctSpectrum, /*IN/OUT*/ + Word16 mdctSpectrum_exp[L_FRAME_MAX], /*IN */ const PsychoacousticParameters *psychParamsCurrent ) { @@ -3081,7 +3081,8 @@ void TonalMDCTConceal_Apply_ivas_fx( /* getCosWord16 returns 1Q14*/ mdctSpectrum[l] = Mpy_32_16_1( powerSpectrum[l], getCosWord16( extract_l( currentPhase ) ) ); move32(); - *mdctSpectrum_exp = add( powerSpectrum_exp, 1 ); // getCosWord16 returns Q14 (exp is 1) + mdctSpectrum_exp[l] = add( powerSpectrum_exp, 1 ); // getCosWord16 returns Q14 (exp is 1)d + move16(); } } }