diff --git a/lib_enc/ivas_mct_core_enc.c b/lib_enc/ivas_mct_core_enc.c index 48a7abc42f48ce40c9d1804b2551036cd98474a0..40153a3c69be115415439e11d2e3783fb5541ef5 100755 --- a/lib_enc/ivas_mct_core_enc.c +++ b/lib_enc/ivas_mct_core_enc.c @@ -334,8 +334,7 @@ void ivas_mct_core_enc( for ( ch = 0; ch < nChannels; ch++ ) { - if ( - sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) + if ( sts[ch]->mct_chan_mode == MCT_CHAN_MODE_IGNORE ) { continue; } @@ -359,16 +358,21 @@ void ivas_mct_core_enc( } else { - /* power spectrum: MDCT^2 + MDST^2 */ - powerSpecMsInv[ch][n][0] = inv_spectrum[ch][n][0] * inv_spectrum[ch][n][0]; - - for ( i = 1; i < L_subframeTCX - 1; i++ ) +#ifdef FIX_483b + if ( hMCT->currBlockDataCnt > 0 ) +#endif { - mdst = ( inv_spectrum[ch][n][i + 1] - inv_spectrum[ch][n][i - 1] ); /* An MDST estimate */ - powerSpecMsInv[ch][n][i] = mdst * mdst + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; - } + /* power spectrum: MDCT^2 + MDST^2 */ + powerSpecMsInv[ch][n][0] = inv_spectrum[ch][n][0] * inv_spectrum[ch][n][0]; + + for ( i = 1; i < L_subframeTCX - 1; i++ ) + { + mdst = ( inv_spectrum[ch][n][i + 1] - inv_spectrum[ch][n][i - 1] ); /* An MDST estimate */ + powerSpecMsInv[ch][n][i] = mdst * mdst + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; + } - powerSpecMsInv[ch][n][L_subframeTCX - 1] = inv_spectrum[ch][n][L_subframeTCX - 1] * inv_spectrum[ch][n][L_subframeTCX - 1]; + powerSpecMsInv[ch][n][L_subframeTCX - 1] = inv_spectrum[ch][n][L_subframeTCX - 1] * inv_spectrum[ch][n][L_subframeTCX - 1]; + } /* power spectrum: MDCT^2 + MDST^2 */ powerSpec[ch][n * L_subframeTCX] = sts[ch]->hTcxEnc->spectrum[n][0] * sts[ch]->hTcxEnc->spectrum[n][0]; diff --git a/lib_enc/ivas_mct_enc_mct.c b/lib_enc/ivas_mct_enc_mct.c old mode 100644 new mode 100755 index 228f48b305453884a1c4a8fef64abc9b2a22190b..50982e2e52f08ace13a7ef232d7bc34f4a3831d4 --- a/lib_enc/ivas_mct_enc_mct.c +++ b/lib_enc/ivas_mct_enc_mct.c @@ -700,6 +700,9 @@ void apply_MCT_enc( { v_multc( sts[ch]->hTcxEnc->spectrum[k], qratio, sts[ch]->hTcxEnc->spectrum[k], L_subframeTCX ); v_multc( mdst_spectrum[ch][k], qratio, mdst_spectrum[ch][k], L_subframeTCX ); +#ifdef FIX_483b + set_zero( inv_spectrum[ch][k], L_subframeTCX ); +#endif } hMCT->mc_global_ild[ch] = 0; } diff --git a/lib_enc/ivas_stereo_mdct_core_enc.c b/lib_enc/ivas_stereo_mdct_core_enc.c old mode 100644 new mode 100755 index 03fcad485a8493450e60aa5f673c257d11a2444c..c8e3dcfcd4423d95102842b379a6f6aa37369edc --- a/lib_enc/ivas_stereo_mdct_core_enc.c +++ b/lib_enc/ivas_stereo_mdct_core_enc.c @@ -223,6 +223,10 @@ void stereo_mdct_core_enc( inv_spectrum[ch][1] = quantized_spectrum[ch][1]; mdst_spectrum[ch][0] = mdst_spectrum_long[ch]; mdst_spectrum[ch][1] = mdst_spectrum_long[ch] + N_TCX10_MAX; +#ifdef FIX_483b + sts[ch]->hTcxEnc->tns_ms_flag[0] = 0; + sts[ch]->hTcxEnc->tns_ms_flag[1] = 0; +#endif } @@ -275,7 +279,11 @@ void stereo_mdct_core_enc( for ( n = 0; n < nSubframes; n++ ) { +#ifdef FIX_483b + if ( sts[ch]->hTcxEnc->tns_ms_flag[n] ) +#else if ( !sts[ch]->hTcxEnc->fUseTns[n] ) +#endif { /* power spectrum: MDCT^2 + MDST^2 */ for ( i = 0; i < L_subframeTCX; i++ ) @@ -286,14 +294,19 @@ void stereo_mdct_core_enc( } else { - /* power spectrum: MDCT^2 + MDST^2 */ - powerSpecMsInv[ch][n][0] = inv_spectrum[ch][n][0] * inv_spectrum[ch][n][0]; - for ( i = 1; i < L_subframeTCX - 1; i++ ) +#ifdef FIX_483b + if ( hStereoMdct->mdct_stereo_mode[n] != SMDCT_DUAL_MONO ) +#endif { - float mdst = ( inv_spectrum[ch][n][i + 1] - inv_spectrum[ch][n][i - 1] ); /* An MDST estimate */ - powerSpecMsInv[ch][n][i] = mdst * mdst + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; + /* power spectrum: MDCT^2 + MDST^2 */ + powerSpecMsInv[ch][n][0] = inv_spectrum[ch][n][0] * inv_spectrum[ch][n][0]; + for ( i = 1; i < L_subframeTCX - 1; i++ ) + { + float mdst = ( inv_spectrum[ch][n][i + 1] - inv_spectrum[ch][n][i - 1] ); /* An MDST estimate */ + powerSpecMsInv[ch][n][i] = mdst * mdst + inv_spectrum[ch][n][i] * inv_spectrum[ch][n][i]; + } + powerSpecMsInv[ch][n][L_subframeTCX - 1] = inv_spectrum[ch][n][L_subframeTCX - 1] * inv_spectrum[ch][n][L_subframeTCX - 1]; } - powerSpecMsInv[ch][n][L_subframeTCX - 1] = inv_spectrum[ch][n][L_subframeTCX - 1] * inv_spectrum[ch][n][L_subframeTCX - 1]; /* power spectrum: MDCT^2 + MDST^2 */ powerSpec[ch][n * L_subframeTCX] = sts[ch]->hTcxEnc->spectrum[n][0] * sts[ch]->hTcxEnc->spectrum[n][0]; diff --git a/lib_enc/ivas_stereo_mdct_stereo_enc.c b/lib_enc/ivas_stereo_mdct_stereo_enc.c index 138c9436d6664a3c16dce55a5761fcd866156e0e..97c9ebe7ff3121542df08033e79802da2d3afb81 100755 --- a/lib_enc/ivas_stereo_mdct_stereo_enc.c +++ b/lib_enc/ivas_stereo_mdct_stereo_enc.c @@ -563,7 +563,12 @@ void ms_inv_mask_processing( { int16_t sfb; STEREO_MDCT_BAND_PARAMETERS *sfbConf; +#ifdef FIX_483b + int16_t nSubframes, L_subframeTCX; + nSubframes = ( sts[0]->hTcxEnc->tcxMode == TCX_20 ) ? 1 : NB_DIV; + L_subframeTCX = sts[0]->hTcxEnc->L_frameTCX / nSubframes; +#endif sfbConf = ( sts[0]->core == TCX_20_CORE ) ? &hStereoMdct->stbParamsTCX20 : &hStereoMdct->stbParamsTCX10; if ( sts[0]->last_core == ACELP_CORE ) @@ -588,6 +593,15 @@ void ms_inv_mask_processing( } } +#ifdef FIX_483b + /* set rest of inverse spectrum to zero */ + if ( L_subframeTCX > sfbConf->sfbOffset[maxSfb] ) + { + set_zero( &x_inv_0[sfbConf->sfbOffset[maxSfb]], L_subframeTCX - sfbConf->sfbOffset[maxSfb] ); + set_zero( &x_inv_1[sfbConf->sfbOffset[maxSfb]], L_subframeTCX - sfbConf->sfbOffset[maxSfb] ); + } +#endif + return; }