diff --git a/lib_com/fd_cng_com_fx.c b/lib_com/fd_cng_com_fx.c index c51c122ed067dba36fd37862df5b277fa1aaf475..73dac2d6677c121faa6616c74d3a4ac634b3396e 100644 --- a/lib_com/fd_cng_com_fx.c +++ b/lib_com/fd_cng_com_fx.c @@ -1193,7 +1193,7 @@ void minimum_statistics_fx( { /* calculate scalar with normalized msPeriodogSum[cnt], exponent -2*s1 */ s1 = norm_l( msPeriodogSum[cnt] ); - msPeriodogSum16 = round_fx( L_shl( msPeriodogSum[cnt], s1 ) ); + msPeriodogSum16 = round_fx_sat( L_shl( msPeriodogSum[cnt], s1 ) ); scalar = L_mult( msPeriodogSum16, msPeriodogSum16 ); /* calculate difference, both elements in 16Q15 format, use absolute value diff --git a/lib_dec/acelp_core_dec.c b/lib_dec/acelp_core_dec.c index 09e8cbf4b4c3220b4faab3f13fa1b5b97a90c6bf..7887e88e71785063fa110e9751745f425a11f57a 100644 --- a/lib_dec/acelp_core_dec.c +++ b/lib_dec/acelp_core_dec.c @@ -109,6 +109,12 @@ ivas_error acelp_core_dec( float exc3[L_FRAME16k]; float syn1_tmp[L_FRAME16k + 2], *syn1; float *realBuffer[CLDFB_NO_COL_MAX], *imagBuffer[CLDFB_NO_COL_MAX]; +#ifdef IVAS_FLOAT_FIXED + Word32 *realBuffer_fx[CLDFB_NO_COL_MAX], *imagBuffer_fx[CLDFB_NO_COL_MAX]; + Word16 buffer_scale; + Word32 realBufferTmp_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; + Word32 imagBufferTmp_fx[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; +#endif // IVAS_FLOAT_FIXED float realBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; float imagBufferTmp[CLDFB_NO_COL_MAX][CLDFB_NO_CHANNELS_MAX]; int16_t LSF_Q_prediction; /* LSF prediction mode */ @@ -153,7 +159,42 @@ ivas_error acelp_core_dec( st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt[i] = STEREO_DFT_FD_FILT * st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt[i] + ( 1 - STEREO_DFT_FD_FILT ) * st->hFdCngDec->hFdCngCom->sidNoiseEst_flt[i]; } +#ifdef IVAS_FLOAT_FIXED + st->hFdCngDec->hFdCngCom->sidNoiseEstExp = 31 - Q4; + for ( int p = 0; p < NPART; p++ ) + { + st->hFdCngDec->hFdCngCom->sidNoiseEstLp[p] = (Word32) ( st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->sidNoiseEstExp ) ) ); + st->hFdCngDec->hFdCngCom->sidNoiseEst[p] = (Word32) ( st->hFdCngDec->hFdCngCom->sidNoiseEst_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->sidNoiseEstExp ) ) ); + } + for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) + { + st->hFdCngDec->bandNoiseShape[p] = (Word32) ( st->hFdCngDec->bandNoiseShape_float[p] * ( 1u << ( 31 - st->hFdCngDec->bandNoiseShape_exp ) ) ); + } + + ApplyFdCng_fx( NULL, 0, NULL, NULL, NULL, NULL, st, 0, 0 ); + + for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) + { + if ( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp <= 31 ) + { + st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); + } + else + { + st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] * ( 1u << ( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp - 31 ) ) ); + } + } + for ( int p = 0; p < NPART; p++ ) + { + st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt[p] = (float) st->hFdCngDec->hFdCngCom->sidNoiseEstLp[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->sidNoiseEstExp ) ); + } + for ( int p = 0; p < 24; p++ ) + { + st->hFdCngDec->partNoiseShape_float[p] = (float) st->hFdCngDec->partNoiseShape[p] / ( 1u << ( 31 - st->hFdCngDec->partNoiseShape_exp ) ); + } +#else ApplyFdCng_flt( NULL, NULL, NULL, NULL, st, 0, 0 ); +#endif // IVAS_FLOAT_FIXED } else { @@ -192,7 +233,15 @@ ivas_error acelp_core_dec( realBuffer[i] = realBufferTmp[i]; imagBuffer[i] = imagBufferTmp[i]; } - +#ifdef IVAS_FLOAT_FIXED + for ( i = 0; i < CLDFB_NO_COL_MAX; i++ ) + { + set32_fx( realBufferTmp_fx[i], 0, CLDFB_NO_CHANNELS_MAX ); + set32_fx( imagBufferTmp_fx[i], 0, CLDFB_NO_CHANNELS_MAX ); + realBuffer_fx[i] = realBufferTmp_fx[i]; + imagBuffer_fx[i] = imagBufferTmp_fx[i]; + } +#endif // IVAS_FLOAT_FIXED /*----------------------------------------------------------------* * Initialization *----------------------------------------------------------------*/ @@ -523,7 +572,48 @@ ivas_error acelp_core_dec( { st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt[i] = STEREO_DFT_FD_FILT * st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt[i] + ( 1 - STEREO_DFT_FD_FILT ) * st->hFdCngDec->hFdCngCom->sidNoiseEst_flt[i]; } +#ifdef IVAS_FLOAT_FIXED + Word16 syn_fx[L_FRAME16k + L_SUBFR] = { 0 }; + st->Q_syn = 0; + for ( int p = 0; p < L_FRAME16k; p++ ) + { + syn_fx[L_SUBFR + p] = (Word16) ( syn[p] * ( 1u << st->Q_syn ) ); + } + for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) + { + st->hFdCngDec->bandNoiseShape[p] = (Word32) ( st->hFdCngDec->bandNoiseShape_float[p] * ( 1u << ( 31 - st->hFdCngDec->bandNoiseShape_exp ) ) ); + } + st->hFdCngDec->hFdCngCom->sidNoiseEstExp = 31 - Q4; + for ( int p = 0; p < NPART; p++ ) + { + st->hFdCngDec->hFdCngCom->sidNoiseEstLp[p] = (Word32)(st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt[p] * (1u << (31 - st->hFdCngDec->hFdCngCom->sidNoiseEstExp))); + st->hFdCngDec->hFdCngCom->sidNoiseEst[p] = (Word32) ( st->hFdCngDec->hFdCngCom->sidNoiseEst_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->sidNoiseEstExp ) ) ); + } + + ApplyFdCng_fx( syn_fx + L_SUBFR, st->Q_syn, NULL, realBuffer, imagBuffer, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + + for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) + { + if ( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp <= 31 ) + { + st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); + } + else + { + st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] * ( 1u << ( st->hFdCngDec->hFdCngCom->cngNoiseLevelExp - 31 ) ) ); + } + } + for ( int p = 0; p < NPART; p++ ) + { + st->hFdCngDec->hFdCngCom->sidNoiseEstLp_flt[p] = (float) st->hFdCngDec->hFdCngCom->sidNoiseEstLp[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->sidNoiseEstExp ) ); + } + for ( int p = 0; p < 24; p++ ) + { + st->hFdCngDec->partNoiseShape_float[p] = (float) st->hFdCngDec->partNoiseShape[p] / ( 1u << ( 31 - st->hFdCngDec->partNoiseShape_exp ) ); + } +#else ApplyFdCng_flt( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); +#endif // IVAS_FLOAT_FIXED } if ( !read_sid_info ) @@ -1130,7 +1220,153 @@ ivas_error acelp_core_dec( if ( st->element_mode != IVAS_CPE_TD && !st->cng_ism_flag ) { /*Noise estimate*/ +#ifdef IVAS_FLOAT_FIXED + Word16 syn_fx[L_FRAME16k + L_SUBFR] = { 0 }; + st->Q_syn = 0; + for ( int p = 0; p < L_FRAME16k; p++ ) + { + syn_fx[L_SUBFR + p] = (Word16) ( syn[p] * ( 1u << st->Q_syn ) ); + } + for ( int p = 0; p < st->L_frame; p++ ) + { + st->hFdCngDec->hFdCngCom->periodog[p] = (Word32) ( st->hFdCngDec->hFdCngCom->periodog_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->periodog_exp ) ) ); + } + st->hFdCngDec->hFdCngCom->fftBuffer_exp = 31 - Q4; + for ( int p = 0; p < st->hFdCngDec->hFdCngCom->fftlen; p++ ) + { + st->hFdCngDec->hFdCngCom->fftBuffer[p] = (Word32) ( st->hFdCngDec->hFdCngCom->fftBuffer_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp ) ) ); + } + st->hFdCngDec->msNoiseEst_exp = 31 - Q4; // Q4 + for ( int p = 0; p < st->hFdCngDec->npart_shaping; p++ ) + { + st->hFdCngDec->msNoiseEst[p] = (Word32) ( st->hFdCngDec->msNoiseEst_float[p] * ( 1u << ( 31 - st->hFdCngDec->msNoiseEst_exp ) ) ); + st->hFdCngDec->msPeriodog[p] = (Word32) ( st->hFdCngDec->msPeriodog_float[p] * ( 1u << ( 31 - st->hFdCngDec->msPeriodog_exp ) ) ); + st->hFdCngDec->msPeriodog_ST_fx[p] = (Word32) ( st->hFdCngDec->msPeriodog_ST[p] * ( 1u << ( 31 - st->hFdCngDec->msPeriodog_ST_exp ) ) ); + } + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 31 - Q4; // Q4 + for ( int p = 0; p < FFTCLDFBLEN; p++ ) + { + st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] = (Word32) ( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); + } + +/*==========================================================*/ + ApplyFdCng_fx( syn_fx + L_SUBFR, st->Q_syn, NULL, realBuffer_fx, imagBuffer_fx, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); +/*==========================================================*/ + + if ( ( ( st->m_frame_type == ACTIVE_FRAME ) && ( ( st->bfi == 0 && + ( syn_fx == NULL || + ( *syn_fx( -FLT_MAX ) && + *( syn_fx + st->hFdCngDec->hFdCngCom->frameSize - 1 ) < FLT_MAX && + *( syn_fx + st->hFdCngDec->hFdCngCom->frameSize - 1 ) > ( -FLT_MAX ) ) ) && + ( ( ( ( st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_DFT && st->hFdCngDec->flag_dtx_mode ) || !st->VAD || ( st->ini_frame < 100 && st->is_ism_format ) ) && + !( st->cng_type == LP_CNG && st->hFdCngDec->flag_dtx_mode ) ) || + ( st->element_mode == IVAS_CPE_TD ) ) && + ( !st->BER_detect ) ) || + ( ( st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT ) && ( st->hFdCngDec->hFdCngCom->active_frame_counter > 0 ) ) || ( ( st->bfi == 1 ) && ( st->nbLostCmpt == 1 ) ) ) ) || + ( st->m_frame_type == ZERO_FRAME ) && ( st != NULL && st->cng_type == LP_CNG ) ) + { + { + for ( int p = 0; p < st->hFdCngDec->hFdCngCom->fftlen; p++ ) + { + st->hFdCngDec->hFdCngCom->fftBuffer_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->fftBuffer[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp ) ) ); + } + + for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) + { + st->hFdCngDec->bandNoiseShape_float[p] = ( (float) st->hFdCngDec->bandNoiseShape[p] / ( 1u << ( 31 - st->hFdCngDec->bandNoiseShape_exp ) ) ); + } + for ( int p = 0; p < st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand; p++ ) + { + st->hFdCngDec->hFdCngCom->periodog_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->periodog[p] / (float) ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->periodog_exp ) ) ); + } + for ( int p = 0; p < st->hFdCngDec->npart_shaping; p++ ) + { + st->hFdCngDec->msPsd_float[p] = ( (float) st->hFdCngDec->msPsd_fx[p] / ( 1u << ( 31 - st->hFdCngDec->msPsd_exp_fft ) ) ); + st->hFdCngDec->msNoiseEst_float[p] = (float) st->hFdCngDec->msNoiseEst[p] / ( 1u << ( 31 - st->hFdCngDec->msNoiseEst_exp ) ); + st->hFdCngDec->msPeriodog_float[p] = ( (float) st->hFdCngDec->msPeriodog[p] / ( 1u << ( 31 - st->hFdCngDec->msPeriodog_exp ) ) ); + st->hFdCngDec->msPeriodog_ST[p] = ( (float) st->hFdCngDec->msPeriodog_ST_fx[p] / ( 1u << ( 31 - st->hFdCngDec->msPeriodog_ST_exp ) ) ); + } + if ( st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT ) + { + for ( int p = 0; p < L_FRAME16k - st->hFdCngDec->hFdCngCom->startBand; p++ ) + { + st->hFdCngDec->smoothed_psd[st->hFdCngDec->hFdCngCom->startBand + p] = ( (float) st->hFdCngDec->smoothed_psd_fx[st->hFdCngDec->hFdCngCom->startBand + p] / ( 1u << ( 31 - st->hFdCngDec->msNoiseEst_exp ) ) ); + } + } + } + if ( !( ( st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT ) && ( st->hFdCngDec->hFdCngCom->active_frame_counter > 0 ) ) ) + { + st->hTcxDec->CngLevelBackgroundTrace_bfi = fix_to_float( st->hTcxDec->CngLevelBackgroundTrace_bfi_fx, ( 31 - st->hTcxDec->CngLevelBackgroundTrace_bfi_exp ) ); + st->cngTDLevel_float = fix16_to_float( st->cngTDLevel, ( 15 - st->cngTDLevel_e ) ); + for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) + { + st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); + } + IF( !( EQ_16( st->element_mode, IVAS_CPE_TD ) || EQ_16( st->element_mode, IVAS_CPE_DFT ) ) ) + { + for ( int p = 0; p < MSNUMSUBFR * NPART_SHAPING; p++ ) + { + if ( ( st->hFdCngDec->msMinBuf[p] == MAX_32 ) ) + { + st->hFdCngDec->msMinBuf_float[p] = FLT_MAX; + } + else + { + st->hFdCngDec->msMinBuf_float[p] = (float) st->hFdCngDec->msMinBuf[p] / ( 1u << ( 31 - 6 ) ); // CNG_S = 6 + } + } + for ( int p = 0; p < st->hFdCngDec->npart_shaping; p++ ) + { + st->hFdCngDec->msPeriodogBuf_float[p] = ( (float) st->hFdCngDec->msPeriodogBuf[p] / ( 1u << Q9 ) ); + st->hFdCngDec->msPsdFirstMoment_float[p] = ( (float) st->hFdCngDec->msPsdFirstMoment[p] / ( 1u << Q9 ) ); + st->hFdCngDec->msPsdSecondMoment_float[p] = ( (float) st->hFdCngDec->msPsdSecondMoment[p] / ( 1u << Q19 ) ); + st->hFdCngDec->msNoiseFloor_float[p] = ( (float) st->hFdCngDec->msNoiseFloor[p] / ( 1u << Q9 ) ); + st->hFdCngDec->msAlpha_float[p] = ( (float) st->hFdCngDec->msAlpha[p] / ( 1u << Q31 ) ); + st->hFdCngDec->msBminWin_float[p] = ( (float) st->hFdCngDec->msBminWin[p] / ( 1u << Q27 ) ); + st->hFdCngDec->msBminSubWin_float[p] = ( (float) st->hFdCngDec->msBminSubWin[p] / ( 1u << Q27 ) ); + if ( st->hFdCngDec->msCurrentMin[p] == MAX_32 ) + { + st->hFdCngDec->msCurrentMin_float[p] = FLT_MAX; + } + else + { + st->hFdCngDec->msCurrentMin_float[p] = ( (float) st->hFdCngDec->msCurrentMin[p] / ( 1u << ( 31 - ( 6 + 1 + 4 ) ) ) ); // exp : CNG_S + 1 + 4 + } + if ( st->hFdCngDec->msCurrentMinOut[p] == MAX_32 ) + { + st->hFdCngDec->msCurrentMinOut_float[p] = FLT_MAX; + } + else + { + st->hFdCngDec->msCurrentMinOut_float[p] = ( (float) st->hFdCngDec->msCurrentMinOut[p] / ( 1u << ( 31 - 6 ) ) ); + } + if ( st->hFdCngDec->msCurrentMinSubWindow[p] == MAX_32 ) + { + st->hFdCngDec->msCurrentMinSubWindow_float[p] = FLT_MAX; + } + else + { + st->hFdCngDec->msCurrentMinSubWindow_float[p] = ( (float) st->hFdCngDec->msCurrentMinSubWindow[p] / ( 1u << ( 31 - 6 ) ) ); + } + } + } + if ( sum_f( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt + st->hFdCngDec->hFdCngCom->startBand, st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ) > 0.01f ) + { + if ( st->element_mode != IVAS_CPE_MDCT || st->core == ACELP_CORE ) + { + int A_cng_q = 15 - norm_s( st->hFdCngDec->hFdCngCom->A_cng[0] ); + for ( int p = 0; p < M; p++ ) + { + st->hFdCngDec->hFdCngCom->A_cng_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->A_cng[p] / ( 1u << A_cng_q ) ); + st->lspold_cng_float[p] = ( (float) st->lspold_cng[p] / ( 1u << Q15 ) ); + } + } + } + } + } +#else ApplyFdCng_flt( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); +#endif // IVAS_FLOAT_FIXED } if ( !st->cna_dirac_flag ) @@ -1207,7 +1443,151 @@ ivas_error acelp_core_dec( /*Noise estimate*/ if ( st->idchan == 0 && ( nchan_out == 2 || ( st->core_brate != FRAME_NO_DATA && st->core_brate != SID_2k40 ) ) ) { +#ifdef IVAS_FLOAT_FIXED + Word16 syn_fx[L_FRAME16k + L_SUBFR] = { 0 }; + st->Q_syn = 0; + for ( int p = 0; p < L_FRAME16k; p++ ) + { + syn_fx[L_SUBFR + p] = (Word16) ( syn[p] * ( 1u << st->Q_syn ) ); + } + for ( int p = 0; p < st->L_frame; p++ ) + { + st->hFdCngDec->hFdCngCom->periodog[p] = (Word32) ( st->hFdCngDec->hFdCngCom->periodog_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->periodog_exp ) ) ); + } + st->hFdCngDec->hFdCngCom->fftBuffer_exp = 31 - Q4; + for ( int p = 0; p < st->hFdCngDec->hFdCngCom->fftlen; p++ ) + { + st->hFdCngDec->hFdCngCom->fftBuffer[p] = (Word32) ( st->hFdCngDec->hFdCngCom->fftBuffer_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp ) ) ); + } + st->hFdCngDec->msNoiseEst_exp = 31 - Q4; + for ( int p = 0; p < st->hFdCngDec->npart_shaping; p++ ) + { + st->hFdCngDec->msNoiseEst[p] = (Word32) ( st->hFdCngDec->msNoiseEst_float[p] * ( 1u << ( 31 - st->hFdCngDec->msNoiseEst_exp ) ) ); + st->hFdCngDec->msPeriodog[p] = (Word32) ( st->hFdCngDec->msPeriodog_float[p] * ( 1u << ( 31 - st->hFdCngDec->msPeriodog_exp ) ) ); + st->hFdCngDec->msPeriodog_ST_fx[p] = (Word32) ( st->hFdCngDec->msPeriodog_ST[p] * ( 1u << ( 31 - st->hFdCngDec->msPeriodog_ST_exp ) ) ); + } + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 31 - Q4; + for ( int p = 0; p < FFTCLDFBLEN; p++ ) + { + st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] = (Word32) ( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); + } + + ApplyFdCng_fx( syn_fx + L_SUBFR, st->Q_syn, NULL, realBuffer, imagBuffer, NULL, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); + + if ( ( ( st->m_frame_type == ACTIVE_FRAME ) && ( ( st->bfi == 0 && + ( syn_fx == NULL || + ( *syn_fx( -FLT_MAX ) && + *( syn_fx + st->hFdCngDec->hFdCngCom->frameSize - 1 ) < FLT_MAX && + *( syn_fx + st->hFdCngDec->hFdCngCom->frameSize - 1 ) > ( -FLT_MAX ) ) ) && + ( ( ( ( st->element_mode != IVAS_CPE_TD && st->element_mode != IVAS_CPE_DFT && st->hFdCngDec->flag_dtx_mode ) || !st->VAD || ( st->ini_frame < 100 && st->is_ism_format ) ) && + !( st->cng_type == LP_CNG && st->hFdCngDec->flag_dtx_mode ) ) || + ( st->element_mode == IVAS_CPE_TD ) ) && + ( !st->BER_detect ) ) || + ( ( st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT ) && ( st->hFdCngDec->hFdCngCom->active_frame_counter > 0 ) ) || ( ( st->bfi == 1 ) && ( st->nbLostCmpt == 1 ) ) ) ) || + ( st->m_frame_type == ZERO_FRAME ) && ( st != NULL && st->cng_type == LP_CNG ) ) + { + { + for ( int p = 0; p < st->hFdCngDec->hFdCngCom->fftlen; p++ ) + { + st->hFdCngDec->hFdCngCom->fftBuffer_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->fftBuffer[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp ) ) ); + } + + for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) + { + st->hFdCngDec->bandNoiseShape_float[p] = ( (float) st->hFdCngDec->bandNoiseShape[p] / ( 1u << ( 31 - st->hFdCngDec->bandNoiseShape_exp ) ) ); + } + for ( int p = 0; p < st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand; p++ ) + { + st->hFdCngDec->hFdCngCom->periodog_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->periodog[p] / (float) ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->periodog_exp ) ) ); + } + for ( int p = 0; p < st->hFdCngDec->npart_shaping; p++ ) + { + st->hFdCngDec->msPsd_float[p] = ( (float) st->hFdCngDec->msPsd_fx[p] / ( 1u << ( 31 - st->hFdCngDec->msPsd_exp_fft ) ) ); + st->hFdCngDec->msNoiseEst_float[p] = (float) st->hFdCngDec->msNoiseEst[p] / ( 1u << ( 31 - st->hFdCngDec->msNoiseEst_exp ) ); + st->hFdCngDec->msPeriodog_float[p] = ( (float) st->hFdCngDec->msPeriodog[p] / ( 1u << ( 31 - st->hFdCngDec->msPeriodog_exp ) ) ); + st->hFdCngDec->msPeriodog_ST[p] = ( (float) st->hFdCngDec->msPeriodog_ST_fx[p] / ( 1u << ( 31 - st->hFdCngDec->msPeriodog_ST_exp ) ) ); + } + if ( st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT ) + { + for ( int p = 0; p < L_FRAME16k - st->hFdCngDec->hFdCngCom->startBand; p++ ) + { + st->hFdCngDec->smoothed_psd[st->hFdCngDec->hFdCngCom->startBand + p] = ( (float) st->hFdCngDec->smoothed_psd_fx[st->hFdCngDec->hFdCngCom->startBand + p] / ( 1u << ( 31 - st->hFdCngDec->msNoiseEst_exp ) ) ); + } + } + } + if ( !( ( st->element_mode == IVAS_CPE_TD || st->element_mode == IVAS_CPE_DFT ) && ( st->hFdCngDec->hFdCngCom->active_frame_counter > 0 ) ) ) + { + st->hTcxDec->CngLevelBackgroundTrace_bfi = fix_to_float( st->hTcxDec->CngLevelBackgroundTrace_bfi_fx, ( 31 - st->hTcxDec->CngLevelBackgroundTrace_bfi_exp ) ); + st->cngTDLevel_float = fix16_to_float( st->cngTDLevel, ( 15 - st->cngTDLevel_e ) ); + for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) + { + st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); + } + IF( !( EQ_16( st->element_mode, IVAS_CPE_TD ) || EQ_16( st->element_mode, IVAS_CPE_DFT ) ) ) + { + for ( int p = 0; p < MSNUMSUBFR * NPART_SHAPING; p++ ) + { + if ( ( st->hFdCngDec->msMinBuf[p] == MAX_32 ) ) + { + st->hFdCngDec->msMinBuf_float[p] = FLT_MAX; + } + else + { + st->hFdCngDec->msMinBuf_float[p] = (float) st->hFdCngDec->msMinBuf[p] / ( 1u << ( 31 - 6 ) ); // CNG_S = 6 + } + } + for ( int p = 0; p < st->hFdCngDec->npart_shaping; p++ ) + { + st->hFdCngDec->msPeriodogBuf_float[p] = ( (float) st->hFdCngDec->msPeriodogBuf[p] / ( 1u << Q9 ) ); + st->hFdCngDec->msPsdFirstMoment_float[p] = ( (float) st->hFdCngDec->msPsdFirstMoment[p] / ( 1u << Q9 ) ); + st->hFdCngDec->msPsdSecondMoment_float[p] = ( (float) st->hFdCngDec->msPsdSecondMoment[p] / ( 1u << Q19 ) ); + st->hFdCngDec->msNoiseFloor_float[p] = ( (float) st->hFdCngDec->msNoiseFloor[p] / ( 1u << Q9 ) ); + st->hFdCngDec->msAlpha_float[p] = ( (float) st->hFdCngDec->msAlpha[p] / ( 1u << Q31 ) ); + st->hFdCngDec->msBminWin_float[p] = ( (float) st->hFdCngDec->msBminWin[p] / ( 1u << Q27 ) ); + st->hFdCngDec->msBminSubWin_float[p] = ( (float) st->hFdCngDec->msBminSubWin[p] / ( 1u << Q27 ) ); + if ( st->hFdCngDec->msCurrentMin[p] == MAX_32 ) + { + st->hFdCngDec->msCurrentMin_float[p] = FLT_MAX; + } + else + { + st->hFdCngDec->msCurrentMin_float[p] = ( (float) st->hFdCngDec->msCurrentMin[p] / ( 1u << ( 31 - ( 6 + 1 + 4 ) ) ) ); // exp : CNG_S + 1 + 4 + } + if ( st->hFdCngDec->msCurrentMinOut[p] == MAX_32 ) + { + st->hFdCngDec->msCurrentMinOut_float[p] = FLT_MAX; + } + else + { + st->hFdCngDec->msCurrentMinOut_float[p] = ( (float) st->hFdCngDec->msCurrentMinOut[p] / ( 1u << ( 31 - 6 ) ) ); + } + if ( st->hFdCngDec->msCurrentMinSubWindow[p] == MAX_32 ) + { + st->hFdCngDec->msCurrentMinSubWindow_float[p] = FLT_MAX; + } + else + { + st->hFdCngDec->msCurrentMinSubWindow_float[p] = ( (float) st->hFdCngDec->msCurrentMinSubWindow[p] / ( 1u << ( 31 - 6 ) ) ); + } + } + } + if ( sum_f( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt + st->hFdCngDec->hFdCngCom->startBand, st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ) > 0.01f ) + { + if ( st->element_mode != IVAS_CPE_MDCT || st->core == ACELP_CORE ) + { + int A_cng_q = 15 - norm_s( st->hFdCngDec->hFdCngCom->A_cng[0] ); + for ( int p = 0; p < M; p++ ) + { + st->hFdCngDec->hFdCngCom->A_cng_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->A_cng[p] / ( 1u << A_cng_q ) ); + st->lspold_cng_float[p] = ( (float) st->lspold_cng[p] / ( 1u << Q15 ) ); + } + } + } + } + } +#else ApplyFdCng_flt( syn, NULL, realBuffer, imagBuffer, st, 0, ( st->coder_type == AUDIO && !st->GSC_noisy_speech ) ); +#endif // IVAS_FLOAT_FIXED } } } diff --git a/lib_dec/fd_cng_dec_fx.c b/lib_dec/fd_cng_dec_fx.c index 32be6e22cdfb2bde3b91c8cf653b42d004aafba8..d841330da68ff2272f87fed11f5cb0e5df66d6c0 100644 --- a/lib_dec/fd_cng_dec_fx.c +++ b/lib_dec/fd_cng_dec_fx.c @@ -139,6 +139,7 @@ void initFdCngDec( hFdCngDec->msPeriodog_ST_exp = 0; hFdCngDec->hFdCngCom->fftBuffer_exp = 0; hFdCngDec->hFdCngCom->periodog_exp = 0; + set32_fx(hFdCngDec->smoothed_psd_fx, 0, L_FRAME16k); #ifdef IVAS_CODE_CNG set_f(hFdCngDec->hFdCngCom->sidNoiseEstLp, 0.0f, NPART); @@ -1076,9 +1077,8 @@ Word16 ApplyFdCng_fx( Flag Overflow = 0; Flag Carry = 0; #endif - + Word64 W_tmp; Word16 L_frame, last_L_frame; - Word16 factor; Word32 *sidNoiseEst; hFdCngDec = st->hFdCngDec; @@ -1291,7 +1291,7 @@ Word16 ApplyFdCng_fx( L_tmp = norm_llQ31( L_c, L_tmp, &L_tmp_exp ); L_tmp_exp = sub( add( L_tmp_exp, *cngNoiseLevel_exp ), 1 ); - // L_tmp = Mpy_32_16_1(L_tmp, hFdCngCom->fftlen); /*Q16*/ + L_tmp = Mpy_32_16_1( L_tmp, 1 ); L_tmp = Mpy_32_16_1( L_tmp, shr( T_DIV_L_Frame[L_shl( L_mac( -28000, NORM_MDCT_FACTOR, 95 ), 1 - 15 )], 1 ) ); /*Q16,exp -7*/ L_tmp_exp = add( L_tmp_exp, -7 ); /*->Q16, L_tmp_exp */ @@ -1302,6 +1302,7 @@ Word16 ApplyFdCng_fx( #else st->hTcxDec->CngLevelBackgroundTrace_bfi_fx = ( Sqrt32( L_tmp, &L_tmp_exp ) ); #endif + L_tmp_exp = add( L_tmp_exp, 1 ); st->hTcxDec->CngLevelBackgroundTrace_bfi_exp = L_tmp_exp; move16(); } @@ -1409,24 +1410,30 @@ Word16 ApplyFdCng_fx( } test(); test(); - L_tmp = 0; + W_tmp = 0; FOR( j = hFdCngCom->startBand; j < hFdCngCom->stopFFTbin; j++ ) { - L_tmp = L_add( L_tmp, L_shr( cngNoiseLevel[j], 16 ) ); + W_tmp = W_add( W_tmp, L_shr( cngNoiseLevel[j], sub( 31, *cngNoiseLevel_exp ) ) ); } - L_tmp_exp = add( *cngNoiseLevel_exp, 16 ); + L_tmp = W_extract_h( W_shl( W_tmp, 32 ) ); + L_tmp_exp = 31; #ifdef BASOP_NOGLOB IF( EQ_16( concealWholeFrame, 1 ) && EQ_16( st->nbLostCmpt, 1 ) && ( L_shl_o( L_tmp, L_tmp_exp, &Overflow ) > 21474836 /*0.01f Q31*/ ) ) #else IF( EQ_16( concealWholeFrame, 1 ) && EQ_16( st->nbLostCmpt, 1 ) && ( L_shl( L_tmp, L_tmp_exp ) > 21474836 /*0.01f Q31*/ ) ) #endif { + /* always set psychParameters for MDCT-Stereo ... */ + IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && st->hTonalMDCTConc != NULL ) + { + st->hTonalMDCTConc->psychParams = EQ_16( st->core, TCX_20_CORE ) ? &st->hTonalMDCTConc->psychParamsTCX20 : &st->hTonalMDCTConc->psychParamsTCX10; + } /* update isf cng estimate for concealment. Do that during concealment, in order to avoid addition clean channel complexity*/ IF( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && NE_16( st->core, ACELP_CORE ) ) { TonalMdctConceal_whiten_noise_shape_ivas_fx( st, L_frame, ON_FIRST_LOST_FRAME ); } - ELSE IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) + ELSE IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) || EQ_16(st->core, ACELP_CORE)) { lpc_from_spectrum( hFdCngCom, hFdCngCom->startBand, hFdCngCom->stopFFTbin, 0 ); E_LPC_a_lsp_conversion( hFdCngCom->A_cng, lsp_cng, st->lspold_cng, M ); @@ -1643,17 +1650,73 @@ Word16 ApplyFdCng_fx( { IF( !( hFdCngCom->msFrCnt_init_counter < hFdCngCom->msFrCnt_init_thresh ) ) { - Word16 scale; sidNoiseEst = hFdCngCom->sidNoiseEstLp; + + s2 = negate( sub( WORD32_BITS, 1 ) ); + move16(); + /* Shape the SID noise levels in each FFT bin */ j = 0; + move16(); FOR( k = 0; k < hFdCngCom->nFFTpart; k++ ) { - factor = BASOP_Util_Divide3232_Scale( ( sidNoiseEst[k] + 1 ), ( hFdCngDec->partNoiseShape[k] + 1 ), &scale ); + assert( hFdCngDec->partNoiseShape[k] >= 0 ); + + /* add DELTA as it is done in FLC version, in order to avoid num > denom */ + facTab[k] = 0; + move16(); + IF( hFdCngDec->partNoiseShape[k] != 0 ) + { + s1 = norm_l( hFdCngCom->sidNoiseEst[k] ); + L_tmp = L_shl( hFdCngCom->sidNoiseEst[k], s1 ); + L_tmp_exp = sub( hFdCngCom->sidNoiseEstExp, s1 ); + L_tmp = BASOP_Util_Add_Mant32Exp( hFdCngCom->sidNoiseEst[k], hFdCngCom->sidNoiseEstExp, DELTA_MANTISSA_W32, DELTA_EXPONENT, &L_tmp_exp ); + L_tmp = L_shr( L_tmp, 1 ); + s = add( L_tmp_exp, 1 ); + num = extract_h( L_tmp ); + + s1 = norm_l( hFdCngDec->partNoiseShape[k] ); + L_tmp = L_shl( hFdCngDec->partNoiseShape[k], s1 ); + L_tmp_exp = sub( hFdCngDec->partNoiseShape_exp, s1 ); + L_tmp = BASOP_Util_Add_Mant32Exp( L_tmp, L_tmp_exp, DELTA_MANTISSA_W32, DELTA_EXPONENT, &L_tmp_exp ); + s = sub( s, L_tmp_exp ); + denom = extract_h( L_tmp ); + + facTab[k] = div_s( num, denom ); + move16(); + facTabExp[k] = s; + move16(); + } + /* Set unique exponent, IF mantissa is equal to zero */ + IF( EQ_16( facTab[k], 0 ) ) + { + facTabExp[k] = negate( sub( WORD32_BITS, 1 ) ); + move16(); + } + s2 = s_max( s2, facTabExp[k] ); + } + + FOR( k = 0; k < hFdCngCom->nFFTpart; k++ ) + { + s = sub( facTabExp[k], s2 ); + s = s_max( s_min( s, sub( WORD32_BITS, 1 ) ), negate( sub( WORD32_BITS, 1 ) ) ); FOR( ; j <= hFdCngCom->part[k]; j++ ) { - cngNoiseLevel[j] = Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], factor ); + cngNoiseLevel[j] = L_shl( Mpy_32_16_1( hFdCngDec->bandNoiseShape[j], facTab[k] ), s ); + move32(); } } + /* adapt scaling for rest of the buffer */ + s = sub( *cngNoiseLevel_exp, add( hFdCngDec->bandNoiseShape_exp, s2 ) ); + FOR( ; k < hFdCngCom->npart; k++ ) + { + FOR( ; j <= hFdCngCom->part[k]; j++ ) + { + cngNoiseLevel[j] = L_shl( cngNoiseLevel[j], s ); + move32(); + } + } + *cngNoiseLevel_exp = add( hFdCngDec->bandNoiseShape_exp, s2 ); + move16(); } } IF( EQ_16( st->codec_mode, MODE2 ) ) @@ -2157,7 +2220,7 @@ void perform_noise_estimation_dec_fx( Word16 *part, *psize_inv, *psize_norm; Word32 *fftBuffer, *periodog, *ptr_per, *ptr_r, *ptr_i; Word32 temp, ftemp, delta, L_tmp; - Word16 e_temp, wght; + Word16 e_temp, wght, periodog_exp; Word32 enr, enr_tot, enr_tot0; Word16 enr_ratio, alpha; Word32 *msPeriodog; @@ -2602,7 +2665,7 @@ void perform_noise_estimation_dec_fx( { /* use power spectrum calculated in the MDCT-domain instead of calculating new power spectrum */ periodog = power_spectrum; - hFdCngDec->hFdCngCom->periodog_exp = 31; + periodog_exp = 31; } ELSE { @@ -2691,10 +2754,11 @@ void perform_noise_estimation_dec_fx( periodog[p] = L_shl( periodog[p], tmp_s ); } } + periodog_exp = hFdCngDec->hFdCngCom->periodog_exp; } /* Adjust to the desired frequency resolution by averaging over spectral partitions for SID transmission */ - bandcombinepow( periodog, hFdCngDec->hFdCngCom->periodog_exp, sub( stopFFTbin, startBand ), part, npart, psize_inv, hFdCngDec->msPeriodog, &hFdCngDec->msPeriodog_exp ); + bandcombinepow( periodog, periodog_exp, sub( stopFFTbin, startBand ), part, npart, psize_inv, hFdCngDec->msPeriodog, &hFdCngDec->msPeriodog_exp ); hFdCngDec->msPeriodog_exp_fft = hFdCngDec->msPeriodog_exp; diff --git a/lib_dec/ivas_stereo_mdct_core_dec_fx.c b/lib_dec/ivas_stereo_mdct_core_dec_fx.c index 505ce61e3ecf01f858db486fbf724106b7e04337..0d51291eb32614b22deb23abc89cbb66f446317b 100644 --- a/lib_dec/ivas_stereo_mdct_core_dec_fx.c +++ b/lib_dec/ivas_stereo_mdct_core_dec_fx.c @@ -913,7 +913,151 @@ static void run_min_stats_fx( if ( will_estimate_noise_on_channel[0] || will_estimate_noise_on_channel[1] || st->bfi ) { +#ifdef IVAS_FLOAT_FIXED + Word32 power_spec_fx[L_FRAME16k]; + + if ( !st->bfi ) + { + for ( int p = 0; p < L_FRAME16k; p++ ) + { + if ( power_spec[p] <= (float) MAX_32 ) + { + power_spec_fx[p] = (Word32) ( power_spec[p] /** ( 1u << 0 )*/ ); + } + else + { + power_spec_fx[p] = MAX_32; + } + } + } + + for ( int p = 0; p < st->hFdCngDec->hFdCngCom->fftlen; p++ ) + { + st->hFdCngDec->hFdCngCom->fftBuffer[p] = (Word32) ( st->hFdCngDec->hFdCngCom->fftBuffer_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp ) ) ); + } + st->hFdCngDec->msNoiseEst_exp = 31 - Q4; + for ( int p = 0; p < NPART_SHAPING; p++ ) + { + st->hFdCngDec->msNoiseEst[p] = (Word32) ( st->hFdCngDec->msNoiseEst_float[p] * ( 1u << ( 31 - st->hFdCngDec->msNoiseEst_exp ) ) ); + st->hFdCngDec->msPeriodog_ST_fx[p] = (Word32) ( st->hFdCngDec->msPeriodog_ST[p] * ( 1u << ( 31 - st->hFdCngDec->msPeriodog_ST_exp ) ) ); + } + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 31 - Q3; // Q3 + for ( int p = 0; p < FFTCLDFBLEN; p++ ) + { + st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] = (Word32) ( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); + } + for ( int p = 0; p < MSBUFLEN * NPART_SHAPING; p++ ) + { + if ( ( st->hFdCngDec->msMinBuf_float[p] * ( 1u << Q15 ) ) >= (float) MAX_32 ) + { + st->hFdCngDec->msMinBuf[p] = MAX_32; + } + else + { + st->hFdCngDec->msMinBuf[p] = (Word32) ( st->hFdCngDec->msMinBuf_float[p] * ( 1u << ( 31 - 6 ) ) ); + } + } + /*=================================================*/ + ApplyFdCng_fx( NULL, 0, st->bfi ? NULL : power_spec_fx, NULL, NULL, NULL, st, st->bfi, 0 ); + /*=================================================*/ + if ( !st->bfi ) + { + for ( int p = 0; p < st->hFdCngDec->hFdCngCom->fftlen; p++ ) + { + st->hFdCngDec->hFdCngCom->fftBuffer_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->fftBuffer[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->fftBuffer_exp ) ) ); + } + for ( int p = 0; p < st->hFdCngDec->npart_shaping; p++ ) + { + st->hFdCngDec->msNoiseEst_float[p] = ( (float) st->hFdCngDec->msNoiseEst[p] / ( 1u << ( 31 - st->hFdCngDec->msNoiseEst_exp ) ) ); + } + + st->hTcxDec->CngLevelBackgroundTrace_bfi = (float) ( st->hTcxDec->CngLevelBackgroundTrace_bfi_fx / powf( 2, ( 31 - st->hTcxDec->CngLevelBackgroundTrace_bfi_exp ) ) ); + st->cngTDLevel_float = fix16_to_float( st->cngTDLevel, ( 15 - st->cngTDLevel_e ) ); + + for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) + { + st->hFdCngDec->bandNoiseShape_float[p] = ( (float) st->hFdCngDec->bandNoiseShape[p] / ( 1u << ( 31 - st->hFdCngDec->bandNoiseShape_exp ) ) ); + } + for ( int p = 0; p < MSBUFLEN * NPART_SHAPING; p++ ) + { + if ( ( st->hFdCngDec->msMinBuf[p] == MAX_32 ) ) + { + st->hFdCngDec->msMinBuf_float[p] = FLT_MAX; + } + else + { + st->hFdCngDec->msMinBuf_float[p] = (float) st->hFdCngDec->msMinBuf[p] / ( 1u << ( 31 - 6 ) ); // CNG_S = 6 + } + } + for ( int p = 0; p < st->hFdCngDec->npart_shaping; p++ ) + { + st->hFdCngDec->msPsd_float[p] = ( (float) st->hFdCngDec->msPsd[p] / ( 1u << Q9 ) ); + st->hFdCngDec->msPeriodog_float[p] = ( (float) st->hFdCngDec->msPeriodog[p] / ( 1u << ( 31 - st->hFdCngDec->msPeriodog_exp ) ) ); + st->hFdCngDec->msPeriodogBuf_float[p] = ( (float) st->hFdCngDec->msPeriodogBuf[p] / ( 1u << Q9 ) ); + st->hFdCngDec->msPeriodog_ST[p] = ( (float) st->hFdCngDec->msPeriodog_ST_fx[p] / ( 1u << ( 31 - st->hFdCngDec->msPeriodog_ST_exp ) ) ); + st->hFdCngDec->msPsdFirstMoment_float[p] = ( (float) st->hFdCngDec->msPsdFirstMoment[p] / ( 1u << Q9 ) ); + st->hFdCngDec->msPsdSecondMoment_float[p] = ( (float) st->hFdCngDec->msPsdSecondMoment[p] / ( 1u << Q19 ) ); + st->hFdCngDec->msNoiseFloor_float[p] = ( (float) st->hFdCngDec->msNoiseFloor[p] / ( 1u << Q9 ) ); + st->hFdCngDec->msAlpha_float[p] = ( (float) st->hFdCngDec->msAlpha[p] / ( 1u << Q31 ) ); + st->hFdCngDec->msBminWin_float[p] = ( (float) st->hFdCngDec->msBminWin[p] / ( 1u << Q27 ) ); + st->hFdCngDec->msBminSubWin_float[p] = ( (float) st->hFdCngDec->msBminSubWin[p] / ( 1u << Q27 ) ); + if ( st->hFdCngDec->msCurrentMin[p] == MAX_32 ) + { + st->hFdCngDec->msCurrentMin_float[p] = FLT_MAX; + } + else + { + st->hFdCngDec->msCurrentMin_float[p] = ( (float) st->hFdCngDec->msCurrentMin[p] / ( 1u << ( 31 - ( 6 + 1 + 4 ) ) ) ); // exp : CNG_S + 1 + 4 + } + if ( st->hFdCngDec->msCurrentMinOut[p] == MAX_32 ) + { + st->hFdCngDec->msCurrentMinOut_float[p] = FLT_MAX; + } + else + { + st->hFdCngDec->msCurrentMinOut_float[p] = ( (float) st->hFdCngDec->msCurrentMinOut[p] / ( 1u << ( 31 - 6 ) ) ); + } + if ( st->hFdCngDec->msCurrentMinSubWindow[p] == MAX_32 ) + { + st->hFdCngDec->msCurrentMinSubWindow_float[p] = FLT_MAX; + } + else + { + st->hFdCngDec->msCurrentMinSubWindow_float[p] = ( (float) st->hFdCngDec->msCurrentMinSubWindow[p] / ( 1u << ( 31 - 6 ) ) ); + } + } + for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) + { + st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); + } + } + else if ( ( ( st->bfi == 1 ) && ( st->nbLostCmpt == 1 ) ) && ( sum_f( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt + st->hFdCngDec->hFdCngCom->startBand, st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ) > 0.01f ) ) + { + if ( st->element_mode == IVAS_CPE_MDCT && st->core != ACELP_CORE ) + { + for ( int p = 0; p < ( st->hFdCngDec->hFdCngCom->stopFFTbin - st->hFdCngDec->hFdCngCom->startBand ); p++ ) + { + st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] / ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); + } + for ( int p = 0; p < FDNS_NPTS; p++ ) + { + st->hTonalMDCTConc->scaleFactorsBackground_flt[p] = (float) st->hTonalMDCTConc->scaleFactorsBackground_fx[p] / ONE_IN_Q16; + } + } + if ( st->element_mode != IVAS_CPE_MDCT || st->core == ACELP_CORE ) + { + int A_cng_q = 15 - norm_s( st->hFdCngDec->hFdCngCom->A_cng[0] ); + for ( int p = 0; p < M; p++ ) + { + st->hFdCngDec->hFdCngCom->A_cng_flt[p] = ( (float) st->hFdCngDec->hFdCngCom->A_cng[p] / ( 1u << A_cng_q ) ); + st->lspold_cng_float[p] = ( (float) st->lspold_cng[p] / ( 1u << Q15 ) ); + st->lsf_cng_float[p] = ( (float) st->lsf_cng[p] / 2.56f ); // Q2.56 + } + } + } +#else ApplyFdCng_flt( NULL, st->bfi ? NULL : power_spec, NULL, NULL, st, st->bfi, 0 ); +#endif // IVAS_FLOAT_FIXED } /* restore VAD (see above) */ diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index 03746f1896a0f3afa57d2355ad4d23399106bda5..fb2e9ba7b0e7823723d9afc0a08de3ca8cb98bee 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -888,16 +888,19 @@ void stereo_tcx_core_dec( } } - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 24; // Q7 + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 31 - Q4; // Q4 for ( int p = 0; p < FFTCLDFBLEN; p++ ) { st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] = (Word32) ( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); } st->hFdCngDec->hFdCngCom->sidNoiseEstExp = 31 - Q4; st->hFdCngDec->partNoiseShape_exp = 31 - Q4; - for ( int p = 0; p < 24; p++ ) + for ( int p = 0; p < NPART; p++ ) { st->hFdCngDec->hFdCngCom->sidNoiseEst[p] = (Word32) ( st->hFdCngDec->hFdCngCom->sidNoiseEst_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->sidNoiseEstExp ) ) ); + } + for ( int p = 0; p < 24; p++ ) + { st->hFdCngDec->partNoiseShape[p] = (Word32) ( st->hFdCngDec->partNoiseShape_float[p] * ( 1u << ( 31 - st->hFdCngDec->partNoiseShape_exp ) ) ); } /*=================================*/ @@ -1104,7 +1107,7 @@ void stereo_tcx_core_dec( } } - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 24; // Q7 + st->hFdCngDec->hFdCngCom->cngNoiseLevelExp = 31 - Q4; // Q4 for ( int p = 0; p < FFTCLDFBLEN; p++ ) { st->hFdCngDec->hFdCngCom->cngNoiseLevel[p] = (Word32) ( st->hFdCngDec->hFdCngCom->cngNoiseLevel_flt[p] * ( 1u << ( 31 - st->hFdCngDec->hFdCngCom->cngNoiseLevelExp ) ) ); diff --git a/lib_dec/stat_dec.h b/lib_dec/stat_dec.h index 40db77d895be16d0e53f152c642ec7dc535017a1..4aece7ae7313b1bf0a774be9455cfde068ff1f48 100644 --- a/lib_dec/stat_dec.h +++ b/lib_dec/stat_dec.h @@ -201,8 +201,8 @@ typedef struct int16_t msPeriodogBufPtr; -#ifdef IVAS_FLOAT_FIXED Word32 smoothed_psd_fx[L_FRAME16k]; /* stereo CNA - periodogram smoothed with IIR filter */ +#ifdef IVAS_FLOAT_FIXED Word16 cna_g_state_fx[STEREO_DFT_BAND_MAX]; /* stereo CNA - side gains from the last inactive frame */ Word16 cna_cm_fx[STEREO_DFT_BAND_MAX]; /* stereo CNA - coherence from the last inactive frame */ Word16 cna_act_fact_fx; /* stereo CNA - long-term signal activity factor (0-1) */