From 5a40c85431a7e48c5f2cbd15d0475ea9e9898768 Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Tue, 22 Oct 2024 14:09:27 +0530 Subject: [PATCH] Q-info addition for decoder and renderer files --- lib_com/ivas_prot.h | 103 +- lib_dec/core_switching_dec.c | 137 ++- lib_dec/ivas_stereo_dft_dec_fx.c | 1388 ++++++++++++------------ lib_dec/ivas_svd_dec.c | 528 ++++----- lib_dec/ivas_tcx_core_dec.c | 234 ++-- lib_dec/ivas_td_low_rate_dec.c | 86 +- lib_rend/ivas_crend.c | 341 +++--- lib_rend/ivas_limiter.c | 890 +-------------- lib_rend/ivas_objectRenderer_mix.c | 229 ++-- lib_rend/ivas_objectRenderer_sfx.c | 190 ++-- lib_rend/ivas_objectRenderer_sources.c | 246 +++-- lib_rend/ivas_reverb_filter_design.c | 227 ++-- lib_rend/ivas_rom_rend.c | 819 ++++++++++++++ lib_rend/ivas_rom_rend.h | 2 + lib_rend/ivas_shoebox.c | 146 +-- lib_rend/ivas_stat_rend.h | 386 +++---- lib_rend/ivas_td_decorr.c | 67 +- 17 files changed, 3048 insertions(+), 2971 deletions(-) diff --git a/lib_com/ivas_prot.h b/lib_com/ivas_prot.h index 5ffc7f4f3..876313d1b 100644 --- a/lib_com/ivas_prot.h +++ b/lib_com/ivas_prot.h @@ -695,17 +695,17 @@ void decod_gen_2sbfr( #ifdef IVAS_FLOAT_FIXED void decod_gen_2sbfr_ivas_fx( - Decoder_State *st, /* i/o: decoder static memory */ - const Word16 sharpFlag, /* i : formant sharpening flag */ - const Word16 *Aq, /* i : LP filter coefficient */ - Word16 *pitch_buf, /* o : floating pitch values for each subframe */ - Word16 *voice_factors, /* o : voicing factors */ - Word16 *exc, /* i/o: adapt. excitation exc */ - Word16 *exc2, /* i/o: adapt. excitation/total exc */ - Word16 *bwe_exc, /* o : excitation for SWB TBE */ - Word16 *gain_buf, /* o : floating pitch gain for each subframe */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ - const Word16 tdm_Pri_pitch_buf[] /* i : pitch values for primary channel */ + Decoder_State *st, /* i/o: decoder static memory */ + const Word16 sharpFlag, /* i : formant sharpening flag `Q0*/ + const Word16 *Aq, /* i : LP filter coefficient Q12*/ + Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ + Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ + const Word16 tdm_Pri_pitch_buf[] /* i : pitch values for primary channel Q6*/ ); #endif @@ -1860,9 +1860,9 @@ void stereo_dft_quantize_res_gains( ); #ifdef IVAS_FLOAT_FIXED void stereo_dft_dequantize_itd_fx( - Word16 *ind, - Word32 *out, - const Word32 output_Fs + Word16 *ind, /* Q0 */ + Word32 *out, /* Q15 */ + const Word32 output_Fs /* Q0 */ ); #endif // IVAS_FLOAT_FIXED @@ -1894,9 +1894,9 @@ void stereo_dft_enc_sid_coh( #ifdef IVAS_FLOAT_FIXED void stereo_dft_dec_sid_coh_fx( Decoder_State *st, /* i/o: decoder state structure */ - const Word16 nbands, /* i : number of DFT stereo bands */ - Word16 *coh, /* i/o: coherence */ - Word16 *nb_bits /* i/o: number of bits read */ + const Word16 nbands, /* i : number of DFT stereo bands Q0*/ + Word16 *coh, /* i/o: coherence Q15*/ + Word16 *nb_bits /* i/o: number of bits read Q0*/ ); #endif // IVAS_FLOAT_FIXED @@ -2045,17 +2045,17 @@ void bpf_pitch_coherence( ); #ifdef IVAS_FLOAT_FIXED void stereo_dft_dec_read_BS_fx( - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word32 element_brate, /* i : element bitrate */ - Word32 *total_brate, /* o : total bitrate */ - Decoder_State *st, /* i/o: decoder state structure */ - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ - const Word16 bwidth, /* i : bandwidth */ - const Word16 output_frame, /* i : output frame length */ - Word32 res_buf[STEREO_DFT_N_8k], /* o : residual buffer */ - Word16 *nb_bits, /* o : number of bits read */ - Word16 *coh, /* i/o: Coherence */ - const Word16 ivas_format /* i : ivas format */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate Q0*/ + const Word32 element_brate, /* i : element bitrate Q0*/ + Word32 *total_brate, /* o : total bitrate Q0*/ + Decoder_State *st, /* i/o: decoder state structure */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ + const Word16 bwidth, /* i : bandwidth Q0*/ + const Word16 output_frame, /* i : output frame length Q0*/ + Word32 res_buf_fx[STEREO_DFT_N_8k], /* o : residual buffer Q0*/ + Word16 *nb_bits, /* o : number of bits read Q0*/ + Word16 *coh_fx, /* i/o: Coherence Q15*/ + const Word16 ivas_format /* i : ivas format Q0*/ ); #endif // IVAS_FLOAT_FIXED @@ -2959,15 +2959,14 @@ uint16_t get_indice_st( #ifdef IVAS_FLOAT_FIXED void tdm_low_rate_dec_fx( - Decoder_State *st, /* i/o: decoder static memory */ - Word16 dct_epit[], /* o : GSC excitation in DCT domain */ - //Word16 *tmp_noise, /* o : long term temporary noise energy */ - Word16 *pitch_buf, /* o : floating pitch values for each subframe */ - Word16 *voice_factors, /* o : voicing factors */ - Word16 *exc, /* i/o: adapt. excitation exc */ - Word16 *exc2, /* i/o: adapt. excitation/total exc */ - Word16 *bwe_exc, /* o : excitation for SWB TBE */ - const Word16 *lsf_new /* i : ISFs at the end of the frame */ + Decoder_State *st, /* i/o: decoder static memory */ + Word16 dct_epit[], /* o : GSC excitation in DCT domain Q_exc*/ + Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ + Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ + const Word16 *lsf_new /* i : ISFs at the end of the frame Q8/100 (2.56x)*/ ); #endif @@ -5462,18 +5461,18 @@ Word16 matrix_product_mant_exp( #ifdef IVAS_FLOAT_FIXED void mat2svdMat_fx( - const Word32 *mat, /* i : matrix as column ordered vector */ - Word32 svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* o : matrix as two-dimensional arry */ - const Word16 nRows, /* i : number of rows of the matrix */ - const Word16 mCols, /* i : number of columns of the matrix */ - const Word16 transpose /* i : flag indication transposition */ + const Word32 *mat, /* i : matrix as column ordered vector Qx*/ + Word32 svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* o : matrix as two-dimensional arry Qx*/ + const Word16 nRows, /* i : number of rows of the matrix Q0*/ + const Word16 mCols, /* i : number of columns of the matrix Q0*/ + const Word16 transpose /* i : flag indication transposition Q0*/ ); void svdMat2mat_fx( - Word32 svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* i : matrix as two-dimensional arry */ - Word32 *mat, /* o : matrix as column ordered vector */ - const Word16 nRows, /* i : number of rows of the matrix */ - const Word16 mCols /* i : number of columns of the matrix */ + Word32 svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* i : matrix as two-dimensional arry Qx*/ + Word32 *mat, /* o : matrix as column ordered vector Qx*/ + const Word16 nRows, /* i : number of rows of the matrix Q0*/ + const Word16 mCols /* i : number of columns of the matrix Q0*/ ); #else @@ -5599,14 +5598,14 @@ Word16 computeMixingMatricesResidual_fx( #ifdef IVAS_FLOAT_FIXED /*! r: error or success */ Word16 svd_fx( - Word32 InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) */ + Word32 InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) InputMatrix_e*/ Word16 InputMatrix_e, - Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) */ - Word32 singularValues[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) */ - Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) */ + Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) Q31*/ + Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) singularValues_fx_e*/ + Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) Q31*/ Word16 singularValues_fx_e[MAX_OUTPUT_CHANNELS], - const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed */ - const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed */ + const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ + const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed Q0*/ ); #else /*! r: error or success */ diff --git a/lib_dec/core_switching_dec.c b/lib_dec/core_switching_dec.c index 4a6c372c6..47ab012a9 100644 --- a/lib_dec/core_switching_dec.c +++ b/lib_dec/core_switching_dec.c @@ -78,7 +78,7 @@ ivas_error core_switching_pre_dec_ivas_fx( Word16 i, oldLenClasBuff, newLenClasBuff; ivas_error error; Word16 exp = 25; - + move16(); error = IVAS_ERR_OK; move32(); @@ -86,7 +86,7 @@ ivas_error core_switching_pre_dec_ivas_fx( test(); test(); test(); - IF( EQ_16( st->last_codec_mode, MODE2 ) || ( ( EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) ) && GT_16( st->element_mode, EVS_MONO ) ) ) + IF( EQ_16( st->last_codec_mode, MODE2 ) || ( ( EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) ) && ( st->element_mode > EVS_MONO ) ) ) { #ifndef FIX_770_DISCONTINUITIES_SW_TCX2ACELP Copy( st->mem_syn2_fx, st->mem_syn1_fx, M ); @@ -113,9 +113,9 @@ ivas_error core_switching_pre_dec_ivas_fx( move16(); IF( st->hPFstat != NULL ) { - Scale_sig( st->hPFstat->mem_pf_in, L_SUBFR, st->Q_syn ); /* Post_filter mem */ - Scale_sig( st->hPFstat->mem_res2, DECMEM_RES2, st->Q_syn ); /* NB post_filter mem */ - Scale_sig( st->hPFstat->mem_stp, L_SUBFR, st->Q_syn ); /* Post_filter mem */ + Scale_sig( st->hPFstat->mem_pf_in, L_SUBFR, st->Q_syn ); /* Post_filter mem ,Q_syn*/ + Scale_sig( st->hPFstat->mem_res2, DECMEM_RES2, st->Q_syn ); /* NB post_filter mem , Q_syn*/ + Scale_sig( st->hPFstat->mem_stp, L_SUBFR, st->Q_syn ); /* Post_filter mem ,Q_syn*/ set16_fx( st->hBPF->pst_old_syn_fx, 0, NBPSF_PIT_MAX ); /* BPF mem*/ } IF( st->hBPF != NULL ) @@ -123,9 +123,10 @@ ivas_error core_switching_pre_dec_ivas_fx( st->hBPF->pst_lp_ener_fx = round_fx( L_shl( Mpy_32_16_1( st->lp_error_ener, 0x6054 ), 2 + 8 ) ); /* convert from 15Q16, log2 -> 7Q8 10*log10 */ st->hBPF->pst_mem_deemp_err_fx = 0; move16(); + move16(); } #endif - st->psf_lp_noise_fx = round_fx( L_shl( st->lp_noise, 1 ) ); + st->psf_lp_noise_fx = round_fx( L_shl( st->lp_noise, 1 ) ); // Q(23+1-16)->Q8 move16(); /* reset old HB synthesis buffer */ @@ -141,7 +142,7 @@ ivas_error core_switching_pre_dec_ivas_fx( set16_fx( st->hb_prev_synth_buffer_fx, 0, NS2SA( 48000, DELAY_BWE_TOTAL_NS ) ); test(); - IF( st->hBWE_TD != NULL && NE_16( st->last_core, ACELP_CORE ) ) + IF( st->hBWE_TD != NULL && ( st->last_core != ACELP_CORE ) ) { #ifdef MSAN_FIX st->hBWE_TD->prev_hb_synth_fx_exp = 31; @@ -183,8 +184,8 @@ ivas_error core_switching_pre_dec_ivas_fx( set16_fx( st->hHQ_core->last_env_fx, 0, BANDS_MAX ); st->hHQ_core->last_max_pos_pulse = 0; - move16(); + IF( GT_32( st->output_Fs, 16000 ) ) { set32_fx( st->hHQ_core->prev_coeff_out_fx, 0, L_HQ_WB_BWE ); @@ -196,7 +197,7 @@ ivas_error core_switching_pre_dec_ivas_fx( } /* reset the GSC pre echo energy threshold in case of switching */ - IF( st->hGSCDec != NULL ) + if ( st->hGSCDec != NULL ) { st->hGSCDec->Last_frame_ener_fx = MAX_32; move32(); @@ -205,7 +206,7 @@ ivas_error core_switching_pre_dec_ivas_fx( test(); IF( EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) ) { - IF( EQ_16( st->element_mode, EVS_MONO ) ) + IF( st->element_mode == EVS_MONO ) { st->last_core = HQ_CORE; move16(); @@ -229,7 +230,7 @@ ivas_error core_switching_pre_dec_ivas_fx( } } - IF( NE_16( st->prev_bfi, 0 ) ) + IF( st->prev_bfi != 0 ) { Word16 delay_comp; @@ -243,11 +244,10 @@ ivas_error core_switching_pre_dec_ivas_fx( } delay_comp = NS2SA( st->output_Fs, DELAY_CLDFB_NS ); - /*TODO To be tested:control not entering the block*/ test(); test(); - IF( !st->last_con_tcx && EQ_16( st->last_core_bfi, ACELP_CORE ) && EQ_16( st->core, HQ_CORE ) ) + IF( !st->last_con_tcx && ( st->last_core_bfi == ACELP_CORE ) && EQ_16( st->core, HQ_CORE ) ) { /*TODO None of the test dtreams are entering this block,hence enabled assert(0)*/ assert( 0 ); @@ -265,12 +265,10 @@ ivas_error core_switching_pre_dec_ivas_fx( set32_fx( imagBufferTmp_fx[i], 0, CLDFB_NO_CHANNELS_MAX ); realBuffer_fx[i] = realBufferTmp_fx[i]; imagBuffer_fx[i] = imagBufferTmp_fx[i]; - move32(); - move32(); } /* CLDFB analysis of the synthesis at internal sampling rate */ - IF( ( error = cldfb_save_memory_ivas_fx( st->cldfbAna ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = cldfb_save_memory_ivas_fx( st->cldfbAna ) ), IVAS_ERR_OK ) ) { return error; } @@ -279,7 +277,7 @@ ivas_error core_switching_pre_dec_ivas_fx( cldfb_restore_memory_ivas_fx( st->cldfbAna ); /*Assuming Q10*/ /* CLDFB synthesis of the combined signal */ - IF( ( error = cldfb_save_memory_ivas_fx( st->cldfbSyn ) ) != IVAS_ERR_OK ) + IF( NE_32( ( error = cldfb_save_memory_ivas_fx( st->cldfbSyn ) ), IVAS_ERR_OK ) ) { return error; } @@ -292,11 +290,11 @@ ivas_error core_switching_pre_dec_ivas_fx( test(); test(); - IF( !st->last_con_tcx && EQ_16( st->last_core_bfi, ACELP_CORE ) && EQ_16( st->core, HQ_CORE ) ) + IF( !st->last_con_tcx && ( st->last_core_bfi == ACELP_CORE ) && EQ_16( st->core, HQ_CORE ) ) { - lerp( st->hTcxDec->syn_Overl, st->hHQ_core->fer_samples_fx + delay_comp, output_frame / 2, st->last_L_frame / 2 ); + lerp( st->hTcxDec->syn_Overl, st->hHQ_core->fer_samples_fx + delay_comp, shr( output_frame, 1 ), shr( st->last_L_frame, 1 ) ); /*Set to zero the remaining part*/ - set16_fx( st->hHQ_core->fer_samples_fx + delay_comp + output_frame / 2, 0, ( output_frame / 2 ) - delay_comp ); + set16_fx( st->hHQ_core->fer_samples_fx + delay_comp + output_frame / 2, 0, sub( shr( output_frame, 1 ), delay_comp ) ); } } @@ -318,14 +316,14 @@ ivas_error core_switching_pre_dec_ivas_fx( { oldLenClasBuff = mult_r( L_SYN_MEM_CLAS_ESTIM, div_s( st->last_L_frame, st->L_frame ) ); newLenClasBuff = L_SYN_MEM_CLAS_ESTIM; + move16(); } ELSE { oldLenClasBuff = L_SYN_MEM_CLAS_ESTIM; + move16(); newLenClasBuff = mult_r( L_SYN_MEM_CLAS_ESTIM, div_s( st->L_frame, st->last_L_frame ) ); } - move16(); - move16(); lerp( &st->mem_syn_clas_estim_fx[L_SYN_MEM_CLAS_ESTIM - oldLenClasBuff], &st->mem_syn_clas_estim_fx[L_SYN_MEM_CLAS_ESTIM - newLenClasBuff], newLenClasBuff, oldLenClasBuff ); } } @@ -339,7 +337,7 @@ ivas_error core_switching_pre_dec_ivas_fx( within ACELP_CORE if switching from another bitarate to vbr, last_ppp and last_nelp is always updated in the previous frame */ test(); test(); - IF( EQ_16( st->core, ACELP_CORE ) && ( NE_16( st->last_core, ACELP_CORE ) || EQ_16( st->last_codec_mode, MODE2 ) ) ) + IF( ( st->core == ACELP_CORE ) && ( ( st->last_core != ACELP_CORE ) || EQ_16( st->last_codec_mode, MODE2 ) ) ) { st->last_ppp_mode_dec = 0; st->last_nelp_mode_dec = 0; @@ -351,7 +349,7 @@ ivas_error core_switching_pre_dec_ivas_fx( test(); test(); test(); - IF( EQ_16( st->core, ACELP_CORE ) && ( NE_16( st->last_core, ACELP_CORE ) || EQ_16( st->last_codec_mode, MODE2 ) || LE_32( st->last_total_brate, PPP_NELP_2k80 ) ) ) + IF( ( st->core == ACELP_CORE ) && ( ( st->last_core != ACELP_CORE ) || EQ_16( st->last_codec_mode, MODE2 ) || LE_32( st->last_total_brate, PPP_NELP_2k80 ) ) ) { st->act_count = 3; st->uv_count = 0; @@ -370,11 +368,11 @@ ivas_error core_switching_pre_dec_ivas_fx( test(); test(); test(); - IF( ( ( EQ_16( st->core, ACELP_CORE ) || EQ_16( st->core, AMR_WB_CORE ) ) && EQ_16( st->last_core, HQ_CORE ) ) || ( ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && EQ_16( last_element_mode, IVAS_CPE_DFT ) ) ) && EQ_16( nchan_out, 2 ) && - NE_32( st->core_brate, SID_2k40 ) && NE_32( st->core_brate, FRAME_NO_DATA ) && ( EQ_32( last_core_brate_st0, FRAME_NO_DATA ) || EQ_32( last_core_brate_st0, SID_2k40 ) ) ) ) + IF( ( ( ( st->core == ACELP_CORE ) || EQ_16( st->core, AMR_WB_CORE ) ) && EQ_16( st->last_core, HQ_CORE ) ) || ( ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) || ( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && EQ_16( last_element_mode, IVAS_CPE_DFT ) ) ) && EQ_16( nchan_out, 2 ) && + NE_32( st->core_brate, SID_2k40 ) && ( st->core_brate != FRAME_NO_DATA ) && ( ( last_core_brate_st0 == FRAME_NO_DATA ) || EQ_32( last_core_brate_st0, SID_2k40 ) ) ) ) { test(); - IF( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) + if ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) { st->hPFstat->reset = 1; move16(); @@ -403,7 +401,7 @@ ivas_error core_switching_pre_dec_ivas_fx( test(); test(); test(); - IF( ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) && EQ_16( nchan_out, 2 ) && GT_32( st->core_brate, SID_2k40 ) && ( EQ_32( last_core_brate_st0, FRAME_NO_DATA ) || EQ_32( last_core_brate_st0, SID_2k40 ) ) && st->hTcxDec != NULL ) + IF( ( EQ_16( st->element_mode, IVAS_CPE_DFT ) || EQ_16( st->element_mode, IVAS_CPE_TD ) ) && EQ_16( nchan_out, 2 ) && GT_32( st->core_brate, SID_2k40 ) && ( ( last_core_brate_st0 == FRAME_NO_DATA ) || EQ_32( last_core_brate_st0, SID_2k40 ) ) && st->hTcxDec != NULL ) { /* Last frame was Stereo CNG and the synthesis memory is outdated -- reset */ set16_fx( st->hTcxDec->old_syn_Overl, 0, L_FRAME32k / 2 ); @@ -417,7 +415,7 @@ ivas_error core_switching_pre_dec_ivas_fx( set16_fx( st->mem_syn2_fx, 0, M ); } set16_fx( st->mem_syn1_fx, 0, M ); - IF( st->hBWE_TD != NULL ) + if ( st->hBWE_TD != NULL ) { st->hBWE_TD->bwe_non_lin_prev_scale_fx = 0; move32(); @@ -452,7 +450,9 @@ ivas_error core_switching_pre_dec_ivas_fx( st->lp_gainp_fx = 0; move16(); st->lp_gainc_fx = extract_h( Sqrt32( st->lp_ener_fx, &exp ) ); /*Q=15-exp*/ - st->lp_gainc_fx = shr( st->lp_gainc_fx, 12 - exp ); /*Q3*/ + move16(); + st->lp_gainc_fx = shr( st->lp_gainc_fx, sub( 12, exp ) ); /*Q3*/ + move16(); st->last_voice_factor_fx = 0; st->Last_GSC_noisy_speech_flag = 0; @@ -467,7 +467,7 @@ ivas_error core_switching_pre_dec_ivas_fx( /* reset TBE memories */ test(); test(); - IF( !st->last_con_tcx && !( ( EQ_16( st->last_core, HQ_CORE ) ) && GT_16( st->element_mode, EVS_MONO ) ) ) + IF( !st->last_con_tcx && !( ( EQ_16( st->last_core, HQ_CORE ) ) && ( st->element_mode > EVS_MONO ) ) ) { set16_fx( st->old_exc_fx, 0, L_EXC_MEM_DEC ); } @@ -500,7 +500,7 @@ ivas_error core_switching_pre_dec_ivas_fx( test(); test(); test(); - IF( ( EQ_16( st->core, ACELP_CORE ) || EQ_16( st->core, AMR_WB_CORE ) ) && ( EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) ) ) + IF( ( ( st->core == ACELP_CORE ) || EQ_16( st->core, AMR_WB_CORE ) ) && ( EQ_16( st->last_core, TCX_20_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) ) ) { IF( st->hBWE_TD != NULL ) { @@ -525,7 +525,9 @@ ivas_error core_switching_pre_dec_ivas_fx( st->lp_gainp_fx = 0; move16(); st->lp_gainc_fx = extract_h( Sqrt32( st->lp_ener_fx, &exp ) ); /*Q=15-exp*/ - st->lp_gainc_fx = shr( st->lp_gainc_fx, 12 - exp ); /*Q3*/ + move16(); + st->lp_gainc_fx = shr( st->lp_gainc_fx, sub( 12, exp ) ); /*Q3*/ + move16(); st->last_voice_factor_fx = 0; st->Last_GSC_noisy_speech_flag = 0; @@ -559,7 +561,7 @@ ivas_error core_switching_pre_dec_ivas_fx( { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Cannot allocate memory for old_synth_lenFB (32 bit) \n" ) ); } - Copy_Scale_sig_16_32( st->hTcxDec->old_synthFB_fx, old_synthFB_fx, st->hTcxDec->old_synth_lenFB, sub( Q10, Q_old_synthFB ) ); + Copy_Scale_sig_16_32( st->hTcxDec->old_synthFB_fx, old_synthFB_fx, st->hTcxDec->old_synth_lenFB, sub( Q10, Q_old_synthFB ) ); // Q10 Copy32( old_synthFB_fx + st->hTcxDec->old_synth_lenFB - offset, st->cldfbAna->cldfb_state_fx, offset ); st->cldfbAna->Q_cldfb_state = Q10; move16(); @@ -572,7 +574,7 @@ ivas_error core_switching_pre_dec_ivas_fx( test(); test(); test(); - IF( EQ_16( st->core, HQ_CORE ) && ( EQ_16( st->last_core, ACELP_CORE ) || EQ_16( st->last_core, AMR_WB_CORE ) || ( ( NE_16( st->element_mode, EVS_MONO ) ) && ( NE_16( st->last_core, HQ_CORE ) ) ) ) ) + IF( EQ_16( st->core, HQ_CORE ) && ( ( st->last_core == ACELP_CORE ) || EQ_16( st->last_core, AMR_WB_CORE ) || ( ( ( st->element_mode != EVS_MONO ) ) && ( NE_16( st->last_core, HQ_CORE ) ) ) ) ) { set32_fx( st->hHQ_core->prev_env_fx, 0, SFM_N_WB ); set32_fx( st->hHQ_core->prev_normq_fx, 0, SFM_N_WB ); @@ -592,13 +594,14 @@ ivas_error core_switching_pre_dec_ivas_fx( set32_fx( st->hHQ_core->prev_coeff_out_fx, 0, L_HQ_WB_BWE ); } - IF( NE_16( st->element_mode, EVS_MONO ) ) + IF( st->element_mode != EVS_MONO ) { /* Estimate mem_env_delta to reinit env_stab */ tmp_fx = L_max( 0, L_add( ENV_STAB_EST1_FX, L_add( Mult_32_16( st->stab_fac_smooth_lt_fx, ENV_STAB_EST2_FX ), Mult_32_16( st->log_energy_diff_lt_fx, ENV_STAB_EST3_FX ) ) ) ); /*Q12*/ st->hHQ_core->mem_env_delta = extract_l( L_min( MAX16B, tmp_fx ) ); /* Convert to Q12 and handle saturation */ - + move16(); + test(); IF( NE_16( st->last_core, TCX_20_CORE ) && NE_16( st->last_core, TCX_10_CORE ) ) { set16_fx( st->hHQ_core->old_out_fx, 0, output_frame ); @@ -631,14 +634,15 @@ ivas_error core_switching_pre_dec_ivas_fx( /* handle switching cases where preecho_sb was not called in the last frame (memory not up to date) */ IF( st->hHQ_core != NULL ) { - st->hHQ_core->pastpre--; - IF( LE_16( st->hHQ_core->pastpre, 0 ) ) + st->hHQ_core->pastpre = sub( st->hHQ_core->pastpre, 1 ); + move16(); + IF( st->hHQ_core->pastpre < 0 ) { reset_preecho_dec_fx( st->hHQ_core ); } } - - IF( EQ_32( st->core_brate, FRAME_NO_DATA ) ) + test(); + IF( st->core_brate == FRAME_NO_DATA ) { st->VAD = 0; st->m_frame_type = ZERO_FRAME; @@ -657,7 +661,7 @@ ivas_error core_switching_pre_dec_ivas_fx( move16(); move16(); /*switch on CNA on active frames*/ - IF( EQ_16( st->element_mode, EVS_MONO ) ) /* for IVAS modes, st->flag_cna is set earlier */ + IF( ( st->element_mode == EVS_MONO ) ) /* for IVAS modes, st->flag_cna is set earlier */ { test(); test(); @@ -677,7 +681,7 @@ ivas_error core_switching_pre_dec_ivas_fx( } } - IF( EQ_16( st->core, AMR_WB_CORE ) ) + if ( EQ_16( st->core, AMR_WB_CORE ) ) { st->cng_type = LP_CNG; move16(); @@ -688,18 +692,26 @@ ivas_error core_switching_pre_dec_ivas_fx( test(); test(); test(); - IF( st->hFdCngDec && ( NE_16( st->last_L_frame, st->L_frame ) || NE_16( st->hFdCngDec->hFdCngCom->frameSize, st->L_frame ) || EQ_16( st->ini_frame, 0 ) || NE_16( st->bwidth, st->last_bwidth ) ) ) + IF( st->hFdCngDec && ( NE_16( st->last_L_frame, st->L_frame ) || NE_16( st->hFdCngDec->hFdCngCom->frameSize, st->L_frame ) || ( st->ini_frame == 0 ) || NE_16( st->bwidth, st->last_bwidth ) ) ) { /* || st->last_core == AMR_WB_CORE || st->last_codec_mode == MODE2)){*/ IF( NE_16( st->core, AMR_WB_CORE ) ) { - configureFdCngDec_ivas_fx( st->hFdCngDec, st->bwidth, st->rf_flag == 1 && st->total_brate == ACELP_13k20 ? ACELP_9k60 : st->total_brate, st->L_frame, st->last_L_frame, st->element_mode ); + test(); + IF( EQ_16( st->rf_flag, 1 ) && EQ_32( st->total_brate, ACELP_13k20 ) ) + { + configureFdCngDec_ivas_fx( st->hFdCngDec, st->bwidth, ACELP_9k60, st->L_frame, st->last_L_frame, st->element_mode ); + } + ELSE + { + configureFdCngDec_ivas_fx( st->hFdCngDec, st->bwidth, st->total_brate, st->L_frame, st->last_L_frame, st->element_mode ); + } } ELSE { configureFdCngDec_ivas_fx( st->hFdCngDec, WB, ACELP_8k00, st->L_frame, st->last_L_frame, st->element_mode ); - IF( st->VAD ) + if ( st->VAD ) { st->hFdCngDec->hFdCngCom->CngBitrate = st->total_brate; move32(); @@ -724,7 +736,7 @@ ivas_error core_switching_pre_dec_ivas_fx( IF( EQ_16( st->L_frame, L_FRAME ) ) { - FOR( i = 0; i < shl( st->L_frame, 1 ); i++ ) + FOR( i = 0; i < ( st->L_frame * 2 ); i++ ) { st->hFdCngDec->hFdCngCom->olapBufferSynth_fx[i] = Mult_32_16( st->hFdCngDec->hFdCngCom->olapBufferSynth_fx[i], (Word16) 20480 /* 0.6250f in Q15 */ ); move32(); @@ -732,7 +744,7 @@ ivas_error core_switching_pre_dec_ivas_fx( } ELSE { - FOR( i = 0; i < shl( st->L_frame, 1 ); i++ ) + FOR( i = 0; i < ( st->L_frame * 2 ); i++ ) { st->hFdCngDec->hFdCngCom->olapBufferSynth_fx[i] = Mult_32_16( L_shl( st->hFdCngDec->hFdCngCom->olapBufferSynth_fx[i], 1 ), (Word16) 26214 /* 1.6f in Q14 */ ); move32(); @@ -1772,7 +1784,7 @@ void bandwidth_switching_detect_ivas_fx( st_fx->bws_cnt1 = 0; move16(); } - ELSE IF( GT_32( st_fx->total_brate, ACELP_9k60 ) && LT_32( st_fx->last_core_brate, ACELP_9k60 ) && EQ_16( st_fx->bwidth, SWB ) && EQ_16( st_fx->last_bwidth, WB ) && EQ_16( st_fx->last_low_rate_mode, 0 ) ) + ELSE IF( GT_32( st_fx->total_brate, ACELP_9k60 ) && LT_32( st_fx->last_core_brate, ACELP_9k60 ) && EQ_16( st_fx->bwidth, SWB ) && EQ_16( st_fx->last_bwidth, WB ) && ( st_fx->last_low_rate_mode == 0 ) ) { st_fx->bws_cnt1 = add( st_fx->bws_cnt1, 1 ); move16(); @@ -1987,8 +1999,9 @@ void ivas_bw_switching_pre_proc_fx( Flag Overflow = 0; + move32(); - IF( GT_16( st->element_mode, EVS_MONO ) ) + IF( st->element_mode > EVS_MONO ) { test(); test(); @@ -1999,33 +2012,36 @@ void ivas_bw_switching_pre_proc_fx( test(); test(); test(); - IF( EQ_16( st->core, ACELP_CORE ) && !( EQ_16( st->bfi, 1 ) && EQ_16( st->con_tcx, 1 ) ) && st->hBWE_FD != NULL && !( LE_32( st->core_brate, SID_2k40 ) && EQ_16( st->element_mode, IVAS_CPE_DFT ) && EQ_16( nchan_out, 2 ) ) && !( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && EQ_16( nchan_out, 1 ) && EQ_16( st->idchan, 1 ) && LE_32( last_element_brate, IVAS_SID_5k2 ) ) ) + test(); + IF( ( st->core == ACELP_CORE ) && !( EQ_16( st->bfi, 1 ) && EQ_16( st->con_tcx, 1 ) ) && st->hBWE_FD != NULL && !( LE_32( st->core_brate, SID_2k40 ) && EQ_16( st->element_mode, IVAS_CPE_DFT ) && EQ_16( nchan_out, 2 ) ) && !( EQ_16( st->element_mode, IVAS_CPE_MDCT ) && EQ_16( nchan_out, 1 ) && EQ_16( st->idchan, 1 ) && LE_32( last_element_brate, IVAS_SID_5k2 ) ) ) { /* Calculate tilt of the ACELP core synthesis - needed in SWB BWE decoding */ Word16 old_syn_12k8_16k_tmp_16fx[L_FRAME16k]; Copy_Scale_sig_32_16( old_syn_12k8_16k_fx, old_syn_12k8_16k_tmp_16fx, st->L_frame, sub( -1, Q ) ); - st->tilt_wb_fx = round_fx_sat( L_shl_sat( calc_tilt_bwe_fx( old_syn_12k8_16k_tmp_16fx, -1, st->L_frame ), sub( Q, 8 ) ) ); + st->tilt_wb_fx = round_fx_sat( L_shl_sat( calc_tilt_bwe_fx( old_syn_12k8_16k_tmp_16fx, -1, st->L_frame ), sub( Q, 8 ) ) ); // Q24+(Q-8) - 16 + move16(); } return; } + test(); test(); - test(); - IF( EQ_16( st->core, ACELP_CORE ) && !( EQ_16( st->bfi, 1 ) && EQ_16( st->con_tcx, 1 ) ) ) + IF( ( st->core == ACELP_CORE ) && !( EQ_16( st->bfi, 1 ) && EQ_16( st->con_tcx, 1 ) ) ) { /*----------------------------------------------------------------------* * Calculate tilt of the ACELP core synthesis *----------------------------------------------------------------------*/ st->tilt_wb_fx = ivas_calc_tilt_bwe_fx( old_syn_12k8_16k_fx, Q, st->L_frame ); - + move16(); /*-------------------------------------------------------------------------------* * Calculate frequency energy of 0~3.2kHz and 3.2~6.4kHz the ACELP core synthesis *-------------------------------------------------------------------------------*/ edct_fx( old_syn_12k8_16k_fx, syn_dct_fx, L_FRAME, &Q ); Word64 W_tmp = 0; + move64(); Word32 tmp; Word16 shift; FOR( i = 0; i < L_FRAME / 2; i++ ) @@ -2039,8 +2055,9 @@ void ivas_bw_switching_pre_proc_fx( tmp = getSqrtWord32( tmp ); st->enerLL_fx = tmp; + move32(); st->enerLL_fx_Q = shr( sub( add( Q, shift ), 32 ), 1 ); - + move16(); W_tmp = 0; move64(); FOR( ; i < L_FRAME; i++ ) @@ -2055,6 +2072,7 @@ void ivas_bw_switching_pre_proc_fx( st->enerLH_fx = tmp; move32(); st->enerLH_fx_Q = shr( sub( add( Q, shift ), 32 ), 1 ); + move16(); } ELSE { @@ -2090,7 +2108,6 @@ void ivas_bw_switching_pre_proc_fx( ELSE { Word32 tmp, L_tmp = 0; - L_tmp = 0; move32(); FOR( i = 0; i < L_FRAME / 2; i++ ) { @@ -2135,9 +2152,9 @@ void ivas_bw_switching_pre_proc_fx( set16_fx( st->prev_SWB_fenv_fx, 0, SWB_FENV ); } } - ELSE IF( ( ( EQ_16( st->core, ACELP_CORE ) && ( EQ_16( st->last_core, HQ_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) || EQ_16( st->last_core, TCX_20_CORE ) ) ) || ( EQ_16( st->core, st->last_core ) && NE_16( st->extl, st->last_extl ) ) ) && GE_16( st->last_bwidth, SWB ) ) + ELSE IF( ( ( ( st->core == ACELP_CORE ) && ( EQ_16( st->last_core, HQ_CORE ) || EQ_16( st->last_core, TCX_10_CORE ) || EQ_16( st->last_core, TCX_20_CORE ) ) ) || ( EQ_16( st->core, st->last_core ) && NE_16( st->extl, st->last_extl ) ) ) && GE_16( st->last_bwidth, SWB ) ) { - st->attenu_fx = 3277; + st->attenu_fx = 3277; // 0.1f in Q15 move16(); } @@ -2146,7 +2163,7 @@ void ivas_bw_switching_pre_proc_fx( test(); test(); test(); - IF( EQ_16( st->last_core, HQ_CORE ) || ( EQ_16( st->last_core, ACELP_CORE ) && !( EQ_16( st->last_extl, WB_TBE ) || EQ_16( st->last_extl, SWB_TBE ) || EQ_16( st->last_extl, FB_TBE ) ) && GT_32( st->core_brate, ACELP_8k00 ) ) ) + if ( EQ_16( st->last_core, HQ_CORE ) || ( ( st->last_core == ACELP_CORE ) && !( EQ_16( st->last_extl, WB_TBE ) || EQ_16( st->last_extl, SWB_TBE ) || EQ_16( st->last_extl, FB_TBE ) ) && GT_32( st->core_brate, ACELP_8k00 ) ) ) { st->prev_fractive = 0; move16(); diff --git a/lib_dec/ivas_stereo_dft_dec_fx.c b/lib_dec/ivas_stereo_dft_dec_fx.c index 40c8baf96..1c5a15e28 100644 --- a/lib_dec/ivas_stereo_dft_dec_fx.c +++ b/lib_dec/ivas_stereo_dft_dec_fx.c @@ -285,79 +285,79 @@ void stereo_dft_dec_reset_fx( *-------------------------------------------------------------------------*/ static void stereo_dft_dec_open_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word32 output_Fs, /* i : output sampling rate */ - const Word16 nchan_transport /* i : number of transport channels */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const Word32 output_Fs, /* i : output sampling rate Q0*/ + const Word16 nchan_transport /* i : number of transport channels Q0*/ ) { /*Sizes*/ // hStereoDft->N = (Word16) ( STEREO_DFT_HOP_MAX * output_Fs / 48000 ); - hStereoDft->N = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT_HOP_MAX ), 44740 ) ); + hStereoDft->N = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT_HOP_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */ move16(); /*Init. DFT sizes*/ - hStereoDft->NFFT = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_N_MAX ), 44740 ) ); + hStereoDft->NFFT = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_N_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */ move16(); - hStereoDft->dft_trigo_8k_fx = dft_trigo_32k_fx; - hStereoDft->dft_trigo_12k8_fx = dft_trigo_12k8_fx; - hStereoDft->dft_trigo_16k_fx = dft_trigo_32k_fx; + hStereoDft->dft_trigo_8k_fx = dft_trigo_32k_fx; /* Q15 */ + hStereoDft->dft_trigo_12k8_fx = dft_trigo_12k8_fx; /* Q15 */ + hStereoDft->dft_trigo_16k_fx = dft_trigo_32k_fx; /* Q15 */ - hStereoDft->dft32ms_ovl = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 ) ); - hStereoDft->win232ms_8k_fx = dft_win232ms_8k_fx; - hStereoDft->win232ms_12k8_fx = dft_win232ms_12k8_fx; - hStereoDft->win232ms_16k_fx = dft_win232ms_16k_fx; + hStereoDft->dft32ms_ovl = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */ + hStereoDft->win232ms_8k_fx = dft_win232ms_8k_fx; /* Q15 */ + hStereoDft->win232ms_12k8_fx = dft_win232ms_12k8_fx; /* Q15 */ + hStereoDft->win232ms_16k_fx = dft_win232ms_16k_fx; /* Q15 */ - hStereoDft->dft32ms_ovl2 = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL2_MAX ), 44740 ) ); - hStereoDft->win32ms_8k_fx = dft_win232ms_8k_fx + 1; - hStereoDft->win32ms_12k8_fx = dft_win232ms_12k8_fx + 1; - hStereoDft->win32ms_16k_fx = dft_win232ms_16k_fx + 1; + hStereoDft->dft32ms_ovl2 = extract_l( Mpy_32_32( imult3216( output_Fs, STEREO_DFT32MS_OVL2_MAX ), 44740 /* 1/48000 in Q31 */ ) ); /* Q0 */ + hStereoDft->win32ms_8k_fx = dft_win232ms_8k_fx + 1; /* Q15 */ + hStereoDft->win32ms_12k8_fx = dft_win232ms_12k8_fx + 1; /* Q15 */ + hStereoDft->win32ms_16k_fx = dft_win232ms_16k_fx + 1; /* Q15 */ IF( EQ_32( output_Fs, 16000 ) ) { - hStereoDft->dft_trigo_fx = dft_trigo_32k_fx; - hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP; + hStereoDft->dft_trigo_fx = dft_trigo_32k_fx; /* Q15 */ + hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_16k_STEP; /* Q0 */ move16(); - hStereoDft->win232ms_fx = dft_win232ms_16k_fx; - hStereoDft->win32ms_fx = dft_win232ms_16k_fx + 1; + hStereoDft->win232ms_fx = dft_win232ms_16k_fx; /* Q15 */ + hStereoDft->win32ms_fx = dft_win232ms_16k_fx + 1; /* Q15 */ } ELSE IF( EQ_32( output_Fs, 32000 ) ) { - hStereoDft->dft_trigo_fx = dft_trigo_32k_fx; - hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP; + hStereoDft->dft_trigo_fx = dft_trigo_32k_fx; /* Q15 */ + hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_32k_STEP; /* Q0 */ move16(); - hStereoDft->win232ms_fx = dft_win232ms_32k_fx; - hStereoDft->win32ms_fx = dft_win232ms_32k_fx + 1; + hStereoDft->win232ms_fx = dft_win232ms_32k_fx; /* Q15 */ + hStereoDft->win32ms_fx = dft_win232ms_32k_fx + 1; /* Q15 */ } ELSE { assert( output_Fs == 48000 ); - hStereoDft->dft_trigo_fx = dft_trigo_48k_fx; - hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP; + hStereoDft->dft_trigo_fx = dft_trigo_48k_fx; /* Q15 */ + hStereoDft->dft_trigo_step = STEREO_DFT_TRIGO_SRATE_48k_STEP; /* Q0 */ move16(); - hStereoDft->win232ms_fx = dft_win232ms_48k_fx; - hStereoDft->win32ms_fx = dft_win232ms_48k_fx + 1; + hStereoDft->win232ms_fx = dft_win232ms_48k_fx; /* Q15 */ + hStereoDft->win32ms_fx = dft_win232ms_48k_fx + 1; /* Q15 */ } - hStereoDft->win_8k_fx = dft_win_8k_fx; + hStereoDft->win_8k_fx = dft_win_8k_fx; /* Q15 */ /*Bands: find the number of bands, Nyquist freq. is not taken into account*/ set16_fx( hStereoDft->band_res, hStereoDft->hConfig->band_res, STEREO_DFT_DEC_DFT_NB ); - hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[0], hStereoDft->NFFT, DEC ); + hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[0], hStereoDft->NFFT, DEC ); /* Q0 */ move16(); - hStereoDft->hb_stefi_delay = NS2SA_FX2( output_Fs, STEREO_DFT_TD_STEFI_DELAY_NS ); + hStereoDft->hb_stefi_delay = NS2SA_FX2( output_Fs, STEREO_DFT_TD_STEFI_DELAY_NS ); /* Q0 */ move16(); IF( GT_16( nchan_transport, 2 ) ) { - hStereoDft->min_smooth_gains_fx = min_smooth_gains2_fx; - hStereoDft->max_smooth_gains_fx = max_smooth_gains2_fx; + hStereoDft->min_smooth_gains_fx = min_smooth_gains2_fx; /* Q15 */ + hStereoDft->max_smooth_gains_fx = max_smooth_gains2_fx; /* Q15 */ } ELSE { - hStereoDft->min_smooth_gains_fx = min_smooth_gains1_fx; - hStereoDft->max_smooth_gains_fx = max_smooth_gains1_fx; + hStereoDft->min_smooth_gains_fx = min_smooth_gains1_fx; /* Q15 */ + hStereoDft->max_smooth_gains_fx = max_smooth_gains1_fx; /* Q15 */ } hStereoDft->q_hb_stefi_sig_fx = Q31; move16(); @@ -378,11 +378,11 @@ static void stereo_dft_dec_open_fx( *------------------------------------------------------------------------*/ ivas_error stereo_dft_dec_create_fx( - STEREO_DFT_DEC_DATA_HANDLE *hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word32 element_brate, /* i : element bitrate */ - const Word32 output_Fs, /* i : output sampling rate */ - const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ - const Word16 nchan_transport /* i : number of transport channels */ + STEREO_DFT_DEC_DATA_HANDLE *hStereoDft, /* i/o: decoder DFT stereo handle */ + const Word32 element_brate, /* i : element bitrate Q0*/ + const Word32 output_Fs, /* i : output sampling rate Q0*/ + const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC Q0*/ + const Word16 nchan_transport /* i : number of transport channels Q0*/ ) { STEREO_DFT_DEC_DATA_HANDLE hStereoDft_loc; @@ -443,11 +443,12 @@ ivas_error stereo_dft_dec_create_fx( *-------------------------------------------------------------------------*/ static void stereo_dft_dequantize_res_gains_fx( - Word16 *ind1, - Word16 *ind2, - Word32 *gout, - Word32 *rout, - const Word16 N ) + Word16 *ind1, /* Q0 */ + Word16 *ind2, /* Q0 */ + Word32 *gout, /* Q31 */ + Word32 *rout, /* Q31 */ + const Word16 N /* Q0 */ +) { Word16 i, index; Word16 tmp; @@ -455,9 +456,9 @@ static void stereo_dft_dequantize_res_gains_fx( FOR( i = 0; i < N; i++ ) { /* Ensure the indices are within range -- may go out of range due to frame loss */ - ind1[i] = check_bounds_s( ind1[i], 0, 30 ); + ind1[i] = check_bounds_s( ind1[i], 0, 30 ); /* Q0 */ move16(); - ind2[i] = check_bounds_s( ind2[i], 0, 7 ); + ind2[i] = check_bounds_s( ind2[i], 0, 7 ); /* Q0 */ move16(); IF( LE_16( ind1[i], 15 ) ) { @@ -472,15 +473,15 @@ static void stereo_dft_dequantize_res_gains_fx( // gout[i] = LE_16( ind1[i], 15 ) ? L_negate( dft_res_gains_q_fx[index][0] ) : dft_res_gains_q_fx[index][0]; IF( LE_16( ind1[i], 15 ) ) { - gout[i] = L_negate( dft_res_gains_q_fx[index][0] ); + gout[i] = L_negate( dft_res_gains_q_fx[index][0] ); /* Q31 */ move16(); } ELSE { - gout[i] = dft_res_gains_q_fx[index][0]; + gout[i] = dft_res_gains_q_fx[index][0]; /* Q31 */ move16(); } - rout[i] = dft_res_gains_q_fx[index][1]; + rout[i] = dft_res_gains_q_fx[index][1]; /* Q31 */ move16(); } @@ -494,11 +495,12 @@ static void stereo_dft_dequantize_res_gains_fx( *---------------------------------------------------------------------------*/ static void stereo_dft_dequantize_res_gains_f_fx( - Word32 *ind1, - Word32 *ind2, - Word32 *gout, - Word32 *rout, - const Word16 N ) + Word32 *ind1, /* Q26 */ + Word32 *ind2, /* Q26 */ + Word32 *gout, /* Q31 */ + Word32 *rout, /* Q31 */ + const Word16 N /* Q0 */ +) { Word16 i, i1, j1, sign, ji, ij; Word32 L_tmp; @@ -507,9 +509,9 @@ static void stereo_dft_dequantize_res_gains_f_fx( FOR( i = 0; i < N; i++ ) { /* Ensure the indices are within range -- may go out of range due to frame loss */ - ind1[i] = check_bounds_l( ind1[i], 0, 31 << Q26 ); + ind1[i] = check_bounds_l( ind1[i], 0, 31 << Q26 ); /* Q26 */ move32(); - ind2[i] = check_bounds_l( ind2[i], 0, 7 << Q26 ); + ind2[i] = check_bounds_l( ind2[i], 0, 7 << Q26 ); /* Q26 */ move32(); /* compensate for the offset and extract/remove sign of first index */ @@ -526,49 +528,49 @@ static void stereo_dft_dequantize_res_gains_f_fx( } IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) ) { - L_tmp = L_sub( L_shl( 15, Q26 ), ind1[i] ); + L_tmp = L_sub( L_shl( 15, Q26 ), ind1[i] ); /* Q26 */ } ELSE { - L_tmp = L_sub( ind1[i], L_shl( 15, Q26 ) ); + L_tmp = L_sub( ind1[i], L_shl( 15, Q26 ) ); /* Q26 */ } - i1 = extract_l( L_shr( ( L_tmp ), Q26 ) ); + i1 = extract_l( L_shr( ( L_tmp ), Q26 ) ); /* Q0 */ IF( LT_32( ind1[i], L_shl( 15, Q26 ) ) ) { - L_tmp = L_sub( L_shl( 15, Q26 ), ind1[i] ); + L_tmp = L_sub( L_shl( 15, Q26 ), ind1[i] ); /* Q26 */ } ELSE { - L_tmp = L_sub( ind1[i], L_shl( 15, Q26 ) ); + L_tmp = L_sub( ind1[i], L_shl( 15, Q26 ) ); /* Q26 */ } - fi = L_sub( ( L_tmp ), L_shl( i1, Q26 ) ); + fi = L_sub( ( L_tmp ), L_shl( i1, Q26 ) ); /* Q26 */ move16(); - j1 = extract_l( L_shr( ind2[i], Q26 ) ); - fj = L_sub( ind2[i], L_shl( j1, Q26 ) ); + j1 = extract_l( L_shr( ind2[i], Q26 ) ); /* Q0 */ + fj = L_sub( ind2[i], L_shl( j1, Q26 ) ); /* Q26 */ /* choose base indices for interpolation */ IF( LT_32( fj, ONE_IN_Q25 ) ) { - ji = extract_l( L_min( j1, 7 ) ); + ji = extract_l( L_min( j1, 7 ) ); /* Q0 */ } ELSE { - ji = extract_l( L_min( add( j1, 1 ), 7 ) ); + ji = extract_l( L_min( add( j1, 1 ), 7 ) ); /* Q0 */ } IF( LT_32( fi, ONE_IN_Q25 ) ) { - ij = extract_l( L_min( i1, 15 ) ); + ij = extract_l( L_min( i1, 15 ) ); /* Q0 */ } ELSE { - ij = extract_l( L_min( add( i1, 1 ), 15 ) ); + ij = extract_l( L_min( add( i1, 1 ), 15 ) ); /* Q0 */ } /* interpolate values from table */ IF( LT_16( i1, 15 ) ) { - gout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fi, Q5 ) ), dft_res_gains_q_fx[add( shl( i1, 3 ), ji )][0] ), dft_res_gains_q_fx[add( shl( add( i1, 1 ), 3 ), ji )][0], L_shl( fi, Q5 ) ); + gout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fi, Q5 ) ), dft_res_gains_q_fx[( i1 << 3 ) + ji][0] ), dft_res_gains_q_fx[( ( i1 + 1 ) << 3 ) + ji][0], L_shl( fi, Q5 ) ); /* Q31 */ move32(); IF( EQ_16( sign, -1 ) ) { @@ -578,7 +580,7 @@ static void stereo_dft_dequantize_res_gains_f_fx( } ELSE { - gout[i] = dft_res_gains_q_fx[120 + ji][0]; + gout[i] = dft_res_gains_q_fx[120 + ji][0]; /* Q31 */ move32(); IF( EQ_16( sign, -1 ) ) { @@ -589,12 +591,12 @@ static void stereo_dft_dequantize_res_gains_f_fx( IF( LT_16( j1, 7 ) ) { - rout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fj, Q5 ) ), dft_res_gains_q_fx[add( shl( ij, 3 ), j1 )][1] ), L_shl( fj, Q5 ), dft_res_gains_q_fx[add( add( shl( ij, 3 ), j1 ), 1 )][1] ); + rout[i] = Madd_32_32( Mpy_32_32( L_sub( MAX_32, L_shl( fj, Q5 ) ), dft_res_gains_q_fx[( ij << 3 ) + j1][1] ), L_shl( fj, Q5 ), dft_res_gains_q_fx[( ij << 3 ) + j1 + 1][1] ); /* Q31 */ move32(); } ELSE { - rout[i] = dft_res_gains_q_fx[add( shl( ij, 3 ), 7 )][1]; + rout[i] = dft_res_gains_q_fx[( ij << 3 ) + 7][1]; /* Q31 */ move32(); } } @@ -608,9 +610,9 @@ static void stereo_dft_dequantize_res_gains_f_fx( *-------------------------------------------------------------------------*/ void stereo_dft_dec_update_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word16 output_frame, /* i : output frame length */ - const Word16 sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const Word16 output_frame, /* i : output frame length Q0*/ + const Word16 sba_dirac_stereo_flag /* i : signal stereo output for SBA DirAC Q0*/ ) { Word16 b, i, k_offset; @@ -621,30 +623,30 @@ void stereo_dft_dec_update_fx( /* Update parameters */ FOR( i = 0; i < k_offset * STEREO_DFT_BAND_MAX; i++ ) { - hStereoDft->side_gain_fx[i] = hStereoDft->side_gain_fx[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; + hStereoDft->side_gain_fx[i] = hStereoDft->side_gain_fx[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; /* Q31 */ move32(); - hStereoDft->res_pred_gain_fx[i] = hStereoDft->res_pred_gain_fx[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; + hStereoDft->res_pred_gain_fx[i] = hStereoDft->res_pred_gain_fx[STEREO_DFT_NBDIV * STEREO_DFT_BAND_MAX + i]; /* Q31 */ move32(); } FOR( i = 0; i < k_offset; i++ ) { - hStereoDft->gipd_fx[i] = hStereoDft->gipd_fx[STEREO_DFT_NBDIV + i]; + hStereoDft->gipd_fx[i] = hStereoDft->gipd_fx[STEREO_DFT_NBDIV + i]; /* Q27 */ move32(); } /* Update configuration memories */ FOR( i = 0; i < k_offset; i++ ) { - hStereoDft->band_res[i] = hStereoDft->band_res[i + STEREO_DFT_NBDIV]; + hStereoDft->band_res[i] = hStereoDft->band_res[i + STEREO_DFT_NBDIV]; /* Q0 */ move16(); - hStereoDft->prm_res[i] = hStereoDft->prm_res[i + STEREO_DFT_NBDIV]; + hStereoDft->prm_res[i] = hStereoDft->prm_res[i + STEREO_DFT_NBDIV]; /* Q0 */ move16(); - hStereoDft->itd_fx[i] = hStereoDft->itd_fx[STEREO_DFT_NBDIV + i]; + hStereoDft->itd_fx[i] = hStereoDft->itd_fx[STEREO_DFT_NBDIV + i]; /* Q15 */ move32(); - hStereoDft->res_cod_mode[i] = hStereoDft->res_cod_mode[i + STEREO_DFT_NBDIV]; + hStereoDft->res_cod_mode[i] = hStereoDft->res_cod_mode[i + STEREO_DFT_NBDIV]; /* Q0 */ move16(); - hStereoDft->res_pred_mode[i] = hStereoDft->res_pred_mode[i + STEREO_DFT_NBDIV]; + hStereoDft->res_pred_mode[i] = hStereoDft->res_pred_mode[i + STEREO_DFT_NBDIV]; /* Q0 */ move16(); } @@ -668,13 +670,13 @@ void stereo_dft_dec_update_fx( FOR( i = STEREO_DFT_CORE_HIST_MAX - 1; i > 0; i-- ) { - hStereoDft->core_hist[i] = hStereoDft->core_hist[i - 1]; + hStereoDft->core_hist[i] = hStereoDft->core_hist[i - 1]; /* Q0 */ move16(); } - Copy32( hStereoDft->hb_stefi_sig_fx + output_frame, hStereoDft->hb_stefi_sig_fx, hStereoDft->hb_stefi_delay ); - Copy32( hStereoDft->hb_nrg_fx, hStereoDft->hb_nrg_fx + 1, STEREO_DFT_CORE_HIST_MAX - 1 ); - Copy32( hStereoDft->td_gain_fx, hStereoDft->td_gain_fx + 1, STEREO_DFT_CORE_HIST_MAX - 1 ); + Copy32( hStereoDft->hb_stefi_sig_fx + output_frame, hStereoDft->hb_stefi_sig_fx, hStereoDft->hb_stefi_delay ); /* Qx */ + Copy32( hStereoDft->hb_nrg_fx, hStereoDft->hb_nrg_fx + 1, STEREO_DFT_CORE_HIST_MAX - 1 ); /* Qx */ + Copy32( hStereoDft->td_gain_fx, hStereoDft->td_gain_fx + 1, STEREO_DFT_CORE_HIST_MAX - 1 ); /* q_td_gain */ #ifdef FIX_826_PRECISION_LOST_AND_COMPL Copy( hStereoDft->q_td_gain, hStereoDft->q_td_gain + 1, STEREO_DFT_CORE_HIST_MAX - 1 ); #else @@ -688,7 +690,7 @@ void stereo_dft_dec_update_fx( { FOR( i = SBA_DIRAC_NRG_SMOOTH_LONG; i > 1; i-- ) { - hStereoDft->smooth_buf_fx[b][i] = hStereoDft->smooth_buf_fx[b][i - 2]; + hStereoDft->smooth_buf_fx[b][i] = hStereoDft->smooth_buf_fx[b][i - 2]; /* q_smooth_buf_fx */ move32(); } } @@ -704,11 +706,11 @@ void stereo_dft_dec_update_fx( *-------------------------------------------------------------------------*/ void stereo_dft_dec_synthesize_fx( - CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ - Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i : DFT buffers */ - const Word16 chan, /* i : channel number */ - Word32 output[L_FRAME48k], /* o : output synthesis signal */ - const Word16 output_frame /* i : output frame length */ + CPE_DEC_HANDLE hCPE, /* i/o: CPE decoder structure */ + Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i : DFT buffers qDFT*/ + const Word16 chan, /* i : channel number Q0*/ + Word32 output[L_FRAME48k], /* o : output synthesis signal qDFT*/ + const Word16 output_frame /* i : output frame length Q0*/ ) { Word16 i, k; @@ -716,7 +718,7 @@ void stereo_dft_dec_synthesize_fx( STEREO_DFT_DEC_DATA_HANDLE hStereoDft; Word32 *p_DFT; const Word16 *win, *win2; - Word16 trigo_dec[( ( STEREO_DFT32MS_N_MAX ) >> 1 ) + 1]; + Word16 trigo_dec[STEREO_DFT32MS_N_MAX / 2 + 1]; Word16 trigo_step; Word16 ovl, zp, NFFT; Word32 outputFs; @@ -734,20 +736,20 @@ void stereo_dft_dec_synthesize_fx( hCPE->lt_es_em_fx = L_shr( hCPE->lt_es_em_fx, 9 ); // Q24 -> Q15 - outputFs = L_mult0( output_frame, FRAMES_PER_SEC ); + outputFs = L_mult0( output_frame, FRAMES_PER_SEC ); /* Q0 */ zp = NS2SA_FX2( outputFs, STEREO_DFT32MS_ZP_NS ); move16(); ovl = NS2SA_FX2( outputFs, STEREO_DFT32MS_OVL_NS ); move16(); - win = hStereoDft->win32ms_fx; + win = hStereoDft->win32ms_fx; /* Q15 */ NFFT = NS2SA_FX2( outputFs, STEREO_DFT32MS_N_NS ); move16(); ovl2 = NS2SA_FX2( outputFs, STEREO_DFT32MS_OVL2_NS ); move16(); flat_portion_end = NS2SA_FX2( outputFs, L_sub( STEREO_DFT32MS_WIN_CENTER_NS, L_shr( STEREO_DFT32MS_OVL2_NS, 1 ) ) ); move16(); - win2 = hStereoDft->win232ms_fx; + win2 = hStereoDft->win232ms_fx; /* Q15 */ p_DFT = DFT[chan]; set32_fx( output, 0, NS2SA_FX2( outputFs, FRAME_SIZE_NS ) ); @@ -758,7 +760,7 @@ void stereo_dft_dec_synthesize_fx( test(); if ( ( chan == 0 && GT_16( hCPE->hCoreCoder[0]->last_coder_type, UNVOICED ) ) || EQ_16( hCPE->last_element_mode, IVAS_CPE_MDCT ) || LT_16( hCPE->last_element_mode, IVAS_CPE_DFT ) ) { - hCPE->stereo_switching_counter = 10; + hCPE->stereo_switching_counter = 10; /* Q0 */ move16(); } @@ -766,7 +768,7 @@ void stereo_dft_dec_synthesize_fx( { /* Set the level of dispersion */ Word16 tmp = extract_l( L_max( (Word16) 0xF333, L_min( (Word16) 0x3333, hCPE->lt_es_em_fx ) ) ); - hCPE->NbFrameMod = extract_h( L_add( L_mult0( 12, tmp ), 0x0000D99A ) ); /* -0.1: -0.4 ; -0.1 -> 0, 0.4 -> 6*/ + hCPE->NbFrameMod = extract_h( L_add( L_mult0( 12, tmp ), 0x0000D99A ) ); /* -0.1: -0.4 ; -0.1 -> 0, 0.4 -> 6*/ /* Q0 */ move16(); } moffset = s_max( 0, sub( 6, hCPE->NbFrameMod ) ); @@ -775,15 +777,15 @@ void stereo_dft_dec_synthesize_fx( * Synthesis *-----------------------------------------------------------------*/ - trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); - FOR( i = 0; i < shr( NFFT, 2 ); i++ ) + trigo_step = i_mult( hStereoDft->dft_trigo_step, STEREO_DFT_TRIGO_DEC_STEP ); /* Q0 */ + FOR( i = 0; i < NFFT / 4; i++ ) { - trigo_dec[i] = hStereoDft->dft_trigo_fx[i_mult( i, trigo_step )]; + trigo_dec[i] = hStereoDft->dft_trigo_fx[i * trigo_step]; /* Q15 */ move16(); - trigo_dec[sub( shr( NFFT, 1 ), i )] = hStereoDft->dft_trigo_fx[i * trigo_step]; + trigo_dec[NFFT / 2 - i] = hStereoDft->dft_trigo_fx[i * trigo_step]; /* Q15 */ move16(); } - trigo_dec[shr( NFFT, 2 )] = hStereoDft->dft_trigo_fx[shr( NFFT, 2 ) * trigo_step]; + trigo_dec[NFFT / 4] = hStereoDft->dft_trigo_fx[NFFT / 4 * trigo_step]; /* Q15 */ move16(); FOR( k = 0; k < STEREO_DFT_NBDIV; k++ ) @@ -796,17 +798,17 @@ void stereo_dft_dec_synthesize_fx( test(); IF( LE_16( hCPE->stereo_switching_counter, 6 ) && EQ_16( chan, 1 ) && ( GT_32( hCPE->lt_es_em_fx, (Word16) 0xCCCD ) || GT_16( hCPE->NbFrameMod, 4 ) ) ) { - FOR( i = 3; i < sub( sub( NFFT, moffset ), 1 ); i++ ) + FOR( i = 3; i < NFFT - moffset - 1; i++ ) { - p_DFT[i] = L_negate( p_DFT[add( add( i, moffset ), 1 )] ); + p_DFT[i] = L_negate( p_DFT[i + moffset + 1] ); /* q_DFT */ move32(); } } ELSE IF( LT_16( hCPE->stereo_switching_counter, 7 ) && ( GT_32( hCPE->lt_es_em_fx, (Word16) 0x199A ) || GT_16( hCPE->NbFrameMod, 4 ) ) ) { - FOR( i = sub( 16, hCPE->NbFrameMod ); i < sub( NFFT, add( moffset, 1 ) ); i++ ) + FOR( i = 16 - hCPE->NbFrameMod; i < NFFT - moffset - 1; i++ ) { - p_DFT[i - 2] = L_negate( p_DFT[add( add( i, moffset ), 1 )] ); + p_DFT[i - 2] = L_negate( p_DFT[i + moffset + 1] ); /* q_DFT */ move32(); } } @@ -826,19 +828,19 @@ void stereo_dft_dec_synthesize_fx( /* Left OLA - 3.125ms */ FOR( i = 0; i < ovl; i++ ) { - output[add( offset, i )] = Madd_32_16( L_shr( hCPE->output_mem_fx[chan][i], sub( hCPE->q_output_mem_fx[chan], hCPE->hStereoDft->q_dft ) ), p_DFT[add( zp, i )], win[STEREO_DFT32MS_STEP * i] ); + output[offset + i] = Madd_32_16( L_shr( hCPE->output_mem_fx[chan][i], sub( hCPE->q_output_mem_fx[chan], hCPE->hStereoDft->q_dft ) ), p_DFT[zp + i], win[STEREO_DFT32MS_STEP * i] ); /* hCPE->hStereoDft->q_dft */ move32(); } /* Flat Portion */ FOR( i = ovl; i < flat_portion_end; i++ ) { - output[add( offset, i )] = p_DFT[add( zp, i )]; + output[offset + i] = p_DFT[zp + i]; /* hCPE->hStereoDft->q_dft */ move32(); } /* Right OLA */ FOR( i = 0; i < ovl2; i++ ) { - ola_buff[i] = Mpy_32_16_1( p_DFT[add( sub( NFFT, add( zp, ovl2 ) ), i )], win2[sub( sub( ovl2, i ), 1 )] ); + ola_buff[i] = Mpy_32_16_1( p_DFT[NFFT - zp - ovl2 + i], win2[ovl2 - 1 - i] ); /* hCPE->hStereoDft->q_dft */ move32(); } } @@ -850,19 +852,19 @@ void stereo_dft_dec_synthesize_fx( /* Left OLA */ FOR( i = 0; i < ovl2; i++ ) { - output[add( offset, i )] = Madd_32_16( ola_buff[i], p_DFT[add( zp, i )], win2[i] ); + output[offset + i] = Madd_32_16( ola_buff[i], p_DFT[zp + i], win2[i] ); /* hCPE->hStereoDft->q_dft */ move32(); } /* Flat Portion */ - FOR( i = ovl2; i < sub( NFFT, add( shl( zp, 1 ), ovl ) ); i++ ) + FOR( i = ovl2; i < NFFT - 2 * zp - ovl; i++ ) { - output[add( offset, i )] = p_DFT[add( zp, i )]; + output[offset + i] = p_DFT[zp + i]; /* hCPE->hStereoDft->q_dft */ move32(); } /* Right OLA - 3.125ms */ FOR( i = 0; i < ovl; i++ ) { - hCPE->output_mem_fx[chan][i] = Mpy_32_16_1( p_DFT[add( sub( NFFT, add( zp, ovl ) ), i )], win[i_mult( STEREO_DFT32MS_STEP, ( sub( sub( ovl, i ), 1 ) ) )] ); + hCPE->output_mem_fx[chan][i] = Mpy_32_16_1( p_DFT[NFFT - zp - ovl + i], win[STEREO_DFT32MS_STEP * ( ovl - 1 - i )] ); /* hCPE->hStereoDft->q_dft */ move32(); } hCPE->q_output_mem_fx[chan] = hCPE->hStereoDft->q_dft; @@ -886,9 +888,9 @@ void stereo_dft_dec_synthesize_fx( void stereo_dft_dec_smooth_parameters_fx( STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word16 prev_sid_nodata, /* i : Previous SID/No data indicator */ - const Word16 active_frame_counter, /* i : Active frame counter */ - const Word32 element_brate /* i : Element bitrate */ + const Word16 prev_sid_nodata, /* i : Previous SID/No data indicator Q0*/ + const Word16 active_frame_counter, /* i : Active frame counter Q0*/ + const Word32 element_brate /* i : Element bitrate Q0*/ ) { Word16 k_offset, k, k2, b, N_div; @@ -917,7 +919,7 @@ void stereo_dft_dec_smooth_parameters_fx( k = 1; FOR( b = 0; b < hStereoDft->nbands; b++ ) { - *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), 1 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ) ); + *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), 1 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ) ); /* Q31 */ move32(); } @@ -931,15 +933,15 @@ void stereo_dft_dec_smooth_parameters_fx( #endif { Word16 q_val; - IF( GT_32( L_sub( hStereoDft->gipd_fx[add( k, k_offset )], hStereoDft->ipd_xfade_prev_fx ), EVS_PI_FX_Q27 ) ) + IF( GT_32( L_sub( hStereoDft->gipd_fx[k + k_offset], hStereoDft->ipd_xfade_prev_fx ), EVS_PI_FX_Q27 ) ) { #ifdef FIX_874_INCREASE_IPD_PRECISION_A - hStereoDft->ipd_xfade_target_fx = L_sub( hStereoDft->gipd_fx[add( k, k_offset )], EVS_PI_FX_Q27 << 1 ); + hStereoDft->ipd_xfade_target_fx = L_sub( hStereoDft->gipd_fx[k + k_offset], EVS_PI_FX_Q27 << 1 ); /* Q27 */ #else hStereoDft->ipd_xfade_target_fx = L_sub( hStereoDft->gipd_fx[add( k, k_offset )], EVS_PI_FX_Q27 ); #endif move32(); - hStereoDft->ipd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->ipd_xfade_target_fx, hStereoDft->ipd_xfade_prev_fx ), L_shl( L_sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->ipd_xfade_counter ), Q24 ), &q_val ); + hStereoDft->ipd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->ipd_xfade_target_fx, hStereoDft->ipd_xfade_prev_fx ), L_shl( L_sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->ipd_xfade_counter ), Q24 ), &q_val ); /* Q27 */ move32(); q_val = add( q_val, Q9 ); /* Q27 - (Q15 - q_val + (-3))*/ @@ -950,20 +952,20 @@ void stereo_dft_dec_smooth_parameters_fx( } ELSE { - hStereoDft->ipd_xfade_step_fx = L_shl( hStereoDft->ipd_xfade_step_fx, q_val ); + hStereoDft->ipd_xfade_step_fx = L_shl( hStereoDft->ipd_xfade_step_fx, q_val ); /* Q27 */ move32(); } } - ELSE IF( GT_32( L_sub( hStereoDft->ipd_xfade_prev_fx, hStereoDft->gipd_fx[add( k, k_offset )] ), EVS_PI_FX_Q27 ) ) + ELSE IF( GT_32( L_sub( hStereoDft->ipd_xfade_prev_fx, hStereoDft->gipd_fx[k + k_offset] ), EVS_PI_FX_Q27 ) ) { #ifndef FIX_874_INCREASE_IPD_PRECISION_A hStereoDft->ipd_xfade_target_fx = L_add( hStereoDft->gipd_fx[add( k, k_offset )], L_shl( EVS_PI_FX_Q27, 1 ) ); #else - hStereoDft->ipd_xfade_target_fx = L_add( hStereoDft->gipd_fx[add( k, k_offset )], EVS_PI_FX_Q27 << 1 ); + hStereoDft->ipd_xfade_target_fx = L_add( hStereoDft->gipd_fx[k + k_offset], EVS_PI_FX_Q27 << 1 ); /* Q27 */ #endif move32(); - hStereoDft->ipd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->ipd_xfade_target_fx, hStereoDft->ipd_xfade_prev_fx ), L_shl( L_sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->ipd_xfade_counter ), Q24 ), &q_val ); - q_val = add( q_val, Q9 ); /* Q27 - (Q15 - q_val + (-3))*/ + hStereoDft->ipd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->ipd_xfade_target_fx, hStereoDft->ipd_xfade_prev_fx ), L_shl( L_sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->ipd_xfade_counter ), Q24 ), &q_val ); /* Q27 */ + q_val = add( q_val, Q9 ); /* Q27 - (Q15 - q_val + (-3))*/ move32(); IF( GT_16( q_val, 32 ) ) { @@ -971,13 +973,13 @@ void stereo_dft_dec_smooth_parameters_fx( } ELSE { - hStereoDft->ipd_xfade_step_fx = L_shl( hStereoDft->ipd_xfade_step_fx, q_val ); + hStereoDft->ipd_xfade_step_fx = L_shl( hStereoDft->ipd_xfade_step_fx, q_val ); /* Q27 */ move32(); } } ELSE { - hStereoDft->ipd_xfade_target_fx = hStereoDft->gipd_fx[add( k, k_offset )]; + hStereoDft->ipd_xfade_target_fx = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */ move32(); hStereoDft->ipd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->ipd_xfade_target_fx, hStereoDft->ipd_xfade_prev_fx ), L_shl( L_sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->ipd_xfade_counter ), Q24 ), &q_val ); q_val = add( q_val, Q9 ); /* Q27 - (Q15 - q_val + (-3))*/ @@ -988,7 +990,7 @@ void stereo_dft_dec_smooth_parameters_fx( } ELSE { - hStereoDft->ipd_xfade_step_fx = L_shl( hStereoDft->ipd_xfade_step_fx, q_val ); + hStereoDft->ipd_xfade_step_fx = L_shl( hStereoDft->ipd_xfade_step_fx, q_val ); /* Q27 */ move32(); } } @@ -999,11 +1001,11 @@ void stereo_dft_dec_smooth_parameters_fx( test(); IF( NE_32( hStereoDft->ipd_xfade_prev_fx, hStereoDft->ipd_xfade_target_fx ) && LT_16( hStereoDft->ipd_xfade_counter, STEREO_DFT_ITD_CNG_XFADE ) && LE_32( hStereoDft->last_active_element_brate, 24400 ) ) { - hStereoDft->gipd_fx[add( k, k_offset )] = L_add( hStereoDft->ipd_xfade_prev_fx, hStereoDft->ipd_xfade_step_fx ); + hStereoDft->gipd_fx[k + k_offset] = L_add( hStereoDft->ipd_xfade_prev_fx, hStereoDft->ipd_xfade_step_fx ); /* Q27 */ move32(); - hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[add( k, k_offset )]; + hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */ move32(); - hStereoDft->ipd_xfade_counter = add( hStereoDft->ipd_xfade_counter, 1 ); + hStereoDft->ipd_xfade_counter = add( hStereoDft->ipd_xfade_counter, 1 ); /* Q27 */ move16(); } } @@ -1012,18 +1014,18 @@ void stereo_dft_dec_smooth_parameters_fx( /* First active frame, "reset" everything if long enough active encoding, only triggered if STEREO_DFT_ITD_CNG_XFADE_RESET = -1 */ IF( GT_16( active_frame_counter, STEREO_DFT_ITD_CNG_XFADE_RESET ) ) { - hStereoDft->ipd_xfade_target_fx = hStereoDft->gipd_fx[add( k, k_offset )]; + hStereoDft->ipd_xfade_target_fx = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */ move32(); - hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[add( k, k_offset )]; + hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */ move32(); hStereoDft->ipd_xfade_counter = 0; move16(); } } - FOR( k2 = 1; k2 < hStereoDft->prm_res[add( k, k_offset )]; k2++ ) + FOR( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ ) { - hStereoDft->gipd_fx[sub( add( k, k_offset ), k2 )] = hStereoDft->gipd_fx[add( k, k_offset )]; + hStereoDft->gipd_fx[( k + k_offset ) - k2] = hStereoDft->gipd_fx[k + k_offset]; /* Q27 */ move32(); } @@ -1037,7 +1039,7 @@ void stereo_dft_dec_smooth_parameters_fx( #endif { Word16 q_val; - hStereoDft->itd_xfade_target_fx = hStereoDft->itd_fx[add( k, k_offset )]; + hStereoDft->itd_xfade_target_fx = hStereoDft->itd_fx[k + k_offset]; /* Q15 */ move32(); hStereoDft->itd_xfade_step_fx = BASOP_Util_Divide3232_Scale( L_sub( hStereoDft->itd_xfade_target_fx, hStereoDft->itd_xfade_prev_fx ), L_shl( sub( STEREO_DFT_ITD_CNG_XFADE, hStereoDft->itd_xfade_counter ), Q15 ), &q_val ); IF( GT_16( q_val, 16 ) ) @@ -1046,7 +1048,7 @@ void stereo_dft_dec_smooth_parameters_fx( } ELSE { - hStereoDft->itd_xfade_step_fx = L_shl( hStereoDft->itd_xfade_step_fx, q_val ); + hStereoDft->itd_xfade_step_fx = L_shl( hStereoDft->itd_xfade_step_fx, q_val ); /* Q15 */ move32(); } move32(); @@ -1055,11 +1057,11 @@ void stereo_dft_dec_smooth_parameters_fx( /* xfade */ IF( NE_32( hStereoDft->itd_xfade_prev_fx, hStereoDft->itd_xfade_target_fx ) && LT_16( hStereoDft->itd_xfade_counter, STEREO_DFT_ITD_CNG_XFADE ) && LE_32( hStereoDft->last_active_element_brate, 24400 ) ) { - hStereoDft->itd_fx[add( k, k_offset )] = L_add( hStereoDft->itd_xfade_prev_fx, hStereoDft->itd_xfade_step_fx ); + hStereoDft->itd_fx[k + k_offset] = L_add( hStereoDft->itd_xfade_prev_fx, hStereoDft->itd_xfade_step_fx ); /* Q15 */ move32(); - hStereoDft->itd_xfade_prev_fx = hStereoDft->itd_fx[add( k, k_offset )]; + hStereoDft->itd_xfade_prev_fx = hStereoDft->itd_fx[k + k_offset]; /* Q15 */ move32(); - hStereoDft->itd_xfade_counter = add( hStereoDft->itd_xfade_counter, 1 ); + hStereoDft->itd_xfade_counter = add( hStereoDft->itd_xfade_counter, 1 ); /* Q0 */ } } ELSE @@ -1067,20 +1069,20 @@ void stereo_dft_dec_smooth_parameters_fx( /* First active frame, "reset" everything if long enough active encoding, only triggered if STEREO_DFT_ITD_CNG_XFADE_RESET = -1 */ IF( GT_16( active_frame_counter, STEREO_DFT_ITD_CNG_XFADE_RESET ) ) { - hStereoDft->itd_xfade_target_fx = hStereoDft->itd_fx[add( k, k_offset )]; + hStereoDft->itd_xfade_target_fx = hStereoDft->itd_fx[k + k_offset]; /* Q15 */ move32(); - hStereoDft->itd_xfade_prev_fx = hStereoDft->itd_fx[add( k, k_offset )]; + hStereoDft->itd_xfade_prev_fx = hStereoDft->itd_fx[k + k_offset]; /* Q15 */ move32(); - hStereoDft->itd_xfade_counter = 0; + hStereoDft->itd_xfade_counter = 0; /* Q0 */ move32(); } hStereoDft->last_active_element_brate = element_brate; move32(); } - FOR( k2 = 1; k2 < hStereoDft->prm_res[add( k, k_offset )]; k2++ ) + FOR( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ ) { - hStereoDft->itd_fx[sub( add( k, k_offset ), k2 )] = hStereoDft->itd_fx[add( k, k_offset )]; + hStereoDft->itd_fx[( k + k_offset ) - k2] = hStereoDft->itd_fx[k + k_offset]; /* Q15 */ move32(); } @@ -1092,22 +1094,22 @@ void stereo_dft_dec_smooth_parameters_fx( { hStereoDft->itd_xfade_counter = 0; move16(); - hStereoDft->itd_xfade_target_fx = hStereoDft->itd_fx[STEREO_DFT_NBDIV - 1]; + hStereoDft->itd_xfade_target_fx = hStereoDft->itd_fx[STEREO_DFT_NBDIV - 1]; /* Q15 */ move32(); - hStereoDft->itd_xfade_prev_fx = hStereoDft->itd_fx[STEREO_DFT_NBDIV - 1]; + hStereoDft->itd_xfade_prev_fx = hStereoDft->itd_fx[STEREO_DFT_NBDIV - 1]; /* Q15 */ move32(); hStereoDft->ipd_xfade_counter = 0; move16(); - hStereoDft->ipd_xfade_target_fx = hStereoDft->gipd_fx[STEREO_DFT_NBDIV - 1]; + hStereoDft->ipd_xfade_target_fx = hStereoDft->gipd_fx[STEREO_DFT_NBDIV - 1]; /* Q27 */ move32(); - hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[STEREO_DFT_NBDIV - 1]; + hStereoDft->ipd_xfade_prev_fx = hStereoDft->gipd_fx[STEREO_DFT_NBDIV - 1]; /* Q27 */ move32(); } hStereoDft->last_active_element_brate = element_brate; move32(); - FOR( k = sub( hStereoDft->prm_res[k_offset], 1 ); k < N_div; k += hStereoDft->prm_res[add( k, k_offset )] ) + FOR( k = sub( hStereoDft->prm_res[k_offset], 1 ); k < N_div; k += hStereoDft->prm_res[k + k_offset] ) { max_res_pred_ind = 0; move32(); @@ -1121,19 +1123,19 @@ void stereo_dft_dec_smooth_parameters_fx( FOR( b = sub( hStereoDft->nbands_respred, 1 ); b >= nbands; b-- ) { hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = - hStereoDft->res_gains_ind_fx[1][b - STEREO_DFT_RES_PRED_BAND_MIN_RED + hStereoDft->res_pred_band_min + STEREO_DFT_BAND_MAX]; + hStereoDft->res_gains_ind_fx[1][b - STEREO_DFT_RES_PRED_BAND_MIN_RED + hStereoDft->res_pred_band_min + STEREO_DFT_BAND_MAX]; /* Q26 */ move32(); - hStereoDft->res_gains_ind_fx[1][b - STEREO_DFT_RES_PRED_BAND_MIN_RED + hStereoDft->res_pred_band_min + STEREO_DFT_BAND_MAX] = 0; + hStereoDft->res_gains_ind_fx[1][b - STEREO_DFT_RES_PRED_BAND_MIN_RED + hStereoDft->res_pred_band_min + STEREO_DFT_BAND_MAX] = 0; /* Q26 */ move32(); } } /* Get maximal index */ - FOR( b = hStereoDft->res_pred_band_min; b < sub( nbands, STEREO_DFT_RES_PRED_BAND_MIN_CONST ); b++ ) + FOR( b = hStereoDft->res_pred_band_min; b < nbands - STEREO_DFT_RES_PRED_BAND_MIN_CONST; b++ ) { IF( LT_32( max_res_pred_ind, hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] ) ) { - max_res_pred_ind = hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX]; + max_res_pred_ind = hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX]; /* Q26 */ move32(); } } @@ -1142,7 +1144,7 @@ void stereo_dft_dec_smooth_parameters_fx( FOR( ; b < nbands; b++ ) { assert( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] == 0 ); - hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = max_res_pred_ind; + hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = max_res_pred_ind; /* Q26 */ move32(); } } @@ -1152,12 +1154,12 @@ void stereo_dft_dec_smooth_parameters_fx( Word32 tmp; Word16 tmps1, tmps2; - hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; + hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; /* Q26 */ move32(); /*stereo_dft_dequantize_res_gains_f(&hStereoDft->res_gains_ind[0][b], &hStereoDft->res_gains_ind[1][b+STEREO_DFT_BAND_MAX],hStereoDft->side_gain+(k+k_offset)*STEREO_DFT_BAND_MAX+b, hStereoDft->res_pred_gain+(k+k_offset)*STEREO_DFT_BAND_MAX+b, 1);*/ - tmps1 = (Word16) L_shr( hStereoDft->res_gains_ind_fx[0][b], Q26 ); + tmps1 = (Word16) L_shr( hStereoDft->res_gains_ind_fx[0][b], Q26 ); /* Q0 */ move16(); - tmps2 = (Word16) L_shr( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], Q26 ); + tmps2 = (Word16) L_shr( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], Q26 ); /* Q0 */ move16(); stereo_dft_dequantize_res_gains_fx( &tmps1, &tmps2, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); @@ -1165,20 +1167,20 @@ void stereo_dft_dec_smooth_parameters_fx( test(); IF( hStereoDft->attackPresent ) { - hStereoDft->res_gains_ind_fx[1][b] = Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x6666 ); + hStereoDft->res_gains_ind_fx[1][b] = Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x6666 ); /* Q26 */ move32(); } ELSE IF( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && ( LT_32( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], ONE_IN_Q27 ) ) ) ) /* Assuming Maximum Q of res_gains_ind_fx is Q26 */ { hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x4CCD ), - hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], (Word16) 0x3333 ); + hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], (Word16) 0x3333 ); /* Q26 */ move32(); } ELSE { hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_s2_fx[b] ), hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], - sub( (Word16) 0x7FFF, dft_alpha_s2_fx[b] ) ); + sub( (Word16) 0x7FFF, dft_alpha_s2_fx[b] ) ); /* Q26 */ move32(); } @@ -1192,25 +1194,25 @@ void stereo_dft_dec_smooth_parameters_fx( test(); IF( hStereoDft->attackPresent ) { - hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; + hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; /* Q26 */ move32(); - hStereoDft->res_gains_ind_fx[1][b] = Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x6666 ); + hStereoDft->res_gains_ind_fx[1][b] = Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], (Word16) 0x6666 ); /* Q26 */ move32(); } ELSE IF( hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && LT_32( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], ONE_IN_Q27 ) ) ) { - hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; + hStereoDft->res_gains_ind_fx[0][b] = hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX]; /* Q26 */ move32(); IF( EQ_16( hStereoDft->hConfig->band_res, STEREO_DFT_BAND_RES_LOW ) ) { hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_w_b2_fx[b] ), - hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], sub( (Word16) 0x7FFF, dft_alpha_w_b2_fx[b] ) ); + hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], sub( (Word16) 0x7FFF, dft_alpha_w_b2_fx[b] ) ); /* Q26 */ move32(); } ELSE { hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_w_fx[b] ), - hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], sub( (Word16) 0x7FFF, dft_alpha_w_fx[b] ) ); + hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], sub( (Word16) 0x7FFF, dft_alpha_w_fx[b] ) ); /* Q26 */ move32(); } } @@ -1220,22 +1222,22 @@ void stereo_dft_dec_smooth_parameters_fx( { hStereoDft->res_gains_ind_fx[0][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[0][b], dft_alpha_s_b2_fx[b] ), hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX], - sub( (Word16) 0x7FFF, dft_alpha_s_b2_fx[b] ) ); + sub( (Word16) 0x7FFF, dft_alpha_s_b2_fx[b] ) ); /* Q26 */ move32(); hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_s2_b2_fx[b] ), hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], - sub( (Word16) 0x7FFF, dft_alpha_s2_b2_fx[b] ) ); + sub( (Word16) 0x7FFF, dft_alpha_s2_b2_fx[b] ) ); /* Q26 */ move32(); } ELSE { hStereoDft->res_gains_ind_fx[0][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[0][b], dft_alpha_s_fx[b] ), hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX], - sub( (Word16) ( 0x7FFF ), dft_alpha_s_fx[b] ) ); + sub( (Word16) ( 0x7FFF ), dft_alpha_s_fx[b] ) ); /* Q26 */ move32(); hStereoDft->res_gains_ind_fx[1][b] = Madd_32_16( Mpy_32_16_1( hStereoDft->res_gains_ind_fx[1][b], dft_alpha_s2_fx[b] ), hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], - sub( (Word16) ( 0x7FFF ), dft_alpha_s2_fx[b] ) ); + sub( (Word16) ( 0x7FFF ), dft_alpha_s2_fx[b] ) ); /* Q26 */ move32(); } } @@ -1248,14 +1250,14 @@ void stereo_dft_dec_smooth_parameters_fx( /* Smoothing of IPDs*/ pgIpd = hStereoDft->gipd_fx + ( add( k, k_offset ) ); - diff_ipd = L_sub( pgIpd[0], pgIpd[-hStereoDft->prm_res[add( k, k_offset )]] ); + diff_ipd = L_sub( pgIpd[0], pgIpd[-hStereoDft->prm_res[k + k_offset]] ); /* Q27 */ #ifndef FIX_874_INCREASE_IPD_PRECISION IF( LT_32( diff_ipd, -EVS_PI_FX_Q27 ) ) #else IF( LT_32( diff_ipd, -PI_round ) ) #endif { - pgIpd[0] = L_add( pgIpd[0], EVS_2PI_FX_Q27 ); + pgIpd[0] = L_add( pgIpd[0], EVS_2PI_FX_Q27 ); /* Q27 */ move32(); } #ifndef FIX_874_INCREASE_IPD_PRECISION @@ -1264,7 +1266,7 @@ void stereo_dft_dec_smooth_parameters_fx( ELSE IF( GT_32( diff_ipd, PI_round ) ) #endif { - pgIpd[0] = L_sub( pgIpd[0], EVS_2PI_FX_Q27 ); + pgIpd[0] = L_sub( pgIpd[0], EVS_2PI_FX_Q27 ); /* Q27 */ move32(); } @@ -1272,12 +1274,12 @@ void stereo_dft_dec_smooth_parameters_fx( { IF( hStereoDft->wasTransient ) { - pgIpd[0] = L_add( Mpy_32_16_1( pgIpd[0], (Word16) 0x6666 ), Mpy_32_16_1( pgIpd[-hStereoDft->prm_res[add( k, k_offset )]], (Word16) ( 0x199A ) ) ); + pgIpd[0] = L_add( Mpy_32_16_1( pgIpd[0], (Word16) 0x6666 ), Mpy_32_16_1( pgIpd[-hStereoDft->prm_res[k + k_offset]], (Word16) ( 0x199A ) ) ); /* Q27 */ move32(); } ELSE { - pgIpd[0] = L_add( L_shr( pgIpd[0], 1 ), L_shr( pgIpd[-hStereoDft->prm_res[add( k, k_offset )]], 1 ) ); + pgIpd[0] = L_add( L_shr( pgIpd[0], 1 ), L_shr( pgIpd[-hStereoDft->prm_res[k + k_offset]], 1 ) ); /* Q27 */ move32(); } } @@ -1285,21 +1287,21 @@ void stereo_dft_dec_smooth_parameters_fx( IF( !hStereoDft->attackPresent ) { - pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); + pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); /* Q31 */ FOR( b = 0; b < hStereoDft->res_cod_band_max; b++ ) { pSideGain[b] = Madd_32_16( Mpy_32_16_1( pSideGain[b], dft_res_cod_alpha_fx[b] ), - pSideGain[sub( b, i_mult( hStereoDft->prm_res[add( k, k_offset )], STEREO_DFT_BAND_MAX ) )], - sub( (Word16) 0x7FFF, dft_res_cod_alpha_fx[b] ) ); + pSideGain[b - hStereoDft->prm_res[k + k_offset] * STEREO_DFT_BAND_MAX], + sub( (Word16) 0x7FFF, dft_res_cod_alpha_fx[b] ) ); /* Q31 */ move32(); } } /*Interpolation between DFT slots*/ - FOR( k2 = 1; k2 < hStereoDft->prm_res[add( k, k_offset )]; k2++ ) + FOR( k2 = 1; k2 < hStereoDft->prm_res[k + k_offset]; k2++ ) { - pInterpol = hStereoDft->gipd_fx + sub( add( k, k_offset ), k2 ); - pIpd = hStereoDft->gipd_fx + add( k, k_offset ); + pInterpol = hStereoDft->gipd_fx + sub( add( k, k_offset ), k2 ); /* Q27 */ + pIpd = hStereoDft->gipd_fx + add( k, k_offset ); /* Q27 */ IF( hStereoDft->attackPresent ) { *( pInterpol ) = *( pIpd ); @@ -1307,13 +1309,13 @@ void stereo_dft_dec_smooth_parameters_fx( } ELSE { - *( pInterpol ) = *( hStereoDft->gipd_fx + sub( add( k, k_offset ), hStereoDft->prm_res[add( k, k_offset )] ) ); + *( pInterpol ) = *( hStereoDft->gipd_fx + sub( add( k, k_offset ), hStereoDft->prm_res[k + k_offset] ) ); move32(); } FOR( b = 0; b < hStereoDft->nbands; b++ ) { - *( hStereoDft->res_pred_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->res_pred_gain_fx + add( i_mult( sub( add( k, k_offset ), hStereoDft->prm_res[add( k, k_offset )] ), STEREO_DFT_BAND_MAX ), b ) ); + *( hStereoDft->res_pred_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->res_pred_gain_fx + add( i_mult( sub( add( k, k_offset ), hStereoDft->prm_res[k + k_offset] ), STEREO_DFT_BAND_MAX ), b ) ); /* Q31 */ move32(); test(); test(); @@ -1321,17 +1323,17 @@ void stereo_dft_dec_smooth_parameters_fx( test(); IF( b < hStereoDft->res_cod_band_max || hStereoDft->attackPresent || hStereoDft->trans || ( hStereoDft->res_pred_mode[k] && LT_32( hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX], ONE_IN_Q27 ) ) ) { - *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ) ); + *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ) ); /* Q31 */ move32(); } ELSE { - *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), hStereoDft->prm_res[add( k, k_offset )] ), STEREO_DFT_BAND_MAX ), b ) ); + *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), k2 ), STEREO_DFT_BAND_MAX ), b ) ) = *( hStereoDft->side_gain_fx + add( i_mult( sub( add( k, k_offset ), hStereoDft->prm_res[k + k_offset] ), STEREO_DFT_BAND_MAX ), b ) ); /* Q31 */ move32(); } } - hStereoDft->itd_fx[sub( add( k, k_offset ), k2 )] = hStereoDft->itd_fx[add( k, k_offset )]; + hStereoDft->itd_fx[k + k_offset - k2] = hStereoDft->itd_fx[k + k_offset]; /* Q15 */ move32(); } /*end of interpolation*/ } @@ -1346,10 +1348,10 @@ void stereo_dft_dec_smooth_parameters_fx( *-------------------------------------------------------------------------*/ void stereo_dft_dec_res_fx( - CPE_DEC_HANDLE hCPE, /* i/o: decoder CPE handle */ - Word32 res_buf[STEREO_DFT_N_8k], /* i : residual buffer */ - Word16 q_res, /* i : q fact of residural buffer */ - Word32 *output /* o : output */ + CPE_DEC_HANDLE hCPE, /* i/o: decoder CPE handle */ + Word32 res_buf[STEREO_DFT_N_8k], /* i : residual buffer q_res*/ + Word16 q_res, /* i : q fact of residural buffer */ + Word32 *output /* o : output Q16*/ ) { Word16 i; @@ -1363,6 +1365,7 @@ void stereo_dft_dec_res_fx( prev_bfi = hCPE->hCoreCoder[0]->prev_old_bfi; /* The core decoding is already completed here and the prev_bfi has been updated for the next frame. The prev_old_bfi still holds the prev_bfi for the current frame. */ + /* Q0 */ move16(); /* flush memories when switching residual coding on */ @@ -1387,9 +1390,9 @@ void stereo_dft_dec_res_fx( Word16 q_shift = sub( hCPE->hStereoDft->q_res_cod_mem_fx, Q16 ); FOR( i = 0; i < STEREO_DFT_OVL_8k; i++ ) { - win[i] = extract_h( L_add( hCPE->hStereoDft->res_cod_mem_fx[i], L_shl( L_mult( win[i], hCPE->hStereoDft->win_8k_fx[i] ), q_shift ) ) ); + win[i] = extract_h( L_add( hCPE->hStereoDft->res_cod_mem_fx[i], L_shl( L_mult( win[i], hCPE->hStereoDft->win_8k_fx[i] ), q_shift ) ) ); /* q_res_cod_mem_fx */ move16(); - hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); + hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); /* q_res_cod_mem_fx */ move32(); } IF( q_shift != 0 ) @@ -1410,38 +1413,38 @@ void stereo_dft_dec_res_fx( { win[i] = extract_h( Madd_32_16( Mpy_32_16_1( hCPE->hStereoDft->res_cod_mem_fx[i], sub( MAX_16, mult( fac, fac ) ) ), L_mult( hCPE->hStereoDft->win_8k_fx[i], win[i] ), - sub( MAX_16, mult( sub( MAX_16, fac ), sub( MAX_16, fac ) ) ) ) ); + sub( MAX_16, mult( sub( MAX_16, fac ), sub( MAX_16, fac ) ) ) ) ); /* Q0 */ move16(); - hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); + hCPE->hStereoDft->res_cod_mem_fx[i] = L_mult( win[L_FRAME8k + i], hCPE->hStereoDft->win_8k_fx[STEREO_DFT_OVL_8k - 1 - i] ); /* Q16 */ move32(); fac = add( fac, step ); } } - Copy( win, out_16, L_FRAME8k ); + Copy( win, out_16, L_FRAME8k ); /* Q0 */ IF( hCPE->hCoreCoder[0]->core == ACELP_CORE ) { /* bass post-filter */ bass_psfilter_fx( hCPE->hStereoDft->hBpf, hCPE->hCoreCoder[0]->Opt_AMR_WB, out_16, L_FRAME8k, hCPE->hCoreCoder[0]->old_pitch_buf_16_fx + ( L_FRAME8k / STEREO_DFT_L_SUBFR_8k ), hCPE->hCoreCoder[0]->bpf_off, hCPE->hCoreCoder[0]->stab_fac_fx, &hCPE->hStereoDft->stab_fac_smooth_res_fx, hCPE->hCoreCoder[0]->last_coder_type, 0, bpf_error_signal_8k_16 ); - Copy_Scale_sig_16_32( bpf_error_signal_8k_16, bpf_error_signal_8k, L_FRAME8k, Q15 ); + Copy_Scale_sig_16_32( bpf_error_signal_8k_16, bpf_error_signal_8k, L_FRAME8k, Q15 ); /* Q15 */ res_bpf_flag = res_bpf_adapt_ivas_fx( hCPE->hStereoDft, bpf_error_signal_8k, res_buf, q_res ); IF( prev_bfi ) { /* Ramp up BPF contribution for the first good frame */ - step = (Word16) ( 0x00CD ); // ( 1.0f / L_FRAME8k ); + step = (Word16) ( 0x00CD ); // ( 1.0f / L_FRAME8k ); /* Q15 */ move16(); fac = negate( step ); FOR( i = 0; i < L_FRAME8k; i++ ) { fac = add( fac, step ); - bpf_error_signal_8k[i] = Mpy_32_16_1( bpf_error_signal_8k[i], fac ); + bpf_error_signal_8k[i] = Mpy_32_16_1( bpf_error_signal_8k[i], fac ); /* Q15 */ move32(); } } - Copy_Scale_sig_16_32( out_16, output, L_FRAME8k, 16 ); + Copy_Scale_sig_16_32( out_16, output, L_FRAME8k, 16 ); /* Q16 */ IF( res_bpf_flag ) { v_sub_32( output, bpf_error_signal_8k, output, L_FRAME8k ); @@ -1452,12 +1455,12 @@ void stereo_dft_dec_res_fx( set16_fx( hCPE->hStereoDft->hBpf->pst_old_syn_fx, 0, STEREO_DFT_NBPSF_PIT_MAX_8k ); hCPE->hStereoDft->hBpf->pst_mem_deemp_err_fx = 0; move16(); - Copy_Scale_sig_16_32( out_16, output, L_FRAME8k, 16 ); + Copy_Scale_sig_16_32( out_16, output, L_FRAME8k, 16 ); /* Q16 */ } ELSE { /* This step is needed to ensure output is properly populated with scaled values in all cases*/ - Copy_Scale_sig_16_32( out_16, output, L_FRAME8k, 16 ); + Copy_Scale_sig_16_32( out_16, output, L_FRAME8k, 16 ); /* Q16 */ } return; @@ -1471,18 +1474,18 @@ void stereo_dft_dec_res_fx( *-------------------------------------------------------------------------*/ void stereo_dft_dec_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - Decoder_State *st0, /* i/o: decoder state structure */ - Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers */ - Word32 *input_mem, /* i/o: mem of buffer DFT analysis */ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure */ - const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ - const Word16 sba_mono_flag, /* i : signal mono output for SBA DirAC */ - ivas_spar_md_dec_state_t *hMdDec, /* i : SPAR MD handle for upmixing */ - const Word16 cross_fade_start_offset, /* i : SPAR mixer delay compensation */ - const Word32 output_Fs, /* i : Fs for delay calculation */ - const Word16 nchan_transport, /* i : number of transpor channels */ - const Word16 num_md_sub_frames /* i : number of MD subframes */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + Decoder_State *st0, /* i/o: decoder state structure */ + Word32 DFT[CPE_CHANNELS][STEREO_DFT_BUF_MAX], /* i/o: DFT buffers qDFT*/ + Word32 *input_mem, /* i/o: mem of buffer DFT analysis */ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i/o: Stereo CNG data structure Q0*/ + const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC Q0*/ + const Word16 sba_mono_flag, /* i : signal mono output for SBA DirAC Q0*/ + ivas_spar_md_dec_state_t *hMdDec, /* i : SPAR MD handle for upmixing */ + const Word16 cross_fade_start_offset, /* i : SPAR mixer delay compensation Q0*/ + const Word32 output_Fs, /* i : Fs for delay calculation Q0*/ + const Word16 nchan_transport, /* i : number of transpor channels Q0*/ + const Word16 num_md_sub_frames /* i : number of MD subframes Q0*/ ) { Word16 i, k, b, N_div, stop; @@ -1521,7 +1524,7 @@ void stereo_dft_dec_fx( Word16 q_samp_ratio = Q15; move16(); - output_frame = (Word16) Mpy_32_32( L_add( st0->output_Fs, FRAMES_PER_SEC_BY_2 ), ONE_BY_FRAMES_PER_SEC_Q31 ); + output_frame = (Word16) Mpy_32_32( L_add( st0->output_Fs, FRAMES_PER_SEC_BY_2 ), ONE_BY_FRAMES_PER_SEC_Q31 ); /* Q0 */ /*------------------------------------------------------------------* * Initialization @@ -1543,7 +1546,7 @@ void stereo_dft_dec_fx( test(); test(); hStereoDft->trans = (Word16) ( ( EQ_16( st0->clas_dec, ONSET ) || EQ_16( st0->clas_dec, SIN_ONSET ) || EQ_16( st0->clas_dec, UNVOICED_CLAS ) || EQ_16( st0->clas_dec, UNVOICED_TRANSITION ) ) || LE_16( st0->stab_fac_fx, (Word16) 0x2000 ) ) || - ( ( EQ_16( st0->core, TCX_20_CORE ) && ( EQ_16( st0->hTcxCfg->tcx_last_overlap_mode, MIN_OVERLAP ) || EQ_16( st0->hTcxCfg->tcx_last_overlap_mode, HALF_OVERLAP ) ) ) || EQ_16( st0->core, TCX_10_CORE ) ); + ( ( EQ_16( st0->core, TCX_20_CORE ) && ( EQ_16( st0->hTcxCfg->tcx_last_overlap_mode, MIN_OVERLAP ) || EQ_16( st0->hTcxCfg->tcx_last_overlap_mode, HALF_OVERLAP ) ) ) || EQ_16( st0->core, TCX_10_CORE ) ); /* Q0 */ move16(); /* Initialization */ @@ -1558,7 +1561,7 @@ void stereo_dft_dec_fx( test(); IF( LT_16( output_frame, inner_frame_tbl[st0->bwidth] ) && ( sba_dirac_stereo_flag == 0 ) ) { - hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); + hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], hStereoDft->NFFT, DEC ); /* Q0 */ } IF( st0->bfi == 0 ) @@ -1578,19 +1581,19 @@ void stereo_dft_dec_fx( move32(); IF( prev_bfi ) { - dmx_nrg = stereo_dft_dmx_swb_nrg_fx( DFT[0], DFT[0] + STEREO_DFT32MS_N_MAX, s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), 0, 0 ); + dmx_nrg = stereo_dft_dmx_swb_nrg_fx( DFT[0], DFT[0] + STEREO_DFT32MS_N_MAX, s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), 0, 0 ); /* Q0 */ } FOR( k = 0; k < N_div; k++ ) { - pDFT_DMX = DFT[0] + i_mult( k, STEREO_DFT32MS_N_MAX ); - pDFT_RES = DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ); + pDFT_DMX = DFT[0] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* qDFT */ + pDFT_RES = DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* qDFT */ pDFT_DMX1 = 0; move16(); IF( GT_16( nchan_transport, 1 ) ) { - pDFT_DMX1 = DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ); + pDFT_DMX1 = DFT[1] + i_mult( k, STEREO_DFT32MS_N_MAX ); /* qDFT */ } /*Apply Stereo*/ @@ -1604,22 +1607,22 @@ void stereo_dft_dec_fx( move16(); /* since delay is just 3.125ms, the parameters received are used for the second window */ - pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); - pgIpd = hStereoDft->gipd_fx + add( k, k_offset ); - pPredGain = hStereoDft->res_pred_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); + pSideGain = hStereoDft->side_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); /* Q31 */ + pgIpd = hStereoDft->gipd_fx + add( k, k_offset ); /* Q27 */ + pPredGain = hStereoDft->res_pred_gain_fx + i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ); /* Q31 */ /* Use coarse band partition in inactive frames */ test(); IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { - NFFT_inner = i_mult( ( STEREO_DFT32MS_N_MAX / L_FRAME48k ), inner_frame_tbl[st0->bwidth] ); + NFFT_inner = i_mult( ( STEREO_DFT32MS_N_MAX / L_FRAME48k ), inner_frame_tbl[st0->bwidth] ); /* Q0 */ hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, 2, NFFT_inner, DEC ); } IF( st0->bfi ) { - hStereoDft->past_DMX_pos = ( hStereoDft->past_DMX_pos + STEREO_DFT_PAST_MAX - 1 ) % STEREO_DFT_PAST_MAX; + hStereoDft->past_DMX_pos = ( sub( add( hStereoDft->past_DMX_pos, STEREO_DFT_PAST_MAX ), 1 ) ) % STEREO_DFT_PAST_MAX; /* Q0 */ } test(); @@ -1634,7 +1637,7 @@ void stereo_dft_dec_fx( { IF( EQ_16( k, 1 ) ) { - Copy32( pDFT_RES, hStereoDft->res_mem_fx, shl( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ) ); + Copy32( pDFT_RES, hStereoDft->res_mem_fx, shl( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ) ); /* qDFT */ hStereoDft->time_offs = 0; move16(); } @@ -1650,16 +1653,16 @@ void stereo_dft_dec_fx( test(); IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { - DFT_L[0] = pDFT_DMX[0]; + DFT_L[0] = pDFT_DMX[0]; /* qDFT */ move32(); - DFT_R[0] = pDFT_RES[0]; + DFT_R[0] = pDFT_RES[0]; /* qDFT */ move32(); } ELSE { - DFT_L[0] = pDFT_DMX[0]; + DFT_L[0] = pDFT_DMX[0]; /* qDFT */ move32(); - DFT_R[0] = pDFT_DMX[0]; + DFT_R[0] = pDFT_DMX[0]; /* qDFT */ move32(); } @@ -1677,7 +1680,7 @@ void stereo_dft_dec_fx( test(); IF( hStereoDft->frame_sid_nodata && !sba_dirac_stereo_flag ) { - g = hStereoDft->g_state_fx[b]; + g = hStereoDft->g_state_fx[b]; /* Q15 */ move16(); } @@ -1686,11 +1689,11 @@ void stereo_dft_dec_fx( test(); IF( LT_16( hStereoDft->band_limits[b], L_FRAME16k ) && ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) ) ) { - hFdCngDec->cna_nbands = add( b, 1 ); + hFdCngDec->cna_nbands = add( b, 1 ); /* Q0 */ move16(); - hFdCngDec->cna_band_limits[b] = hStereoDft->band_limits[b]; + hFdCngDec->cna_band_limits[b] = hStereoDft->band_limits[b]; /* Q0 */ move16(); - hFdCngDec->cna_g_state_fx[b] = g; + hFdCngDec->cna_g_state_fx[b] = g; /* Q15 */ move16(); } @@ -1715,7 +1718,7 @@ void stereo_dft_dec_fx( { /* Low pass filter coherence */ /* store coherence from inactive frames for later use by the stereo CNA */ - hFdCngDec->cna_cm_fx[b] = hStereoCng->cm_fx[b]; + hFdCngDec->cna_cm_fx[b] = hStereoCng->cm_fx[b]; /* Q15 */ move16(); /* Calculate gamma */ @@ -1725,9 +1728,9 @@ void stereo_dft_dec_fx( Word16 q_loc1, q_loc2; gamma = hStereoCng->cm_fx[b]; move16(); - gamma = BASOP_Util_Divide3232_Scale( gamma, sub( MAX_16, gamma ), &q_loc1 ); + gamma = BASOP_Util_Divide3232_Scale( gamma, sub( MAX_16, gamma ), &q_loc1 ); /* q_loc1 */ l_gamma = L_deposit_l( gamma ); - op1 = L_add( l_gamma, L_shr( L_deposit_l( sub( MAX_16, mult( g, g ) ) ), q_loc1 ) ); + op1 = L_add( l_gamma, L_shr( L_deposit_l( sub( MAX_16, mult( g, g ) ) ), q_loc1 ) ); /* q_loc1 */ q_loc1 = add( Q16, q_loc1 ); q_loc2 = q_loc1; op1 = Sqrt32( op1, &q_loc1 ); @@ -1737,8 +1740,8 @@ void stereo_dft_dec_fx( op2 = L_shl( op2, sub( q_loc2, q_loc1 ) ); q_loc2 = q_loc1; } - gamma = extract_h( L_sub( op1, op2 ) ); - gamma = shl( gamma, q_loc2 ); + gamma = extract_h( L_sub( op1, op2 ) ); /* q_loc1 - 16 */ + gamma = shl( gamma, q_loc2 ); /* 2 * q_loc1 - 16 */ } ELSE { @@ -1749,14 +1752,14 @@ void stereo_dft_dec_fx( FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) { /* Create L and R signals with the correct coherence by mixing channel 0 (pDFT_DMX) and channel 1 (pDFT_RES) */ - DFT_L[2 * i] = Madd_32_16( Madd_32_16( pDFT_DMX[2 * i], pDFT_DMX[2 * i], g ), pDFT_RES[2 * i], gamma ); + DFT_L[2 * i] = Madd_32_16( Madd_32_16( pDFT_DMX[2 * i], pDFT_DMX[2 * i], g ), pDFT_RES[2 * i], gamma ); /* qDFT */ move32(); - DFT_R[2 * i] = Msub_32_16( Msub_32_16( pDFT_DMX[2 * i], pDFT_DMX[2 * i], g ), pDFT_RES[2 * i], gamma ); + DFT_R[2 * i] = Msub_32_16( Msub_32_16( pDFT_DMX[2 * i], pDFT_DMX[2 * i], g ), pDFT_RES[2 * i], gamma ); /* qDFT */ move32(); - DFT_L[add( shl( i, 1 ), 1 )] = Madd_32_16( Madd_32_16( pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )], g ), pDFT_RES[add( shl( i, 1 ), 1 )], gamma ); + DFT_L[2 * i + 1] = Madd_32_16( Madd_32_16( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1], g ), pDFT_RES[2 * i + 1], gamma ); /* qDFt */ move32(); - DFT_R[add( shl( i, 1 ), 1 )] = Msub_32_16( Msub_32_16( pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )], g ), pDFT_RES[add( shl( i, 1 ), 1 )], gamma ); + DFT_R[2 * i + 1] = Msub_32_16( Msub_32_16( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1], g ), pDFT_RES[2 * i + 1], gamma ); /* qDFT */ move32(); } @@ -1765,19 +1768,19 @@ void stereo_dft_dec_fx( Word32 theta = pgIpd[0]; WHILE( GT_32( theta, EVS_2PI_FX_Q27 ) ) { - theta = L_sub( theta, EVS_2PI_FX_Q27 ); + theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */ } WHILE( LT_32( theta, -EVS_2PI_FX_Q27 ) ) { - theta = L_add( theta, EVS_2PI_FX_Q27 ); + theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */ } IF( GT_32( theta, EVS_PI_FX_Q27 ) ) { - theta = L_sub( theta, EVS_2PI_FX_Q27 ); + theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */ } ELSE IF( LT_32( theta, -EVS_PI_FX_Q27 ) ) { - theta = L_add( theta, EVS_2PI_FX_Q27 ); + theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */ } c0 = getCosWord16( (Word16) L_shr( theta, 14 ) ); IF( EQ_16( c0, ONE_IN_Q14 ) ) @@ -1793,10 +1796,10 @@ void stereo_dft_dec_fx( FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) { /*rotate L*/ - tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[add( shl( i, 1 ), 1 )], s0 ); - DFT_L[add( shl( i, 1 ), 1 )] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[add( shl( i, 1 ), 1 )], c0 ); + tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[2 * i + 1], s0 ); /* qDFT */ + DFT_L[2 * i + 1] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[2 * i + 1], c0 ); /* qDFT */ move32(); - DFT_L[2 * i] = tmp; + DFT_L[2 * i] = tmp; /* qDFT */ move32(); } } @@ -1812,53 +1815,53 @@ void stereo_dft_dec_fx( { i = 0; move16(); - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */ move32(); - DFT_L[2 * i] = DFT_W; + DFT_L[2 * i] = DFT_W; /* qDFT */ move32(); DFT_R[2 * i] = 0; move32(); - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[add( shl( i, 1 ), 1 )] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */ move32(); - DFT_L[add( shl( i, 1 ), 1 )] = DFT_W; + DFT_L[2 * i + 1] = DFT_W; /* qDFT */ move32(); - DFT_R[add( shl( i, 1 ), 1 )] = 0; + DFT_R[2 * i + 1] = 0; move32(); } FOR( i = hStereoDft->band_limits[b]; i < s_min( stop, hStereoDft->band_limits[b + 1] ); i++ ) { - DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ), - L_add( hStereoDft->mixer_mat_smooth_fx[0][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], - L_add( hStereoDft->mixer_mat_smooth_fx[0][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], - hStereoDft->mixer_mat_smooth_fx[0][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), - DFT_PRED_RES[2 * i] ); - DFT_L[2 * i] = DFT_W; + DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ), + L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS], + L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS], + hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ), + DFT_PRED_RES[2 * i] ); /* qDFT */ + DFT_L[2 * i] = DFT_W; /* qDFT */ move32(); DFT_R[2 * i] = 0; move32(); - DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ), - L_add( hStereoDft->mixer_mat_smooth_fx[0][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], - L_add( hStereoDft->mixer_mat_smooth_fx[0][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], - hStereoDft->mixer_mat_smooth_fx[0][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), - DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); - DFT_L[add( shl( i, 1 ), 1 )] = DFT_W; + DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ), + L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS], + L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS], + hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ), + DFT_PRED_RES[2 * i + 1] ); /* qDFT */ + DFT_L[2 * i + 1] = DFT_W; /* qDFT */ move32(); - DFT_R[add( shl( i, 1 ), 1 )] = 0; + DFT_R[2 * i + 1] = 0; move32(); } FOR( ; i < hStereoDft->band_limits[b + 1]; i++ ) { - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); - DFT_L[2 * i] = DFT_W; + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */ + DFT_L[2 * i] = DFT_W; /* qDFT */ move32(); DFT_R[2 * i] = 0; move32(); - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); - DFT_L[add( shl( i, 1 ), 1 )] = DFT_W; + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */ + DFT_L[2 * i + 1] = DFT_W; /* qDFT */ move32(); - DFT_R[add( shl( i, 1 ), 1 )] = 0; + DFT_R[2 * i + 1] = 0; move32(); } } @@ -1868,72 +1871,72 @@ void stereo_dft_dec_fx( { i = 0; move16(); - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); - DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */ + DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */ - DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); + DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */ move32(); - DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); + DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */ move32(); - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); - DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */ + DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */ - DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); + DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */ move32(); - DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); + DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */ move32(); } FOR( i = hStereoDft->band_limits[b]; i < min( stop, hStereoDft->band_limits[b + 1] ); i++ ) { - DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ), - L_add( hStereoDft->mixer_mat_smooth_fx[0][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], - L_add( hStereoDft->mixer_mat_smooth_fx[0][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], - hStereoDft->mixer_mat_smooth_fx[0][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), - DFT_PRED_RES[2 * i] ); - DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ), - L_add( hStereoDft->mixer_mat_smooth_fx[1][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], - L_add( hStereoDft->mixer_mat_smooth_fx[1][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], - hStereoDft->mixer_mat_smooth_fx[1][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), - DFT_PRED_RES[2 * i] ); - - DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); + DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ), + L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS], + L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS], + hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ), + DFT_PRED_RES[2 * i] ); /* qDFT */ + DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ), + L_add( hStereoDft->mixer_mat_smooth_fx[1][1][b + k * IVAS_MAX_NUM_BANDS], + L_add( hStereoDft->mixer_mat_smooth_fx[1][2][b + k * IVAS_MAX_NUM_BANDS], + hStereoDft->mixer_mat_smooth_fx[1][3][b + k * IVAS_MAX_NUM_BANDS] ) ), + DFT_PRED_RES[2 * i] ); /* qDFT */ + + DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */ move32(); - DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); + DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */ move32(); - DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ), - L_add( hStereoDft->mixer_mat_smooth_fx[0][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], - L_add( hStereoDft->mixer_mat_smooth_fx[0][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], - hStereoDft->mixer_mat_smooth_fx[0][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), - DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); - DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ), - L_add( hStereoDft->mixer_mat_smooth_fx[1][1][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], - L_add( hStereoDft->mixer_mat_smooth_fx[1][2][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], - hStereoDft->mixer_mat_smooth_fx[1][3][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )] ) ), - DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); - - DFT_L[add( shl( i, 1 ), 1 )] = L_add( DFT_W, DFT_Y ); + DFT_W = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ), + L_add( hStereoDft->mixer_mat_smooth_fx[0][1][b + k * IVAS_MAX_NUM_BANDS], + L_add( hStereoDft->mixer_mat_smooth_fx[0][2][b + k * IVAS_MAX_NUM_BANDS], + hStereoDft->mixer_mat_smooth_fx[0][3][b + k * IVAS_MAX_NUM_BANDS] ) ), + DFT_PRED_RES[2 * i + 1] ); /* qDFT */ + DFT_Y = Madd_32_32( Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ), + L_add( hStereoDft->mixer_mat_smooth_fx[1][1][b + k * IVAS_MAX_NUM_BANDS], + L_add( hStereoDft->mixer_mat_smooth_fx[1][2][b + k * IVAS_MAX_NUM_BANDS], + hStereoDft->mixer_mat_smooth_fx[1][3][b + k * IVAS_MAX_NUM_BANDS] ) ), + DFT_PRED_RES[2 * i + 1] ); /* qDFT */ + + DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */ move32(); - DFT_R[add( shl( i, 1 ), 1 )] = L_sub( DFT_W, DFT_Y ); + DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */ move32(); } FOR( ; i < hStereoDft->band_limits[b + 1]; i++ ) { - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); - DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */ + DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */ - DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); + DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */ move32(); - DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); + DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */ move32(); - DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); - DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); + DFT_W = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[0][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */ + DFT_Y = Mpy_32_32( hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */ - DFT_L[add( shl( i, 1 ), 1 )] = L_add( DFT_W, DFT_Y ); + DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */ move32(); - DFT_R[add( shl( i, 1 ), 1 )] = L_sub( DFT_W, DFT_Y ); + DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */ move32(); } } @@ -1945,42 +1948,42 @@ void stereo_dft_dec_fx( i = 0; move32(); - DFT_W = pDFT_DMX[2 * i]; + DFT_W = pDFT_DMX[2 * i]; /* qDFT */ move32(); - DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); + DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */ - DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); + DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */ move32(); - DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); + DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */ move32(); - DFT_W = pDFT_DMX[add( shl( i, 1 ), 1 )]; + DFT_W = pDFT_DMX[2 * i + 1]; /* qDFT */ move32(); - DFT_Y = Madd_32_32( pDFT_DMX1[add( shl( i, 1 ), 1 )], hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); + DFT_Y = Madd_32_32( pDFT_DMX1[2 * i + 1], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */ - DFT_L[add( shl( i, 1 ), 1 )] = L_add( DFT_W, DFT_Y ); + DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */ move32(); - DFT_R[add( shl( i, 1 ), 1 )] = L_sub( DFT_W, DFT_Y ); + DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */ move32(); } FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) { - DFT_W = pDFT_DMX[2 * i]; + DFT_W = pDFT_DMX[2 * i]; /* qDFT */ move32(); - DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[2 * i] ); + DFT_Y = Madd_32_32( pDFT_DMX1[2 * i], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i] ); /* qDFT */ - DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); + DFT_L[2 * i] = L_add( DFT_W, DFT_Y ); /* qDFT */ move32(); - DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); + DFT_R[2 * i] = L_sub( DFT_W, DFT_Y ); /* qDFT */ move32(); - DFT_W = pDFT_DMX[add( shl( i, 1 ), 1 )]; + DFT_W = pDFT_DMX[2 * i + 1]; /* qDFT */ move32(); - DFT_Y = Madd_32_32( pDFT_DMX1[add( shl( i, 1 ), 1 )], hStereoDft->mixer_mat_smooth_fx[1][0][add( b, i_mult( k, IVAS_MAX_NUM_BANDS ) )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); + DFT_Y = Madd_32_32( pDFT_DMX1[2 * i + 1], hStereoDft->mixer_mat_smooth_fx[1][0][b + k * IVAS_MAX_NUM_BANDS], pDFT_DMX[2 * i + 1] ); /* qDFT */ - DFT_L[add( shl( i, 1 ), 1 )] = L_add( DFT_W, DFT_Y ); + DFT_L[2 * i + 1] = L_add( DFT_W, DFT_Y ); /* qDFT */ move32(); - DFT_R[add( shl( i, 1 ), 1 )] = L_sub( DFT_W, DFT_Y ); + DFT_R[2 * i + 1] = L_sub( DFT_W, DFT_Y ); /* qDFT */ move32(); } } @@ -1991,37 +1994,37 @@ void stereo_dft_dec_fx( } ELSE { - FOR( i = hStereoDft->band_limits[b]; i < s_min( stop, hStereoDft->band_limits[b + 1] ); i++ ) + FOR( i = hStereoDft->band_limits[b]; i < min( stop, hStereoDft->band_limits[b + 1] ); i++ ) { - tmp = L_add( Madd_32_16( pDFT_RES[2 * i], pDFT_DMX[2 * i], g ), DFT_PRED_RES[2 * i] ); + tmp = L_add( Madd_32_16( pDFT_RES[2 * i], pDFT_DMX[2 * i], g ), DFT_PRED_RES[2 * i] ); /* qDFT */ - DFT_L[2 * i] = L_add( pDFT_DMX[2 * i], tmp ); + DFT_L[2 * i] = L_add( pDFT_DMX[2 * i], tmp ); /* qDFT */ move32(); - DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); + DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); /* qDFT */ move32(); - tmp = L_add( Madd_32_16( pDFT_RES[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )], g ), DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); + tmp = L_add( Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g ), DFT_PRED_RES[2 * i + 1] ); /* qDFT */ - DFT_L[add( shl( i, 1 ), 1 )] = L_add( pDFT_DMX[add( shl( i, 1 ), 1 )], tmp ); + DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */ move32(); - DFT_R[add( shl( i, 1 ), 1 )] = L_sub( pDFT_DMX[add( shl( i, 1 ), 1 )], tmp ); + DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */ move32(); } FOR( ; i < hStereoDft->band_limits[b + 1]; i++ ) { - tmp = Madd_32_16( pDFT_RES[2 * i], pDFT_DMX[2 * i], g ); + tmp = Madd_32_16( pDFT_RES[2 * i], pDFT_DMX[2 * i], g ); /* qDFT */ - DFT_L[2 * i] = L_add( pDFT_DMX[2 * i], tmp ); + DFT_L[2 * i] = L_add( pDFT_DMX[2 * i], tmp ); /* qDFT */ move32(); - DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); + DFT_R[2 * i] = L_sub( pDFT_DMX[2 * i], tmp ); /* qDFT */ move32(); - tmp = Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g ); + tmp = Madd_32_16( pDFT_RES[2 * i + 1], pDFT_DMX[2 * i + 1], g ); /* qDFT */ - DFT_L[add( shl( i, 1 ), 1 )] = L_add( pDFT_DMX[add( shl( i, 1 ), 1 )], tmp ); + DFT_L[2 * i + 1] = L_add( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */ move32(); - DFT_R[add( shl( i, 1 ), 1 )] = L_sub( pDFT_DMX[add( shl( i, 1 ), 1 )], tmp ); + DFT_R[2 * i + 1] = L_sub( pDFT_DMX[2 * i + 1], tmp ); /* qDFT */ move32(); } @@ -2032,19 +2035,19 @@ void stereo_dft_dec_fx( move32(); WHILE( GT_32( theta, EVS_2PI_FX_Q27 ) ) { - theta = L_sub( theta, EVS_2PI_FX_Q27 ); + theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */ } WHILE( LT_32( theta, -EVS_2PI_FX_Q27 ) ) { - theta = L_add( theta, EVS_2PI_FX_Q27 ); + theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */ } IF( GT_32( theta, EVS_PI_FX_Q27 ) ) { - theta = L_sub( theta, EVS_2PI_FX_Q27 ); + theta = L_sub( theta, EVS_2PI_FX_Q27 ); /* Q27 */ } ELSE IF( LT_32( theta, -EVS_PI_FX_Q27 ) ) { - theta = L_add( theta, EVS_2PI_FX_Q27 ); + theta = L_add( theta, EVS_2PI_FX_Q27 ); /* Q27 */ } c0 = getCosWord16( (Word16) L_shr( theta, 14 ) ); IF( EQ_16( c0, ONE_IN_Q14 ) ) @@ -2060,10 +2063,10 @@ void stereo_dft_dec_fx( FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->band_limits[b + 1]; i++ ) { /*rotate L*/ - tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[add( shl( i, 1 ), 1 )], s0 ); - DFT_L[add( shl( i, 1 ), 1 )] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[add( shl( i, 1 ), 1 )], c0 ); + tmp = Msub_32_16( Mpy_32_16_1( DFT_L[2 * i], c0 ), DFT_L[2 * i + 1], s0 ); /* qDFT */ + DFT_L[2 * i + 1] = Madd_32_16( Mpy_32_16_1( DFT_L[2 * i], s0 ), DFT_L[2 * i + 1], c0 ); /* qDFT */ move32(); - DFT_L[2 * i] = tmp; + DFT_L[2 * i] = tmp; /* qDFT */ move32(); } } @@ -2073,7 +2076,7 @@ void stereo_dft_dec_fx( test(); if ( hStereoDft->frame_sid_nodata || ( st0->VAD == 0 ) ) { - hFdCngDec->cna_band_limits[hFdCngDec->cna_nbands] = hStereoDft->band_limits[hFdCngDec->cna_nbands]; + hFdCngDec->cna_band_limits[hFdCngDec->cna_nbands] = hStereoDft->band_limits[hFdCngDec->cna_nbands]; /* Q0 */ move16(); } @@ -2086,7 +2089,7 @@ void stereo_dft_dec_fx( move16(); } - FOR( i = hStereoDft->band_limits[b]; i < shr( hStereoDft->NFFT, 1 ); i++ ) + FOR( i = hStereoDft->band_limits[b]; i < hStereoDft->NFFT / 2; i++ ) { DFT_L[2 * i] = 0; move32(); @@ -2101,13 +2104,13 @@ void stereo_dft_dec_fx( /*Nyquist Freq.*/ IF( EQ_16( hStereoDft->band_limits[b], shr( hStereoDft->NFFT, 1 ) ) ) { - DFT_L[1] = L_add( pDFT_DMX[1], Mpy_32_16_1( pDFT_DMX[1], g ) ); + DFT_L[1] = L_add( pDFT_DMX[1], Mpy_32_16_1( pDFT_DMX[1], g ) ); /* qDFT */ move32(); - DFT_R[1] = L_sub( pDFT_DMX[1], Mpy_32_16_1( pDFT_DMX[1], g ) ); + DFT_R[1] = L_sub( pDFT_DMX[1], Mpy_32_16_1( pDFT_DMX[1], g ) ); /* qDFT */ move32(); - DFT_L[1] = Mpy_32_16_1( DFT_L[1], INV_SQRT2_FX_Q15 ); + DFT_L[1] = Mpy_32_16_1( DFT_L[1], INV_SQRT2_FX_Q15 ); /* qDFT */ move32(); - DFT_R[1] = Mpy_32_16_1( DFT_R[1], INV_SQRT2_FX_Q15 ); + DFT_R[1] = Mpy_32_16_1( DFT_R[1], INV_SQRT2_FX_Q15 ); /* qDFT */ move32(); } ELSE @@ -2126,9 +2129,9 @@ void stereo_dft_dec_fx( /* Dummy upmix-> mono binauralization */ FOR( i = 0; i < hStereoDft->NFFT; i++ ) { - DFT_L[i] = L_add( pDFT_DMX[i], pDFT_RES[i] ); + DFT_L[i] = L_add( pDFT_DMX[i], pDFT_RES[i] ); /* qDFT */ move32(); - DFT_R[i] = L_sub( pDFT_DMX[i], pDFT_RES[i] ); + DFT_R[i] = L_sub( pDFT_DMX[i], pDFT_RES[i] ); /* qDFT */ move32(); } } @@ -2136,7 +2139,7 @@ void stereo_dft_dec_fx( /* Comfort Noise Addition */ IF( st0->flag_cna ) { - ptr_per = &hFdCngDec->smoothed_psd_fx[hFdCngCom->startBand]; + ptr_per = &hFdCngDec->smoothed_psd_fx[hFdCngCom->startBand]; /* hFdCngDec->smoothed_psd_exp */ scale_fact0 = 0; move16(); @@ -2188,16 +2191,16 @@ void stereo_dft_dec_fx( { IF( NE_16( q_loc1, q_loc2 ) ) { - op2 = L_shl( op2, sub( q_loc2, q_loc1 ) ); + op2 = L_shl( op2, sub( q_loc2, q_loc1 ) ); /* qloc2 */ q_loc2 = q_loc1; move16(); } - gamma = extract_h( L_sub( op1, op2 ) ); - gamma = shl( gamma, q_loc2 ); + gamma = extract_h( L_sub( op1, op2 ) ); /* qloc2 - 16 */ + gamma = shl( gamma, q_loc2 ); /* 2 * qloc2 - 16 */ } ELSE { - gamma = extract_h( L_shl( op1, q_loc1 ) ); + gamma = extract_h( L_shl( op1, q_loc1 ) ); /* 2 * qloc2 - 16 */ } } ELSE @@ -2206,7 +2209,7 @@ void stereo_dft_dec_fx( move16(); } - FOR( i = s_max( hFdCngDec->cna_band_limits[b], shr( hFdCngCom->startBand, 1 ) ); i < s_min( hFdCngDec->cna_band_limits[b + 1], ( L_FRAME16k ) >> 1 ); i++ ) + FOR( i = max( hFdCngDec->cna_band_limits[b], ( hFdCngCom->startBand / 2 ) ); i < min( hFdCngDec->cna_band_limits[b + 1], ( L_FRAME16k ) >> 1 ); i++ ) { Word32 l_tmp; lev1 = *ptr_per++; @@ -2219,17 +2222,17 @@ void stereo_dft_dec_fx( IF( ( lev1 > 0 ) && ( lev2 > 0 ) && GT_32( Mpy_32_16_1( L_max( lev1, lev2 ), (Word16) 0x6AAB ), L_min( lev1, lev2 ) ) ) { /* take the minimum of two adjacent frequency bins */ - cna_level = L_min( lev1, lev2 ); + cna_level = L_min( lev1, lev2 ); /* hFdCngDec->smoothed_psd_exp */ } ELSE { /* take the average of two adjacent frequency bins */ - cna_level = L_add( L_shr( lev1, 1 ), L_shr( lev2, 1 ) ); + cna_level = L_add( L_shr( lev1, 1 ), L_shr( lev2, 1 ) ); /* hFdCngDec->smoothed_psd_exp */ } q_cna_level = hFdCngDec->smoothed_psd_exp; move16(); l_tmp = Sqrt32( cna_level, &q_cna_level ); - scale_fact = Mpy_32_32( l_tmp, scale_fact0 ); + scale_fact = Mpy_32_32( l_tmp, scale_fact0 ); /* q_cna_level */ /* scale_fact0 will be in Q15 by the time the above operation is performed so the q of scale_fact represented now by q_cna_level has to be updated @@ -2237,32 +2240,32 @@ void stereo_dft_dec_fx( q_cna_level = sub( Q31, add( q_cna_level, Q16 ) ); /* generate comfort noise from gaussian noise and add to the decoded DFT spectrum */ - N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); - N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); - l_tmp = L_add( Madd_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); - l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); - DFT_L[2 * i] = L_add( DFT_L[2 * i], l_tmp ); + N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */ + N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */ + l_tmp = L_add( Madd_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */ + l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); /* q_dft */ + DFT_L[2 * i] = L_add( DFT_L[2 * i], l_tmp ); /* q_dft */ move32(); - l_tmp = L_sub( Msub_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); - l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); - DFT_R[2 * i] = L_add( DFT_R[2 * i], l_tmp ); + l_tmp = L_sub( Msub_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */ + l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); /* q_dft */ + DFT_R[2 * i] = L_add( DFT_R[2 * i], l_tmp ); /* q_dft */ move32(); - N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); - N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); - l_tmp = L_add( Madd_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); - l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); - DFT_L[2 * i + 1] = L_add( DFT_L[2 * i + 1], l_tmp ); + N1 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */ + N2 = L_shl( Mpy_32_16_1( scale_fact, rand_gauss_fix( &ftmp, cna_seed ) ), Q2 ); /* q_cna_level */ + l_tmp = L_add( Madd_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */ + l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); /* q_dft */ + DFT_L[2 * i + 1] = L_add( DFT_L[2 * i + 1], l_tmp ); /* q_dft */ move32(); - l_tmp = L_sub( Msub_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); - l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); - DFT_R[2 * i + 1] = L_add( DFT_R[2 * i + 1], l_tmp ); + l_tmp = L_sub( Msub_32_16( N1, N1, g ), Mpy_32_16_1( N2, gamma ) ); /* q_cna_level */ + l_tmp = L_shr( l_tmp, sub( q_cna_level, hStereoDft->q_dft ) ); /* q_dft */ + DFT_R[2 * i + 1] = L_add( DFT_R[2 * i + 1], l_tmp ); /* q_dft */ move32(); } } /* update CNA re-scaling factor */ - hFdCngDec->cna_rescale_fact_fx = extract_l( L_shr( L_mult0( (Word16) 0x6666, hFdCngDec->cna_act_fact_fx ), Q15 ) ); + hFdCngDec->cna_rescale_fact_fx = extract_l( L_shr( L_mult0( (Word16) 0x6666, hFdCngDec->cna_act_fact_fx ), Q15 ) ); /* q_cna_act */ move16(); IF( !hFdCngDec->first_cna_noise_updated ) @@ -2273,9 +2276,9 @@ void stereo_dft_dec_fx( } /* Update memories */ - hStereoDft->past_DMX_pos = s_and( ( add( hStereoDft->past_DMX_pos, 1 ) ), ( STEREO_DFT_PAST_MAX - 1 ) ); + hStereoDft->past_DMX_pos = s_and( ( add( hStereoDft->past_DMX_pos, 1 ) ), ( STEREO_DFT_PAST_MAX - 1 ) ); /* Q0 */ move16(); - Copy32( pDFT_DMX, hStereoDft->DFT_past_DMX_fx[hStereoDft->past_DMX_pos], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); + Copy32( pDFT_DMX, hStereoDft->DFT_past_DMX_fx[hStereoDft->past_DMX_pos], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ) ); /* qDFT */ hStereoDft->q_DFT_past_DMX_fx[hStereoDft->past_DMX_pos] = hStereoDft->q_dft; move16(); IF( pPredGain ) @@ -2283,20 +2286,20 @@ void stereo_dft_dec_fx( stereo_dft_adapt_sf_delay_fx( hStereoDft, pPredGain ); } - Copy32( DFT_L, DFT[0] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT ); - Copy32( DFT_R, DFT[1] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT ); + Copy32( DFT_L, DFT[0] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT ); /* qDFT */ + Copy32( DFT_R, DFT[1] + k * STEREO_DFT32MS_N_MAX, hStereoDft->NFFT ); /* qDFT */ } IF( st0->bfi && !prev_bfi ) { Word16 q_shift0; Word16 q_shift1; - idx_k0 = add( hStereoDft->past_DMX_pos, STEREO_DFT_PAST_MAX - 1 ) & ( STEREO_DFT_PAST_MAX - 1 ); + idx_k0 = add( hStereoDft->past_DMX_pos, STEREO_DFT_PAST_MAX - 1 ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */ idx_k1 = add( idx_k0, 1 ) & ( STEREO_DFT_PAST_MAX - 1 ); q_shift0 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k0] ); q_shift1 = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[idx_k1] ); /*dmx energy memory*/ - hStereoDft->past_dmx_nrg_fx = stereo_dft_dmx_swb_nrg_fx( hStereoDft->DFT_past_DMX_fx[idx_k0], hStereoDft->DFT_past_DMX_fx[idx_k1], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), q_shift0, q_shift1 ); + hStereoDft->past_dmx_nrg_fx = stereo_dft_dmx_swb_nrg_fx( hStereoDft->DFT_past_DMX_fx[idx_k0], hStereoDft->DFT_past_DMX_fx[idx_k1], s_min( hStereoDft->NFFT, STEREO_DFT32MS_N_32k ), q_shift0, q_shift1 ); /* 2 * q_DFT */ } stereo_dft_compute_td_stefi_params_fx( hStereoDft, samp_ratio ); @@ -2311,8 +2314,8 @@ void stereo_dft_dec_fx( *-------------------------------------------------------------------------*/ static void stereo_dft_compute_td_stefi_params_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word16 samp_ratio /* i : sampling ratio */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const Word16 samp_ratio /* i : sampling ratio Q13*/ ) { Word16 pdmx_ind; @@ -2330,9 +2333,9 @@ static void stereo_dft_compute_td_stefi_params_fx( Word32 op1; Word16 q_div, q_sqrt; - pdmx_ind = hStereoDft->past_DMX_pos; + pdmx_ind = hStereoDft->past_DMX_pos; /* Q0 */ move16(); - bres = hStereoDft->band_res[1]; + bres = hStereoDft->band_res[1]; /* Q0 */ move16(); test(); @@ -2345,16 +2348,16 @@ static void stereo_dft_compute_td_stefi_params_fx( return; } - bin0 = extract_l( L_shr_r( Mpy_32_16_1( (Word32) hStereoDft->NFFT, samp_ratio ), 1 ) ); + bin0 = extract_l( L_shr_r( Mpy_32_16_1( (Word32) hStereoDft->NFFT, samp_ratio ), 1 ) ); /* Q0 */ bin0 = shl( bin0, Q3 ); - bin0 = s_min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); - b = hStereoDft->nbands; + bin0 = s_min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); /* Q0 */ + b = hStereoDft->nbands; /* Q0 */ move16(); WHILE( GT_16( hStereoDft->band_limits[b], bin0 ) ) { - b = sub( b, 1 ); + b--; } - band0 = b; + band0 = b; /* Q0 */ move16(); /* calculate averages over high bands */ @@ -2379,11 +2382,11 @@ static void stereo_dft_compute_td_stefi_params_fx( pred_g = L_add( pred_g, L_shr( Mpy_32_16_1( L_add( L_shr( hStereoDft->res_pred_gain_fx[b + STEREO_DFT_BAND_MAX], 1 ), L_shr( hStereoDft->res_pred_gain_fx[b + 2 * STEREO_DFT_BAND_MAX], 1 ) ), dft_res_pred_weights_fx[bres][b - band0] ), - shift_g ) ); + shift_g ) ); /* Q30 - shift_g */ pred_gain_avg = L_add( pred_gain_avg, L_shr( Mpy_32_16_1( L_add( L_shr( hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 2, pdmx_ind )][b], 1 ), L_shr( hStereoDft->past_res_pred_gain_fx[STEFI_DELAY_IND( STEREO_DFT_TD_STEFI_SUBFR_DELAY + 1, pdmx_ind )][b], 1 ) ), dft_res_pred_weights_fx[bres][b - band0] ), - shift_g ) ); + shift_g ) ); /* Q30 - shift_g */ nbands = add( nbands, 1 ); wsum = L_add( wsum, dft_res_pred_weights_fx[bres][b - band0] ); @@ -2401,14 +2404,14 @@ static void stereo_dft_compute_td_stefi_params_fx( move16(); return; } - wsum = L_shl( wsum, sub( Q16, shift_g ) ); - pred_g = BASOP_Util_Divide3232_Scale( pred_g, wsum, &q_div ); + wsum = L_shl( wsum, sub( Q16, shift_g ) ); /* Q31 - shift_g */ + pred_g = BASOP_Util_Divide3232_Scale( pred_g, wsum, &q_div ); /* q_div */ IF( GT_16( sub( 15, q_div ), 15 ) ) { pred_g = L_shl( pred_g, q_div ); } - pred_gain_avg = BASOP_Util_Divide3232_Scale( pred_gain_avg, wsum, &q_div ); + pred_gain_avg = BASOP_Util_Divide3232_Scale( pred_gain_avg, wsum, &q_div ); /* q_div */ IF( GT_16( sub( 15, q_div ), 15 ) ) { pred_gain_avg = L_shl( pred_gain_avg, q_div ); @@ -2424,10 +2427,10 @@ static void stereo_dft_compute_td_stefi_params_fx( nrg_pred_DMX = hStereoDft->hb_nrg_fx[1]; move32(); - op1 = BASOP_Util_Divide3232_Scale( L_add( EPSILON_FIX, nrg_DMX ), L_add( EPSILON_FIX, nrg_pred_DMX ), &q_div ); + op1 = BASOP_Util_Divide3232_Scale( L_add( EPSILON_FIX, nrg_DMX ), L_add( EPSILON_FIX, nrg_pred_DMX ), &q_div ); /* q_div */ q_sqrt = add( Q16, q_div ); op1 = Sqrt32( op1, &q_sqrt ); - g2 = Mpy_32_32( pred_g, op1 ); + g2 = Mpy_32_32( pred_g, op1 ); /* q_div + q_sqrt - 31 */ IF( LT_16( q_sqrt, 0 ) ) { g2 = L_shl( g2, q_sqrt ); @@ -2438,25 +2441,25 @@ static void stereo_dft_compute_td_stefi_params_fx( { IF( LT_32( L_shr( pred_gain_avg, q_sqrt ), g2 ) ) { - g2 = pred_gain_avg; + g2 = pred_gain_avg; /* q_pred_gain_avg */ move32(); } ELSE { g2 = L_min( Mpy_32_16_1( L_shr( pred_gain_avg, q_sqrt ), STEREO_DFT_STEFFI_GAIN_AMP_FX ), Madd_32_16( Mpy_32_16_1( L_shr( pred_gain_avg, q_sqrt ), sub( (Word16) 0x7FFF, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ), - g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); - g2 = L_shl( g2, q_sqrt ); + g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* q_pred_gain_avg - q_sqrt */ + g2 = L_shl( g2, q_sqrt ); /* q_pred_gain_avg */ } } ELSE { g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ), Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( (Word16) 0x7FFF, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ), - g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); + g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* q_pred_gain_avg */ } - hStereoDft->td_gain_fx[0] = L_deposit_h( (Word16) g2 ); + hStereoDft->td_gain_fx[0] = L_deposit_h( (Word16) g2 ); /* Q16 + q_pred_gain_avg */ hStereoDft->q_td_gain[0] = add( 16, q_pred_gain_avg ); move32(); move16(); @@ -2471,12 +2474,13 @@ static void stereo_dft_compute_td_stefi_params_fx( } static void stereo_dft_dequantize_ipd_fx( - Word16 *ind, - Word32 *out_fx, + Word16 *ind, /* Q0 */ + Word32 *out_fx, /* Q27 */ #ifndef FIX_874_INCREASE_IPD_PRECISION const Word16 N, #endif - const Word16 bits ) + const Word16 bits /* Q0 */ +) { Word16 delta_fx; #ifndef FIX_874_INCREASE_IPD_PRECISION @@ -2485,22 +2489,22 @@ static void stereo_dft_dequantize_ipd_fx( #endif IF( EQ_16( bits, 2 ) ) /* 2-bit phase quantization for the highest frequency band only */ { - delta_fx = ( EVS_PI_FX ) >> 1; + delta_fx = ( EVS_PI_FX ) >> 1; /* Q13 */ move16(); } ELSE IF( EQ_16( bits, 3 ) ) { - delta_fx = ( EVS_PI_FX ) >> 2; + delta_fx = ( EVS_PI_FX ) >> 2; /* Q13 */ move16(); } ELSE IF( EQ_16( bits, 4 ) ) { - delta_fx = ( EVS_PI_FX ) >> 3; + delta_fx = ( EVS_PI_FX ) >> 3; /* Q13 */ move16(); } ELSE { - delta_fx = ( EVS_PI_FX ) >> 2; + delta_fx = ( EVS_PI_FX ) >> 2; /* Q13 */ move16(); assert( 0 ); } @@ -2508,8 +2512,8 @@ static void stereo_dft_dequantize_ipd_fx( #ifndef FIX_874_INCREASE_IPD_PRECISION FOR( i = 0; i < N; i++ ) { - temp_out = L_sub( L_mult0( ind[i], delta_fx ), ( EVS_PI_FX ) ); - *out_fx = L_shl( temp_out, 14 ); + temp_out = L_sub( L_mult0( ind[i], delta_fx ), ( EVS_PI_FX ) ); /* Q13 */ + *out_fx = L_shl( temp_out, 14 ); /* Q27 */ move32(); } #else @@ -2525,15 +2529,15 @@ static void stereo_dft_dequantize_ipd_fx( * *-------------------------------------------------------------------------*/ void stereo_dft_generate_res_pred_fx( - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ - const Word16 samp_ratio, /* i : sampling ratio */ - Word32 *pDFT_DMX, /* i : downmix signal */ - Word32 *DFT_PRED_RES, /* o : residual prediction signal */ - Word32 *pPredGain, /* i : residual prediction gains */ - const Word16 k, /* i : subframe index */ - Word32 *ap_filt_DMX, /* i : enhanced stereo filling signal */ - Word16 *stop, /* o : last FD stereo filling bin */ - const Word16 bfi /* i : BFI flag */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder DFT stereo handle */ + const Word16 samp_ratio, /* i : sampling ratio Q13*/ + Word32 *pDFT_DMX, /* i : downmix signal qDFT*/ + Word32 *DFT_PRED_RES, /* o : residual prediction signal qDFT*/ + Word32 *pPredGain, /* i : residual prediction gains Q31*/ + const Word16 k, /* i : subframe index Q0*/ + Word32 *ap_filt_DMX, /* i : enhanced stereo filling signal qDFT*/ + Word16 *stop, /* o : last FD stereo filling bin Q0*/ + const Word16 bfi /* i : BFI flag Q0*/ ) { /* general variables */ @@ -2570,24 +2574,24 @@ void stereo_dft_generate_res_pred_fx( } ELSE { - alpha = (Word16) ( 0x199A ); + alpha = (Word16) ( 0x199A ); /* Q15 */ move16(); } // gain_limit = 0x7FFF; // 2.0 in Q14 /* residual prediction only used up to 16 kHz (SWB) */ - nbands_respred = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); + nbands_respred = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); /* Q0 */ /* In ACELP mode the downmix signal is not available in bandwidth extension area. * * Therefore, the downmix energy in the corresponding subbands is estimated. */ - bin0 = (Word16) ( L_shr( L_add( L_mult0( hStereoDft->NFFT, samp_ratio ), ONE_IN_Q12 ), Q12 + 1 ) ); + bin0 = (Word16) ( L_shr( L_add( L_mult0( hStereoDft->NFFT, samp_ratio ), ONE_IN_Q12 ), Q12 + 1 ) ); /* Q0 */ move16(); - bin0 = s_min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); + bin0 = s_min( bin0, hStereoDft->band_limits[hStereoDft->nbands] ); /* Q0 */ b = hStereoDft->nbands; move16(); WHILE( GE_16( hStereoDft->band_limits[b], bin0 ) ) { - b = sub( b, 1 ); + b--; } band0 = b; move16(); @@ -2595,12 +2599,12 @@ void stereo_dft_generate_res_pred_fx( IF( LT_16( hStereoDft->res_pred_mode[k + STEREO_DFT_OFFSET], STEREO_DFT_RESPRED_ESF ) ) { /* no ESF signal available, use stereo filling over whole spectrum */ - lb_stefi_start_band = s_max( hStereoDft->res_pred_band_min, hStereoDft->res_cod_band_max ); + lb_stefi_start_band = s_max( hStereoDft->res_pred_band_min, hStereoDft->res_cod_band_max ); /* Q0 */ } ELSE { /* ESF signal available, use ESF in lowband, stereo filling in highband */ - lb_stefi_start_band = s_max( band0, hStereoDft->res_cod_band_max ); + lb_stefi_start_band = s_max( band0, hStereoDft->res_cod_band_max ); /* Q0 */ } IF( bfi ) @@ -2623,14 +2627,14 @@ void stereo_dft_generate_res_pred_fx( move64(); /* calculate band energies (low band only in case of ACELP) */ - FOR( i = hStereoDft->band_limits[b]; i < s_min( hStereoDft->band_limits[b + 1], bin0 ); i++ ) + FOR( i = hStereoDft->band_limits[b]; i < min( hStereoDft->band_limits[b + 1], bin0 ); i++ ) { dmx_nrg_64bit = W_add( dmx_nrg_64bit, W_add( W_mult0_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), - W_mult0_32_32( pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )] ) ) ); + W_mult0_32_32( pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ) ) ); /* 2 * q_dft */ rev_nrg_64bit = W_add( rev_nrg_64bit, W_add( W_mult0_32_32( ap_filt_DMX[2 * i], ap_filt_DMX[2 * i] ), - W_mult0_32_32( ap_filt_DMX[add( shl( i, 1 ), 1 )], ap_filt_DMX[add( shl( i, 1 ), 1 )] ) ) ); + W_mult0_32_32( ap_filt_DMX[2 * i + 1], ap_filt_DMX[2 * i + 1] ) ) ); /* 2 * q_dft */ } q_shift = W_norm( dmx_nrg_64bit ); dmx_nrg = W_extract_l( W_shl( dmx_nrg_64bit, sub( q_shift, 32 ) ) ); // 2 * hStereoDft->q_dft + (q_shift - 32) @@ -2641,8 +2645,8 @@ void stereo_dft_generate_res_pred_fx( /* Reach a common Q for dmx_nrg and rev_nrg */ q_com = s_min( dmx_nrg_q, rev_nrg_q ); - dmx_nrg = L_shl( dmx_nrg, sub( q_com, dmx_nrg_q ) ); - rev_nrg = L_shl( rev_nrg, sub( q_com, rev_nrg_q ) ); + dmx_nrg = L_shl( dmx_nrg, sub( q_com, dmx_nrg_q ) ); /* q_com */ + rev_nrg = L_shl( rev_nrg, sub( q_com, rev_nrg_q ) ); /* q_com */ IF( LT_16( hStereoDft->q_smoothed_nrg, q_com ) ) { rev_nrg = L_shr( rev_nrg, shl( sub( q_com, hStereoDft->q_smoothed_nrg ), 1 ) ); @@ -2652,23 +2656,23 @@ void stereo_dft_generate_res_pred_fx( } ELSE IF( GT_16( hStereoDft->q_smoothed_nrg, q_com ) ) { - hStereoDft->smooth_res_nrg_fx[b] = L_shr( hStereoDft->smooth_res_nrg_fx[b], shl( sub( hStereoDft->q_smoothed_nrg, q_com ), 1 ) ); + hStereoDft->smooth_res_nrg_fx[b] = L_shr( hStereoDft->smooth_res_nrg_fx[b], shl( sub( hStereoDft->q_smoothed_nrg, q_com ), 1 ) ); /* hStereoDft->q_smoothed_nrg */ move32(); - hStereoDft->smooth_dmx_nrg_fx[b] = L_shr( hStereoDft->smooth_dmx_nrg_fx[b], shl( sub( hStereoDft->q_smoothed_nrg, q_com ), 1 ) ); + hStereoDft->smooth_dmx_nrg_fx[b] = L_shr( hStereoDft->smooth_dmx_nrg_fx[b], shl( sub( hStereoDft->q_smoothed_nrg, q_com ), 1 ) ); /* hStereoDft->q_smoothed_nrg */ move32(); q_smoothed_nrg_local[b] = q_com; move16(); } /* smoothing */ - hStereoDft->smooth_res_nrg_fx[b] = Madd_32_16( Mpy_32_16_1( hStereoDft->smooth_res_nrg_fx[b], alpha ), rev_nrg, sub( (Word16) ( 0x7FFF ), alpha ) ); + hStereoDft->smooth_res_nrg_fx[b] = Madd_32_16( Mpy_32_16_1( hStereoDft->smooth_res_nrg_fx[b], alpha ), rev_nrg, sub( (Word16) ( 0x7FFF ), alpha ) ); /* hStereoDft->q_smoothed_nrg */ move32(); - hStereoDft->smooth_dmx_nrg_fx[b] = Madd_32_16( Mpy_32_16_1( hStereoDft->smooth_dmx_nrg_fx[b], alpha ), dmx_nrg, sub( (Word16) ( 0x7FFF ), alpha ) ); + hStereoDft->smooth_dmx_nrg_fx[b] = Madd_32_16( Mpy_32_16_1( hStereoDft->smooth_dmx_nrg_fx[b], alpha ), dmx_nrg, sub( (Word16) ( 0x7FFF ), alpha ) ); /* hStereoDft->q_smoothed_nrg */ move32(); /* normalization factor */ IF( hStereoDft->smooth_res_nrg_fx[b] != 0 ) { - norm_fac = BASOP_Util_Divide3232_Scale( hStereoDft->smooth_dmx_nrg_fx[b], hStereoDft->smooth_res_nrg_fx[b], &q_norm_fac ); + norm_fac = BASOP_Util_Divide3232_Scale( hStereoDft->smooth_dmx_nrg_fx[b], hStereoDft->smooth_res_nrg_fx[b], &q_norm_fac ); /* q_norm_fac */ norm_fac = Sqrt16( norm_fac, &q_norm_fac ); IF( norm_fac != 0 ) { @@ -2705,7 +2709,7 @@ void stereo_dft_generate_res_pred_fx( } ELSE { - norm_fac = extract_l( L_shr( L_mult0( norm_fac, lim_norm_fac ), Q15 ) ); + norm_fac = extract_l( L_shr( L_mult0( norm_fac, lim_norm_fac ), Q15 ) ); /* q_norm_fac */ q_norm_fac = add( q_norm_fac, 1 ); test(); IF( q_norm_fac < 0 ) @@ -2732,11 +2736,11 @@ void stereo_dft_generate_res_pred_fx( move16(); } - FOR( i = hStereoDft->band_limits[b]; i < s_min( hStereoDft->band_limits[b + 1], bin0 ); i++ ) + FOR( i = hStereoDft->band_limits[b]; i < min( hStereoDft->band_limits[b + 1], bin0 ); i++ ) { - DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i] ), q_norm_fac ); + DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i] ), q_norm_fac ); /* q_dft */ move32(); - DFT_PRED_RES[add( shl( i, 1 ), 1 )] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[add( shl( i, 1 ), 1 )] ), q_norm_fac ); + DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( Mpy_32_16_1( pPredGain[b], norm_fac ), ap_filt_DMX[2 * i + 1] ), q_norm_fac ); /* q_dft */ move32(); } } @@ -2750,13 +2754,16 @@ void stereo_dft_generate_res_pred_fx( } FOR( b = 0; b < STEREO_DFT_BAND_MAX; b++ ) { - hStereoDft->smooth_dmx_nrg_fx[b] = L_shl( hStereoDft->smooth_dmx_nrg_fx[b], sub( q_com, q_smoothed_nrg_local[b] ) ); - hStereoDft->smooth_res_nrg_fx[b] = L_shl( hStereoDft->smooth_res_nrg_fx[b], sub( q_com, q_smoothed_nrg_local[b] ) ); + hStereoDft->smooth_dmx_nrg_fx[b] = L_shl( hStereoDft->smooth_dmx_nrg_fx[b], sub( q_com, q_smoothed_nrg_local[b] ) ); /* q_com */ + move32(); + + hStereoDft->smooth_res_nrg_fx[b] = L_shl( hStereoDft->smooth_res_nrg_fx[b], sub( q_com, q_smoothed_nrg_local[b] ) ); /* q_com */ + move32(); } IF( GT_16( q_com, hStereoDft->q_dft ) ) { - scale_sig32( hStereoDft->smooth_dmx_nrg_fx, STEREO_DFT_BAND_MAX, sub( hStereoDft->q_dft, q_com ) ); - scale_sig32( hStereoDft->smooth_res_nrg_fx, STEREO_DFT_BAND_MAX, sub( hStereoDft->q_dft, q_com ) ); + scale_sig32( hStereoDft->smooth_dmx_nrg_fx, STEREO_DFT_BAND_MAX, sub( hStereoDft->q_dft, q_com ) ); /* q_dft */ + scale_sig32( hStereoDft->smooth_res_nrg_fx, STEREO_DFT_BAND_MAX, sub( hStereoDft->q_dft, q_com ) ); /* q_dft */ hStereoDft->q_smoothed_nrg = hStereoDft->q_dft; move16(); } @@ -2769,8 +2776,8 @@ void stereo_dft_generate_res_pred_fx( FOR( b = lb_stefi_start_band; b <= band0; b++ ) { Word16 temp, temp_e; - d_short_ind = add( sub( STEREO_DFT_PAST_MAX, STEREO_DFT_STEFFI_DELAY_SHORT ), b & 1 ); - temp = BASOP_Util_Divide1616_Scale( b, sub( hStereoDft->nbands, 1 ), &temp_e ); /*(float) b / ( hStereoDft->nbands - 1 )*/ + d_short_ind = add( sub( STEREO_DFT_PAST_MAX, STEREO_DFT_STEFFI_DELAY_SHORT ), b & 1 ); /* Q0 */ + temp = BASOP_Util_Divide1616_Scale( b, sub( hStereoDft->nbands, 1 ), &temp_e ); /*(float) b / ( hStereoDft->nbands - 1 )*/ IF( temp_e < 0 ) { temp = shl( temp, temp_e ); @@ -2787,20 +2794,20 @@ void stereo_dft_generate_res_pred_fx( move16(); /* Even number of window sliding (assymmetric OLA) */ - d_short_ind = shl( shr( d_short_ind, 1 ), 1 ); - d_long_ind = shl( shr( d_long_ind, 1 ), 1 ); + d_short_ind = shl( shr( d_short_ind, 1 ), 1 ); /* Q0 */ + d_long_ind = shl( shr( d_long_ind, 1 ), 1 ); /* Q0 */ - d_short = sub( STEREO_DFT_PAST_MAX, d_short_ind ); - d_long = sub( STEREO_DFT_PAST_MAX, d_long_ind ); + d_short = sub( STEREO_DFT_PAST_MAX, d_short_ind ); /* Q0 */ + d_long = sub( STEREO_DFT_PAST_MAX, d_long_ind ); /* Q0 */ - d_short_ind = add( add( d_short_ind, hStereoDft->past_DMX_pos ), 1 ) % STEREO_DFT_PAST_MAX; + d_short_ind = add( add( d_short_ind, hStereoDft->past_DMX_pos ), 1 ) % STEREO_DFT_PAST_MAX; /* Q0 */ move16(); - d_long_ind = add( add( d_long_ind, hStereoDft->past_DMX_pos ), 1 ) % STEREO_DFT_PAST_MAX; + d_long_ind = add( add( d_long_ind, hStereoDft->past_DMX_pos ), 1 ) % STEREO_DFT_PAST_MAX; /* Q0 */ move16(); - g_short = hStereoDft->stefi_short_gain_fx; + g_short = hStereoDft->stefi_short_gain_fx; /* Q15 */ move16(); - g_long = hStereoDft->stefi_long_gain_fx; + g_long = hStereoDft->stefi_long_gain_fx; /* Q15 */ move16(); /* change mixing ratio if long and short delay are the same */ @@ -2844,35 +2851,35 @@ void stereo_dft_generate_res_pred_fx( move32(); dmx_nrg = EPSILON_FIX; move32(); - FOR( i = hStereoDft->band_limits[b]; i < s_min( bin0, hStereoDft->band_limits[b + 1] ); i++ ) + FOR( i = hStereoDft->band_limits[b]; i < min( bin0, hStereoDft->band_limits[b + 1] ); i++ ) { - dmx_nrg = Madd_32_32( Madd_32_32( dmx_nrg, pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )] ); + dmx_nrg = Madd_32_32( Madd_32_32( dmx_nrg, pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ); /* 2 * q_dft - 31 */ - DFT_PRED_RES[2 * i] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i], g_long ), q_shift1 ) ); + DFT_PRED_RES[2 * i] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i], g_long ), q_shift1 ) ); /* q_dft */ move32(); - DFT_PRED_RES[add( shl( i, 1 ), 1 )] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][add( shl( i, 1 ), 1 )], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][add( shl( i, 1 ), 1 )], g_long ), q_shift1 ) ); + DFT_PRED_RES[2 * i + 1] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i + 1], g_long ), q_shift1 ) ); /* q_dft */ move32(); - past_dmx_nrg = Madd_32_32( Madd_32_32( past_dmx_nrg, DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[add( shl( i, 1 ), 1 )], DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); + past_dmx_nrg = Madd_32_32( Madd_32_32( past_dmx_nrg, DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[2 * i + 1], DFT_PRED_RES[2 * i + 1] ); /* q_dft */ } test(); IF( !bfi || GE_16( b, hStereoDft->res_cod_band_max ) ) { Word16 q_div; Word16 op; - op = BASOP_Util_Divide3232_Scale( L_add( 1, dmx_nrg ), L_add( 1, past_dmx_nrg ), &q_div ); + op = BASOP_Util_Divide3232_Scale( L_add( 1, dmx_nrg ), L_add( 1, past_dmx_nrg ), &q_div ); /* q_sqrt */ q_sqrt = q_div; move16(); norm_fac = Sqrt16( op, &q_sqrt ); - g2 = Mpy_32_16_1( pPredGain[b], norm_fac ); + g2 = Mpy_32_16_1( pPredGain[b], norm_fac ); /* Q31 */ IF( LE_32( q_sqrt, norm_l( g2 ) ) ) { g2 = L_shl( g2, q_sqrt ); pred_gain_avg = Madd_32_16( Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ), - hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); + hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); /* Q31 */ g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ), Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( MAX_16, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ), - g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); + g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* Q31 */ q_sqrt = 0; move16(); } @@ -2881,23 +2888,23 @@ void stereo_dft_generate_res_pred_fx( /* Multiplication with STEREO_DFT_STEFFI_GAIN_AMP_FX is avodided since the float value of this constant is 1.0f */ g2 = Madd_32_16( Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ), - hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); + hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); /* Q31 */ q_sqrt = 0; move16(); } FOR( i = hStereoDft->band_limits[b]; i < min( bin0, hStereoDft->band_limits[b + 1] ); i++ ) { - DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[2 * i] ), q_sqrt ); + DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[2 * i] ), q_sqrt ); /* q_dft */ move32(); - DFT_PRED_RES[add( shl( i, 1 ), 1 )] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[add( shl( i, 1 ), 1 )] ), q_sqrt ); + DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( g2, DFT_PRED_RES[2 * i + 1] ), q_sqrt ); /* q_dft */ move32(); } } } ELSE { - set32_fx( DFT_PRED_RES + shl( hStereoDft->band_limits[b], 1 ), 0, shl( sub( min( bin0, hStereoDft->band_limits[b + 1] ), hStereoDft->band_limits[b] ), 1 ) ); + set32_fx( DFT_PRED_RES + shl( hStereoDft->band_limits[b], 1 ), 0, shl( sub( s_min( bin0, hStereoDft->band_limits[b + 1] ), hStereoDft->band_limits[b] ), 1 ) ); } } } @@ -2918,12 +2925,12 @@ void stereo_dft_generate_res_pred_fx( /* calculate high band energy only */ dmx_nrg = EPSILON_FIX; move32(); - FOR( i = bin0; i < shr( hStereoDft->NFFT, 1 ); i++ ) + FOR( i = bin0; i < hStereoDft->NFFT / 2; i++ ) { - dmx_nrg = L_add( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )] ) ); + dmx_nrg = L_add( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ) ); /* 2 * q_dft - 31 */ } - hStereoDft->hb_nrg_fx[0] = L_add( hStereoDft->hb_nrg_fx[0], div_l( dmx_nrg, shr( hStereoDft->NFFT, 2 ) ) ); + hStereoDft->hb_nrg_fx[0] = L_add( hStereoDft->hb_nrg_fx[0], div_l( dmx_nrg, shr( hStereoDft->NFFT, 2 ) ) ); /* Q15 */ move32(); *stop = bin0; move16(); @@ -2932,22 +2939,22 @@ void stereo_dft_generate_res_pred_fx( { /* TCX/HQ core -> ACELP transition */ /* apply short delay only and blend to long/short gain */ - dmx_nrg = hStereoDft->hb_nrg_subr_fx[k]; + dmx_nrg = hStereoDft->hb_nrg_subr_fx[k]; /* Q15 */ move32(); d_short_ind = STEREO_DFT_PAST_MAX - STEREO_DFT_TD_STEFI_SUBFR_DELAY; move16(); - d_short_ind = s_and( add( d_short_ind, add( hStereoDft->past_DMX_pos, 1 ) ), ( STEREO_DFT_PAST_MAX - 1 ) ); + d_short_ind = s_and( add( d_short_ind, add( hStereoDft->past_DMX_pos, 1 ) ), ( STEREO_DFT_PAST_MAX - 1 ) ); /* Q0 */ /* calculate high band energy of past dmx */ // past_dmx_nrg = EPSILON_FIX; past_dmx_nrg = 0; move32(); - FOR( i = bin0; i < s_min( shr( hStereoDft->NFFT, 1 ), STEREO_DFT32MS_N_32k / 2 ); i++ ) + FOR( i = bin0; i < min( ( hStereoDft->NFFT / 2 ), ( STEREO_DFT32MS_N_32k / 2 ) ); i++ ) { - past_dmx_nrg = L_add( past_dmx_nrg, Madd_32_32( Mpy_32_32( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i] ), hStereoDft->DFT_past_DMX_fx[d_short_ind][add( shl( i, 1 ), 1 )], hStereoDft->DFT_past_DMX_fx[d_short_ind][add( shl( i, 1 ), 1 )] ) ); + past_dmx_nrg = L_add( past_dmx_nrg, Madd_32_32( Mpy_32_32( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i] ), hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1] ) ); /* 2 * hStereoDft->q_DFT_past_DMX_fx[d_short_ind] - 31 */ } - past_dmx_nrg = L_shl( past_dmx_nrg, shl( sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] ), 1 ) ); + past_dmx_nrg = L_shl( past_dmx_nrg, shl( sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] ), 1 ) ); /* 2 * hStereoDft->q_dft - 31*/ IF( past_dmx_nrg == 0 ) { past_dmx_nrg = EPSILON_FX; @@ -2973,8 +2980,8 @@ void stereo_dft_generate_res_pred_fx( Word32 op = BASOP_Util_Divide3232_Scale( L_add( EPSILON_FIX, dmx_nrg ), L_add( EPSILON_FIX, past_dmx_nrg ), &q_divide ); q_norm_fac = add( add( Q16, q_divide ), hStereoDft->q_hb_nrg_subr ); op = Sqrt32( op, &q_norm_fac ); - g2 = Mpy_32_32( pPredGain[b], op ); - pred_gain_avg = Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ); + g2 = Mpy_32_32( pPredGain[b], op ); /* Q31 */ + pred_gain_avg = Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ); /* Q31 */ IF( q_norm_fac < 0 ) { g2 = L_shl( g2, q_norm_fac ); @@ -2992,30 +2999,30 @@ void stereo_dft_generate_res_pred_fx( { g2 = L_min( Mpy_32_16_1( L_shr( pred_gain_avg, q_norm_fac ), STEREO_DFT_STEFFI_GAIN_AMP_FX ), Madd_32_16( Mpy_32_16_1( L_shr( pred_gain_avg, q_norm_fac ), sub( (Word16) 0x7FFF, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ), - g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); - g2 = L_shl( g2, q_norm_fac ); + g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* Q31 - q_norm_fac */ + g2 = L_shl( g2, q_norm_fac ); /* Q31 */ } } ELSE { g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ), Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( (Word16) 0x7FFF, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ), - g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); + g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* Q31 */ } q_shift = sub( hStereoDft->q_dft, hStereoDft->q_DFT_past_DMX_fx[d_short_ind] ); move16(); - FOR( i = s_max( hStereoDft->band_limits[b], bin0 ); i < s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) + FOR( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) { - DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( g2, hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i] ), q_shift ); + DFT_PRED_RES[2 * i] = L_shl( Mpy_32_32( g2, hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i] ), q_shift ); /* q_dft */ move32(); - DFT_PRED_RES[add( shl( i, 1 ), 1 )] = L_shl( Mpy_32_32( g2, hStereoDft->DFT_past_DMX_fx[d_short_ind][add( shl( i, 1 ), 1 )] ), q_shift ); + DFT_PRED_RES[2 * i + 1] = L_shl( Mpy_32_32( g2, hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1] ), q_shift ); /* q_dft */ move32(); } } ELSE { - begin = s_max( hStereoDft->band_limits[b], bin0 ); - end = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); + begin = s_max( hStereoDft->band_limits[b], bin0 ); /* Q0 */ + end = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); /* Q0 */ set32_fx( DFT_PRED_RES + shl( begin, 1 ), 0, shl( sub( end, begin ), 1 ) ); } } @@ -3025,7 +3032,7 @@ void stereo_dft_generate_res_pred_fx( FOR( b = band0; b < nbands_respred; b++ ) { /* TCX/HQ core -> TCX/HQ core: business as usual */ - d_short_ind = add( sub( STEREO_DFT_PAST_MAX, STEREO_DFT_STEFFI_DELAY_SHORT ), b & 1 ); + d_short_ind = add( sub( STEREO_DFT_PAST_MAX, STEREO_DFT_STEFFI_DELAY_SHORT ), b & 1 ); /* Q0 */ Word16 temp, temp_e; temp = BASOP_Util_Divide1616_Scale( b, sub( hStereoDft->nbands, 1 ), &temp_e ); /*(float) b / ( hStereoDft->nbands - 1 )*/ IF( temp_e < 0 ) @@ -3037,31 +3044,31 @@ void stereo_dft_generate_res_pred_fx( temp = shr( temp, 3 ); /*adding 3 as guard bit*/ temp_e = add( temp_e, 3 ); temp = shr( add( imult1616( ( STEREO_DFT_PAST_MAX + 4 - 1 ), temp ), shl( 1, sub( 14, temp_e ) ) ), sub( 15, temp_e ) ); /*( (float) b / ( hStereoDft->nbands - 1 ) ) + 0.5f*/ /*Q0*/ - d_long_ind = sub( s_max( 4, temp ), 4 ); + d_long_ind = sub( s_max( 4, temp ), 4 ); /* Q0 */ /* make sure d_short really corresponds to a shorter or equally long delay than d_long (e.g. not always the case for * STEREO_DFT_STEFFI_DELAY_SHORT=3 and STEREO_DFT_STEFFI_DELAY_LONG=4)*/ - d_short_ind = s_max( d_short_ind, d_long_ind ); + d_short_ind = s_max( d_short_ind, d_long_ind ); /* Q0 */ /* Even number of window sliding (assymmetric OLA) */ - d_short_ind = d_short_ind & (Word16) ( 0xFFFE ); + d_short_ind = d_short_ind & (Word16) ( 0xFFFE ); /* Q0 */ move16(); - d_long_ind = d_long_ind & (Word16) ( 0xFFFE ); + d_long_ind = d_long_ind & (Word16) ( 0xFFFE ); /* Q0 */ move16(); - d_short = sub( STEREO_DFT_PAST_MAX, d_short_ind ); + d_short = sub( STEREO_DFT_PAST_MAX, d_short_ind ); /* Q0 */ move16(); - d_long = sub( STEREO_DFT_PAST_MAX, d_long_ind ); + d_long = sub( STEREO_DFT_PAST_MAX, d_long_ind ); /* Q0 */ move16(); /* Works as long as STEREO_DFT_PAST_MAX is a power of 2*/ - d_short_ind = ( add( d_short_ind, add( hStereoDft->past_DMX_pos, 1 ) ) ) & ( STEREO_DFT_PAST_MAX - 1 ); + d_short_ind = ( add( d_short_ind, add( hStereoDft->past_DMX_pos, 1 ) ) ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */ move16(); - d_long_ind = ( add( d_long_ind, add( hStereoDft->past_DMX_pos, 1 ) ) ) & ( STEREO_DFT_PAST_MAX - 1 ); + d_long_ind = ( add( d_long_ind, add( hStereoDft->past_DMX_pos, 1 ) ) ) & ( STEREO_DFT_PAST_MAX - 1 ); /* Q0 */ move16(); - g_short = hStereoDft->stefi_short_gain_fx; + g_short = hStereoDft->stefi_short_gain_fx; /* Q15 */ move16(); - g_long = hStereoDft->stefi_long_gain_fx; + g_long = hStereoDft->stefi_long_gain_fx; /* Q15 */ move16(); /* change mixing ratio if long and short delay are the same */ @@ -3118,18 +3125,18 @@ void stereo_dft_generate_res_pred_fx( move32(); dmx_nrg = EPSILON_FIX; move32(); - FOR( i = s_max( hStereoDft->band_limits[b], bin0 ); i < s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) + FOR( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) { - dmx_nrg = L_add( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[add( shl( i, 1 ), 1 )], pDFT_DMX[add( shl( i, 1 ), 1 )] ) ); + dmx_nrg = L_add( dmx_nrg, Madd_32_32( Mpy_32_32( pDFT_DMX[2 * i], pDFT_DMX[2 * i] ), pDFT_DMX[2 * i + 1], pDFT_DMX[2 * i + 1] ) ); /* 2 * q_dft - 31 */ - DFT_PRED_RES[2 * i] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i], g_long ), q_shift1 ) ); + DFT_PRED_RES[2 * i] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i], g_long ), q_shift1 ) ); /* q_dft */ move32(); - DFT_PRED_RES[add( shl( i, 1 ), 1 )] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][add( shl( i, 1 ), 1 )], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][add( shl( i, 1 ), 1 )], g_long ), q_shift1 ) ); + DFT_PRED_RES[2 * i + 1] = L_add( L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_short_ind][2 * i + 1], g_short ), q_shift0 ), L_shl( Mpy_32_16_1( hStereoDft->DFT_past_DMX_fx[d_long_ind][2 * i + 1], g_long ), q_shift1 ) ); /* q_dft */ move32(); - past_dmx_nrg = L_add( past_dmx_nrg, Madd_32_32( Mpy_32_32( DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[2 * i + 1], DFT_PRED_RES[2 * i + 1] ) ); + past_dmx_nrg = L_add( past_dmx_nrg, Madd_32_32( Mpy_32_32( DFT_PRED_RES[2 * i], DFT_PRED_RES[2 * i] ), DFT_PRED_RES[2 * i + 1], DFT_PRED_RES[2 * i + 1] ) ); /* 2 * q_dft - 31 */ } - op1 = L_deposit_h( BASOP_Util_Divide3232_Scale( ( EPSILON_FIX + dmx_nrg ), ( EPSILON_FIX + past_dmx_nrg ), &q_div ) ); + op1 = L_deposit_h( BASOP_Util_Divide3232_Scale( ( EPSILON_FIX + dmx_nrg ), ( EPSILON_FIX + past_dmx_nrg ), &q_div ) ); /* q_div + 16 */ q_norm_fac = q_div; move16(); op1 = Sqrt32( op1, &q_norm_fac ); @@ -3137,26 +3144,26 @@ void stereo_dft_generate_res_pred_fx( { assert( 0 ); } - norm_fac = extract_h( op1 ); + norm_fac = extract_h( op1 ); /* q_norm_fac - 16 */ q_norm_fac = sub( q_norm_fac, Q16 ); - g2 = Mpy_32_16_1( pPredGain[b], norm_fac ); - pred_gain_avg = Madd_32_16( Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ), hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); + g2 = Mpy_32_16_1( pPredGain[b], norm_fac ); /* Q31 */ + pred_gain_avg = Madd_32_16( Mpy_32_16_1( hStereoDft->past_res_pred_gain_fx[d_short_ind][b], g_short ), hStereoDft->past_res_pred_gain_fx[d_long_ind][b], g_long ); /* Q31 */ g2 = L_min( Mpy_32_16_1( pred_gain_avg, STEREO_DFT_STEFFI_GAIN_AMP_FX ), - Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( (Word16) ( 0x7FFF ), STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ), g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); + Madd_32_16( Mpy_32_16_1( pred_gain_avg, sub( (Word16) ( 0x7FFF ), STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ), g2, STEREO_DFT_STEFFI_GAIN_REST_AMT_FX ) ); /* Q31 */ - FOR( i = s_max( hStereoDft->band_limits[b], bin0 ); i < s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) + FOR( i = max( hStereoDft->band_limits[b], bin0 ); i < min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); i++ ) { - DFT_PRED_RES[2 * i] = Mpy_32_32( g2, DFT_PRED_RES[2 * i] ); + DFT_PRED_RES[2 * i] = Mpy_32_32( g2, DFT_PRED_RES[2 * i] ); /* Q31 */ move32(); - DFT_PRED_RES[add( shl( i, 1 ), 1 )] = Mpy_32_32( g2, DFT_PRED_RES[add( shl( i, 1 ), 1 )] ); + DFT_PRED_RES[2 * i + 1] = Mpy_32_32( g2, DFT_PRED_RES[2 * i + 1] ); /* Q31 */ move32(); } } ELSE { - begin = s_max( hStereoDft->band_limits[b], bin0 ); - end = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); + begin = s_max( hStereoDft->band_limits[b], bin0 ); /* Q0 */ + end = s_min( hStereoDft->band_limits[b + 1], STEREO_DFT32MS_N_32k / 2 ); /* Q0 */ set32_fx( DFT_PRED_RES + shl( begin, 1 ), 0, shl( sub( end, begin ), 1 ) ); } } @@ -3169,12 +3176,12 @@ void stereo_dft_generate_res_pred_fx( test(); IF( hStereoDft->attackPresent || hStereoDft->wasTransient ) { - hStereoDft->past_res_pred_gain_fx[s_and( add( hStereoDft->past_DMX_pos, 1 ), ( STEREO_DFT_PAST_MAX - 1 ) )][b] = MIN_32; + hStereoDft->past_res_pred_gain_fx[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = MIN_32; move32(); } ELSE { - hStereoDft->past_res_pred_gain_fx[s_and( add( hStereoDft->past_DMX_pos, 1 ), ( STEREO_DFT_PAST_MAX - 1 ) )][b] = pPredGain[b]; + hStereoDft->past_res_pred_gain_fx[( hStereoDft->past_DMX_pos + 1 ) % STEREO_DFT_PAST_MAX][b] = pPredGain[b]; move32(); } } @@ -3220,32 +3227,32 @@ static void stereo_dft_adapt_sf_delay_fx( max_pg = pPredGain[b]; move16(); } - sum_pg = L_add( sum_pg, L_shr( pPredGain[b], q_guard ) ); + sum_pg = L_add( sum_pg, L_shr( pPredGain[b], q_guard ) ); /* q_gurad */ } IF( GT_16( q_guard, hStereoDft->q_lt_pred_gain ) ) { - hStereoDft->lt_pred_gain_fx = L_shr( hStereoDft->lt_pred_gain_fx, sub( q_guard, hStereoDft->q_lt_pred_gain ) ); + hStereoDft->lt_pred_gain_fx = L_shr( hStereoDft->lt_pred_gain_fx, sub( q_guard, hStereoDft->q_lt_pred_gain ) ); /* q_guard */ hStereoDft->q_lt_pred_gain = q_guard; move16(); } ELSE { - sum_pg = L_shr( sum_pg, sub( hStereoDft->q_lt_pred_gain, q_guard ) ); + sum_pg = L_shr( sum_pg, sub( hStereoDft->q_lt_pred_gain, q_guard ) ); /* hStereoDft->q_lt_pred_gain */ q_guard = hStereoDft->q_lt_pred_gain; move16(); } IF( sum_pg > 0 ) { /* Calculate mean of the prediction gain */ - hStereoDft->lt_pred_gain_fx = Madd_32_16( Mpy_32_16_1( sum_pg, STEREO_DFT_LT_PREDGAIN_UPD_FX ), hStereoDft->lt_pred_gain_fx, sub( MAX_16, STEREO_DFT_LT_PREDGAIN_UPD_FX ) ); + hStereoDft->lt_pred_gain_fx = Madd_32_16( Mpy_32_16_1( sum_pg, STEREO_DFT_LT_PREDGAIN_UPD_FX ), hStereoDft->lt_pred_gain_fx, sub( MAX_16, STEREO_DFT_LT_PREDGAIN_UPD_FX ) ); /* hStereoDft->q_lt_pred_gain */ /* Calculate the variation of the prediction gain */ - new_variation = L_abs( L_sub( sum_pg, hStereoDft->lt_pred_gain_fx ) ); - hStereoDft->lt_pred_gain_variation_fx = Madd_32_16( Mpy_32_16_1( new_variation, STEREO_DFT_VR_PREDGAIN_UPD_FX ), hStereoDft->lt_pred_gain_variation_fx, sub( MAX_16, STEREO_DFT_VR_PREDGAIN_UPD_FX ) ); + new_variation = L_abs( L_sub( sum_pg, hStereoDft->lt_pred_gain_fx ) ); /* hStereoDft->q_lt_pred_gain */ + hStereoDft->lt_pred_gain_variation_fx = Madd_32_16( Mpy_32_16_1( new_variation, STEREO_DFT_VR_PREDGAIN_UPD_FX ), hStereoDft->lt_pred_gain_variation_fx, sub( MAX_16, STEREO_DFT_VR_PREDGAIN_UPD_FX ) ); /* hStereoDft->q_lt_pred_gain */ } /* Calculate ratio of variation and mean of prediction gain */ - var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT_FX; + var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT_FX; /* Q31 */ move16(); IF( hStereoDft->lt_pred_gain_fx > 0 ) @@ -3259,40 +3266,40 @@ static void stereo_dft_adapt_sf_delay_fx( } IF( LT_32( L_shr( STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2, q_div ), opr2 ) ) { - var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2; + var_mean_ratio = STEREO_DFT_RES_RATIO_LIMIT_FX_3_BY_2; /* Q31 */ move32(); } ELSE { - var_mean_ratio = L_shl( opr2, q_div ); + var_mean_ratio = L_shl( opr2, q_div ); /* Q31 */ } } IF( GT_32( max_pg, STEREO_DFT_STEFFI_PG_THRESHOLD_FX ) ) { /* slow upwards */ - alpha_up = STEREO_DFT_STEFFI_RATIO_UP_HIGH_FX; + alpha_up = STEREO_DFT_STEFFI_RATIO_UP_HIGH_FX; /* Q31 */ move16(); - alpha_down = STEREO_DFT_STEFFI_RATIO_DOWN_HIGH_FX; + alpha_down = STEREO_DFT_STEFFI_RATIO_DOWN_HIGH_FX; /* Q31 */ move16(); } ELSE { /* slow downwards */ - alpha_up = STEREO_DFT_STEFFI_RATIO_UP_LOW_FX; + alpha_up = STEREO_DFT_STEFFI_RATIO_UP_LOW_FX; /* Q31 */ move16(); - alpha_down = STEREO_DFT_STEFFI_RATIO_DOWN_LOW_FX; + alpha_down = STEREO_DFT_STEFFI_RATIO_DOWN_LOW_FX; /* Q31 */ move16(); } IF( GT_16( extract_h( var_mean_ratio ), extract_h( hStereoDft->lt_var_mean_ratio_fx ) ) ) { - hStereoDft->lt_var_mean_ratio_fx = Madd_32_32( Mpy_32_32( var_mean_ratio, alpha_up ), hStereoDft->lt_var_mean_ratio_fx, L_sub( MAX_32, alpha_up ) ); + hStereoDft->lt_var_mean_ratio_fx = Madd_32_32( Mpy_32_32( var_mean_ratio, alpha_up ), hStereoDft->lt_var_mean_ratio_fx, L_sub( MAX_32, alpha_up ) ); /* Q31 */ move32(); } ELSE { - hStereoDft->lt_var_mean_ratio_fx = Madd_32_32( Mpy_32_32( var_mean_ratio, alpha_down ), hStereoDft->lt_var_mean_ratio_fx, L_sub( MAX_32, alpha_down ) ); + hStereoDft->lt_var_mean_ratio_fx = Madd_32_32( Mpy_32_32( var_mean_ratio, alpha_down ), hStereoDft->lt_var_mean_ratio_fx, L_sub( MAX_32, alpha_down ) ); /* Q31 */ move32(); } @@ -3300,7 +3307,7 @@ static void stereo_dft_adapt_sf_delay_fx( variation is relatively high compared to the mean */ IF( GE_16( extract_h( hStereoDft->lt_var_mean_ratio_fx ), extract_h( STEREO_DFT_RES_RATIO_LIMIT_FX ) ) ) { - target_delay = L_shl( STEREO_DFT_STEFFI_DELAY_SHORT, Q15 ); + target_delay = L_shl( STEREO_DFT_STEFFI_DELAY_SHORT, Q15 ); /* Q15 */ move32(); } ELSE @@ -3308,11 +3315,11 @@ static void stereo_dft_adapt_sf_delay_fx( target_delay = L_min( L_shl( STEREO_DFT_STEFFI_DELAY_LONG, Q15 ), L_add( L_shl( STEREO_DFT_STEFFI_DELAY_SHORT, Q15 ), L_mult0( ( STEREO_DFT_STEFFI_DELAY_OFFSET + STEREO_DFT_STEFFI_DELAY_LONG - STEREO_DFT_STEFFI_DELAY_SHORT ), - sub( MAX_16, extract_h( L_shl( Mpy_32_16_1( hStereoDft->lt_var_mean_ratio_fx, ONE_STEREO_DFT_RES_RATIO_LIMIT_Q12 ), Q3 ) ) ) ) ) ); + sub( MAX_16, extract_h( L_shl( Mpy_32_16_1( hStereoDft->lt_var_mean_ratio_fx, ONE_STEREO_DFT_RES_RATIO_LIMIT_Q12 ), Q3 ) ) ) ) ) ); /* Q15 */ } /* Adapt the stereo filling delay by interpolating between two delay taps, one at the shortest delay and one at the longest delay */ - hStereoDft->stefi_short_gain_fx = extract_l( L_shr( L_sub( L_shl( STEREO_DFT_STEFFI_DELAY_LONG, Q15 ), target_delay ), 1 ) ); + hStereoDft->stefi_short_gain_fx = extract_l( L_shr( L_sub( L_shl( STEREO_DFT_STEFFI_DELAY_LONG, Q15 ), target_delay ), 1 ) ); /* Q15 */ q_sqrt = 0; move16(); IF( EQ_16( hStereoDft->stefi_short_gain_fx, MIN_16 ) ) @@ -3326,10 +3333,10 @@ static void stereo_dft_adapt_sf_delay_fx( { op = hStereoDft->stefi_short_gain_fx; move16(); - hStereoDft->stefi_long_gain_fx = Sqrt16( sub( MAX_16, mult( op, op ) ), &q_sqrt ); + hStereoDft->stefi_long_gain_fx = Sqrt16( sub( MAX_16, mult( op, op ) ), &q_sqrt ); /* Q15 */ IF( q_sqrt != 0 ) { - hStereoDft->stefi_long_gain_fx = shl( hStereoDft->stefi_long_gain_fx, q_sqrt ); + hStereoDft->stefi_long_gain_fx = shl( hStereoDft->stefi_long_gain_fx, q_sqrt ); /* Q15 */ } } @@ -3337,9 +3344,9 @@ static void stereo_dft_adapt_sf_delay_fx( } void stereo_dft_dec_sid_coh_fx( Decoder_State *st, /* i/o: decoder state structure */ - const Word16 nbands, /* i : number of DFT stereo bands */ - Word16 *coh_fx, /* i/o: coherence */ - Word16 *nb_bits /* i/o: number of bits read */ + const Word16 nbands, /* i : number of DFT stereo bands Q0*/ + Word16 *coh_fx, /* i/o: coherence Q15*/ + Word16 *nb_bits /* i/o: number of bits read Q0*/ ) { Word16 alpha_fx; @@ -3356,17 +3363,17 @@ void stereo_dft_dec_sid_coh_fx( Word16 bits_tmp; Word16 b; - nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + nr_of_sid_stereo_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; /* Q0 */ move16(); /* If the coherence is not encoded due to lack of bits set alpha to zero which leads to that the coherence */ /* from the previous frame is used. */ - IF( GT_16( sub( sub( nr_of_sid_stereo_bits, *nb_bits ), STEREO_DFT_N_COH_ALPHA_BITS - STEREO_DFT_PRED_NBITS ), 0 ) ) + IF( sub( sub( nr_of_sid_stereo_bits, *nb_bits ), STEREO_DFT_N_COH_ALPHA_BITS - STEREO_DFT_PRED_NBITS ) > 0 ) { /* Read coherence from bitstream */ - coh_pred_index = get_next_indice_fx( st, STEREO_DFT_PRED_NBITS ); /* Read predictor index */ + coh_pred_index = get_next_indice_fx( st, STEREO_DFT_PRED_NBITS ); /* Read predictor index Q0*/ ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_PRED_NBITS ); - alpha_index = get_next_indice_fx( st, STEREO_DFT_N_COH_ALPHA_BITS ); /* Read alpha index */ + alpha_index = get_next_indice_fx( st, STEREO_DFT_N_COH_ALPHA_BITS ); /* Read alpha index Q0*/ ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_N_COH_ALPHA_BITS ); alpha_step = 0; @@ -3375,10 +3382,10 @@ void stereo_dft_dec_sid_coh_fx( { IF( GT_16( sub( nr_of_sid_stereo_bits, *nb_bits ), dft_cng_coh_alpha_start[i] ) ) { - alpha_step = add( i, 1 ); + alpha_step = i + 1; } } - alpha_fx = dft_cng_alpha_bits_fx[alpha_step][alpha_index]; /*Q-15*/ + alpha_fx = dft_cng_alpha_bits_fx[alpha_step][alpha_index]; /* Q15 */ move16(); } ELSE @@ -3390,12 +3397,12 @@ void stereo_dft_dec_sid_coh_fx( FOR( i = *nb_bits; i < nr_of_sid_stereo_bits; i++ ) { get_next_indice_fx( st, 1 ); - ( *nb_bits ) = add( ( *nb_bits ), 1 ); + ( *nb_bits )++; } } - pptr_fx = dft_cng_coh_pred_fx[coh_pred_index]; /*Q-13*/ - pred_fx = 3276; /*Q-13*/ + pptr_fx = dft_cng_coh_pred_fx[coh_pred_index]; /*Q13*/ + pred_fx = 3276; /*Q13*/ move16(); move16(); FOR( b = 0; b < nbands; b++ ) @@ -3412,9 +3419,9 @@ void stereo_dft_dec_sid_coh_fx( /* Read residual index from bitstream */ IF( LT_16( *nb_bits, nr_of_sid_stereo_bits ) ) /* If the bit limit is reached, res_index = 0 is assumed for remaining indices */ { - bits_tmp = read_GR0( &st->bit_stream[st->next_bit_pos], &res_index, 1 ); - *nb_bits = add( *nb_bits, bits_tmp ); - st->next_bit_pos = add( st->next_bit_pos, bits_tmp ); + bits_tmp = read_GR0( &st->bit_stream[st->next_bit_pos], &res_index, 1 ); /* Q0 */ + *nb_bits = add( *nb_bits, bits_tmp ); /* Q0 */ + st->next_bit_pos = add( st->next_bit_pos, bits_tmp ); /* Q0 */ move16(); move16(); } @@ -3425,13 +3432,13 @@ void stereo_dft_dec_sid_coh_fx( } /* Reconstruct */ - res_index = dft_cng_coh_u2i[res_index]; + res_index = dft_cng_coh_u2i[res_index]; /* Q0 */ move16(); - pred_err_fx = shr( usdequant_fx( res_index, -13107 /*Q-15*/, 1638 /*Q-14*/ ), 2 ); - cohBandq_fx[b] = add( pred_fx, pred_err_fx ); /* Store for intra-frame prediction */ + pred_err_fx = shr( usdequant_fx( res_index, -13107 /*Q-15*/, 1638 /*Q-14*/ ), 2 ); /* Q15 */ + cohBandq_fx[b] = add( pred_fx, pred_err_fx ); /* Store for intra-frame prediction */ IF( GT_16( cohBandq_fx[b], 8192 ) ) { - cohBandq_fx[b] = 8192; + cohBandq_fx[b] = 8192; /* Q13 */ move16(); } ELSE IF( cohBandq_fx[b] < 0 ) @@ -3439,7 +3446,7 @@ void stereo_dft_dec_sid_coh_fx( cohBandq_fx[b] = 0; move16(); } - coh_fx[b] = shl_sat( cohBandq_fx[b], 2 ); /* Update memory for next frame */ + coh_fx[b] = shl_sat( cohBandq_fx[b], 2 ); /* Update memory for next frame */ /* Q15 */ move16(); pred_fx = 0; move16(); @@ -3449,29 +3456,30 @@ void stereo_dft_dec_sid_coh_fx( FOR( i = *nb_bits; i < nr_of_sid_stereo_bits; i++ ) { get_next_indice_fx( st, 1 ); - ( *nb_bits ) = add( ( *nb_bits ), 1 ); + ( *nb_bits )++; } return; } void stereo_dft_dequantize_itd_fx( - Word16 *ind, - Word32 *out_fx, - const Word32 output_Fs ) + Word16 *ind, /* Q0 */ + Word32 *out_fx, /* Q15 */ + const Word32 output_Fs /* Q0 */ +) { Word16 itd; Word16 mask; - mask = ( 1 << ( STEREO_DFT_ITD_NBITS - 1 ) ) - 1; + mask = ( 1 << ( STEREO_DFT_ITD_NBITS - 1 ) ) - 1; /* Q0 */ move16(); - itd = s_and( ind[0], mask ) + STEREO_DFT_ITD_MIN; + itd = s_and( ind[0], mask ) + STEREO_DFT_ITD_MIN; /* Q0 */ IF( shr( ind[0], ( STEREO_DFT_ITD_NBITS - 1 ) ) ) { - itd = imult1616( -1, itd ); + itd = imult1616( -1, itd ); /* Q0 */ } assert( ( ABSVAL( itd ) <= STEREO_DFT_ITD_MAX ) && ( ABSVAL( itd ) >= STEREO_DFT_ITD_MIN ) ); /*Convert back @ fs*/ - *out_fx = L_mult( itd, divide3232( output_Fs, STEREO_DFT_ITD_FS << 1 ) ); /*Q-15*/ + *out_fx = L_mult( itd, divide3232( output_Fs, STEREO_DFT_ITD_FS << 1 ) ); /*Q15*/ move32(); return; } @@ -3482,17 +3490,17 @@ void stereo_dft_dequantize_itd_fx( *-------------------------------------------------------------------------*/ void stereo_dft_dec_read_BS_fx( - const Word32 ivas_total_brate, /* i : IVAS total bitrate */ - const Word32 element_brate, /* i : element bitrate */ - Word32 *total_brate, /* o : total bitrate */ - Decoder_State *st, /* i/o: decoder state structure */ - STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ - const Word16 bwidth, /* i : bandwidth */ - const Word16 output_frame, /* i : output frame length */ - Word32 res_buf_fx[STEREO_DFT_N_8k], /* o : residual buffer */ - Word16 *nb_bits, /* o : number of bits read */ - Word16 *coh_fx, /* i/o: Coherence */ - const Word16 ivas_format /* i : ivas format */ + const Word32 ivas_total_brate, /* i : IVAS total bitrate Q0*/ + const Word32 element_brate, /* i : element bitrate Q0*/ + Word32 *total_brate, /* o : total bitrate Q0*/ + Decoder_State *st, /* i/o: decoder state structure */ + STEREO_DFT_DEC_DATA_HANDLE hStereoDft, /* i/o: decoder stereo handle */ + const Word16 bwidth, /* i : bandwidth Q0*/ + const Word16 output_frame, /* i : output frame length Q0*/ + Word32 res_buf_fx[STEREO_DFT_N_8k], /* o : residual buffer Q0*/ + Word16 *nb_bits, /* o : number of bits read Q0*/ + Word16 *coh_fx, /* i/o: Coherence Q15*/ + const Word16 ivas_format /* i : ivas format Q0*/ ) { Word32 sg_tmp_fx[STEREO_DFT_BAND_MAX]; @@ -3517,7 +3525,7 @@ void stereo_dft_dec_read_BS_fx( * Initialization *-----------------------------------------------------------------*/ - k_offset = STEREO_DFT_OFFSET; + k_offset = STEREO_DFT_OFFSET; /* Q0 */ move16(); IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) ) @@ -3534,7 +3542,7 @@ void stereo_dft_dec_read_BS_fx( hStereoDft->frame_nodata = 0; hStereoDft->frame_sid_nodata = 1; hStereoDft->frame_sid = 1; - *nb_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; + *nb_bits = ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - SID_FORMAT_NBITS; /* Q0 */ } move16(); move16(); @@ -3548,8 +3556,8 @@ void stereo_dft_dec_read_BS_fx( hStereoDft->frame_sid = 0; *nb_bits = 0; *total_brate = 0; - hStereoDft->itd_fx[k = hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->itd_xfade_target_fx; - hStereoDft->gipd_fx[hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->ipd_xfade_target_fx; + hStereoDft->itd_fx[k = hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->itd_xfade_target_fx; /* Q15 */ + hStereoDft->gipd_fx[hStereoDft->prm_res[k_offset] - 1 + k_offset] = hStereoDft->ipd_xfade_target_fx; /* Q27 */ move16(); move16(); @@ -3569,7 +3577,7 @@ void stereo_dft_dec_read_BS_fx( move16(); move16(); - st->total_brate = L_mult0( *nb_bits, FRAMES_PER_SEC ); + st->total_brate = L_mult0( *nb_bits, FRAMES_PER_SEC ); /* Q0 */ } hStereoDft->reverb_flag = 0; @@ -3578,7 +3586,7 @@ void stereo_dft_dec_read_BS_fx( /* reverse the bitstream */ FOR( b = 0; b < *nb_bits; b++ ) { - bit_stream_side[b] = st->bit_stream[-b]; + bit_stream_side[b] = st->bit_stream[-b]; /* Q0 */ move16(); } @@ -3588,12 +3596,12 @@ void stereo_dft_dec_read_BS_fx( bit_stream_side[b] = 0; move16(); } - st->bit_stream = bit_stream_side; + st->bit_stream = bit_stream_side; /* Q0 */ /*init*/ - max_bits = *nb_bits; + max_bits = *nb_bits; /* Q0 */ *nb_bits = 0; - N_div = STEREO_DFT_NBDIV; + N_div = STEREO_DFT_NBDIV; /* Q0 */ move16(); move16(); @@ -3612,7 +3620,7 @@ void stereo_dft_dec_read_BS_fx( } ELSE { - hStereoDft->attackPresent = get_next_indice_fx( st, 1 ); + hStereoDft->attackPresent = get_next_indice_fx( st, 1 ); /* Q0 */ ( *nb_bits ) = add( ( *nb_bits ), 1 ); move16(); move16(); @@ -3622,7 +3630,7 @@ void stereo_dft_dec_read_BS_fx( test(); IF( EQ_16( bwidth, WB ) && hStereoDft->hConfig->ada_wb_res_cod_mode ) { - hStereoDft->res_cod_mode[k_offset] = get_next_indice_fx( st, 1 ); + hStereoDft->res_cod_mode[k_offset] = get_next_indice_fx( st, 1 ); /* Q0 */ move16(); ( *nb_bits ) = add( ( *nb_bits ), 1 ); move16(); @@ -3631,43 +3639,43 @@ void stereo_dft_dec_read_BS_fx( /* read number of bands in the bitstream - depends on the audio bandwidth and not to output_Fs */ IF( hStereoDft->frame_sid ) { - NFFT_inner = imult1616( inner_frame_tbl[bwidth], STEREO_DFT32MS_N_MAX / L_FRAME48k ); + NFFT_inner = imult1616( inner_frame_tbl[bwidth], STEREO_DFT32MS_N_MAX / L_FRAME48k ); /* Q0 */ } ELSE { - NFFT_inner = imult1616( inner_frame_tbl[st->bwidth], STEREO_DFT32MS_N_MAX / L_FRAME48k ); + NFFT_inner = imult1616( inner_frame_tbl[st->bwidth], STEREO_DFT32MS_N_MAX / L_FRAME48k ); /* Q0 */ } /* Use coarse band partition in inactive frames */ IF( hStereoDft->frame_sid ) { - hStereoDft->band_res[k_offset] = STEREO_DFT_BAND_RES_LOW; - hStereoDft->res_cod_mode[k_offset] = STEREO_DFT_RES_COD_OFF; + hStereoDft->band_res[k_offset] = STEREO_DFT_BAND_RES_LOW; /* Q0 */ + hStereoDft->res_cod_mode[k_offset] = STEREO_DFT_RES_COD_OFF; /* Q0 */ move16(); move16(); - hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], s_min( STEREO_DFT32MS_N_MAX, NFFT_inner ), DEC ); + hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], s_min( STEREO_DFT32MS_N_MAX, NFFT_inner ), DEC ); /* Q0 */ IF( hStereoDft->nbands > STEREO_DFT_COH_MAXBAND ) { - hStereoDft->band_limits[STEREO_DFT_COH_MAXBAND] = hStereoDft->band_limits[hStereoDft->nbands]; - hStereoDft->nbands = STEREO_DFT_COH_MAXBAND; + hStereoDft->band_limits[STEREO_DFT_COH_MAXBAND] = hStereoDft->band_limits[hStereoDft->nbands]; /* Q0 */ + hStereoDft->nbands = STEREO_DFT_COH_MAXBAND; /* Q0 */ move16(); move16(); } } ELSE { - hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, DEC ); + hStereoDft->nbands = stereo_dft_band_config_fx( hStereoDft->band_limits, hStereoDft->band_res[k_offset], NFFT_inner, DEC ); /* Q0 */ move16(); } - hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]]; + hStereoDft->res_cod_band_max = dft_band_res_cod[hStereoDft->band_res[k_offset]][hStereoDft->res_cod_mode[k_offset]]; /* Q0 */ move16(); - hStereoDft->res_cod_line_max = (Word16) L_shr( L_add( ( 1 << Q13 ) /*0.5f Q-14*/, L_shl( L_mult0( sub( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ), divide1616( shr( output_frame, 1 ), ( hStereoDft->NFFT ) ) ) /*Q-14*/, 1 ) ), Q14 ); + hStereoDft->res_cod_line_max = (Word16) L_shr( L_add( ( 1 << Q13 ) /*0.5f Q-14*/, L_shl( L_mult0( sub( hStereoDft->band_limits[hStereoDft->res_cod_band_max], 1 ), divide1616( shr( output_frame, 1 ), ( hStereoDft->NFFT ) ) ) /*Q-14*/, 1 ) ), Q14 ); /* Q0 */ move16(); - hStereoDft->res_cod_line_max = shl( shr( hStereoDft->res_cod_line_max, 3 ), 3 ); + hStereoDft->res_cod_line_max = shl( shr( hStereoDft->res_cod_line_max, 3 ), 3 ); /* Q0 */ move16(); - hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); + hStereoDft->res_pred_band_min = s_max( STEREO_DFT_RES_PRED_BAND_MIN, hStereoDft->res_cod_band_max ); /* Q0 */ move16(); @@ -3706,49 +3714,49 @@ void stereo_dft_dec_read_BS_fx( nb = st->next_bit_pos; move16(); move16(); - n_bits = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->side_gain_flag_1 ); + n_bits = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->side_gain_flag_1 ); /* Q0 */ nb = add( nb, n_bits ); IF( hStereoDft->side_gain_flag_1 == 0 ) { - b = read_BS_adapt_GR_sg( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2, dft_maps_sg ); - n_bits = add( n_bits, b ); + b = read_BS_adapt_GR_sg( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2, dft_maps_sg ); /* Q0 */ + n_bits = add( n_bits, b ); /* Q0 */ } ELSE { IF( EQ_16( hStereoDft->side_gain_flag_1, 2 ) ) /* differential */ { - b = read_BS_GR( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2 ); - n_bits = add( n_bits, b ); + b = read_BS_GR( st->bit_stream, nb, ind1, hStereoDft->nbands, &hStereoDft->side_gain_flag_2 ); /* Q0 */ + n_bits = add( n_bits, b ); /* Q0 */ FOR( b = 0; b < hStereoDft->nbands; b++ ) { - ind1[b] = add( ind1[b], hStereoDft->side_gain_index_previous[b] ); + ind1[b] = add( ind1[b], hStereoDft->side_gain_index_previous[b] ); /* Q0 */ } } ELSE { FOR( b = 0; b < hStereoDft->nbands; b++ ) { - ind1[b] = get_value( &st->bit_stream[nb], STEREO_DFT_SIDEGAIN_NBITS ); - nb = add( nb, STEREO_DFT_SIDEGAIN_NBITS ); - n_bits = add( n_bits, STEREO_DFT_SIDEGAIN_NBITS ); + ind1[b] = get_value( &st->bit_stream[nb], STEREO_DFT_SIDEGAIN_NBITS ); /* Q0 */ + nb = add( nb, STEREO_DFT_SIDEGAIN_NBITS ); /* Q0 */ + n_bits = add( n_bits, STEREO_DFT_SIDEGAIN_NBITS ); /* Q0 */ } } } FOR( b = 0; b < hStereoDft->nbands; b++ ) { - hStereoDft->side_gain_index_previous[b] = ind1[b]; + hStereoDft->side_gain_index_previous[b] = ind1[b]; /* Q0 */ move16(); #ifdef FIX_860_FER_CRASH - hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX] = L_shl_sat( ind1[b], 26 ); + hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX] = L_shl_sat( ind1[b], 26 ); /* Q26 */ #else hStereoDft->res_gains_ind_fx[0][b + STEREO_DFT_BAND_MAX] = L_shl( ind1[b], 26 ); #endif move32(); } - st->next_bit_pos = add( st->next_bit_pos, n_bits ); + st->next_bit_pos = add( st->next_bit_pos, n_bits ); /* Q0 */ ( *nb_bits ) = add( ( *nb_bits ), n_bits ); move16(); move16(); @@ -3760,34 +3768,34 @@ void stereo_dft_dec_read_BS_fx( IF( !hStereoDft->frame_sid_nodata ) { - itd_mode = get_next_indice_fx( st, STEREO_DFT_ITD_MODE_NBITS ); - ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS ); /*ITD mode flag: 1bit*/ + itd_mode = get_next_indice_fx( st, STEREO_DFT_ITD_MODE_NBITS ); /* Q0 */ + ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS ); /*ITD mode flag: 1bit Q0*/ move16(); hStereoDft->itd_fx[k + k_offset] = 0; move32(); IF( itd_mode ) { - ( *nb_bits ) = add( ( *nb_bits ), read_itd( st, &I ) ); + ( *nb_bits ) = add( ( *nb_bits ), read_itd( st, &I ) ); /* Q0 */ move16(); stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + add( k, k_offset ), st->output_Fs ); } } ELSE IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_ITD_MODE_NBITS - STEREO_DFT_SID_ITD_NBITS - 1 - SID_FORMAT_NBITS ) ) ) { - itd_mode = get_next_indice_fx( st, STEREO_DFT_ITD_MODE_NBITS ); - ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS ); /*ITD mode flag: 1bit*/ + itd_mode = get_next_indice_fx( st, STEREO_DFT_ITD_MODE_NBITS ); /* Q0 */ + ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_ITD_MODE_NBITS ); /*ITD mode flag: 1bit*/ move16(); - hStereoDft->itd_fx[add( k, k_offset )] = 0; + hStereoDft->itd_fx[k + k_offset] = 0; /* Q0 */ move32(); IF( itd_mode ) { - sign_flag = get_next_indice_fx( st, 1 ); - I = get_next_indice_fx( st, STEREO_DFT_SID_ITD_NBITS ); - ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_SID_ITD_NBITS + 1 ); + sign_flag = get_next_indice_fx( st, 1 ); /* Q0 */ + I = get_next_indice_fx( st, STEREO_DFT_SID_ITD_NBITS ); /* Q0 */ + ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_SID_ITD_NBITS + 1 ); /* Q0 */ move16(); - I = shl( I, STEREO_DFT_SID_ITD_FAC ); - I = add( I, shl( sign_flag, 8 ) ); + I = shl( I, STEREO_DFT_SID_ITD_FAC ); /* Q0 */ + I = add( I, shl( sign_flag, 8 ) ); /* Q0 */ stereo_dft_dequantize_itd_fx( &I, hStereoDft->itd_fx + add( k, k_offset ), st->output_Fs ); } } @@ -3798,22 +3806,22 @@ void stereo_dft_dec_read_BS_fx( n_bits = 0; move16(); - nb = st->next_bit_pos; + nb = st->next_bit_pos; /* Q0 */ move16(); IF( !hStereoDft->frame_sid_nodata ) { /* Active frame */ - hStereoDft->no_ipd_flag = st->bit_stream[nb]; + hStereoDft->no_ipd_flag = st->bit_stream[nb]; /* Q0 */ move16(); - nb = add( nb, 1 ); - n_bits = add( n_bits, 1 ); + nb = add( nb, 1 ); /* Q0 */ + n_bits = add( n_bits, 1 ); /* Q0 */ IF( hStereoDft->no_ipd_flag == 0 ) { - ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_GIPD_NBITS ); + ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_GIPD_NBITS ); /* Q0 */ move16(); - nb = add( nb, STEREO_DFT_GIPD_NBITS ); - n_bits = add( n_bits, STEREO_DFT_GIPD_NBITS ); + nb = add( nb, STEREO_DFT_GIPD_NBITS ); /* Q0 */ + n_bits = add( n_bits, STEREO_DFT_GIPD_NBITS ); /* Q0 */ #ifndef FIX_874_INCREASE_IPD_PRECISION stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + add( k, k_offset ), 1, STEREO_DFT_GIPD_NBITS ); #else @@ -3824,16 +3832,16 @@ void stereo_dft_dec_read_BS_fx( ELSE IF( LE_16( *nb_bits, ( ( IVAS_SID_5k2 - SID_2k40 ) / FRAMES_PER_SEC - STEREO_DFT_FLAG_BITS - STEREO_DFT_SID_GIPD_NBITS - SID_FORMAT_NBITS ) ) ) { /* SID frame, only read IPD only if enough bits left in bitstream */ - hStereoDft->no_ipd_flag = st->bit_stream[nb]; + hStereoDft->no_ipd_flag = st->bit_stream[nb]; /* Q0 */ move16(); - nb = add( nb, 1 ); - n_bits = add( n_bits, 1 ); + nb = add( nb, 1 ); /* Q0 */ + n_bits = add( n_bits, 1 ); /* Q0 */ IF( hStereoDft->no_ipd_flag == 0 ) { - ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_SID_GIPD_NBITS ); + ind1_ipd[0] = get_value( &st->bit_stream[nb], STEREO_DFT_SID_GIPD_NBITS ); /* Q0 */ move16(); - nb = add( nb, STEREO_DFT_SID_GIPD_NBITS ); - n_bits = add( n_bits, STEREO_DFT_SID_GIPD_NBITS ); + nb = add( nb, STEREO_DFT_SID_GIPD_NBITS ); /* Q0 */ + n_bits = add( n_bits, STEREO_DFT_SID_GIPD_NBITS ); /* Q0 */ #ifndef FIX_874_INCREASE_IPD_PRECISION stereo_dft_dequantize_ipd_fx( &ind1_ipd[0], hStereoDft->gipd_fx + add( k, k_offset ), 1, STEREO_DFT_SID_GIPD_NBITS ); #else @@ -3843,12 +3851,12 @@ void stereo_dft_dec_read_BS_fx( } ELSE { - hStereoDft->no_ipd_flag = 1; + hStereoDft->no_ipd_flag = 1; /* Q0 */ move16(); } - st->next_bit_pos = add( st->next_bit_pos, n_bits ); - ( *nb_bits ) = add( ( *nb_bits ), n_bits ); + st->next_bit_pos = add( st->next_bit_pos, n_bits ); /* Q0 */ + ( *nb_bits ) = add( ( *nb_bits ), n_bits ); /* Q0 */ move16(); move16(); @@ -3858,7 +3866,7 @@ void stereo_dft_dec_read_BS_fx( /* Residual prediction */ /* Switch it off if ITD detected */ n_bits = 0; - nb = st->next_bit_pos; + nb = st->next_bit_pos; /* Q0 */ move16(); move16(); @@ -3866,49 +3874,49 @@ void stereo_dft_dec_read_BS_fx( IF( !hStereoDft->frame_sid_nodata ) { test(); - IF( hStereoDft->res_pred_mode[add( k, k_offset )] && hStereoDft->attackPresent == 0 ) + IF( hStereoDft->res_pred_mode[k + k_offset] && hStereoDft->attackPresent == 0 ) { - nbands = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); + nbands = s_min( hStereoDft->nbands, STEREO_DFT_RES_PRED_BAND_MAX ); /* Q0 */ hStereoDft->reverb_flag = 0; - hStereoDft->nbands_respred = nbands; + hStereoDft->nbands_respred = nbands; /* Q0 */ move16(); move16(); /* Read bit for adaptive SF (WB/SWB & FB) */ IF( EQ_16( hStereoDft->hConfig->res_cod_mode, STEREO_DFT_RES_COD_OFF ) ) { - hStereoDft->reverb_flag = get_next_indice_fx( st, STEREO_DFT_REVERB_MODE_NBITS ); - ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_REVERB_MODE_NBITS ); + hStereoDft->reverb_flag = get_next_indice_fx( st, STEREO_DFT_REVERB_MODE_NBITS ); /* Q0 */ + ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_REVERB_MODE_NBITS ); /* Q0 */ move16(); move16(); - nb = add( nb, STEREO_DFT_REVERB_MODE_NBITS ); + nb = add( nb, STEREO_DFT_REVERB_MODE_NBITS ); /* Q0 */ IF( hStereoDft->reverb_flag ) { - nbands = sub( nbands, STEREO_DFT_RES_PRED_BAND_MIN_CONST ); + nbands = sub( nbands, STEREO_DFT_RES_PRED_BAND_MIN_CONST ); /* Q0 */ } } /* get coding type */ - b = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->res_pred_flag_0 ); - nb = add( nb, b ); - n_bits = add( n_bits, b ); + b = read_flag_EC_DFT( &st->bit_stream[nb], &hStereoDft->res_pred_flag_0 ); /* Q0 */ + nb = add( nb, b ); /* Q0 */ + n_bits = add( n_bits, b ); /* Q0 */ IF( hStereoDft->res_pred_flag_0 == 0 ) { - b = read_BS_adapt_GR_rpg( st->bit_stream, nb, ind1_pred, hStereoDft->res_pred_band_min, nbands, &hStereoDft->res_pred_flag_1 ); - n_bits = add( n_bits, b ); + b = read_BS_adapt_GR_rpg( st->bit_stream, nb, ind1_pred, hStereoDft->res_pred_band_min, nbands, &hStereoDft->res_pred_flag_1 ); /* Q0 */ + n_bits = add( n_bits, b ); /* Q0 */ } ELSE { IF( EQ_16( hStereoDft->res_pred_flag_0, 2 ) ) { - b = read_BS_GR( st->bit_stream, nb, &ind1_pred[hStereoDft->res_pred_band_min], nbands - hStereoDft->res_pred_band_min, &hStereoDft->res_pred_flag_1 ); + b = read_BS_GR( st->bit_stream, nb, &ind1_pred[hStereoDft->res_pred_band_min], nbands - hStereoDft->res_pred_band_min, &hStereoDft->res_pred_flag_1 ); /* Q0 */ - n_bits = add( n_bits, b ); + n_bits = add( n_bits, b ); /* Q0 */ FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ ) { - ind1_pred[b] = add( ind1_pred[b], hStereoDft->res_pred_index_previous[b] ); + ind1_pred[b] = add( ind1_pred[b], hStereoDft->res_pred_index_previous[b] ); /* Q0 */ move16(); } } @@ -3916,10 +3924,10 @@ void stereo_dft_dec_read_BS_fx( { FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ ) { - ind1_pred[b] = get_value( &st->bit_stream[nb], STEREO_DFT_RES_GAINS_BITS ); + ind1_pred[b] = get_value( &st->bit_stream[nb], STEREO_DFT_RES_GAINS_BITS ); /* Q0 */ move16(); - nb = add( nb, STEREO_DFT_RES_GAINS_BITS ); - n_bits = add( n_bits, STEREO_DFT_RES_GAINS_BITS ); + nb = add( nb, STEREO_DFT_RES_GAINS_BITS ); /* Q0 */ + n_bits = add( n_bits, STEREO_DFT_RES_GAINS_BITS ); /* Q0 */ } } } @@ -3929,21 +3937,21 @@ void stereo_dft_dec_read_BS_fx( I = 0; move16(); stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); - hStereoDft->res_pred_index_previous[b] = I; + hStereoDft->res_pred_index_previous[b] = I; /* Q0 */ move16(); - hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; + hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; /* Q26 */ move32(); } FOR( b = hStereoDft->res_pred_band_min; b < nbands; b++ ) { - I = ind1_pred[b]; + I = ind1_pred[b]; /* Q0 */ move16(); stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); - hStereoDft->res_pred_index_previous[b] = I; + hStereoDft->res_pred_index_previous[b] = I; /* Q0 */ move16(); #ifdef FIX_860_FER_CRASH - hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl_sat( I, 26 ); + hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl_sat( I, 26 ); /* Q26 */ #else hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl( I, 26 ); #endif @@ -3956,9 +3964,9 @@ void stereo_dft_dec_read_BS_fx( move16(); stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); move16(); - hStereoDft->res_pred_index_previous[b] = I; + hStereoDft->res_pred_index_previous[b] = I; /* Q0 */ move16(); - hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; + hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = 0; /* Q26 */ move32(); } } @@ -3969,10 +3977,10 @@ void stereo_dft_dec_read_BS_fx( I = 0; move16(); stereo_dft_dequantize_res_gains_fx( ind1 + b, &I, hStereoDft->side_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), hStereoDft->res_pred_gain_fx + add( i_mult( add( k, k_offset ), STEREO_DFT_BAND_MAX ), b ), 1 ); - hStereoDft->res_pred_index_previous[b] = I; + hStereoDft->res_pred_index_previous[b] = I; /* Q0 */ move16(); #ifdef FIX_860_FER_CRASH - hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl_sat( I, 26 ); + hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl_sat( I, 26 ); /* Q26 */ #else hStereoDft->res_gains_ind_fx[1][b + STEREO_DFT_BAND_MAX] = L_shl( I, 26 ); #endif @@ -3980,8 +3988,8 @@ void stereo_dft_dec_read_BS_fx( } } - st->next_bit_pos = add( st->next_bit_pos, n_bits ); - ( *nb_bits ) = add( ( *nb_bits ), n_bits ); + st->next_bit_pos = add( st->next_bit_pos, n_bits ); /* Q0 */ + ( *nb_bits ) = add( ( *nb_bits ), n_bits ); /* Q0 */ move16(); move16(); } @@ -4014,12 +4022,12 @@ void stereo_dft_dec_read_BS_fx( IF( GT_32( ivas_total_brate, IVAS_SID_5k2 ) ) { // hStereoDft->recovery_flg = stereo_dft_sg_recovery( hStereoDft ); - hStereoDft->recovery_flg = stereo_dft_sg_recovery_fx( hStereoDft ); + hStereoDft->recovery_flg = stereo_dft_sg_recovery_fx( hStereoDft ); /* Q0 */ IF( hStereoDft->recovery_flg ) { - Copy32( sg_tmp_fx, hStereoDft->side_gain_fx + 2 * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); - Copy32( res_pred_gain_tmp_fx, hStereoDft->res_pred_gain_fx + 2 * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); + Copy32( sg_tmp_fx, hStereoDft->side_gain_fx + 2 * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); /* Q31 */ + Copy32( res_pred_gain_tmp_fx, hStereoDft->res_pred_gain_fx + 2 * STEREO_DFT_BAND_MAX, STEREO_DFT_BAND_MAX ); /* Q31 */ } } @@ -4033,8 +4041,8 @@ void stereo_dft_dec_read_BS_fx( { Word16 dec[STEREO_DFT_N_MAX_RES]; - I = get_next_indice_fx( st, STEREO_DFT_RES_GLOBAL_GAIN_BITS ); - ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_RES_GLOBAL_GAIN_BITS ); + I = get_next_indice_fx( st, STEREO_DFT_RES_GLOBAL_GAIN_BITS ); /* Q0 */ + ( *nb_bits ) = add( ( *nb_bits ), STEREO_DFT_RES_GLOBAL_GAIN_BITS ); /* Q0 */ move16(); move16(); @@ -4045,24 +4053,24 @@ void stereo_dft_dec_read_BS_fx( rc_uni_dec_init_fx( &range_uni_dec_state, bit_stream_side + *nb_bits, max_bits - *nb_bits ); - hStereoDft->res_global_gain_fx = ECSQ_dequantize_gain_fx( I ); + hStereoDft->res_global_gain_fx = ECSQ_dequantize_gain_fx( I ); /* Q15 */ move32(); #ifdef DEBUGGING dbgwrite_txt( (const float *) ( &hStereoDft->res_global_gain_fx ), 1, "fixed_res_global_gain.txt", NULL ); #endif - ecsq_inst.config_index = sub( shl( hStereoDft->res_cod_mode[k_offset], 1 ), 1 ); + ecsq_inst.config_index = sub( shl( hStereoDft->res_cod_mode[k_offset], 1 ), 1 ); /* Q0 */ move16(); ECSQ_decode( &ecsq_inst, hStereoDft->res_cod_line_max, dec ); - n_bits = rc_uni_dec_virtual_finish_fx( &range_uni_dec_state ); + n_bits = rc_uni_dec_virtual_finish_fx( &range_uni_dec_state ); /* Q0 */ set_zero_fx( res_buf_fx, STEREO_DFT_N_8k ); FOR( Word16 c = 0; c < hStereoDft->res_cod_line_max; c++ ) { - dec[c] = shl_sat( dec[c], 8 ); + dec[c] = shl_sat( dec[c], 8 ); /* Q0 */ move16(); } @@ -4082,7 +4090,7 @@ void stereo_dft_dec_read_BS_fx( set_zero_fx( res_buf_fx, STEREO_DFT_N_8k ); } - ( *nb_bits ) = add( ( *nb_bits ), n_bits ); + ( *nb_bits ) = add( ( *nb_bits ), n_bits ); /* Q0 */ pop_wmops(); } @@ -4096,11 +4104,11 @@ void stereo_dft_dec_read_BS_fx( test(); IF( EQ_32( ivas_total_brate, IVAS_SID_5k2 ) && NE_16( ivas_format, MASA_FORMAT ) ) { - *nb_bits = (Word16) Mult_32_16( L_sub( element_brate, SID_2k40 ), INV_FRAME_PER_SEC_Q15 ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40; */ + *nb_bits = (Word16) Mult_32_16( L_sub( element_brate, SID_2k40 ), INV_FRAME_PER_SEC_Q15 ); /* => hCPE->hCoreCoder[0]->total_brate = SID_2k40; Q0*/ move16(); } { - *total_brate = L_sub( element_brate, L_mult0( *nb_bits, FRAMES_PER_SEC ) ); + *total_brate = L_sub( element_brate, L_mult0( *nb_bits, FRAMES_PER_SEC ) ); /* Q0 */ move32(); } return; diff --git a/lib_dec/ivas_svd_dec.c b/lib_dec/ivas_svd_dec.c index e33ad58e3..e0c210a2f 100644 --- a/lib_dec/ivas_svd_dec.c +++ b/lib_dec/ivas_svd_dec.c @@ -92,62 +92,67 @@ static void flushToZeroArray( float arr[MAX_OUTPUT_CHANNELS], const int16_t leng static void flushToZeroMat( float mat[][MAX_OUTPUT_CHANNELS], const int16_t m, const int16_t n ); #else static void HouseholderReduction_fx( - Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], - Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], - Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], - Word32 secDiag_fx[MAX_OUTPUT_CHANNELS], + Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_Left_e) */ + Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* exp(singularValues_fx_e) */ + Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_Left_e) */ + Word32 secDiag_fx[MAX_OUTPUT_CHANNELS], /* exp(secDiag_fx_e) */ Word16 singularVectors_Left_e, Word16 singularValues_fx_e[MAX_OUTPUT_CHANNELS], Word16 *secDiag_fx_e, - const int16_t nChannelsL, - const int16_t nChannelsC, - Word32 *eps_x_fx, + const Word16 nChannelsL, /* Q0 */ + const Word16 nChannelsC, /* Q0 */ + Word32 *eps_x_fx, /* exp(eps_x_fx_e) */ Word16 *eps_x_fx_e ); static void biDiagonalReductionLeft_fx( - Word32 singularVectors[][MAX_OUTPUT_CHANNELS], - Word32 singularValues[MAX_OUTPUT_CHANNELS], - Word32 secDiag[MAX_OUTPUT_CHANNELS], + Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ + Word32 singularValues[MAX_OUTPUT_CHANNELS], /* exp(singularValues_e) */ + Word32 secDiag[MAX_OUTPUT_CHANNELS], /* exp(secDiag_e) */ Word16 *singularVectors_e, Word16 singularValues_e[MAX_OUTPUT_CHANNELS], Word16 *secDiag_e, - const Word16 nChannelsL, - const Word16 nChannelsC, - const Word16 currChannel, - Word32 *sig_x, + const Word16 nChannelsL, /* Q0 */ + const Word16 nChannelsC, /* Q0 */ + const Word16 currChannel, /* Q0 */ + Word32 *sig_x, /* exp(sig_x_e) */ Word16 *sig_x_e, - Word32 *g ); // Q31 + Word32 *g /* Q31 */ +); static void biDiagonalReductionRight_fx( - Word32 singularVectors[][MAX_OUTPUT_CHANNELS], - Word32 secDiag[MAX_OUTPUT_CHANNELS], + Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ + Word32 secDiag[MAX_OUTPUT_CHANNELS], /* exp(secDiag_e) */ Word16 *singularVectors_e, Word16 *secDiag_e, - const Word16 nChannelsL, - const Word16 nChannelsC, - const Word16 currChannel, - Word32 *sig_x, + const Word16 nChannelsL, /* Q0 */ + const Word16 nChannelsC, /* Q0 */ + const Word16 currChannel, /* Q0 */ + Word32 *sig_x, /* exp(sig_x_e) */ Word16 *sig_x_e, - Word32 *g ); // Q31 + Word32 *g /* Q31 */ +); // Q31 static void singularVectorsAccumulationLeft_fx( - Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], // Q31 output - Word32 singularValues[MAX_OUTPUT_CHANNELS], + Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) as Input, Q31 as output */ + Word32 singularValues[MAX_OUTPUT_CHANNELS], /* exp(singularValues_e) */ Word16 singularVectors_e, Word16 singularValues_e[MAX_OUTPUT_CHANNELS], - const Word16 nChannelsL, - const Word16 nChannelsC ); + const Word16 nChannelsL, /* Q0 */ + const Word16 nChannelsC /* Q0 */ +); static void singularVectorsAccumulationRight_fx( - Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], - Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], // Q31 output - Word32 secDiag[MAX_OUTPUT_CHANNELS], + Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* Q31 */ + Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* Q31 */ + Word32 secDiag[MAX_OUTPUT_CHANNELS], /* exp(secDiag_e) */ Word16 singularVectors_e, Word16 secDiag_e, - const Word16 nChannelsC ); + const Word16 nChannelsC /* Q0 */ +); static Word32 maxWithSign_fx( - const Word32 a ); + const Word32 a /* Qx */ +); #if 0 static void flushToZeroArray_fx( @@ -161,54 +166,55 @@ static void flushToZeroMat_fx( #endif static Word16 BidagonalDiagonalisation_fx( - Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) Q31 */ - Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ - Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) Q31 */ - Word32 secDiag_fx[MAX_OUTPUT_CHANNELS], /* i/o: */ - Word16 singularValues_fx_e[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ - Word16 *secDiag_fx_e, /* i/o: */ - const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed */ - const Word16 nChannelsC, /* i : number of columns in the matrix to be decomposed */ - const Word32 eps_x, /* i : */ - const Word16 eps_x_e /* i : */ + Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) Q31*/ + Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) singularValues_fx_e*/ + Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) Q31*/ + Word32 secDiag_fx[MAX_OUTPUT_CHANNELS], /* i/o: secDiag_fx_e*/ + Word16 singularValues_fx_e[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ + Word16 *secDiag_fx_e, /* i/o: */ + const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ + const Word16 nChannelsC, /* i : number of columns in the matrix to be decomposed Q0*/ + const Word32 eps_x, /* i : eps_x_e*/ + const Word16 eps_x_e /* i : */ ); static void ApplyRotation_fx( Word32 singularVector[][MAX_OUTPUT_CHANNELS], - const Word32 c, + const Word32 c, /* exp(c_e)*/ const Word16 c_e, - const Word32 s, + const Word32 s, /* exp(s_e) */ const Word16 s_e, - Word32 x11, + Word32 x11, /* exp(x11_e) */ Word16 x11_e, - Word32 x12, + Word32 x12, /* exp(x12_e) */ Word16 x12_e, - Word32 *d, + Word32 *d, /* exp(d_e) */ Word16 *d_e, - Word32 *g, + Word32 *g, /* exp(g_e) */ Word16 *g_e, - const Word16 currentIndex1, - const Word16 currentIndex2, - const Word16 nChannels ); + const Word16 currentIndex1, /* Q0 */ + const Word16 currentIndex2, /* Q0 */ + const Word16 nChannels /* Q0 */ +); static Word32 GivensRotation_fx( - const Word32 x, + const Word32 x, /* exp(x_e) */ const Word16 x_e, - const Word32 z, + const Word32 z, /* exp(z_e) */ const Word16 z_e, Word16 *out_e ); static void ApplyQRTransform_fx( - Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) Q31 */ - Word32 singularValues[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ - Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) Q31 */ - Word32 secDiag[MAX_OUTPUT_CHANNELS], /* i/o: */ + Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) Q31*/ + Word32 singularValues[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) singularValues_e*/ + Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) Q31*/ + Word32 secDiag[MAX_OUTPUT_CHANNELS], /* i/o: secDiag_e*/ Word16 singularValues_e[MAX_OUTPUT_CHANNELS], Word16 secDiag_e[MAX_OUTPUT_CHANNELS], - const Word16 startIndex, /* i : */ - const Word16 currentIndex, /* i : */ - const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed */ - const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed */ + const Word16 startIndex, /* i : Q0*/ + const Word16 currentIndex, /* i : Q0*/ + const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ + const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed Q0*/ ); #endif @@ -220,11 +226,11 @@ static void ApplyQRTransform_fx( *-------------------------------------------------------------------------*/ void mat2svdMat_fx( - const Word32 *mat, /* i : matrix as column ordered vector */ - Word32 svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* o : matrix as two-dimensional arry */ - const Word16 nRows, /* i : number of rows of the matrix */ - const Word16 mCols, /* i : number of columns of the matrix */ - const Word16 transpose /* i : flag indication transposition */ + const Word32 *mat, /* i : matrix as column ordered vector Qx*/ + Word32 svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* o : matrix as two-dimensional arry Qx*/ + const Word16 nRows, /* i : number of rows of the matrix Q0*/ + const Word16 mCols, /* i : number of columns of the matrix Q0*/ + const Word16 transpose /* i : flag indication transposition Q0*/ ) { Word16 i, j; @@ -235,11 +241,11 @@ void mat2svdMat_fx( { FOR( j = 0; j < nRows; j++ ) { - svdMat[i][j] = mat[add( j, i_mult( nRows, i ) )]; + svdMat[i][j] = mat[j + ( nRows * i )]; /* Qx */ move32(); } - set_zero_fx( &svdMat[i][mCols], MAX_OUTPUT_CHANNELS - nRows ); + set_zero_fx( &svdMat[i][mCols], sub( MAX_OUTPUT_CHANNELS, nRows ) ); } FOR( ; i < MAX_OUTPUT_CHANNELS; i++ ) @@ -253,11 +259,11 @@ void mat2svdMat_fx( { FOR( j = 0; j < mCols; j++ ) { - svdMat[i][j] = mat[add( i, i_mult( nRows, j ) )]; + svdMat[i][j] = mat[i + ( nRows * j )]; /* Qx */ move32(); } - set_zero_fx( &svdMat[i][mCols], MAX_OUTPUT_CHANNELS - mCols ); + set_zero_fx( &svdMat[i][mCols], sub( MAX_OUTPUT_CHANNELS, mCols ) ); } FOR( ; i < MAX_OUTPUT_CHANNELS; i++ ) @@ -277,10 +283,10 @@ void mat2svdMat_fx( *---------------------------------------------------------------------*/ void svdMat2mat_fx( - Word32 svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* i : matrix as two-dimensional arry */ - Word32 *mat, /* o : matrix as column ordered vector */ - const Word16 nRows, /* i : number of rows of the matrix */ - const Word16 mCols /* i : number of columns of the matrix */ + Word32 svdMat[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS], /* i : matrix as two-dimensional arry Qx*/ + Word32 *mat, /* o : matrix as column ordered vector Qx*/ + const Word16 nRows, /* i : number of rows of the matrix Q0*/ + const Word16 mCols /* i : number of columns of the matrix Q0*/ ) { Word16 i, j; @@ -289,7 +295,7 @@ void svdMat2mat_fx( { FOR( j = 0; j < mCols; j++ ) { - mat[add( i, i_mult( nRows, j ) )] = svdMat[i][j]; + mat[i + ( nRows * j )] = svdMat[i][j]; /* Qx */ move32(); } } @@ -391,14 +397,14 @@ void svdMat2mat( #ifdef IVAS_FLOAT_FIXED /*! r: error or success */ Word16 svd_fx( - Word32 InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) */ + Word32 InputMatrix[][MAX_OUTPUT_CHANNELS], /* i : matrix to be decomposed (M) InputMatrix_e*/ Word16 InputMatrix_e, - Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) (Q31) */ - Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) */ - Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) (Q31) */ + Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* o : left singular vectors (U) Q31*/ + Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* o : singular values vector (S) singularValues_fx_e*/ + Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* o : right singular vectors (V) Q31*/ Word16 singularValues_fx_e[MAX_OUTPUT_CHANNELS], - const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed */ - const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed */ + const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ + const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed Q0*/ ) { Word16 iCh, jCh; @@ -422,7 +428,7 @@ Word16 svd_fx( { FOR( jCh = 0; jCh < nChannelsC; jCh++ ) { - singularVectors_Left_fx[iCh][jCh] = InputMatrix[iCh][jCh]; + singularVectors_Left_fx[iCh][jCh] = InputMatrix[iCh][jCh]; /* Q31 */ move32(); } } @@ -438,26 +444,26 @@ Word16 svd_fx( // flushToZeroMat(singularVectors_Right, nChannelsC, nChannelsC); /* BidagonalDiagonalisation */ - errorMessage = BidagonalDiagonalisation_fx( singularVectors_Left_fx, singularValues_fx, singularVectors_Right_fx, secDiag_fx, singularValues_fx_e, &secDiag_fx_e, nChannelsL, nChannelsC, eps_x_fx, eps_x_fx_e ); + errorMessage = BidagonalDiagonalisation_fx( singularVectors_Left_fx, singularValues_fx, singularVectors_Right_fx, secDiag_fx, singularValues_fx_e, &secDiag_fx_e, nChannelsL, nChannelsC, eps_x_fx, eps_x_fx_e ); /* Q0 */ /* Sort the singular values descending order */ - lengthSingularValues = s_min( nChannelsL, nChannelsC ); + lengthSingularValues = s_min( nChannelsL, nChannelsC ); /* Q0 */ DO { condition = 0; move16(); - FOR( iCh = 0; iCh < sub( lengthSingularValues, 1 ); iCh++ ) + FOR( iCh = 0; iCh < lengthSingularValues - 1; iCh++ ) { IF( BASOP_Util_Cmp_Mant32Exp( singularValues_fx[iCh], singularValues_fx_e[iCh], singularValues_fx[iCh + 1], singularValues_fx_e[iCh + 1] ) < 0 ) { condition = 1; move16(); - temp_fx = singularValues_fx[iCh]; + temp_fx = singularValues_fx[iCh]; /* singularValues_fx_e */ move32(); - singularValues_fx[iCh] = singularValues_fx[iCh + 1]; + singularValues_fx[iCh] = singularValues_fx[iCh + 1]; /* singularValues_fx_e */ move32(); - singularValues_fx[iCh + 1] = temp_fx; + singularValues_fx[iCh + 1] = temp_fx; /* singularValues_fx_e */ move32(); temp_fx_e = singularValues_fx_e[iCh]; move16(); @@ -468,21 +474,21 @@ Word16 svd_fx( FOR( jCh = 0; jCh < nChannelsL; ++jCh ) { - temp_fx = singularVectors_Left_fx[jCh][iCh]; + temp_fx = singularVectors_Left_fx[jCh][iCh]; /* Q31 */ move32(); - singularVectors_Left_fx[jCh][iCh] = singularVectors_Left_fx[jCh][iCh + 1]; + singularVectors_Left_fx[jCh][iCh] = singularVectors_Left_fx[jCh][iCh + 1]; /* Q31 */ move32(); - singularVectors_Left_fx[jCh][iCh + 1] = temp_fx; + singularVectors_Left_fx[jCh][iCh + 1] = temp_fx; /* Q31 */ move32(); } FOR( jCh = 0; jCh < nChannelsC; ++jCh ) { - temp_fx = singularVectors_Right_fx[jCh][iCh]; + temp_fx = singularVectors_Right_fx[jCh][iCh]; /* Q31 */ move32(); - singularVectors_Right_fx[jCh][iCh] = singularVectors_Right_fx[jCh][iCh + 1]; + singularVectors_Right_fx[jCh][iCh] = singularVectors_Right_fx[jCh][iCh + 1]; /* Q31 */ move32(); - singularVectors_Right_fx[jCh][iCh + 1] = temp_fx; + singularVectors_Right_fx[jCh][iCh + 1] = temp_fx; /* Q31 */ move32(); } } @@ -585,16 +591,16 @@ int16_t svd( #ifdef IVAS_FLOAT_FIXED static Word16 BidagonalDiagonalisation_fx( - Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) Q31 */ - Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ - Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) Q31 */ - Word32 secDiag_fx[MAX_OUTPUT_CHANNELS], /* i/o: */ - Word16 singularValues_fx_e[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ - Word16 *secDiag_fx_e, /* i/o: */ - const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed */ - const Word16 nChannelsC, /* i : number of columns in the matrix to be decomposed */ - const Word32 eps_x, /* i : */ - const Word16 eps_x_e /* i : */ + Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) Q31*/ + Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) singularValues_fx_e*/ + Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) Q31*/ + Word32 secDiag_fx[MAX_OUTPUT_CHANNELS], /* i/o: secDiag_fx_e*/ + Word16 singularValues_fx_e[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ + Word16 *secDiag_fx_e, /* i/o: */ + const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ + const Word16 nChannelsC, /* i : number of columns in the matrix to be decomposed Q0*/ + const Word32 eps_x, /* i : eps_x_e*/ + const Word16 eps_x_e /* i : */ ) { Word16 kCh, nCh, iCh, jCh, split; @@ -621,18 +627,18 @@ static Word16 BidagonalDiagonalisation_fx( move16(); iteration = 0; move16(); - split = iCh - 1; + split = iCh - 1; /* Q0 */ move16(); WHILE( EQ_16( convergence, 0 ) ) { - iteration = add( iteration, 1 ); - found_split = 1; + iteration = add( iteration, 1 ); /* Q0 */ + found_split = 1; /* Q0 */ move16(); FOR( jCh = iCh; jCh >= 0; jCh-- ) { - split = sub( jCh, 1 ); + split = sub( jCh, 1 ); /* Q0 */ IF( LE_16( BASOP_Util_Cmp_Mant32Exp( L_abs( secDiag_fx[jCh] ), secDiag_new_e[jCh], Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), eps_x_e ), 0 ) ) /* is secDiag[ch] vanishing compared to eps_x */ { found_split = 0; @@ -648,7 +654,7 @@ static Word16 BidagonalDiagonalisation_fx( // convergence = ( jCh == iCh ) ? 1 : 0; IF( EQ_16( jCh, iCh ) ) { - convergence = 1; + convergence = 1; /* Q0 */ move16(); } ELSE @@ -670,19 +676,19 @@ static Word16 BidagonalDiagonalisation_fx( FOR( kCh = jCh; kCh <= iCh; kCh++ ) { - g = Mpy_32_32( s, secDiag_fx[kCh] ); + g = Mpy_32_32( s, secDiag_fx[kCh] ); /* exp(s_e + secDiag_new_e) */ g_e = add( s_e, secDiag_new_e[kCh] ); - secDiag_fx[kCh] = Mpy_32_32( c, secDiag_fx[kCh] ); + secDiag_fx[kCh] = Mpy_32_32( c, secDiag_fx[kCh] ); /* exp(c_e + secDiag_new_e) */ secDiag_new_e[kCh] = add( c_e, secDiag_new_e[kCh] ); IF( LE_16( BASOP_Util_Cmp_Mant32Exp( L_abs( g ), g_e, Mpy_32_32( CONVERGENCE_FACTOR_FX, eps_x ), eps_x_e ), 0 ) ) /* is singularValues[split] vanishing compared to eps_x */ { BREAK; } - c = singularValues_fx[kCh]; + c = singularValues_fx[kCh]; /* exp(singularValues_new_e) */ c_e = singularValues_new_e[kCh]; - singularValues_fx[kCh] = GivensRotation_fx( g, g_e, singularValues_fx[kCh], singularValues_new_e[kCh], &singularValues_new_e[kCh] ); - c = BASOP_Util_Divide3232_Scale_cadence( c, maxWithSign_fx( singularValues_fx[kCh] ), &temp_exp ); + singularValues_fx[kCh] = GivensRotation_fx( g, g_e, singularValues_fx[kCh], singularValues_new_e[kCh], &singularValues_new_e[kCh] ); /* exp(singularValues_new_e) */ + c = BASOP_Util_Divide3232_Scale_cadence( c, maxWithSign_fx( singularValues_fx[kCh] ), &temp_exp ); /* exp(temp_exp + (c_e - singularValues_new_e)) */ c_e = add( temp_exp, sub( c_e, singularValues_new_e[kCh] ) ); IF( c_e > 0 ) { @@ -690,7 +696,7 @@ static Word16 BidagonalDiagonalisation_fx( c_e = 0; move16(); } - s = BASOP_Util_Divide3232_Scale_cadence( -g, maxWithSign_fx( singularValues_fx[kCh] ), &temp_exp ); + s = BASOP_Util_Divide3232_Scale_cadence( -g, maxWithSign_fx( singularValues_fx[kCh] ), &temp_exp ); /* exp(temp_exp + (g_e - singularValues_new_e))*/ s_e = add( temp_exp, sub( g_e, singularValues_new_e[kCh] ) ); IF( s_e > 0 ) { @@ -766,7 +772,7 @@ static Word16 BidagonalDiagonalisation_fx( move16(); FOR( iCh = 0; iCh < nChannelsC; iCh++ ) { - secDiag_fx[iCh] = L_shr_r( secDiag_fx[iCh], sub( *secDiag_fx_e, secDiag_new_e[iCh] ) ); + secDiag_fx[iCh] = L_shr_r( secDiag_fx[iCh], sub( *secDiag_fx_e, secDiag_new_e[iCh] ) ); /* exp(secDiag_fx_e) */ move32(); } @@ -887,16 +893,16 @@ static int16_t BidagonalDiagonalisation( #ifdef IVAS_FLOAT_FIXED static void ApplyQRTransform_fx( - Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) Q31 */ - Word32 singularValues[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) */ - Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) Q31 */ - Word32 secDiag[MAX_OUTPUT_CHANNELS], /* i/o: */ + Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* i/o: left singular vectors (U) Q31*/ + Word32 singularValues[MAX_OUTPUT_CHANNELS], /* i/o: singular values vector (S) singularValues_e*/ + Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* i/o: right singular vectors (V) Q31*/ + Word32 secDiag[MAX_OUTPUT_CHANNELS], /* i/o: secDiag_e*/ Word16 singularValues_e[MAX_OUTPUT_CHANNELS], Word16 secDiag_e[MAX_OUTPUT_CHANNELS], - const Word16 startIndex, /* i : */ - const Word16 currentIndex, /* i : */ - const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed */ - const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed */ + const Word16 startIndex, /* i : Q0*/ + const Word16 currentIndex, /* i : Q0*/ + const Word16 nChannelsL, /* i : number of rows in the matrix to be decomposed Q0*/ + const Word16 nChannelsC /* i : number of columns in the matrix to be decomposed Q0*/ ) { Word16 ch, split; @@ -929,42 +935,42 @@ static void ApplyQRTransform_fx( Word16 s_e = 0; move16(); - x_kk = singularValues[currentIndex]; + x_kk = singularValues[currentIndex]; /* exp(singularValues_e) */ move32(); x_kk_e = singularValues_e[currentIndex]; move16(); - x_ii = singularValues[startIndex]; + x_ii = singularValues[startIndex]; /* exp(singularValues_e) */ move32(); x_ii_e = singularValues_e[startIndex]; move16(); - split = sub( currentIndex, 1 ); + split = sub( currentIndex, 1 ); /* Q0 */ move16(); - x_split = singularValues[split]; + x_split = singularValues[split]; /* exp(singularValues_e) */ move32(); x_split_e = singularValues_e[split]; move16(); - g = secDiag[split]; + g = secDiag[split]; /* exp(secDiag_e) */ move32(); g_e = secDiag_e[split]; move16(); - r = secDiag[currentIndex]; + r = secDiag[currentIndex]; /* exp(secDiag_e) */ move32(); r_e = secDiag_e[currentIndex]; move16(); // d = (x_split + x_kk) * (x_split - x_kk) + (g + r) * (g - r); - L_temp1 = BASOP_Util_Add_Mant32Exp( x_split, x_split_e, x_kk, x_kk_e, &L_temp1_e ); - L_temp2 = BASOP_Util_Add_Mant32Exp( x_split, x_split_e, L_negate( x_kk ), x_kk_e, &L_temp2_e ); - L_temp3 = BASOP_Util_Add_Mant32Exp( g, g_e, r, r_e, &L_temp3_e ); - L_temp4 = BASOP_Util_Add_Mant32Exp( g, g_e, L_negate( r ), r_e, &L_temp4_e ); - d = BASOP_Util_Add_Mant32Exp( Mpy_32_32( L_temp1, L_temp2 ), add( L_temp1_e, L_temp2_e ), Mpy_32_32( L_temp3, L_temp4 ), add( L_temp3_e, L_temp4_e ), &d_e ); + L_temp1 = BASOP_Util_Add_Mant32Exp( x_split, x_split_e, x_kk, x_kk_e, &L_temp1_e ); /* exp(L_temp1_e) */ + L_temp2 = BASOP_Util_Add_Mant32Exp( x_split, x_split_e, L_negate( x_kk ), x_kk_e, &L_temp2_e ); /* exp(L_temp2_e) */ + L_temp3 = BASOP_Util_Add_Mant32Exp( g, g_e, r, r_e, &L_temp3_e ); /* exp(L_temp3_e) */ + L_temp4 = BASOP_Util_Add_Mant32Exp( g, g_e, L_negate( r ), r_e, &L_temp4_e ); /* exp(L_temp4_e) */ + d = BASOP_Util_Add_Mant32Exp( Mpy_32_32( L_temp1, L_temp2 ), add( L_temp1_e, L_temp2_e ), Mpy_32_32( L_temp3, L_temp4 ), add( L_temp3_e, L_temp4_e ), &d_e ); /* exp(d_e) */ // d /= maxWithSign((r + r) * x_split); - L_temp1 = BASOP_Util_Add_Mant32Exp( r, r_e, r, r_e, &L_temp1_e ); - L_temp1 = maxWithSign_fx( Mpy_32_32( L_temp1, x_split ) ); + L_temp1 = BASOP_Util_Add_Mant32Exp( r, r_e, r, r_e, &L_temp1_e ); /* exp(L_temp1_e) */ + L_temp1 = maxWithSign_fx( Mpy_32_32( L_temp1, x_split ) ); /* exp(L_temp1_e + x_split_e) */ L_temp1_e = add( L_temp1_e, x_split_e ); - d = BASOP_Util_Divide3232_Scale_cadence( d, L_temp1, &temp_exp ); + d = BASOP_Util_Divide3232_Scale_cadence( d, L_temp1, &temp_exp ); /* temp_exp + d_e - L_temp1_e */ d_e = add( temp_exp, sub( d_e, L_temp1_e ) ); g = GivensRotation_fx( MAX_32, 0, d, d_e, &g_e ); @@ -981,29 +987,29 @@ static void ApplyQRTransform_fx( } L_temp1_e = g_e; move16(); - L_temp2 = maxWithSign_fx( BASOP_Util_Add_Mant32Exp( d, d_e, L_temp1, L_temp1_e, &L_temp2_e ) ); - mu = BASOP_Util_Divide3232_Scale_cadence( x_split, L_temp2, &mu_e ); + L_temp2 = maxWithSign_fx( BASOP_Util_Add_Mant32Exp( d, d_e, L_temp1, L_temp1_e, &L_temp2_e ) ); /* exp(L_temp2_e) */ + mu = BASOP_Util_Divide3232_Scale_cadence( x_split, L_temp2, &mu_e ); /* exp(mu_e + (x-plit_e - L_temp2_e)) */ mu_e = add( mu_e, sub( x_split_e, L_temp2_e ) ); - mu = BASOP_Util_Add_Mant32Exp( mu, mu_e, L_negate( r ), r_e, &mu_e ); + mu = BASOP_Util_Add_Mant32Exp( mu, mu_e, L_negate( r ), r_e, &mu_e ); /* exp(mu_e) */ // d = ((x_ii + x_kk) * (x_ii - x_kk) + r * mu) / maxWithSign(x_ii); - L_temp1 = BASOP_Util_Add_Mant32Exp( x_ii, x_ii_e, x_kk, x_kk_e, &L_temp1_e ); - L_temp2 = BASOP_Util_Add_Mant32Exp( x_ii, x_ii_e, L_negate( x_kk ), x_kk_e, &L_temp2_e ); - d = BASOP_Util_Add_Mant32Exp( Mpy_32_32( L_temp1, L_temp2 ), add( L_temp1_e, L_temp2_e ), Mpy_32_32( r, mu ), add( r_e, mu_e ), &d_e ); - d = BASOP_Util_Divide3232_Scale_cadence( d, maxWithSign_fx( x_ii ), &temp_exp ); + L_temp1 = BASOP_Util_Add_Mant32Exp( x_ii, x_ii_e, x_kk, x_kk_e, &L_temp1_e ); /* exp(L_temp1_e) */ + L_temp2 = BASOP_Util_Add_Mant32Exp( x_ii, x_ii_e, L_negate( x_kk ), x_kk_e, &L_temp2_e ); /* exp(L_temp2_e) */ + d = BASOP_Util_Add_Mant32Exp( Mpy_32_32( L_temp1, L_temp2 ), add( L_temp1_e, L_temp2_e ), Mpy_32_32( r, mu ), add( r_e, mu_e ), &d_e ); /* exp(d_e) */ + d = BASOP_Util_Divide3232_Scale_cadence( d, maxWithSign_fx( x_ii ), &temp_exp ); /* exp(temp_exp + (d_e - x_ii_e) */ d_e = add( temp_exp, sub( d_e, x_ii_e ) ); /*QR transformation*/ FOR( ch = startIndex; ch <= split; ch++ ) { - r = Mpy_32_32( s, secDiag[ch + 1] ); + r = Mpy_32_32( s, secDiag[ch + 1] ); /* exp(s_e + secDiag_e) */ r_e = add( s_e, secDiag_e[ch + 1] ); - g = Mpy_32_32( c, secDiag[ch + 1] ); + g = Mpy_32_32( c, secDiag[ch + 1] ); /* exp(c_e + secDiag_e) */ g_e = add( c_e, secDiag_e[ch + 1] ); - secDiag[ch] = GivensRotation_fx( d, d_e, r, r_e, &secDiag_e[ch] ); + secDiag[ch] = GivensRotation_fx( d, d_e, r, r_e, &secDiag_e[ch] ); /* exp(secDiag_e) */ move32(); - c = BASOP_Util_Divide3232_Scale_cadence( d, maxWithSign_fx( secDiag[ch] ), &c_e ); + c = BASOP_Util_Divide3232_Scale_cadence( d, maxWithSign_fx( secDiag[ch] ), &c_e ); /* exp(c_e + (d_e + secDiag_e)) */ c_e = add( c_e, sub( d_e, secDiag_e[ch] ) ); IF( c_e > 0 ) { @@ -1011,7 +1017,7 @@ static void ApplyQRTransform_fx( c_e = 0; move16(); } - s = BASOP_Util_Divide3232_Scale_cadence( r, maxWithSign_fx( secDiag[ch] ), &s_e ); + s = BASOP_Util_Divide3232_Scale_cadence( r, maxWithSign_fx( secDiag[ch] ), &s_e ); /* exp(s_e + (r_e - sec_Diag_e))*/ s_e = add( s_e, sub( r_e, secDiag_e[ch] ) ); IF( s_e > 0 ) { @@ -1020,12 +1026,12 @@ static void ApplyQRTransform_fx( move16(); } - r = Mpy_32_32( s, singularValues[ch + 1] ); + r = Mpy_32_32( s, singularValues[ch + 1] ); /* exp(r_e + secDiag_e) */ r_e = add( s_e, singularValues_e[ch + 1] ); - x_split = Mpy_32_32( c, singularValues[ch + 1] ); + x_split = Mpy_32_32( c, singularValues[ch + 1] ); /* exp(c_e + secDiag_e) */ x_split_e = add( c_e, singularValues_e[ch + 1] ); - aux = g; + aux = g; /* exp(g_e) */ move32(); aux_e = g_e; move16(); @@ -1033,14 +1039,14 @@ static void ApplyQRTransform_fx( // ApplyRotation(singularVectors_Right, c, s, x_ii, aux, &d, &g, ch + 1, ch, nChannelsC); ApplyRotation_fx( singularVectors_Right, c, c_e, s, s_e, x_ii, x_ii_e, aux, aux_e, &d, &d_e, &g, &g_e, ch + 1, ch, nChannelsC ); - singularValues[ch] = GivensRotation_fx( d, d_e, r, r_e, &singularValues_e[ch] ); + singularValues[ch] = GivensRotation_fx( d, d_e, r, r_e, &singularValues_e[ch] ); /* exp(singularValues_e) */ move32(); IF( GT_32( L_abs( singularValues[ch] ), Mpy_32_32( CONVERGENCE_FACTOR_FX, L_abs( singularValues[ch] ) ) ) ) { - aux = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, singularValues[ch], &aux_e ); + aux = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, singularValues[ch], &aux_e ); /* exp(aux_e + (1 - singularValues_e)) */ aux_e = add( aux_e, sub( 1, singularValues_e[ch] ) ); - c = Mpy_32_32( d, aux ); + c = Mpy_32_32( d, aux ); /* exp(d_e + aux_e) */ c_e = add( d_e, aux_e ); IF( c_e > 0 ) { @@ -1049,7 +1055,7 @@ static void ApplyQRTransform_fx( move16(); } - s = Mpy_32_32( r, aux ); + s = Mpy_32_32( r, aux ); /* exp(r_e + aux_e) */ s_e = add( r_e, aux_e ); IF( s_e > 0 ) { @@ -1065,11 +1071,11 @@ static void ApplyQRTransform_fx( secDiag[startIndex] = 0; move32(); - secDiag[currentIndex] = d; + secDiag[currentIndex] = d; /* exp(d_e) */ move32(); secDiag_e[currentIndex] = d_e; move16(); - singularValues[currentIndex] = x_ii; + singularValues[currentIndex] = x_ii; /* exp(x_ii_e) */ move32(); singularValues_e[currentIndex] = x_ii_e; move16(); @@ -1151,28 +1157,29 @@ static void ApplyQRTransform( #ifdef IVAS_FLOAT_FIXED static void ApplyRotation_fx( Word32 singularVector[][MAX_OUTPUT_CHANNELS], - const Word32 c, + const Word32 c, /* exp(c_e)*/ const Word16 c_e, - const Word32 s, + const Word32 s, /* exp(s_e) */ const Word16 s_e, - Word32 x11, + Word32 x11, /* exp(x11_e) */ Word16 x11_e, - Word32 x12, + Word32 x12, /* exp(x12_e) */ Word16 x12_e, - Word32 *d, + Word32 *d, /* exp(d_e) */ Word16 *d_e, - Word32 *g, + Word32 *g, /* exp(g_e) */ Word16 *g_e, - const Word16 currentIndex1, - const Word16 currentIndex2, - const Word16 nChannels ) + const Word16 currentIndex1, /* Q0 */ + const Word16 currentIndex2, /* Q0 */ + const Word16 nChannels /* Q0 */ +) { Word16 ch; Word16 temp_exp; - *d = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x11 ), add( c_e, x11_e ), Mpy_32_32( s, x12 ), add( s_e, x12_e ), d_e ); + *d = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x11 ), add( c_e, x11_e ), Mpy_32_32( s, x12 ), add( s_e, x12_e ), d_e ); /* exp(d_e) */ move32(); - *g = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x12 ), add( c_e, x12_e ), Mpy_32_32( L_negate( s ), x11 ), add( s_e, x11_e ), g_e ); + *g = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x12 ), add( c_e, x12_e ), Mpy_32_32( L_negate( s ), x11 ), add( s_e, x11_e ), g_e ); /* exp(g_e) */ move32(); FOR( ch = 0; ch < nChannels; ch++ ) @@ -1181,13 +1188,13 @@ static void ApplyRotation_fx( move32(); x12 = singularVector[ch][currentIndex1]; move32(); - singularVector[ch][currentIndex2] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x11 ), c_e, Mpy_32_32( s, x12 ), s_e, &temp_exp ); + singularVector[ch][currentIndex2] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x11 ), c_e, Mpy_32_32( s, x12 ), s_e, &temp_exp ); /* exp(temp_exp) */ move32(); - singularVector[ch][currentIndex2] = L_shl_sat( singularVector[ch][currentIndex2], temp_exp ); + singularVector[ch][currentIndex2] = L_shl_sat( singularVector[ch][currentIndex2], temp_exp ); /* exp(temp_exp) */ move32(); - singularVector[ch][currentIndex1] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x12 ), c_e, Mpy_32_32( L_negate( s ), x11 ), s_e, &temp_exp ); + singularVector[ch][currentIndex1] = BASOP_Util_Add_Mant32Exp( Mpy_32_32( c, x12 ), c_e, Mpy_32_32( L_negate( s ), x11 ), s_e, &temp_exp ); /* exp(temp_exp) */ move32(); - singularVector[ch][currentIndex1] = L_shl_sat( singularVector[ch][currentIndex1], temp_exp ); + singularVector[ch][currentIndex1] = L_shl_sat( singularVector[ch][currentIndex1], temp_exp ); /* exp(temp_exp) */ move32(); } @@ -1231,16 +1238,16 @@ static void ApplyRotation( #ifdef IVAS_FLOAT_FIXED static void HouseholderReduction_fx( - Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], - Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], - Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], - Word32 secDiag_fx[MAX_OUTPUT_CHANNELS], + Word32 singularVectors_Left_fx[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_Left_e) */ + Word32 singularValues_fx[MAX_OUTPUT_CHANNELS], /* exp(singularValues_fx_e) */ + Word32 singularVectors_Right_fx[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_Left_e) */ + Word32 secDiag_fx[MAX_OUTPUT_CHANNELS], /* exp(secDiag_fx_e) */ Word16 singularVectors_Left_e, Word16 singularValues_fx_e[MAX_OUTPUT_CHANNELS], Word16 *secDiag_fx_e, - const Word16 nChannelsL, - const Word16 nChannelsC, - Word32 *eps_x_fx, + const Word16 nChannelsL, /* Q0 */ + const Word16 nChannelsC, /* Q0 */ + Word32 *eps_x_fx, /* exp(eps_x_fx_e) */ Word16 *eps_x_fx_e ) { Word16 nCh; @@ -1258,10 +1265,10 @@ static void HouseholderReduction_fx( biDiagonalReductionRight_fx( singularVectors_Left_fx, secDiag_fx, &singularVectors_Left_e, secDiag_fx_e, nChannelsL, nChannelsC, nCh, &sig_x_fx, &sig_x_fx_e, &g_fx ); Word16 L_temp_e; - Word32 L_temp = BASOP_Util_Add_Mant32Exp( L_abs( singularValues_fx[nCh] ), singularValues_fx_e[nCh], L_abs( secDiag_fx[nCh] ), *secDiag_fx_e, &L_temp_e ); + Word32 L_temp = BASOP_Util_Add_Mant32Exp( L_abs( singularValues_fx[nCh] ), singularValues_fx_e[nCh], L_abs( secDiag_fx[nCh] ), *secDiag_fx_e, &L_temp_e ); /* exp(L_temp_e) */ IF( EQ_16( BASOP_Util_Cmp_Mant32Exp( L_temp, L_temp_e, *eps_x_fx, *eps_x_fx_e ), 1 ) ) { - *eps_x_fx = L_temp; + *eps_x_fx = L_temp; /* exp(L_temp_e) */ move32(); *eps_x_fx_e = L_temp_e; move32(); @@ -1312,18 +1319,19 @@ static void HouseholderReduction( #ifdef IVAS_FLOAT_FIXED static void biDiagonalReductionLeft_fx( - Word32 singularVectors[][MAX_OUTPUT_CHANNELS], - Word32 singularValues[MAX_OUTPUT_CHANNELS], - Word32 secDiag[MAX_OUTPUT_CHANNELS], + Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ + Word32 singularValues[MAX_OUTPUT_CHANNELS], /* exp(singularValues_e) */ + Word32 secDiag[MAX_OUTPUT_CHANNELS], /* exp(secDiag_e) */ Word16 *singularVectors_e, Word16 singularValues_e[MAX_OUTPUT_CHANNELS], Word16 *secDiag_e, - const Word16 nChannelsL, - const Word16 nChannelsC, - const Word16 currChannel, - Word32 *sig_x, + const Word16 nChannelsL, /* Q0 */ + const Word16 nChannelsC, /* Q0 */ + const Word16 currChannel, /* Q0 */ + Word32 *sig_x, /* exp(sig_x_e) */ Word16 *sig_x_e, - Word32 *g ) // Q31 + Word32 *g /* Q31 */ +) { Word16 iCh, jCh, idx; Word32 norm_x, f, r; @@ -1337,14 +1345,14 @@ static void biDiagonalReductionLeft_fx( set16_fx( sing_exp2[jCh], *singularVectors_e, MAX_OUTPUT_CHANNELS ); } - secDiag[currChannel] = Mpy_32_32( *sig_x, *g ); + secDiag[currChannel] = Mpy_32_32( *sig_x, *g ); /* exp(sig_x_e) */ move32(); // rescaling block IF( GT_16( *sig_x_e, *secDiag_e ) ) { FOR( Word16 i = 0; i < MAX_OUTPUT_CHANNELS; i++ ){ IF( NE_16( i, currChannel ) ){ - secDiag[i] = L_shl( secDiag[i], sub( *secDiag_e, *sig_x_e ) ); + secDiag[i] = L_shl( secDiag[i], sub( *secDiag_e, *sig_x_e ) ); /* sig_x_e */ move32(); } } @@ -1353,7 +1361,7 @@ move16(); } ELSE IF( LT_16( *sig_x_e, *secDiag_e ) ) { - secDiag[currChannel] = L_shr_r( secDiag[currChannel], sub( *secDiag_e, *sig_x_e ) ); + secDiag[currChannel] = L_shr_r( secDiag[currChannel], sub( *secDiag_e, *sig_x_e ) ); /* exp(secDiag_e) */ move32(); } @@ -1370,7 +1378,7 @@ IF( LT_16( currChannel, nChannelsL ) ) /* i <= m */ FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ { - ( *sig_x ) = BASOP_Util_Add_Mant32Exp( *sig_x, *sig_x_e, L_abs( singularVectors[jCh][currChannel] ), *singularVectors_e, sig_x_e ); + ( *sig_x ) = BASOP_Util_Add_Mant32Exp( *sig_x, *sig_x_e, L_abs( singularVectors[jCh][currChannel] ), *singularVectors_e, sig_x_e ); /* exp(sig_x_e) */ } IF( ( *sig_x ) ) /*(fabsf(*sig_x) > EPSILON * fabsf(*sig_x)) { */ @@ -1381,11 +1389,11 @@ IF( LT_16( currChannel, nChannelsL ) ) /* i <= m */ move16(); FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ { - singularVectors[jCh][currChannel] = BASOP_Util_Divide3232_Scale_cadence( singularVectors[jCh][currChannel], maxWithSign_fx( *sig_x ), &sing_exp[jCh] ); + singularVectors[jCh][currChannel] = BASOP_Util_Divide3232_Scale_cadence( singularVectors[jCh][currChannel], maxWithSign_fx( *sig_x ), &sing_exp[jCh] ); /* exp(sing_exp + (singularVectors_e - sig_x_e) */ move32(); sing_exp[jCh] = add( sing_exp[jCh], sub( *singularVectors_e, *sig_x_e ) ); move16(); - norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][currChannel] ), shl( sing_exp[jCh], 1 ), &norm_x_e ); + norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][currChannel] ), shl( sing_exp[jCh], 1 ), &norm_x_e ); /* exp(norm_x_e) */ } IF( GT_16( norm_x_e, 0 ) ) { @@ -1410,9 +1418,9 @@ IF( LT_16( currChannel, nChannelsL ) ) /* i <= m */ move32(); } - r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ( *g ), singularVectors[currChannel][idx] ), sing_exp[currChannel], -norm_x, norm_x_e, &r_e ); + r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ( *g ), singularVectors[currChannel][idx] ), sing_exp[currChannel], -norm_x, norm_x_e, &r_e ); /* exp(r_e) */ #ifdef FIX_827_HIGH_MLD - singularVectors[currChannel][idx] = BASOP_Util_Add_Mant32Exp( singularVectors[currChannel][idx], sing_exp[currChannel], -( *g ), 0, &sing_exp[currChannel] ); + singularVectors[currChannel][idx] = BASOP_Util_Add_Mant32Exp( singularVectors[currChannel][idx], sing_exp[currChannel], -( *g ), 0, &sing_exp[currChannel] ); /* sing_exp */ #else singularVectors[currChannel][idx] = BASOP_Util_Add_Mant32Exp( singularVectors[currChannel][idx], sing_exp[idx], -( *g ), 0, &sing_exp[currChannel] ); #endif @@ -1426,15 +1434,15 @@ IF( LT_16( currChannel, nChannelsL ) ) /* i <= m */ move16(); FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ { - norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][iCh] ), add( sing_exp[jCh], *singularVectors_e ), &norm_x_e ); + norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[jCh][currChannel], singularVectors[jCh][iCh] ), add( sing_exp[jCh], *singularVectors_e ), &norm_x_e ); /* exp(norm_x_e) */ } - f = BASOP_Util_Divide3232_Scale_cadence( norm_x, maxWithSign_fx( r ), &f_e ); + f = BASOP_Util_Divide3232_Scale_cadence( norm_x, maxWithSign_fx( r ), &f_e ); /* f_e + (norm_x_e - r_e) */ f_e = add( f_e, sub( norm_x_e, r_e ) ); FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ { - singularVectors[jCh][iCh] = BASOP_Util_Add_Mant32Exp( singularVectors[jCh][iCh], *singularVectors_e, Mpy_32_32( f, singularVectors[jCh][currChannel] ), add( f_e, sing_exp[jCh] ), &sing_exp2[jCh][iCh] ); + singularVectors[jCh][iCh] = BASOP_Util_Add_Mant32Exp( singularVectors[jCh][iCh], *singularVectors_e, Mpy_32_32( f, singularVectors[jCh][currChannel] ), add( f_e, sing_exp[jCh] ), &sing_exp2[jCh][iCh] ); /* exp( sing_exp2) */ move32(); } } @@ -1442,7 +1450,7 @@ IF( LT_16( currChannel, nChannelsL ) ) /* i <= m */ FOR( jCh = idx; jCh < nChannelsL; jCh++ ) /* nChannelsL */ { - singularVectors[jCh][currChannel] = Mpy_32_32( singularVectors[jCh][currChannel], ( *sig_x ) ); + singularVectors[jCh][currChannel] = Mpy_32_32( singularVectors[jCh][currChannel], ( *sig_x ) ); /* sing_exp + sig_x_e */ move32(); sing_exp2[jCh][currChannel] = add( sing_exp[jCh], *sig_x_e ); move16(); @@ -1463,7 +1471,7 @@ IF( LT_16( currChannel, nChannelsL ) ) /* i <= m */ { FOR( jCh = 0; jCh < nChannelsL; jCh++ ) { - singularVectors[jCh][iCh] = L_shr_r( singularVectors[jCh][iCh], sub( exp_max, sing_exp2[jCh][iCh] ) ); + singularVectors[jCh][iCh] = L_shr_r( singularVectors[jCh][iCh], sub( exp_max, sing_exp2[jCh][iCh] ) ); /* exp(exp_max) */ move32(); } } @@ -1472,7 +1480,7 @@ IF( LT_16( currChannel, nChannelsL ) ) /* i <= m */ } // rescaling block - singularValues[currChannel] = Mpy_32_32( ( *sig_x ), ( *g ) ); + singularValues[currChannel] = Mpy_32_32( ( *sig_x ), ( *g ) ); /* sig_x_e */ move32(); singularValues_e[currChannel] = *sig_x_e; move16(); @@ -1561,16 +1569,17 @@ static void biDiagonalReductionLeft( #ifdef IVAS_FLOAT_FIXED static void biDiagonalReductionRight_fx( - Word32 singularVectors[][MAX_OUTPUT_CHANNELS], - Word32 secDiag[MAX_OUTPUT_CHANNELS], + Word32 singularVectors[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) */ + Word32 secDiag[MAX_OUTPUT_CHANNELS], /* exp(secDiag_e) */ Word16 *singularVectors_e, Word16 *secDiag_e, - const Word16 nChannelsL, - const Word16 nChannelsC, - const Word16 currChannel, - Word32 *sig_x, + const Word16 nChannelsL, /* Q0 */ + const Word16 nChannelsC, /* Q0 */ + const Word16 currChannel, /* Q0 */ + Word32 *sig_x, /* exp(sig_x_e) */ Word16 *sig_x_e, - Word32 *g ) + Word32 *g /* Q31 */ +) { Word16 iCh, jCh, idx; Word32 norm_x, r; @@ -1594,11 +1603,11 @@ static void biDiagonalReductionRight_fx( IF( LT_16( currChannel, nChannelsL ) && NE_16( currChannel, sub( nChannelsC, 1 ) ) ) /* i <=m && i !=n */ { - idx = add( currChannel, 1 ); + idx = add( currChannel, 1 ); /* Q0 */ FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ { - ( *sig_x ) = BASOP_Util_Add_Mant32Exp( *sig_x, *sig_x_e, L_abs( singularVectors[currChannel][jCh] ), *singularVectors_e, sig_x_e ); + ( *sig_x ) = BASOP_Util_Add_Mant32Exp( *sig_x, *sig_x_e, L_abs( singularVectors[currChannel][jCh] ), *singularVectors_e, sig_x_e ); /* exp(sig_x_e) */ } IF( ( *sig_x ) ) /*(fabsf(*sig_x) > EPSILON * fabsf(*sig_x)) { */ @@ -1610,11 +1619,11 @@ static void biDiagonalReductionRight_fx( FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /*nChannelsC */ { - singularVectors[currChannel][jCh] = BASOP_Util_Divide3232_Scale_cadence( singularVectors[currChannel][jCh], maxWithSign_fx( *sig_x ), &sing_exp[jCh] ); + singularVectors[currChannel][jCh] = BASOP_Util_Divide3232_Scale_cadence( singularVectors[currChannel][jCh], maxWithSign_fx( *sig_x ), &sing_exp[jCh] ); /* exp(sing_exp + (singularVectors_e - sig_x_e)) */ move32(); sing_exp[jCh] = add( sing_exp[jCh], sub( *singularVectors_e, *sig_x_e ) ); move16(); - norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[currChannel][jCh], singularVectors[currChannel][jCh] ), shl( sing_exp[jCh], 1 ), &norm_x_e ); + norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[currChannel][jCh], singularVectors[currChannel][jCh] ), shl( sing_exp[jCh], 1 ), &norm_x_e ); /* exp(norm_x_e) */ } IF( GT_16( norm_x_e, 0 ) ) { @@ -1629,22 +1638,22 @@ static void biDiagonalReductionRight_fx( L_temp = L_shl_r( L_temp, L_temp_e ); // Q31 IF( singularVectors[currChannel][idx] >= 0 ) { - ( *g ) = L_negate( L_temp ); + ( *g ) = L_negate( L_temp ); /* exp(L_temp_e) */ move32(); } ELSE { - ( *g ) = L_negate( L_negate( L_temp ) ); + ( *g ) = L_negate( L_negate( L_temp ) ); /* exp(L_temp_e) */ move32(); } - r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ( *g ), singularVectors[currChannel][idx] ), sing_exp[idx], -norm_x, norm_x_e, &r_e ); - singularVectors[currChannel][idx] = BASOP_Util_Add_Mant32Exp( singularVectors[currChannel][idx], sing_exp[idx], -( *g ), 0, &sing_exp[idx] ); + r = BASOP_Util_Add_Mant32Exp( Mpy_32_32( ( *g ), singularVectors[currChannel][idx] ), sing_exp[idx], -norm_x, norm_x_e, &r_e ); /* exp(r_e) */ + singularVectors[currChannel][idx] = BASOP_Util_Add_Mant32Exp( singularVectors[currChannel][idx], sing_exp[idx], -( *g ), 0, &sing_exp[idx] ); /* exp(sing_exp) */ move32(); FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ { - secDiag[jCh] = BASOP_Util_Divide3232_Scale_cadence( singularVectors[currChannel][jCh], maxWithSign_fx( r ), &secDiag_exp[jCh] ); + secDiag[jCh] = BASOP_Util_Divide3232_Scale_cadence( singularVectors[currChannel][jCh], maxWithSign_fx( r ), &secDiag_exp[jCh] ); /* exp(secDiag_exp + (sing_exp - r_e) */ move32(); secDiag_exp[jCh] = add( secDiag_exp[jCh], sub( sing_exp[jCh], r_e ) ); move32(); @@ -1658,19 +1667,19 @@ static void biDiagonalReductionRight_fx( move16(); FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ { - norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[iCh][jCh], singularVectors[currChannel][jCh] ), add( *singularVectors_e, sing_exp[jCh] ), &norm_x_e ); + norm_x = BASOP_Util_Add_Mant32Exp( norm_x, norm_x_e, Mpy_32_32( singularVectors[iCh][jCh], singularVectors[currChannel][jCh] ), add( *singularVectors_e, sing_exp[jCh] ), &norm_x_e ); /* exp(norm_x_e) */ } FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ { - singularVectors[iCh][jCh] = BASOP_Util_Add_Mant32Exp( singularVectors[iCh][jCh], *singularVectors_e, Mpy_32_32( norm_x, secDiag[jCh] ), add( norm_x_e, secDiag_exp[jCh] ), &sing_exp2[iCh][jCh] ); + singularVectors[iCh][jCh] = BASOP_Util_Add_Mant32Exp( singularVectors[iCh][jCh], *singularVectors_e, Mpy_32_32( norm_x, secDiag[jCh] ), add( norm_x_e, secDiag_exp[jCh] ), &sing_exp2[iCh][jCh] ); /* exp(sing_exp2) */ move32(); } } FOR( jCh = idx; jCh < nChannelsC; jCh++ ) /* nChannelsC */ { - singularVectors[currChannel][jCh] = Mpy_32_32( singularVectors[currChannel][jCh], ( *sig_x ) ); + singularVectors[currChannel][jCh] = Mpy_32_32( singularVectors[currChannel][jCh], ( *sig_x ) ); /* exp(sing_exp + sig_x_e) */ move32(); sing_exp2[currChannel][jCh] = add( sing_exp[jCh], *sig_x_e ); move16(); @@ -1685,7 +1694,7 @@ static void biDiagonalReductionRight_fx( } FOR( jCh = 0; jCh < nChannelsC; jCh++ ) { - secDiag[jCh] = L_shr_r( secDiag[jCh], sub( exp_max, secDiag_exp[jCh] ) ); + secDiag[jCh] = L_shr_r( secDiag[jCh], sub( exp_max, secDiag_exp[jCh] ) ); /* exp(exp_max) */ move32(); } @@ -1704,7 +1713,7 @@ static void biDiagonalReductionRight_fx( { FOR( jCh = 0; jCh < nChannelsC; jCh++ ) { - singularVectors[iCh][jCh] = L_shr_r( singularVectors[iCh][jCh], sub( exp_max, sing_exp2[iCh][jCh] ) ); + singularVectors[iCh][jCh] = L_shr_r( singularVectors[iCh][jCh], sub( exp_max, sing_exp2[iCh][jCh] ) ); /* exp(exp_max) */ move32(); } } @@ -1792,12 +1801,13 @@ static void biDiagonalReductionRight( #ifdef IVAS_FLOAT_FIXED static void singularVectorsAccumulationLeft_fx( - Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], // Q31 output - Word32 singularValues[MAX_OUTPUT_CHANNELS], + Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* exp(singularVectors_e) as Input, Q31 as output */ + Word32 singularValues[MAX_OUTPUT_CHANNELS], /* exp(singularValues_e) */ Word16 singularVectors_e, Word16 singularValues_e[MAX_OUTPUT_CHANNELS], - const Word16 nChannelsL, - const Word16 nChannelsC ) + const Word16 nChannelsL, /* Q0 */ + const Word16 nChannelsC /* Q0 */ +) { Word16 nCh, iCh, k; Word16 nChannels; @@ -1810,11 +1820,11 @@ static void singularVectorsAccumulationLeft_fx( } /* Processing */ - nChannels = min( nChannelsL, nChannelsC ); /* min(nChannelsL,ChannelsC) */ + nChannels = s_min( nChannelsL, nChannelsC ); /* min(nChannelsL,ChannelsC) Q0*/ // FILE *fp = fopen("t_ii_out.txt","a"); FOR( nCh = nChannels - 1; nCh >= 0; nCh-- ) /* min(nChannelsL,ChannelsC) */ { - t_ii = singularValues[nCh]; + t_ii = singularValues[nCh]; /* exp(singularValues_e) */ move32(); t_ii_e = singularValues_e[nCh]; move16(); @@ -1827,7 +1837,7 @@ static void singularVectorsAccumulationLeft_fx( IF( t_ii ) /*if (fabsf(t_ii) > EPSILON *fabsf(t_ii)) {*/ { - t_ii = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, maxWithSign_fx( t_ii ), &temp_exp ); + t_ii = BASOP_Util_Divide3232_Scale_cadence( ONE_IN_Q30, maxWithSign_fx( t_ii ), &temp_exp ); /* exp(1 + (temp_exp + tii_e)) */ t_ii_e = add( 1, sub( temp_exp, t_ii_e ) ); // fprintf( fp, "%e\n", me2f( t_ii, t_ii_e ) ); FOR( iCh = nCh + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC */ @@ -1838,21 +1848,21 @@ static void singularVectorsAccumulationLeft_fx( move16(); FOR( k = nCh + 1; k < nChannelsL; k++ ) /* nChannelsL */ { - norm_y = BASOP_Util_Add_Mant32Exp( norm_y, norm_y_e, Mpy_32_32( singularVectors_Left[k][nCh], singularVectors_Left[k][iCh] ), add( sing_exp2[k][nCh], sing_exp2[k][iCh] ), &norm_y_e ); + norm_y = BASOP_Util_Add_Mant32Exp( norm_y, norm_y_e, Mpy_32_32( singularVectors_Left[k][nCh], singularVectors_Left[k][iCh] ), add( sing_exp2[k][nCh], sing_exp2[k][iCh] ), &norm_y_e ); /* exp(norm_y_e) */ } t_jj = BASOP_Util_Divide3232_Scale_cadence( Mpy_32_32( t_ii, norm_y ), maxWithSign_fx( singularVectors_Left[nCh][nCh] ), &temp_exp ); // t_ii_e+norm_y_e-*singularVectors_e, t_jj_e = add( temp_exp, sub( add( t_ii_e, norm_y_e ), sing_exp2[nCh][nCh] ) ); FOR( k = nCh; k < nChannelsL; k++ ) /* nChannelsL */ { - singularVectors_Left[k][iCh] = BASOP_Util_Add_Mant32Exp( singularVectors_Left[k][iCh], sing_exp2[k][iCh], Mpy_32_32( t_jj, singularVectors_Left[k][nCh] ), add( t_jj_e, sing_exp2[k][nCh] ), &sing_exp2[k][iCh] ); + singularVectors_Left[k][iCh] = BASOP_Util_Add_Mant32Exp( singularVectors_Left[k][iCh], sing_exp2[k][iCh], Mpy_32_32( t_jj, singularVectors_Left[k][nCh] ), add( t_jj_e, sing_exp2[k][nCh] ), &sing_exp2[k][iCh] ); /* exp(sing_exp2) */ move32(); } } FOR( iCh = nCh; iCh < nChannelsL; iCh++ ) /* nChannelsL */ { - singularVectors_Left[iCh][nCh] = Mpy_32_32( singularVectors_Left[iCh][nCh], t_ii ); + singularVectors_Left[iCh][nCh] = Mpy_32_32( singularVectors_Left[iCh][nCh], t_ii ); /* exp(sing_exp2 + t_ii_e) */ move32(); sing_exp2[iCh][nCh] = add( sing_exp2[iCh][nCh], t_ii_e ); move16(); @@ -1867,7 +1877,7 @@ static void singularVectorsAccumulationLeft_fx( } } - singularVectors_Left[nCh][nCh] = BASOP_Util_Add_Mant32Exp( singularVectors_Left[nCh][nCh], sing_exp2[nCh][nCh], ONE_IN_Q30, 1, &sing_exp2[nCh][nCh] ); + singularVectors_Left[nCh][nCh] = BASOP_Util_Add_Mant32Exp( singularVectors_Left[nCh][nCh], sing_exp2[nCh][nCh], ONE_IN_Q30, 1, &sing_exp2[nCh][nCh] ); /* exp(sing_exp2) */ move32(); } // fclose(fp); @@ -1875,7 +1885,7 @@ static void singularVectorsAccumulationLeft_fx( { FOR( iCh = 0; iCh < nChannelsC; iCh++ ) { - singularVectors_Left[nCh][iCh] = L_shl_sat( singularVectors_Left[nCh][iCh], sing_exp2[nCh][iCh] ); + singularVectors_Left[nCh][iCh] = L_shl_sat( singularVectors_Left[nCh][iCh], sing_exp2[nCh][iCh] ); /* Q31 */ move32(); } } @@ -1953,12 +1963,13 @@ static void singularVectorsAccumulationLeft( #ifdef IVAS_FLOAT_FIXED static void singularVectorsAccumulationRight_fx( - Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], - Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], // Q31 - Word32 secDiag[MAX_OUTPUT_CHANNELS], + Word32 singularVectors_Left[][MAX_OUTPUT_CHANNELS], /* Q31 */ + Word32 singularVectors_Right[][MAX_OUTPUT_CHANNELS], /* Q31 */ + Word32 secDiag[MAX_OUTPUT_CHANNELS], /* exp(secDiag_e) */ Word16 singularVectors_e, Word16 secDiag_e, - const Word16 nChannelsC ) + const Word16 nChannelsC /* Q0 */ +) { Word16 nCh, iCh, k; Word16 nChannels; @@ -1966,10 +1977,10 @@ static void singularVectorsAccumulationRight_fx( Word16 norm_y_e, temp_exp1, sing_right_exp[MAX_OUTPUT_CHANNELS][MAX_OUTPUT_CHANNELS] = { 0 }; /* Processing */ - nChannels = nChannelsC; /* nChannelsC */ + nChannels = nChannelsC; /* nChannelsC Q0*/ /* avoid compiler warning */ - t_ii = secDiag[nChannels - 1]; + t_ii = secDiag[nChannels - 1]; /* exp(secDiag_e) */ move32(); FOR( nCh = nChannels - 1; nCh >= 0; nCh-- ) /* nChannelsC, min(nChannelsLmnChannelsC) otherwise */ @@ -1982,8 +1993,8 @@ static void singularVectorsAccumulationRight_fx( FOR( iCh = nCh + 1; iCh < nChannelsC; iCh++ ) /* nChannelsC*/ { - ratio_float = BASOP_Util_Divide3232_Scale_cadence( singularVectors_Left[nCh][iCh], maxWithSign_fx( singularVectors_Left[nCh][nCh + 1] ), &temp_exp1 ); - singularVectors_Right[iCh][nCh] = BASOP_Util_Divide3232_Scale_cadence( ratio_float, maxWithSign_fx( t_ii ), &sing_right_exp[iCh][nCh] ); + ratio_float = BASOP_Util_Divide3232_Scale_cadence( singularVectors_Left[nCh][iCh], maxWithSign_fx( singularVectors_Left[nCh][nCh + 1] ), &temp_exp1 ); /* exp(temp_exp1) */ + singularVectors_Right[iCh][nCh] = BASOP_Util_Divide3232_Scale_cadence( ratio_float, maxWithSign_fx( t_ii ), &sing_right_exp[iCh][nCh] ); /* exp(sing_right_exp + (temp_exp1 - secDiag_e) */ move32(); sing_right_exp[iCh][nCh] = add( sing_right_exp[iCh][nCh], sub( temp_exp1, secDiag_e ) ); move16(); @@ -1999,14 +2010,14 @@ static void singularVectorsAccumulationRight_fx( FOR( k = nCh + 1; k < nChannelsC; k++ ) /* nChannelsC */ { - norm_y = BASOP_Util_Add_Mant32Exp( norm_y, norm_y_e, Mpy_32_32( singularVectors_Left[nCh][k], singularVectors_Right[k][iCh] ), add( singularVectors_e, sing_right_exp[k][iCh] ), &norm_y_e ); + norm_y = BASOP_Util_Add_Mant32Exp( norm_y, norm_y_e, Mpy_32_32( singularVectors_Left[nCh][k], singularVectors_Right[k][iCh] ), add( singularVectors_e, sing_right_exp[k][iCh] ), &norm_y_e ); /* exp(norm_y_e) */ } FOR( k = nCh + 1; k < nChannelsC; k++ ) /* nChannelsC */ { - singularVectors_Right[k][iCh] = BASOP_Util_Add_Mant32Exp( singularVectors_Right[k][iCh], sing_right_exp[k][iCh], Mpy_32_32( norm_y, singularVectors_Right[k][nCh] ), add( norm_y_e, sing_right_exp[k][nCh] ), &sing_right_exp[k][iCh] ); + singularVectors_Right[k][iCh] = BASOP_Util_Add_Mant32Exp( singularVectors_Right[k][iCh], sing_right_exp[k][iCh], Mpy_32_32( norm_y, singularVectors_Right[k][nCh] ), add( norm_y_e, sing_right_exp[k][nCh] ), &sing_right_exp[k][iCh] ); /* exp(sing_right_exp) */ move32(); - singularVectors_Right[k][iCh] = L_shl_sat( singularVectors_Right[k][iCh], sing_right_exp[k][iCh] ); + singularVectors_Right[k][iCh] = L_shl_sat( singularVectors_Right[k][iCh], sing_right_exp[k][iCh] ); /* Q31 */ move32(); sing_right_exp[k][iCh] = 0; move16(); @@ -2023,7 +2034,7 @@ static void singularVectorsAccumulationRight_fx( } singularVectors_Right[nCh][nCh] = MAX_32; move32(); - t_ii = secDiag[nCh]; + t_ii = secDiag[nCh]; /* exp(secDiag_e) */ move32(); } return; @@ -2096,9 +2107,9 @@ static void singularVectorsAccumulationRight( #ifdef IVAS_FLOAT_FIXED static Word32 GivensRotation_fx( - const Word32 x, + const Word32 x, /* exp(x_e) */ const Word16 x_e, - const Word32 z, + const Word32 z, /* exp(z_e) */ const Word16 z_e, Word16 *out_e ) { @@ -2123,11 +2134,11 @@ static Word32 GivensRotation_fx( } ELSE { - cotan = BASOP_Util_Divide3232_Scale_cadence( z_abs, x_abs, &temp_exp ); + cotan = BASOP_Util_Divide3232_Scale_cadence( z_abs, x_abs, &temp_exp ); /* exp(temp_exp + (z_e - x_e) */ temp_exp = add( temp_exp, sub( z_e, x_e ) ); - L_temp = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, Mpy_32_32( cotan, cotan ), 2 * temp_exp, &temp_exp ); + L_temp = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, Mpy_32_32( cotan, cotan ), 2 * temp_exp, &temp_exp ); /* exp(temp_exp) */ L_temp = Sqrt32( L_temp, &temp_exp ); - r = Mpy_32_32( x_abs, L_temp ); + r = Mpy_32_32( x_abs, L_temp ); /* exp(x_e + temp_exp) */ *out_e = add( x_e, temp_exp ); } } @@ -2140,11 +2151,11 @@ static Word32 GivensRotation_fx( } ELSE { - tan = BASOP_Util_Divide3232_Scale_cadence( x_abs, z_abs, &temp_exp ); + tan = BASOP_Util_Divide3232_Scale_cadence( x_abs, z_abs, &temp_exp ); /* exp(temp_exp + (x_e - z_e) */ temp_exp = add( temp_exp, sub( x_e, z_e ) ); - L_temp = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, Mpy_32_32( tan, tan ), shl( temp_exp, 1 ), &temp_exp ); + L_temp = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, Mpy_32_32( tan, tan ), shl( temp_exp, 1 ), &temp_exp ); /* exp(temp_exp) */ L_temp = Sqrt32( L_temp, &temp_exp ); - r = Mpy_32_32( z_abs, L_temp ); + r = Mpy_32_32( z_abs, L_temp ); /* exp(z_e + temp_exp) */ *out_e = add( z_e, temp_exp ); } } @@ -2201,7 +2212,8 @@ static float GivensRotation( #ifdef IVAS_FLOAT_FIXED static Word32 maxWithSign_fx( - const Word32 a ) + const Word32 a /* Qx */ +) { IF( GT_32( L_abs( a ), SVD_MINIMUM_VALUE_FX ) ) { diff --git a/lib_dec/ivas_tcx_core_dec.c b/lib_dec/ivas_tcx_core_dec.c index d0bed2c21..05734c278 100644 --- a/lib_dec/ivas_tcx_core_dec.c +++ b/lib_dec/ivas_tcx_core_dec.c @@ -65,9 +65,9 @@ static void stereo_tcx_dec_mode_switch_reconf_ivas_fx( Decoder_State *st, const *-------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED void stereo_tcx_init_dec_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ - const Word16 last_element_mode /* i : element mode of previous frame */ + Decoder_State *st, /* i/o: decoder state structure */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ + const Word16 last_element_mode /* i : element mode of previous frame Q0*/ ) { TCX_LTP_DEC_HANDLE hTcxLtpDec = st->hTcxLtpDec; @@ -75,20 +75,20 @@ void stereo_tcx_init_dec_fx( st->rate_switching_init = 0; move16(); - st->m_frame_type = ACTIVE_FRAME; + st->m_frame_type = ACTIVE_FRAME; /* Q0 */ move16(); - st->core_brate = st->total_brate; + st->core_brate = st->total_brate; /* Q0 */ move32(); /*sampling rate*/ - st->sr_core = getCoreSamplerateMode2( st->element_mode, L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->bwidth, st->flag_ACELP16k, st->rf_flag, st->is_ism_format ); + st->sr_core = getCoreSamplerateMode2( st->element_mode, L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->bwidth, st->flag_ACELP16k, st->rf_flag, st->is_ism_format ); /* Q0 */ move32(); - st->fscale = sr2fscale_fx( st->sr_core ); + st->fscale = sr2fscale_fx( st->sr_core ); /* Q0 */ move16(); /*frame size*/ - st->L_frame = extract_l( Mult_32_16( st->sr_core, INV_FRAME_PER_SEC_Q15 ) ); - hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, INV_FRAME_PER_SEC_Q15 ) ); + st->L_frame = extract_l( Mult_32_16( st->sr_core, INV_FRAME_PER_SEC_Q15 ) ); /* Q0 */ + hTcxDec->L_frameTCX = extract_l( Mult_32_16( st->output_Fs, INV_FRAME_PER_SEC_Q15 ) ); /* Q0 */ move16(); move16(); @@ -98,47 +98,47 @@ void stereo_tcx_init_dec_fx( test(); IF( ( EQ_16( st->L_frame, L_FRAME16k ) && LE_32( L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), MAX_ACELP_BRATE ) ) || ( st->tcxonly && ( EQ_32( st->sr_core, 32000 ) || EQ_32( st->sr_core, INT_FS_16k ) ) ) ) { - st->nb_subfr = NB_SUBFR16k; + st->nb_subfr = NB_SUBFR16k; /* Q0 */ move16(); } ELSE { - st->nb_subfr = NB_SUBFR; + st->nb_subfr = NB_SUBFR; /* Q0 */ move16(); } move16(); /*TCX tools*/ - st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->rf_flag ); + st->hTcxCfg->ctx_hm = getCtxHm( st->element_mode, L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->rf_flag ); /* Q0 */ move16(); - st->hTcxCfg->resq = getResq( L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ) ); + st->hTcxCfg->resq = getResq( L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ) ); /* Q0 */ move16(); - hTcxDec->tcx_lpc_shaped_ari = getTcxLpcShapedAri( L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->rf_flag, st->element_mode ); + hTcxDec->tcx_lpc_shaped_ari = getTcxLpcShapedAri( L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->rf_flag, st->element_mode ); /* Q0 */ move16(); - st->igf = getIgfPresent_fx( st->element_mode, L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->bwidth, st->rf_flag ); + st->igf = getIgfPresent_fx( st->element_mode, L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->bwidth, st->rf_flag ); /* Q0 */ move16(); IF( st->element_mode != EVS_MONO ) { - st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->igf, st->element_mode ); + st->hTcxCfg->fIsTNSAllowed = getTnsAllowed( L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), st->igf, st->element_mode ); /* Q0 */ move16(); } IF( hTcxLtpDec != NULL ) { - hTcxLtpDec->tcxltp = getTcxLtp( st->sr_core ); + hTcxLtpDec->tcxltp = getTcxLtp( st->sr_core ); /* Q0 */ move16(); } IF( EQ_16( st->element_mode, IVAS_SCE ) ) { - st->tcxonly = getTcxonly_fx( st->element_mode, L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), MCT_flag, st->is_ism_format ); + st->tcxonly = getTcxonly_fx( st->element_mode, L_mult0( st->bits_frame_nominal, FRAMES_PER_SEC ), MCT_flag, st->is_ism_format ); /* Q0 */ move16(); /* LPC quantization */ test(); IF( LE_32( st->sr_core, INT_FS_16k ) && st->tcxonly == 0 ) { - st->lpcQuantization = 1; + st->lpcQuantization = 1; /* Q0 */ move16(); } ELSE @@ -150,12 +150,12 @@ void stereo_tcx_init_dec_fx( IF( st->tcxonly == 0 ) { - st->numlpc = 1; + st->numlpc = 1; /* Q0 */ move16(); } ELSE { - st->numlpc = 2; + st->numlpc = 2; /* Q0 */ move16(); } move16(); @@ -284,18 +284,18 @@ void stereo_tcx_init_dec( *-------------------------------------------------------------------*/ void stereo_tcx_core_dec_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const FRAME_MODE frameMode, /* i : Decoder frame mode */ - Word16 *signal_out_fx, /* o : synthesis @internal_Fs, Q0 */ - Word16 *signal_outFB_fx, /* o : synthesis @output_Fs, Q0 */ - Word16 pitch_buf_fx[], /* o : Word16 pitch for each subframe, Q6 */ - const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC */ - STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ - const Word16 last_element_mode, /* i : last element mode */ - const Word16 flag_sec_CNA, /* i : CNA flag for secondary channel */ - STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ - const Word16 nchan_out, /* i : number of output channels */ - const IVAS_FORMAT ivas_format /* i : IVAS format */ + Decoder_State *st, /* i/o: decoder state structure */ + const FRAME_MODE frameMode, /* i : Decoder frame mode */ + Word16 *signal_out_fx, /* o : synthesis @internal_Fs, Q0*/ + Word16 *signal_outFB_fx, /* o : synthesis @output_Fs, Q0*/ + Word16 pitch_buf_fx[], /* o : Word16 pitch for each subframe, Q6*/ + const Word16 sba_dirac_stereo_flag, /* i : signal stereo output for SBA DirAC Q0*/ + STEREO_TD_DEC_DATA_HANDLE hStereoTD, /* i/o: TD stereo decoder handle */ + const Word16 last_element_mode, /* i : last element mode Q0*/ + const Word16 flag_sec_CNA, /* i : CNA flag for secondary channel Q0*/ + STEREO_CNG_DEC_HANDLE hStereoCng, /* i : Stereo CNG handle */ + const Word16 nchan_out, /* i : number of output channels Q0*/ + const IVAS_FORMAT ivas_format /* i : IVAS format */ ) { Word16 i, k; @@ -357,10 +357,10 @@ void stereo_tcx_core_dec_fx( *--------------------------------------------------------------------------------*/ iDiv_and_mod_32( st->total_brate, FRAMES_PER_SEC, &L_tmp, &mod, 0 ); - total_nbbits = extract_l( L_tmp ); + total_nbbits = extract_l( L_tmp ); /* Q0 */ bitsRead = 0; move16(); - LSF_Q_prediction = -1; /* to avoid compilation warnings */ + LSF_Q_prediction = -1; /* to avoid compilation warnings Q0*/ move16(); IF( frameMode == FRAMEMODE_NORMAL ) @@ -375,7 +375,7 @@ void stereo_tcx_core_dec_fx( { st->m_decodeMode = DEC_CONCEALMENT_EXT; move32(); - bfi = 1; + bfi = 1; /* Q0 */ move16(); } /* for bass postfilter */ @@ -394,8 +394,8 @@ void stereo_tcx_core_dec_fx( /* Initialize pointers */ synth_fx = synth_buf_fx + hTcxDec->old_synth_len; synthFB_fx = synth_bufFB_fx + hTcxDec->old_synth_lenFB; - Copy_Scale_sig( hTcxDec->old_synth, synth_buf_fx, hTcxDec->old_synth_len, negate( st->Q_syn ) ); - Copy( hTcxDec->old_synthFB_fx, synth_bufFB_fx, hTcxDec->old_synth_lenFB ); + Copy_Scale_sig( hTcxDec->old_synth, synth_buf_fx, hTcxDec->old_synth_len, negate( st->Q_syn ) ); /* q_old_synth - st->Q_syn */ + Copy( hTcxDec->old_synthFB_fx, synth_bufFB_fx, hTcxDec->old_synth_lenFB ); /* q_old_synthFB */ set16_fx( synth_fx, 0, L_FRAME_PLUS + M ); set16_fx( synthFB_fx, 0, L_FRAME_PLUS + M ); @@ -405,7 +405,7 @@ void stereo_tcx_core_dec_fx( IF( !bfi ) { - st->second_last_core = st->last_core; + st->second_last_core = st->last_core; /* Q0 */ move16(); move16(); @@ -421,7 +421,7 @@ void stereo_tcx_core_dec_fx( /* PLC: [Common: mode decision] * PLC: Decide which Concealment to use. Update pitch lags if needed */ - st->core = GetPLCModeDecision_ivas_fx( st ); + st->core = GetPLCModeDecision_ivas_fx( st ); /* Q0 */ move16(); } @@ -442,24 +442,24 @@ void stereo_tcx_core_dec_fx( test(); IF( bfi && st->use_partial_copy && EQ_16( st->rf_frame_type, RF_TCXFD ) ) { - tcx_lpc_cdk = tcxlpc_get_cdk( GENERIC ); + tcx_lpc_cdk = tcxlpc_get_cdk( GENERIC ); /* Q0 */ move16(); } ELSE { - tcx_lpc_cdk = tcxlpc_get_cdk( st->coder_type ); + tcx_lpc_cdk = tcxlpc_get_cdk( st->coder_type ); /* Q0 */ move16(); } - Copy( st->lsf_old_fx, &lsf_fx[0], M ); - Copy( st->lsp_old_fx, &lsp_fx[0], M ); + Copy( st->lsf_old_fx, &lsf_fx[0], M ); /* Q2.56 */ + Copy( st->lsp_old_fx, &lsp_fx[0], M ); /* Q15 */ D_lsf_tcxlpc( param_lpc, &lsf_fx[M], lspind, st->narrowBand, tcx_lpc_cdk, st->mem_MA_fx ); lsf2lsp_fx( &lsf_fx[M], &lsp_fx[M], M, st->sr_core ); lsf_update_memory( st->narrowBand, &lsf_fx[M], st->mem_MA_fx, st->mem_MA_fx, M ); - Copy( &lsf_fx[M], st->mem_AR_fx, M ); + Copy( &lsf_fx[M], st->mem_AR_fx, M ); /* Q2.56 */ hTcxDec->envWeighted = 1; move16(); @@ -470,8 +470,8 @@ void stereo_tcx_core_dec_fx( { IF( hTcxDec->envWeighted ) { - Copy( st->lspold_uw, st->lsp_old_fx, M ); - Copy( st->lsfold_uw, st->lsf_old_fx, M ); + Copy( st->lspold_uw, st->lsp_old_fx, M ); /* Q15 */ + Copy( st->lsfold_uw, st->lsf_old_fx, M ); /* Q2.56 */ hTcxDec->envWeighted = 0; move16(); } @@ -480,8 +480,8 @@ void stereo_tcx_core_dec_fx( FOR( k = 0; k < st->numlpc; ++k ) { - Copy( &lsp_fx[imult1616( add( k, 1 ), M )], &lspnew_uw_fx[k * M], M ); /*basop not used for k * M as M is a multiple of 2*/ - Copy( &lsf_fx[imult1616( add( k, 1 ), M )], &lsfnew_uw_fx[k * M], M ); + Copy( &lsp_fx[( k + 1 ) * M], &lspnew_uw_fx[k * M], M ); /*basop not used for k * M as M is a multiple of 2 Q15*/ + Copy( &lsf_fx[( k + 1 ) * M], &lsfnew_uw_fx[k * M], M ); /* Q2.56 */ } } @@ -490,11 +490,11 @@ void stereo_tcx_core_dec_fx( { FOR( i = 0; i < M; i++ ) { - st->lsf_adaptive_mean_fx[i] = add( add( mult_r( st->lsfoldbfi1_fx[i], ONE_BY_THREE_Q15 ), mult_r( st->lsfoldbfi0_fx[i], ONE_BY_THREE_Q15 ) ), mult_r( lsfnew_uw_fx[add( i_mult( k, M ), i )], ONE_BY_THREE_Q15 ) ); + st->lsf_adaptive_mean_fx[i] = add( add( mult_r( st->lsfoldbfi1_fx[i], ONE_BY_THREE_Q15 ), mult_r( st->lsfoldbfi0_fx[i], ONE_BY_THREE_Q15 ) ), mult_r( lsfnew_uw_fx[k * M + i], ONE_BY_THREE_Q15 ) ); /* Q2.56 */ move16(); - st->lsfoldbfi1_fx[i] = st->lsfoldbfi0_fx[i]; + st->lsfoldbfi1_fx[i] = st->lsfoldbfi0_fx[i]; /* Q2.56 */ move16(); - st->lsfoldbfi0_fx[i] = lsfnew_uw_fx[add( i_mult( k, M ), i )]; + st->lsfoldbfi0_fx[i] = lsfnew_uw_fx[( k * M ) + i]; /* Q2.56 */ move16(); } } @@ -519,28 +519,28 @@ void stereo_tcx_core_dec_fx( IF( EQ_16( st->nbLostCmpt, 1 ) ) { - Copy( st->lsf_old_fx, st->old_lsf_q_cng, M ); - Copy( st->lsp_old_fx, st->old_lsp_q_cng, M ); + Copy( st->lsf_old_fx, st->old_lsf_q_cng, M ); /* Q2.56 */ + Copy( st->lsp_old_fx, st->old_lsp_q_cng, M ); /* Q15 */ } - lsfBase = PlcGetLsfBase( st->lpcQuantization, st->narrowBand, st->sr_core ); + lsfBase = PlcGetLsfBase( st->lpcQuantization, st->narrowBand, st->sr_core ); /* Q2.56 */ dlpc_bfi( st->L_frame, lsfnew_uw_fx, st->lsfold_uw, st->last_good, st->nbLostCmpt, st->mem_MA_fx, st->mem_AR_fx, &( st->stab_fac_fx ), st->lsf_adaptive_mean_fx, st->numlpc, st->lsf_cng, (Word8) st->plcBackgroundNoiseUpdated, st->lsf_q_cng, st->old_lsf_q_cng, lsfBase, (Word8) st->tcxonly ); hTcxDec->envWeighted = 0; move16(); - Copy( st->lspold_uw, lsp_fx, M ); - Copy( st->lsfold_uw, lsf_fx, M ); + Copy( st->lspold_uw, lsp_fx, M ); /* Q15 */ + Copy( st->lsfold_uw, lsf_fx, M ); /* Q2.56 */ FOR( k = 0; k < st->numlpc; k++ ) { - Copy( &lsfnew_uw_fx[k * M], &lsf_fx[imult1616( add( k, 1 ), M )], M ); + Copy( &lsfnew_uw_fx[k * M], &lsf_fx[( k + 1 ) * M], M ); /* Q2.56 */ - lsf2lsp_fx( &lsf_fx[imult1616( add( k, 1 ), M )], &lsp_fx[imult1616( add( k, 1 ), M )], M, st->sr_core ); - lsf2lsp_fx( st->lsf_q_cng, st->lsp_q_cng, M, st->sr_core ); + lsf2lsp_fx( &lsf_fx[( k + 1 ) * M], &lsp_fx[( k + 1 ) * M], M, st->sr_core ); /* Q2.56 */ + lsf2lsp_fx( st->lsf_q_cng, st->lsp_q_cng, M, st->sr_core ); /* Q2.56 */ - Copy( &lsp_fx[imult1616( add( k, 1 ), M )], &lspnew_uw_fx[k * M], M ); + Copy( &lsp_fx[( k + 1 ) * M], &lspnew_uw_fx[k * M], M ); /* Q2.56 */ } } @@ -550,19 +550,19 @@ void stereo_tcx_core_dec_fx( IF( st->rate_switching_reset ) { - Copy( &( lsf_fx[M] ), &( lsf_fx[0] ), M ); - Copy( &( lsp_fx[M] ), &( lsp_fx[0] ), M ); - Copy( &( lsf_fx[M] ), st->lsf_old_fx, M ); - Copy( &( lsp_fx[M] ), st->lsp_old_fx, M ); - Copy( &( lsf_fx[M] ), lsfmid_fx, M ); - Copy( &( lsp_fx[M] ), lspmid_fx, M ); + Copy( &( lsf_fx[M] ), &( lsf_fx[0] ), M ); /* Q2.56 */ + Copy( &( lsp_fx[M] ), &( lsp_fx[0] ), M ); /* Q15 */ + Copy( &( lsf_fx[M] ), st->lsf_old_fx, M ); /* Q2.56 */ + Copy( &( lsp_fx[M] ), st->lsp_old_fx, M ); /* Q2.56 */ + Copy( &( lsf_fx[M] ), lsfmid_fx, M ); /* Q2.56 */ + Copy( &( lsp_fx[M] ), lspmid_fx, M ); /* Q15 */ E_LPC_f_lsp_a_conversion( st->lsp_old_fx, st->old_Aq_12_8_fx, M ); } test(); if ( st->enablePlcWaveadjust && bfi ) { - st->hPlcInfo->nbLostCmpt = add( st->hPlcInfo->nbLostCmpt, 1 ); + st->hPlcInfo->nbLostCmpt = add( st->hPlcInfo->nbLostCmpt, 1 ); /* Q0 */ move16(); } @@ -586,11 +586,11 @@ void stereo_tcx_core_dec_fx( test(); IF( ( EQ_16( st->nbLostCmpt, 1 ) ) || hTcxDec->tcxConceal_recalc_exc ) { - Copy_Scale_sig( &synthFB_fx[negate( add( add( shr( st->hTcxDec->L_frameTCX, 1 ), hTcxDec->pit_max_TCX ), 2 * M ) )], &synthFB_fx[negate( add( add( shr( st->hTcxDec->L_frameTCX, 1 ), hTcxDec->pit_max_TCX ), 2 * M ) )], add( add( shr( st->hTcxDec->L_frameTCX, 1 ), hTcxDec->pit_max_TCX ), 2 * M ), negate( sub( st->Q_exc, 1 ) ) ); + Copy_Scale_sig( &synthFB_fx[-( ( st->hTcxDec->L_frameTCX / 2 ) + hTcxDec->pit_max_TCX + 2 * M )], &synthFB_fx[-( ( st->hTcxDec->L_frameTCX / 2 ) + hTcxDec->pit_max_TCX + 2 * M )], add( add( shr( st->hTcxDec->L_frameTCX, 1 ), hTcxDec->pit_max_TCX ), 2 * M ), negate( sub( st->Q_exc, 1 ) ) ); /* q_old_synthFB + Q_exc - 1 */ } ELSE { - Copy_Scale_sig( &synthFB_fx[negate( st->hTcxDec->L_frameTCX )], &synthFB_fx[negate( st->hTcxDec->L_frameTCX )], st->hTcxDec->L_frameTCX, negate( sub( st->Q_exc, 1 ) ) ); + Copy_Scale_sig( &synthFB_fx[-( st->hTcxDec->L_frameTCX )], &synthFB_fx[-( st->hTcxDec->L_frameTCX )], st->hTcxDec->L_frameTCX, negate( sub( st->Q_exc, 1 ) ) ); /* q_old_synthFB + Q_exc - 1 */ } lerp( synthFB_fx, synth_fx, st->L_frame, hTcxDec->L_frameTCX ); @@ -604,7 +604,7 @@ void stereo_tcx_core_dec_fx( test(); IF( st->narrowBand || EQ_32( st->sr_core, INT_FS_12k8 ) || EQ_32( st->sr_core, INT_FS_16k ) ) { - Copy( Aq_fx, st->mem_Aq, i_mult( st->nb_subfr, ( M + 1 ) ) ); + Copy( Aq_fx, st->mem_Aq, i_mult( st->nb_subfr, ( M + 1 ) ) ); /* Q12 */ } /* PLC: [TCX: Tonal Concealment] */ @@ -620,14 +620,14 @@ void stereo_tcx_core_dec_fx( *--------------------------------------------------------------------------------*/ /* Set pointer to parameters */ - prm = param; + prm = param; /* Q0 */ IF( EQ_16( st->core, TCX_20_CORE ) ) { /* Stability Factor */ IF( !bfi ) { - st->stab_fac_fx = lsf_stab_fx( &lsf_fx[M], &lsf_fx[0], 0, st->L_frame ); + st->stab_fac_fx = lsf_stab_fx( &lsf_fx[M], &lsf_fx[0], 0, st->L_frame ); /* Q15 */ move16(); } @@ -645,7 +645,7 @@ void stereo_tcx_core_dec_fx( /* diffuse LPC power on rate switching*/ RecLpcSpecPowDiffuseLc( &lsp_fx[M], &lsp_fx[0], &lsf_fx[M], st, 0 ); int_lsp_fx( st->L_frame, &lsp_fx[0], &lsp_fx[M], Aq_fx, M, interpol_frac_fx, 0 ); - Copy( &lsf_fx[M], lsfnew_uw_fx, M ); + Copy( &lsf_fx[M], lsfnew_uw_fx, M ); /* Q2.56 */ } ELSE { @@ -678,22 +678,22 @@ void stereo_tcx_core_dec_fx( FOR( k = 0; k < 2; k++ ) { /* Set pointer to parameters */ - prm = param + imult1616( k, DEC_NPRM_DIV ); + prm = param + imult1616( k, DEC_NPRM_DIV ); /* Q0 */ /* Stability Factor */ IF( !bfi ) { - st->stab_fac_fx = lsf_stab_fx( &lsf_fx[imult1616( add( k, 1 ), M )], &lsf_fx[k * M], 0, st->L_frame ); + st->stab_fac_fx = lsf_stab_fx( &lsf_fx[( k + 1 ) * M], &lsf_fx[k * M], 0, st->L_frame ); /* Q15 */ move16(); } - E_LPC_f_lsp_a_conversion( &lsp_fx[imult1616( add( k, 1 ), M )], Aq_fx, M ); + E_LPC_f_lsp_a_conversion( &lsp_fx[( k + 1 ) * M], Aq_fx, M ); { IGFDecRestoreTCX10SubFrameData_fx( st->hIGFDec, k ); } /* TCX decoder */ - decoder_tcx_ivas_fx( st, prm, Aq_fx, Aind, &synth_fx[imult1616( k, shr( st->L_frame, 1 ) )], &synthFB_fx[imult1616( k, shr( hTcxDec->L_frameTCX, 1 ) )], bfi, k, sba_dirac_stereo_flag ); + decoder_tcx_ivas_fx( st, prm, Aq_fx, Aind, &synth_fx[k * st->L_frame / 2], &synthFB_fx[k * ( hTcxDec->L_frameTCX / 2 )], bfi, k, sba_dirac_stereo_flag ); } } @@ -743,7 +743,7 @@ void stereo_tcx_core_dec_fx( IF( st->narrowBand || EQ_32( st->sr_core, INT_FS_12k8 ) || EQ_32( st->sr_core, INT_FS_16k ) ) { int_lsp_fx( st->L_frame, st->lspold_uw, lspnew_uw_fx, Aq_fx, M, interpol_frac_fx, 0 ); - Copy( Aq_fx, st->mem_Aq, i_mult( st->nb_subfr, ( M + 1 ) ) ); + Copy( Aq_fx, st->mem_Aq, i_mult( st->nb_subfr, ( M + 1 ) ) ); /* Q12 */ } } } @@ -764,9 +764,9 @@ void stereo_tcx_core_dec_fx( set16_fx( pitch_C, shl( round_fx( st->old_fpitch ), Q6 ), 4 ); /* note: codec_mode is forced to MODE2, since FEC_clas_estim() considers only TCX being in Mode2*/ - Word16 prev_codec_mode = st->codec_mode; + Word16 prev_codec_mode = st->codec_mode; /* Q0 */ move16(); - st->codec_mode = MODE2; + st->codec_mode = MODE2; /* Q0 */ move16(); IF( st->tcxonly ) { @@ -784,7 +784,7 @@ void stereo_tcx_core_dec_fx( FEC_clas_estim_fx( st, 0, st->L_frame, &st->clas_dec, st->core_ext_mode, pitch_C, synth_fx, &st->lp_ener_FER_fx, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, st->mem_syn_clas_estim_fx, &st->classifier_Q_mem_syn, hTcxLtpDec->tcxltp ? hTcxDec->tcxltp_last_gain_unmodified : MIN_16, CLASSIFIER_TCX, bfi, st->last_core_brate, -1 ); #endif } - st->codec_mode = prev_codec_mode; + st->codec_mode = prev_codec_mode; /* Q0 */ move16(); } } @@ -818,23 +818,23 @@ void stereo_tcx_core_dec_fx( } /* Update past buffers */ - Copy_Scale_sig( synth_buf_fx + st->L_frame, hTcxDec->old_synth, hTcxDec->old_synth_len, 0 ); - Copy( hTcxDec->old_synthFB_fx + sub( hTcxDec->L_frameTCX, NS2SA_FX2( st->output_Fs, PH_ECU_MEM_NS ) ), hTcxDec->synth_history_fx, NS2SA_FX2( st->output_Fs, PH_ECU_MEM_NS ) ); - Copy( synth_bufFB_fx + hTcxDec->L_frameTCX, hTcxDec->old_synthFB_fx, hTcxDec->old_synth_lenFB ); - Copy( st->hHQ_core->old_out_fx + NS2SA_FX2( st->output_Fs, N_ZERO_MDCT_NS ), hTcxDec->old_synthFB_fx + hTcxDec->old_synth_lenFB, NS2SA_FX2( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); + Copy_Scale_sig( synth_buf_fx + st->L_frame, hTcxDec->old_synth, hTcxDec->old_synth_len, 0 ); /* q_old_synth - st->Q_syn */ + Copy( hTcxDec->old_synthFB_fx + sub( hTcxDec->L_frameTCX, NS2SA_FX2( st->output_Fs, PH_ECU_MEM_NS ) ), hTcxDec->synth_history_fx, NS2SA_FX2( st->output_Fs, PH_ECU_MEM_NS ) ); /* q_old_synthFB */ + Copy( synth_bufFB_fx + hTcxDec->L_frameTCX, hTcxDec->old_synthFB_fx, hTcxDec->old_synth_lenFB ); /* q_old_synthFB */ + Copy( st->hHQ_core->old_out_fx + NS2SA_FX2( st->output_Fs, N_ZERO_MDCT_NS ), hTcxDec->old_synthFB_fx + hTcxDec->old_synth_lenFB, NS2SA_FX2( st->output_Fs, PH_ECU_LOOKAHEAD_NS ) ); /* exp(exp_old_out) */ Copy( &lspnew_uw_fx[imult1616( sub( st->numlpc, 1 ), M )], st->lspold_uw, M ); Copy( &lsfnew_uw_fx[imult1616( sub( st->numlpc, 1 ), M )], st->lsfold_uw, M ); IF( EQ_16( bfi, 1 ) ) { - Copy( st->lspold_uw, st->lsp_old_fx, M ); /* for recovery */ - Copy( st->lsfold_uw, st->lsf_old_fx, M ); /* for recovery */ + Copy( st->lspold_uw, st->lsp_old_fx, M ); /* for recovery Q15*/ + Copy( st->lsfold_uw, st->lsf_old_fx, M ); /* for recovery Q15*/ } ELSE { - Copy( &lsp_fx[i_mult( st->numlpc, M )], st->lsp_old_fx, M ); - Copy( &lsf_fx[i_mult( st->numlpc, M )], st->lsf_old_fx, M ); + Copy( &lsp_fx[( st->numlpc ) * M], st->lsp_old_fx, M ); /* Q15 */ + Copy( &lsf_fx[( st->numlpc ) * M], st->lsf_old_fx, M ); /* Q2.56 */ } Copy( st->lsp_q_cng, st->old_lsp_q_cng, M ); Copy( st->lsf_q_cng, st->old_lsf_q_cng, M ); @@ -851,7 +851,7 @@ void stereo_tcx_core_dec_fx( Word16 buf[L_LP], res[L_FRAME], A[M + 1], r_h[M + 1], r_l[M + 1], tmp, lsptmp[M], q_r; assert( EQ_16( st->L_frame, L_FRAME ) ); - Copy( synth_fx + L_FRAME - L_LP, buf, L_LP ); + Copy( synth_fx + L_FRAME - L_LP, buf, L_LP ); /* q_old_synth - st->Q_syn */ tmp = synth_fx[L_FRAME - L_LP - 1]; move16(); E_UTIL_f_preemph2( 0, buf, st->preemph_fac, L_LP, &tmp ); @@ -879,7 +879,7 @@ void stereo_tcx_core_dec_fx( } ELSE { - st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 1; + st->hTdCngDec->ho_16k_lsp[st->hTdCngDec->ho_circ_ptr] = 1; /* Q0 */ move16(); } } @@ -904,11 +904,11 @@ void stereo_tcx_core_dec_fx( IF( st->p_bpf_noise_buf_32 ) #endif // MSAN_FIX { - Copy_Scale_sig_16_32_no_sat( st->p_bpf_noise_buf, st->p_bpf_noise_buf_32, st->L_frame, Q11 ); + Copy_Scale_sig_16_32_no_sat( st->p_bpf_noise_buf, st->p_bpf_noise_buf_32, st->L_frame, Q11 ); /* q_p_bpf + Q11 */ } IF( signal_outFB_fx ) { - Copy( synthFB_fx, signal_outFB_fx, hTcxDec->L_frameTCX ); + Copy( synthFB_fx, signal_outFB_fx, hTcxDec->L_frameTCX ); /* q_old_synthFB */ } IF( !bfi ) @@ -941,7 +941,7 @@ void stereo_tcx_core_dec_fx( /* updates */ st->last_voice_factor_fx = 0; move16(); - st->last_coder_type = st->coder_type; + st->last_coder_type = st->coder_type; /* Q0 */ move16(); /* -------------------------------------------------------------- * @@ -956,9 +956,9 @@ void stereo_tcx_core_dec_fx( noisy_speech_detection_fx( st->hFdCngDec, st->VAD && EQ_16( st->m_frame_type, ACTIVE_FRAME ), signal_out_fx, 0 ); st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx = L_add( Mpy_32_32( Q31_0_99, st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx ), - imult3216( Q31_0_01, st->hFdCngDec->hFdCngCom->flag_noisy_speech ) ); - st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = extract_h( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx ); - st->lp_noise = st->hFdCngDec->lp_noise; + imult3216( Q31_0_01, st->hFdCngDec->hFdCngCom->flag_noisy_speech ) ); /* Q31 */ + st->hFdCngDec->hFdCngCom->likelihood_noisy_speech = extract_h( st->hFdCngDec->hFdCngCom->likelihood_noisy_speech_32fx ); /* Q15 */ + st->lp_noise = st->hFdCngDec->lp_noise; /* Q9.23 */ move32(); move32(); move16(); @@ -1765,9 +1765,9 @@ static void stereo_tcx_dec_mode_switch_reconf( #endif #ifdef IVAS_FLOAT_FIXED static void stereo_tcx_dec_mode_switch_reconf_ivas_fx( - Decoder_State *st, /* i/o: decoder state structure */ - const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0)*/ - const Word16 last_element_mode, /* i : element mode of previous frame */ + Decoder_State *st, /* i/o: decoder state structure */ + const Word16 MCT_flag, /* i : hMCT handle allocated (1) or not (0) Q0*/ + const Word16 last_element_mode, /* i : element mode of previous frame Q0*/ Word16 *Q_syn_Overl_TDAC, Word16 *Q_fer_samples, Word16 *Q_syn_Overl, @@ -1779,7 +1779,7 @@ static void stereo_tcx_dec_mode_switch_reconf_ivas_fx( { Word16 frame_size_index; - st->rate_switching_init = 1; + st->rate_switching_init = 1; /* Q0 */ move16(); /* Identify frame type - TCX Reconfiguration */ @@ -1808,12 +1808,12 @@ static void stereo_tcx_dec_mode_switch_reconf_ivas_fx( return; } static void dec_prm_tcx_ivas_fx( - Decoder_State *st, /* i/o: decoder memory state */ - Word16 param[], /* o : decoded parameters */ - Word16 param_lpc[], /* o : LPC parameters */ - Word16 *total_nbbits, /* i/o: number of bits / decoded bits */ - const Word16 last_element_mode, /* i : last element mode */ - Word16 *bitsRead /* o : number of read bits */ + Decoder_State *st, /* i/o: decoder memory state */ + Word16 param[], /* o : decoded parameters Q0*/ + Word16 param_lpc[], /* o : LPC parameters Q0*/ + Word16 *total_nbbits, /* i/o: number of bits / decoded bits Q0*/ + const Word16 last_element_mode, /* i : last element mode Q0*/ + Word16 *bitsRead /* o : number of read bits Q0*/ ) { Word16 start_bit_pos, bits_common; @@ -1830,14 +1830,14 @@ static void dec_prm_tcx_ivas_fx( IF( NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { // The value of 1/ FRAMES_PER_SEC shifted left by 19 because taking Q as 15 led to precision loss - st->bits_frame_core = extract_l( L_sub( L_shr( Mpy_32_16_1( st->total_brate, 10486 ), 4 ), st->next_bit_pos ) ); + st->bits_frame_core = extract_l( L_sub( L_shr( Mpy_32_16_1( st->total_brate, 10486 ), 4 ), st->next_bit_pos ) ); /* Q0 */ move16(); } - start_bit_pos = st->next_bit_pos; + start_bit_pos = st->next_bit_pos; /* Q0 */ move16(); /* Init LTP data */ - st->hTcxDec->tcx_hm_LtpPitchLag = -1; + st->hTcxDec->tcx_hm_LtpPitchLag = -1; /* Q0 */ move16(); st->hTcxLtpDec->tcxltp_gain = 0; move16(); @@ -1853,7 +1853,7 @@ static void dec_prm_tcx_ivas_fx( test(); IF( !st->use_partial_copy && NE_16( st->element_mode, IVAS_CPE_MDCT ) ) { - st->last_core_from_bs = get_next_indice_fx( st, 1 ); /* Store decoder memory of last_core */ + st->last_core_from_bs = get_next_indice_fx( st, 1 ); /* Store decoder memory of last_core Q0*/ move16(); test(); @@ -1862,7 +1862,7 @@ static void dec_prm_tcx_ivas_fx( /* A mismatch between the memory and the last_core from the bitstream indicates a frame was lost. If prev_bfi is not set the frame loss occured during CNG and the prev_bfi needs to be set. */ - st->prev_bfi = 1; + st->prev_bfi = 1; /* Q0 */ move16(); } @@ -1885,13 +1885,13 @@ static void dec_prm_tcx_ivas_fx( &st->hHQ_core->Q_old_wtda_LB, &Q_old_Aq_12_8 ); } - st->last_core = st->last_core_from_bs; + st->last_core = st->last_core_from_bs; /* Q0 */ move16(); /*for TCX 10 force last_core to be TCX since ACELP as previous core is forbidden*/ if ( EQ_16( st->core, TCX_10_CORE ) ) { - st->last_core = TCX_20_CORE; + st->last_core = TCX_20_CORE; /* Q0 */ move16(); } } @@ -1937,11 +1937,11 @@ static void dec_prm_tcx_ivas_fx( { st->BER_detect = 1; move16(); - st->next_bit_pos = add( start_bit_pos, sub( *total_nbbits, bitsRead[0] ) ); + st->next_bit_pos = add( start_bit_pos, sub( *total_nbbits, bitsRead[0] ) ); /* Q0 */ move16(); } - bitsRead[0] = sub( st->next_bit_pos, start_bit_pos ); + bitsRead[0] = sub( st->next_bit_pos, start_bit_pos ); /* Q0 */ move16(); } diff --git a/lib_dec/ivas_td_low_rate_dec.c b/lib_dec/ivas_td_low_rate_dec.c index 132a7d743..03f85a5d6 100644 --- a/lib_dec/ivas_td_low_rate_dec.c +++ b/lib_dec/ivas_td_low_rate_dec.c @@ -219,14 +219,14 @@ void tdm_low_rate_dec( #endif #ifdef IVAS_FLOAT_FIXED void tdm_low_rate_dec_fx( - Decoder_State *st, /* i/o: decoder static memory */ - Word16 dct_epit[], /* o : GSC excitation in DCT domain Q_exc */ - Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6 */ - Word16 *voice_factors, /* o : voicing factors Q15 */ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc */ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc */ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc */ - const Word16 *lsf_new /* i : ISFs at the end of the frame Q8/100 (2.56x) */ + Decoder_State *st, /* i/o: decoder static memory */ + Word16 dct_epit[], /* o : GSC excitation in DCT domain Q_exc*/ + Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ + Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ + const Word16 *lsf_new /* i : ISFs at the end of the frame Q8/100 (2.56x)*/ ) { Word16 tmp_nb_bits_tot, pit_band_idx; @@ -249,11 +249,11 @@ void tdm_low_rate_dec_fx( move16(); st->GSC_noisy_speech = 1; move16(); - hGSCDec->noise_lev = 14; + hGSCDec->noise_lev = 14; /* Q0 */ move16(); - pit_band_idx = 10 + BAND1k2; - hGSCDec->Last_GSC_pit_band_idx = pit_band_idx; + pit_band_idx = 10 + BAND1k2; /* Q0 */ + hGSCDec->Last_GSC_pit_band_idx = pit_band_idx; /* Q0 */ move16(); move16(); @@ -265,9 +265,9 @@ void tdm_low_rate_dec_fx( st->bpf_off = 1; move16(); - st->bfi_pitch_fx = mean_fx( pitch_buf, 4 ); + st->bfi_pitch_fx = mean_fx( pitch_buf, 4 ); /* Q6 */ move16(); - st->bfi_pitch_frame = L_FRAME; + st->bfi_pitch_frame = L_FRAME; /* Q0 */ move16(); Diff_len = L_FRAME / 2; move16(); @@ -285,24 +285,24 @@ void tdm_low_rate_dec_fx( *--------------------------------------------------------------------------------------*/ /* find the current total number of bits used */ - tmp_nb_bits_tot = st->next_bit_pos; + tmp_nb_bits_tot = st->next_bit_pos; /* Q0 */ move16(); move16(); if ( EQ_16( st->element_mode, IVAS_CPE_TD ) ) { - tmp_nb_bits_tot = add( tmp_nb_bits_tot, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ); + tmp_nb_bits_tot = add( tmp_nb_bits_tot, TDM_SIGNAL_BITS_READ_FROM_THE_END_OF_BS ); /* Q0 */ } if ( EQ_16( st->tdm_LRTD_flag, 1 ) ) { - tmp_nb_bits_tot = sub( tmp_nb_bits_tot, STEREO_BITS_TCA ); + tmp_nb_bits_tot = sub( tmp_nb_bits_tot, STEREO_BITS_TCA ); /* Q0 */ } if ( st->extl_brate_orig > 0 ) { /* subtract 1 bit for TBE/BWE BWE flag (bit counted in extl_brate) */ - tmp_nb_bits_tot = sub( tmp_nb_bits_tot, 1 ); + tmp_nb_bits_tot = sub( tmp_nb_bits_tot, 1 ); /* Q0 */ } gsc_dec_ivas_fx( st, dct_epit, pit_band_idx, Diff_len, tmp_nb_bits_tot, nb_subfr, st->coder_type, &last_bin, lsf_new, exc_wo_nf_fx, &st->Q_exc ); @@ -348,8 +348,8 @@ void tdm_low_rate_dec_fx( * Updates *--------------------------------------------------------------------------------------*/ - Copy( exc, exc2, L_FRAME ); - Copy( exc_wo_nf_fx, exc, L_FRAME ); + Copy( exc, exc2, L_FRAME ); /* Q_exc */ + Copy( exc_wo_nf_fx, exc, L_FRAME ); /* Q_exc */ /*--------------------------------------------------------------------------------------* * Channel aware mode parameters @@ -507,16 +507,16 @@ void decod_gen_2sbfr( void decod_gen_2sbfr_ivas_fx( Decoder_State *st, /* i/o: decoder static memory */ - const Word16 sharpFlag, /* i : formant sharpening flag */ - const Word16 *Aq, /* i : LP filter coefficient Q12 */ - Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6 */ - Word16 *voice_factors, /* o : voicing factors Q15 */ - Word16 *exc, /* i/o: adapt. excitation exc Q_exc */ - Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc */ - Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc */ - Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14 */ - const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */ - const Word16 tdm_Pri_pitch_buf[] /* i : pitch values for primary channel Q6 */ + const Word16 sharpFlag, /* i : formant sharpening flag `Q0*/ + const Word16 *Aq, /* i : LP filter coefficient Q12*/ + Word16 *pitch_buf, /* o : Word16 pitch values for each subframe Q6*/ + Word16 *voice_factors, /* o : voicing factors Q15*/ + Word16 *exc, /* i/o: adapt. excitation exc Q_exc*/ + Word16 *exc2, /* i/o: adapt. excitation/total exc Q_exc*/ + Word16 *bwe_exc, /* o : excitation for SWB TBE Q_exc*/ + Word16 *gain_buf, /* o : Word16 pitch gain for each subframe Q14*/ + const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag Q0*/ + const Word16 tdm_Pri_pitch_buf[] /* i : pitch values for primary channel Q6*/ ) { Word16 T0, T0_frac, T0_min, T0_max; /* integer pitch variables */ @@ -560,8 +560,8 @@ void decod_gen_2sbfr_ivas_fx( * ACELP subframe loop *------------------------------------------------------------------*/ - p_Aq = Aq; /* pointer to interpolated LPC parameters */ - pt_pitch = pitch_buf; /* pointer to the pitch buffer */ + p_Aq = Aq; /* pointer to interpolated LPC parameters Q12*/ + pt_pitch = pitch_buf; /* pointer to the pitch buffer Q6*/ FOR( i_subfr = 0; i_subfr < L_frame; i_subfr += 2 * L_SUBFR ) { @@ -569,7 +569,7 @@ void decod_gen_2sbfr_ivas_fx( * Decode pitch lag *----------------------------------------------------------------------*/ - *pt_pitch = pit_decode_ivas_fx( st, st->core_brate, 0, L_frame, i_subfr, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, 2 * L_SUBFR, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); + *pt_pitch = pit_decode_ivas_fx( st, st->core_brate, 0, L_frame, i_subfr, GENERIC, &pitch_limit_flag, &T0, &T0_frac, &T0_min, &T0_max, 2 * L_SUBFR, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf ); /* Q6 */ test(); test(); @@ -602,19 +602,19 @@ void decod_gen_2sbfr_ivas_fx( *--------------------------------------------------------------*/ gain_dec_lbr_ivas_fx( st, GENERIC, i_subfr, code, &gain_pit, &gain_code, &gain_inov, &norm_gain_code, gc_mem, gp_mem, 2 * L_SUBFR ); - st->tilt_code_fx = est_tilt_ivas_fx( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, st->Q_exc, 2 * L_SUBFR, 0 ); + st->tilt_code_fx = est_tilt_ivas_fx( exc + i_subfr, gain_pit, code, gain_code, &voice_fac, st->Q_exc, 2 * L_SUBFR, 0 ); /* Q15 */ move16(); /* update LP filtered gains for the case of frame erasures */ lp_gain_updt_ivas_fx( i_subfr, gain_pit, norm_gain_code, &st->lp_gainp_fx, &st->lp_gainc_fx, L_frame ); - lp_gain_updt_ivas_fx( i_subfr + L_SUBFR, gain_pit, norm_gain_code, &st->lp_gainp_fx, &st->lp_gainc_fx, L_frame ); + lp_gain_updt_ivas_fx( add( i_subfr, L_SUBFR ), gain_pit, norm_gain_code, &st->lp_gainp_fx, &st->lp_gainc_fx, L_frame ); /*----------------------------------------------------------------------* * Find the total excitation *----------------------------------------------------------------------*/ #ifdef FIX_734_MISSING_SUBFR_LOW_RATE_ACELP /* Don't need the if/else as here L_frame==L_FRAME all the time */ - Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, &exc[i_subfr], ( bwe_exc != NULL ) ? &bwe_exc[imult1616( i_subfr, HIBND_ACB_L_FAC )] : NULL, st->hGSCDec->last_exc_dct_in_fx, + Rescale_exc( st->hMusicPF->dct_post_old_exc_fx, &exc[i_subfr], ( bwe_exc != NULL ) ? &bwe_exc[i_subfr * HIBND_ACB_L_FAC] : NULL, st->hGSCDec->last_exc_dct_in_fx, 2 * L_SUBFR, 2 * L_SUBFR * HIBND_ACB_L_FAC, gain_code, &( st->Q_exc ), st->Q_subfr, exc2, i_subfr, st->coder_type ); #else @@ -646,7 +646,7 @@ void decod_gen_2sbfr_ivas_fx( // prep_tbe_exc_fx(L_frame, /*L_SUBFR,*/ i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, 0, NULL, Q_exc, T0, T0_frac, GENERIC, st->core_brate/*, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag*/); prep_tbe_exc_ivas_fx( L_frame, L_SUBFR, i_subfr, gain_pit, gain_code, code, voice_fac, &voice_factors[i_subfr / L_SUBFR], bwe_exc, 0, NULL, st->Q_exc, T0, T0_frac, GENERIC, st->core_brate, st->element_mode, st->idchan, st->hBWE_TD != NULL, st->tdm_LRTD_flag ); #endif - voice_factors[add( shr( i_subfr, 6 ) /*i_subfr / L_SUBFR*/, 1 )] = voice_factors[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/]; + voice_factors[i_subfr / L_SUBFR + 1] = voice_factors[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/]; /* Q15 */ move16(); /*----------------------------------------------------------------* @@ -666,25 +666,25 @@ void decod_gen_2sbfr_ivas_fx( // enhancer_fx(MODE1, st->core_brate, -1, 0, GENERIC, L_frame, voice_fac, st->stab_fac, norm_gain_code, gain_inov, &st->gc_threshold, code + L_SUBFR, exc2 + i_subfr + L_SUBFR, gain_pit, st->dispMem); enhancer_fx( st->core_brate, 0, GENERIC, i_subfr, L_frame, voice_fac, st->stab_fac_fx, norm_gain_code, gain_inov, &st->gc_threshold_fx, code + L_SUBFR, exc2 + L_SUBFR, gain_pit, &st->dm_fx, st->Q_exc ); #endif - p_Aq += 2 * ( M + 1 ); + p_Aq += 2 * ( M + 1 ); /* Q12 */ pt_pitch++; - *pt_pitch = *( pt_pitch - 1 ); + *pt_pitch = *( pt_pitch - 1 ); /* Q6 */ move16(); pt_pitch++; - gain_buf[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/] = gain_pit; + gain_buf[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/] = gain_pit; /* Q14 */ move16(); - gain_buf[shr( add( i_subfr, L_SUBFR ), 6 ) /*(i_subfr+L_SUBFR) / L_SUBFR*/] = gain_pit; + gain_buf[( i_subfr + L_SUBFR ) / L_SUBFR /*(i_subfr+L_SUBFR) / L_SUBFR*/] = gain_pit; /* Q14 */ move16(); - st->tilt_code_dec_fx[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/] = st->tilt_code_fx; + st->tilt_code_dec_fx[i_subfr / L_SUBFR /*i_subfr / L_SUBFR*/] = st->tilt_code_fx; /* Q15 */ move16(); - st->tilt_code_dec_fx[shr( add( i_subfr, L_SUBFR ), 6 ) /*( i_subfr + L_SUBFR ) / L_SUBFR*/] = st->tilt_code_fx; + st->tilt_code_dec_fx[( i_subfr + L_SUBFR ) / L_SUBFR /*( i_subfr + L_SUBFR ) / L_SUBFR*/] = st->tilt_code_fx; /* Q15 */ move16(); } /* SC-VBR */ - st->prev_gain_pit_dec_fx = gain_pit; + st->prev_gain_pit_dec_fx = gain_pit; /* Q14 */ move16(); return; diff --git a/lib_rend/ivas_crend.c b/lib_rend/ivas_crend.c index 255ad1b24..78ebf384d 100644 --- a/lib_rend/ivas_crend.c +++ b/lib_rend/ivas_crend.c @@ -306,22 +306,22 @@ static ivas_error ivas_rend_initCrend_fx( { hHrtf->max_num_ir = sub( hHrtf->max_num_ir, 1 ); /* subtract LFE */ move16(); - hHrtf->gain_lfe_fx = GAIN_LFE_FX; + hHrtf->gain_lfe_fx = GAIN_LFE_FX; // Q14 move16(); IF( EQ_32( output_Fs, 48000 ) ) { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { - hHrtf->latency_s_fx = CRendBin_Combined_BRIR_latency_s_fx; - hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_48kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz; + hHrtf->latency_s_fx = CRendBin_Combined_BRIR_latency_s_fx; // Q31 + hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_48kHz; // Q0 + hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_48kHz; // Q0 } ELSE { - hHrtf->latency_s_fx = CRendBin_Combined_HRIR_latency_s_fx; - hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_48kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz; + hHrtf->latency_s_fx = CRendBin_Combined_HRIR_latency_s_fx; // Q31 + hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_48kHz; // Q0 + hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_48kHz; // Q0 } move32(); move16(); @@ -331,19 +331,19 @@ static ivas_error ivas_rend_initCrend_fx( { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { - hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_48kHz[j]; // Q0 + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_48kHz[j]; // Q0 - hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_48kHz_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_48kHz_fx[j]; // Q31 } ELSE { - hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; + hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_48kHz[j]; // Q0 + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; // Q0 - hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_48kHz_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_48kHz_fx[j]; // Q31 } move32(); move32(); @@ -355,15 +355,15 @@ static ivas_error ivas_rend_initCrend_fx( { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { - hHrtf->latency_s_fx = CRendBin_Combined_BRIR_latency_s_fx; - hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_32kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz; + hHrtf->latency_s_fx = CRendBin_Combined_BRIR_latency_s_fx; // Q31 + hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_32kHz; // Q0 + hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_32kHz; // Q0 } ELSE { - hHrtf->latency_s_fx = CRendBin_Combined_HRIR_latency_s_fx; - hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_32kHz; - hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz; + hHrtf->latency_s_fx = CRendBin_Combined_HRIR_latency_s_fx; // Q31 + hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_32kHz; // Q0 + hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_32kHz; // Q0 } move32(); move16(); @@ -373,19 +373,19 @@ static ivas_error ivas_rend_initCrend_fx( { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { - hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_32kHz[j]; // Q0 + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_32kHz[j]; // Q0 - hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_32kHz_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_32kHz_fx[j]; // Q31 } ELSE { - hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[j]; - hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; + hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_32kHz[j]; // Q0 + hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; // Q0 - hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_32kHz_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_32kHz_fx[j]; // Q31 } move32(); move32(); @@ -397,13 +397,13 @@ static ivas_error ivas_rend_initCrend_fx( { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { - hHrtf->latency_s_fx = CRendBin_Combined_BRIR_latency_s_fx; + hHrtf->latency_s_fx = CRendBin_Combined_BRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_Combined_BRIR_max_num_iterations_16kHz; hHrtf->index_frequency_max_diffuse = CRendBin_Combined_BRIR_index_frequency_max_diffuse_16kHz; } ELSE { - hHrtf->latency_s_fx = CRendBin_Combined_HRIR_latency_s_fx; + hHrtf->latency_s_fx = CRendBin_Combined_HRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_Combined_HRIR_max_num_iterations_16kHz; hHrtf->index_frequency_max_diffuse = CRendBin_Combined_HRIR_index_frequency_max_diffuse_16kHz; } @@ -418,16 +418,16 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_BRIR_num_iterations_diffuse_16kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_BRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_Combined_BRIR_coeff_diffuse_re_16kHz_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_Combined_BRIR_coeff_diffuse_im_16kHz_fx[j]; // Q31 } ELSE { hHrtf->num_iterations_diffuse[j] = CRendBin_Combined_HRIR_num_iterations_diffuse_16kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_Combined_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_Combined_HRIR_coeff_diffuse_re_16kHz_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_Combined_HRIR_coeff_diffuse_im_16kHz_fx[j]; // Q31 } move32(); move32(); @@ -472,11 +472,11 @@ static ivas_error ivas_rend_initCrend_fx( { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[tmp]; + hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_48kHz_fx[tmp]; // Q15 } ELSE { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[tmp]; + hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_48kHz_fx[tmp]; // Q15 } move16(); @@ -487,16 +487,16 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_48kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_48kHz[tmp][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_Combined_BRIR_coeff_re_48kHz_fx[tmp][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_Combined_BRIR_coeff_im_48kHz_fx[tmp][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_Combined_BRIR_coeff_re_48kHz_fx[tmp][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_Combined_BRIR_coeff_im_48kHz_fx[tmp][j]; // Q29 } ELSE { hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_48kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_48kHz[tmp][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_Combined_HRIR_coeff_re_48kHz_fx[tmp][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_Combined_HRIR_coeff_im_48kHz_fx[tmp][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_Combined_HRIR_coeff_re_48kHz_fx[tmp][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_Combined_HRIR_coeff_im_48kHz_fx[tmp][j]; // Q29 } move32(); move32(); @@ -508,11 +508,11 @@ static ivas_error ivas_rend_initCrend_fx( { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[tmp]; + hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_32kHz_fx[tmp]; // Q15 } ELSE { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[tmp]; + hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_32kHz_fx[tmp]; // Q15 } move16(); @@ -523,16 +523,16 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_32kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_32kHz[tmp][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_Combined_BRIR_coeff_re_32kHz_fx[tmp][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_Combined_BRIR_coeff_im_32kHz_fx[tmp][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_Combined_BRIR_coeff_re_32kHz_fx[tmp][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_Combined_BRIR_coeff_im_32kHz_fx[tmp][j]; // Q29 } ELSE { hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_32kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_32kHz[tmp][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_Combined_HRIR_coeff_re_32kHz_fx[tmp][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_Combined_HRIR_coeff_im_32kHz_fx[tmp][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_Combined_HRIR_coeff_re_32kHz_fx[tmp][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_Combined_HRIR_coeff_im_32kHz_fx[tmp][j]; // Q29 } move32(); move32(); @@ -544,11 +544,11 @@ static ivas_error ivas_rend_initCrend_fx( { IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[tmp]; + hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_BRIR_inv_diffuse_weight_16kHz_fx[tmp]; // Q15 } ELSE { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[tmp]; + hHrtf->inv_diffuse_weight_fx[i] = CRendBin_Combined_HRIR_inv_diffuse_weight_16kHz_fx[tmp]; // Q15 } move16(); @@ -559,16 +559,16 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations[i][j] = CRendBin_Combined_BRIR_num_iterations_16kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_BRIR_pIndex_frequency_max_16kHz[tmp][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_Combined_BRIR_coeff_re_16kHz_fx[tmp][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_Combined_BRIR_coeff_im_16kHz_fx[tmp][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_Combined_BRIR_coeff_re_16kHz_fx[tmp][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_Combined_BRIR_coeff_im_16kHz_fx[tmp][j]; // Q29 } ELSE { hHrtf->num_iterations[i][j] = CRendBin_Combined_HRIR_num_iterations_16kHz[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_Combined_HRIR_pIndex_frequency_max_16kHz[tmp][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_Combined_HRIR_coeff_re_16kHz_fx[tmp][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_Combined_HRIR_coeff_im_16kHz_fx[tmp][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_Combined_HRIR_coeff_re_16kHz_fx[tmp][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_Combined_HRIR_coeff_im_16kHz_fx[tmp][j]; // Q29 } move32(); move32(); @@ -588,7 +588,7 @@ static ivas_error ivas_rend_initCrend_fx( { IF( EQ_32( output_Fs, 48000 ) ) { - hHrtf->latency_s_fx = CRendBin_HOA3_HRIR_latency_s_fx; + hHrtf->latency_s_fx = CRendBin_HOA3_HRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_48kHz; hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_48kHz; move32(); @@ -597,7 +597,7 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[i]; + hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_48kHz_fx[i]; // Q15 move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) @@ -605,8 +605,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_48kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_48kHz[i][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_HOA3_HRIR_coeff_re_48kHz_fx[i][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz_fx[i][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_HOA3_HRIR_coeff_re_48kHz_fx[i][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_HOA3_HRIR_coeff_im_48kHz_fx[i][j]; // Q29 move32(); move32(); move16(); @@ -618,8 +618,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_48kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_48kHz_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_48kHz_fx[j]; // Q31 move32(); move32(); move16(); @@ -628,7 +628,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_32( output_Fs, 32000 ) ) { - hHrtf->latency_s_fx = CRendBin_HOA3_HRIR_latency_s_fx; + hHrtf->latency_s_fx = CRendBin_HOA3_HRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_32kHz; hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_32kHz; move32(); @@ -637,7 +637,7 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[i]; + hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_32kHz_fx[i]; // Q15 move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) @@ -645,8 +645,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_32kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_32kHz[i][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_HOA3_HRIR_coeff_re_32kHz_fx[i][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_HOA3_HRIR_coeff_im_32kHz_fx[i][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_HOA3_HRIR_coeff_re_32kHz_fx[i][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_HOA3_HRIR_coeff_im_32kHz_fx[i][j]; // Q29 move32(); move32(); move16(); @@ -659,8 +659,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_32kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_32kHz_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_32kHz_fx[j]; // Q31 move32(); move32(); move16(); @@ -669,7 +669,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_32( output_Fs, 16000 ) ) { - hHrtf->latency_s_fx = CRendBin_HOA3_HRIR_latency_s_fx; + hHrtf->latency_s_fx = CRendBin_HOA3_HRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_HOA3_HRIR_max_num_iterations_16kHz; hHrtf->index_frequency_max_diffuse = CRendBin_HOA3_HRIR_index_frequency_max_diffuse_16kHz; move32(); @@ -678,7 +678,7 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[i]; + hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA3_HRIR_inv_diffuse_weight_16kHz_fx[i]; // Q15 move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) @@ -686,8 +686,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations[i][j] = CRendBin_HOA3_HRIR_num_iterations_16kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_16kHz[i][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_HOA3_HRIR_coeff_re_16kHz_fx[i][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_HOA3_HRIR_coeff_im_16kHz_fx[i][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_HOA3_HRIR_coeff_re_16kHz_fx[i][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_HOA3_HRIR_coeff_im_16kHz_fx[i][j]; // Q29 move32(); move32(); move16(); @@ -700,8 +700,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations_diffuse[j] = CRendBin_HOA3_HRIR_num_iterations_diffuse_16kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA3_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_HOA3_HRIR_coeff_diffuse_re_16kHz_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_HOA3_HRIR_coeff_diffuse_im_16kHz_fx[j]; // Q31 move32(); move32(); move16(); @@ -717,7 +717,7 @@ static ivas_error ivas_rend_initCrend_fx( { IF( EQ_32( output_Fs, 48000 ) ) { - hHrtf->latency_s_fx = CRendBin_HOA2_HRIR_latency_s_fx; + hHrtf->latency_s_fx = CRendBin_HOA2_HRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_48kHz; hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_48kHz; move32(); @@ -726,7 +726,7 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[i]; + hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_48kHz_fx[i]; // Q15 move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) @@ -734,8 +734,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_48kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_48kHz[i][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_HOA2_HRIR_coeff_re_48kHz_fx[i][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_HOA2_HRIR_coeff_im_48kHz_fx[i][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_HOA2_HRIR_coeff_re_48kHz_fx[i][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_HOA2_HRIR_coeff_im_48kHz_fx[i][j]; // Q29 move32(); move32(); move16(); @@ -747,8 +747,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_48kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_48kHz_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_48kHz_fx[j]; // Q31 move32(); move32(); move16(); @@ -757,7 +757,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_32( output_Fs, 32000 ) ) { - hHrtf->latency_s_fx = CRendBin_HOA2_HRIR_latency_s_fx; + hHrtf->latency_s_fx = CRendBin_HOA2_HRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_32kHz; hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_32kHz; move32(); @@ -766,7 +766,7 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[i]; + hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_32kHz_fx[i]; // Q15 move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) @@ -774,8 +774,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_32kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_32kHz[i][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_HOA2_HRIR_coeff_re_32kHz_fx[i][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_HOA2_HRIR_coeff_im_32kHz_fx[i][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_HOA2_HRIR_coeff_re_32kHz_fx[i][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_HOA2_HRIR_coeff_im_32kHz_fx[i][j]; // Q29 move32(); move32(); move16(); @@ -788,8 +788,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_32kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_32kHz_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_32kHz_fx[j]; // Q31 move32(); move32(); move16(); @@ -798,7 +798,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_32( output_Fs, 16000 ) ) { - hHrtf->latency_s_fx = CRendBin_HOA2_HRIR_latency_s_fx; + hHrtf->latency_s_fx = CRendBin_HOA2_HRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_HOA2_HRIR_max_num_iterations_16kHz; hHrtf->index_frequency_max_diffuse = CRendBin_HOA2_HRIR_index_frequency_max_diffuse_16kHz; move32(); @@ -807,7 +807,7 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[i]; + hHrtf->inv_diffuse_weight_fx[i] = CRendBin_HOA2_HRIR_inv_diffuse_weight_16kHz_fx[i]; // Q15 move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) @@ -815,8 +815,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations[i][j] = CRendBin_HOA2_HRIR_num_iterations_16kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_16kHz[i][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_HOA2_HRIR_coeff_re_16kHz_fx[i][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_HOA2_HRIR_coeff_im_16kHz_fx[i][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_HOA2_HRIR_coeff_re_16kHz_fx[i][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_HOA2_HRIR_coeff_im_16kHz_fx[i][j]; // Q29 move32(); move32(); move16(); @@ -829,8 +829,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations_diffuse[j] = CRendBin_HOA2_HRIR_num_iterations_diffuse_16kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_HOA2_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_HOA2_HRIR_coeff_diffuse_re_16kHz_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_HOA2_HRIR_coeff_diffuse_im_16kHz_fx[j]; // Q31 move32(); move32(); move16(); @@ -846,7 +846,7 @@ static ivas_error ivas_rend_initCrend_fx( { IF( EQ_32( output_Fs, 48000 ) ) { - hHrtf->latency_s_fx = CRendBin_FOA_HRIR_latency_s_fx; + hHrtf->latency_s_fx = CRendBin_FOA_HRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_48kHz; hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_48kHz; move32(); @@ -855,7 +855,7 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[i]; + hHrtf->inv_diffuse_weight_fx[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_48kHz_fx[i]; // Q15 move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) @@ -863,8 +863,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_48kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_48kHz[i][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_FOA_HRIR_coeff_re_48kHz_fx[i][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_FOA_HRIR_coeff_im_48kHz_fx[i][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_FOA_HRIR_coeff_re_48kHz_fx[i][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_FOA_HRIR_coeff_im_48kHz_fx[i][j]; // Q29 move32(); move32(); move16(); @@ -876,8 +876,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_48kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_48kHz[j]; - hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_48kHz_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_48kHz_fx[j]; // Q31 move32(); move32(); move16(); @@ -886,7 +886,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_32( output_Fs, 32000 ) ) { - hHrtf->latency_s_fx = CRendBin_FOA_HRIR_latency_s_fx; + hHrtf->latency_s_fx = CRendBin_FOA_HRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_32kHz; hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_32kHz; move32(); @@ -895,7 +895,7 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[i]; + hHrtf->inv_diffuse_weight_fx[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_32kHz_fx[i]; // Q15 move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) @@ -903,8 +903,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_32kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_32kHz[i][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_FOA_HRIR_coeff_re_32kHz_fx[i][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_FOA_HRIR_coeff_im_32kHz_fx[i][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_FOA_HRIR_coeff_re_32kHz_fx[i][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_FOA_HRIR_coeff_im_32kHz_fx[i][j]; // Q29 move32(); move32(); move16(); @@ -917,8 +917,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_32kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_32kHz[j]; - hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_32kHz_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_32kHz_fx[j]; // Q31 move32(); move32(); move16(); @@ -927,7 +927,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_32( output_Fs, 16000 ) ) { - hHrtf->latency_s_fx = CRendBin_FOA_HRIR_latency_s_fx; + hHrtf->latency_s_fx = CRendBin_FOA_HRIR_latency_s_fx; // Q31 hHrtf->max_num_iterations = CRendBin_FOA_HRIR_max_num_iterations_16kHz; hHrtf->index_frequency_max_diffuse = CRendBin_FOA_HRIR_index_frequency_max_diffuse_16kHz; move32(); @@ -936,7 +936,7 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[i]; + hHrtf->inv_diffuse_weight_fx[i] = CRendBin_FOA_HRIR_inv_diffuse_weight_16kHz_fx[i]; // Q15 move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) @@ -944,8 +944,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations[i][j] = CRendBin_FOA_HRIR_num_iterations_16kHz[i][j]; hHrtf->pIndex_frequency_max[i][j] = CRendBin_FOA_HRIR_pIndex_frequency_max_16kHz[i][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_FOA_HRIR_coeff_re_16kHz_fx[i][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_FOA_HRIR_coeff_im_16kHz_fx[i][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = CRendBin_FOA_HRIR_coeff_re_16kHz_fx[i][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = CRendBin_FOA_HRIR_coeff_im_16kHz_fx[i][j]; // Q29 move32(); move32(); move16(); @@ -958,8 +958,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations_diffuse[j] = CRendBin_FOA_HRIR_num_iterations_diffuse_16kHz[j]; hHrtf->pIndex_frequency_max_diffuse[j] = CRendBin_FOA_HRIR_pIndex_frequency_max_diffuse_16kHz[j]; - hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = CRendBin_FOA_HRIR_coeff_diffuse_re_16kHz_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = CRendBin_FOA_HRIR_coeff_diffuse_im_16kHz_fx[j]; // Q31 move32(); move32(); move16(); @@ -992,13 +992,13 @@ static ivas_error ivas_rend_initCrend_fx( IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { - hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_brir_combined->latency_s_fx; + hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_brir_combined->latency_s_fx; // Q31 hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_brir_combined->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_brir_combined->index_frequency_max_diffuse; } ELSE { - hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_combined->latency_s_fx; + hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_combined->latency_s_fx; // Q31 hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_combined->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_combined->index_frequency_max_diffuse; } @@ -1013,16 +1013,16 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_brir_combined->num_iterations_diffuse[j]; hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_brir_combined->pIndex_frequency_max_diffuse[j]; - hHrtf->pOut_to_bin_diffuse_re_fx[j] = hSetOfHRTF->hHRTF_brir_combined->pOut_to_bin_diffuse_re_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = hSetOfHRTF->hHRTF_brir_combined->pOut_to_bin_diffuse_im_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = hSetOfHRTF->hHRTF_brir_combined->pOut_to_bin_diffuse_re_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = hSetOfHRTF->hHRTF_brir_combined->pOut_to_bin_diffuse_im_fx[j]; // Q31 } ELSE { hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_combined->num_iterations_diffuse[j]; hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_combined->pIndex_frequency_max_diffuse[j]; - hHrtf->pOut_to_bin_diffuse_re_fx[j] = hSetOfHRTF->hHRTF_hrir_combined->pOut_to_bin_diffuse_re_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = hSetOfHRTF->hHRTF_hrir_combined->pOut_to_bin_diffuse_im_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = hSetOfHRTF->hHRTF_hrir_combined->pOut_to_bin_diffuse_re_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = hSetOfHRTF->hHRTF_hrir_combined->pOut_to_bin_diffuse_im_fx[j]; // Q31 } move32(); move32(); @@ -1060,11 +1060,11 @@ static ivas_error ivas_rend_initCrend_fx( IF( EQ_16( outConfig, IVAS_AUDIO_CONFIG_BINAURAL_ROOM_IR ) ) { - hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_brir_combined->inv_diffuse_weight_fx[tmp]; + hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_brir_combined->inv_diffuse_weight_fx[tmp]; // Q15 } ELSE { - hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_combined->inv_diffuse_weight_fx[tmp]; + hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_combined->inv_diffuse_weight_fx[tmp]; // Q15 } move16(); @@ -1075,16 +1075,16 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_brir_combined->num_iterations[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_brir_combined->pIndex_frequency_max[tmp][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = hSetOfHRTF->hHRTF_brir_combined->pOut_to_bin_re_fx[tmp][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = hSetOfHRTF->hHRTF_brir_combined->pOut_to_bin_im_fx[tmp][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = hSetOfHRTF->hHRTF_brir_combined->pOut_to_bin_re_fx[tmp][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = hSetOfHRTF->hHRTF_brir_combined->pOut_to_bin_im_fx[tmp][j]; // Q29 } ELSE { hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_combined->num_iterations[tmp][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_combined->pIndex_frequency_max[tmp][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = hSetOfHRTF->hHRTF_hrir_combined->pOut_to_bin_re_fx[tmp][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = hSetOfHRTF->hHRTF_hrir_combined->pOut_to_bin_im_fx[tmp][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = hSetOfHRTF->hHRTF_hrir_combined->pOut_to_bin_re_fx[tmp][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = hSetOfHRTF->hHRTF_hrir_combined->pOut_to_bin_im_fx[tmp][j]; // Q29 } move32(); move32(); @@ -1097,7 +1097,7 @@ static ivas_error ivas_rend_initCrend_fx( { IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_HOA3 ) ) { - hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s_fx; + hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_hoa3->latency_s_fx; // Q31 hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa3->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa3->index_frequency_max_diffuse; move32(); @@ -1106,7 +1106,7 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_hoa3->inv_diffuse_weight_fx[i]; + hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_hoa3->inv_diffuse_weight_fx[i]; // Q31 move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) @@ -1114,8 +1114,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->num_iterations[i][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pIndex_frequency_max[i][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_re_fx[i][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_im_fx[i][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_re_fx[i][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_im_fx[i][j]; // Q29 move32(); move32(); move16(); @@ -1127,8 +1127,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa3->num_iterations_diffuse[j]; hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pIndex_frequency_max_diffuse[j]; - hHrtf->pOut_to_bin_diffuse_re_fx[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_re_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_im_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_re_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = hSetOfHRTF->hHRTF_hrir_hoa3->pOut_to_bin_diffuse_im_fx[j]; // Q31 move32(); move32(); move16(); @@ -1137,7 +1137,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_HOA2 ) ) { - hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_hoa2->latency_s_fx; + hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_hoa2->latency_s_fx; // Q31 hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_hoa2->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_hoa2->index_frequency_max_diffuse; move32(); @@ -1146,7 +1146,7 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_hoa2->inv_diffuse_weight_fx[i]; + hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_hoa2->inv_diffuse_weight_fx[i]; // Q15 move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) @@ -1154,8 +1154,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->num_iterations[i][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pIndex_frequency_max[i][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_re_fx[i][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_im_fx[i][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_re_fx[i][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_im_fx[i][j]; // Q29 move32(); move32(); move16(); @@ -1167,8 +1167,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa2->num_iterations_diffuse[j]; hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pIndex_frequency_max_diffuse[j]; - hHrtf->pOut_to_bin_diffuse_re_fx[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_diffuse_re_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_diffuse_im_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_diffuse_re_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = hSetOfHRTF->hHRTF_hrir_hoa2->pOut_to_bin_diffuse_im_fx[j]; // Q31 move32(); move32(); move16(); @@ -1177,7 +1177,7 @@ static ivas_error ivas_rend_initCrend_fx( } ELSE IF( EQ_16( inConfig, IVAS_AUDIO_CONFIG_FOA ) ) { - hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_foa->latency_s_fx; + hHrtf->latency_s_fx = hSetOfHRTF->hHRTF_hrir_foa->latency_s_fx; // Q31 hHrtf->max_num_iterations = hSetOfHRTF->hHRTF_hrir_foa->max_num_iterations; hHrtf->index_frequency_max_diffuse = hSetOfHRTF->hHRTF_hrir_foa->index_frequency_max_diffuse; move32(); @@ -1186,7 +1186,7 @@ static ivas_error ivas_rend_initCrend_fx( FOR( i = 0; i < hHrtf->max_num_ir; i++ ) { - hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_foa->inv_diffuse_weight_fx[i]; + hHrtf->inv_diffuse_weight_fx[i] = hSetOfHRTF->hHRTF_hrir_foa->inv_diffuse_weight_fx[i]; // Q31 move16(); FOR( j = 0; j < BINAURAL_CHANNELS; j++ ) @@ -1194,8 +1194,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations[i][j] = hSetOfHRTF->hHRTF_hrir_foa->num_iterations[i][j]; hHrtf->pIndex_frequency_max[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pIndex_frequency_max[i][j]; - hHrtf->pOut_to_bin_re_fx[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_re_fx[i][j]; - hHrtf->pOut_to_bin_im_fx[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_im_fx[i][j]; + hHrtf->pOut_to_bin_re_fx[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_re_fx[i][j]; // Q29 + hHrtf->pOut_to_bin_im_fx[i][j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_im_fx[i][j]; // Q29 move32(); move32(); move16(); @@ -1207,8 +1207,8 @@ static ivas_error ivas_rend_initCrend_fx( hHrtf->num_iterations_diffuse[j] = hSetOfHRTF->hHRTF_hrir_foa->num_iterations_diffuse[j]; hHrtf->pIndex_frequency_max_diffuse[j] = hSetOfHRTF->hHRTF_hrir_foa->pIndex_frequency_max_diffuse[j]; - hHrtf->pOut_to_bin_diffuse_re_fx[j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_diffuse_re_fx[j]; - hHrtf->pOut_to_bin_diffuse_im_fx[j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_diffuse_im_fx[j]; + hHrtf->pOut_to_bin_diffuse_re_fx[j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_diffuse_re_fx[j]; // Q31 + hHrtf->pOut_to_bin_diffuse_im_fx[j] = hSetOfHRTF->hHRTF_hrir_foa->pOut_to_bin_diffuse_im_fx[j]; // Q31 move32(); move32(); move16(); @@ -2341,7 +2341,7 @@ static ivas_error ivas_er_init_handle( move32(); if ( EQ_16( i, 2 ) ) { - reflections->user_origin_fx[i] = ER_LIST_HEIGHT_FX; + reflections->user_origin_fx[i] = ER_LIST_HEIGHT_FX; // Q22 move32(); } } @@ -2675,7 +2675,7 @@ ivas_error ivas_rend_openCrend( /* Set sample rate and frame size */ - hCrend->reflections->output_Fs_fx = output_Fs; + hCrend->reflections->output_Fs_fx = output_Fs; // Q0 move32(); hCrend->reflections->max_frame_size = extract_l( Mult_32_16( output_Fs, INV_FRAME_PER_SEC_Q15 ) ); @@ -2721,6 +2721,7 @@ void ivas_rend_closeCrend( Word16 i; CREND_HANDLE hCrend; + test(); IF( pCrend == NULL || *pCrend == NULL ) { return; @@ -3086,8 +3087,8 @@ static ivas_error ivas_rend_crendConvolver( const CREND_WRAPPER *pCrend, AUDIO_CONFIG inConfig, AUDIO_CONFIG outConfig, - Word32 *pcm_in[], - Word32 *pcm_out[], + Word32 *pcm_in[], // Qx + Word32 *pcm_out[], // Qx const Word32 output_Fs, const Word16 i_ts ) { @@ -3149,26 +3150,26 @@ static ivas_error ivas_rend_crendConvolver( move16(); FOR( idx_in = 0; idx_in < nchan_in; idx_in++ ) { - pIn = &pcm_in[idx_in][imult1616( i_ts, subframe_length )]; + pIn = &pcm_in[idx_in][i_ts * subframe_length]; IF( NE_16( idx_in, lfe_idx_in ) ) { IF( pCrend->hHrtfCrend->num_iterations_diffuse[0] > 0 ) { - pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[offset_diffuse]; - pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[offset_diffuse]; - pFreq_filt_re = &hCrend->freq_buffer_re_fx[i][offset]; - pFreq_filt_im = &hCrend->freq_buffer_im_fx[i][offset]; + pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[offset_diffuse]; // Qx + pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[offset_diffuse]; // Qx + pFreq_filt_re = &hCrend->freq_buffer_re_fx[i][offset]; // Qx + pFreq_filt_im = &hCrend->freq_buffer_im_fx[i][offset]; // Qx FOR( k = 0; k < pCrend->hHrtfCrend->index_frequency_max_diffuse; k++ ) { - pFreq_buf_re[k] = L_add( Mpy_32_16_r( pFreq_filt_re[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[i] ), pFreq_buf_re[k] ); - pFreq_buf_im[k] = L_add( Mpy_32_16_r( pFreq_filt_im[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[i] ), pFreq_buf_im[k] ); + pFreq_buf_re[k] = L_add( Mpy_32_16_r( pFreq_filt_re[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[i] ), pFreq_buf_re[k] ); // Qx + pFreq_buf_im[k] = L_add( Mpy_32_16_r( pFreq_filt_im[k], pCrend->hHrtfCrend->inv_diffuse_weight_fx[i] ), pFreq_buf_im[k] ); // Qx move32(); move32(); } } - pFreq_buf_re = &hCrend->freq_buffer_re_fx[i][offset]; - pFreq_buf_im = &hCrend->freq_buffer_im_fx[i][offset]; + pFreq_buf_re = &hCrend->freq_buffer_re_fx[i][offset]; // Qx + pFreq_buf_im = &hCrend->freq_buffer_im_fx[i][offset]; // Qx ivas_mdft_fx( pIn, pFreq_buf_re, pFreq_buf_im, subframe_length, subframe_length ); @@ -3198,15 +3199,15 @@ static ivas_error ivas_rend_crendConvolver( offset_in = offset_in % ( pCrend->hHrtfCrend->max_num_iterations ); move16(); offset_in = imult1616( offset_in, subframe_length ); - pFreq_buf_re = &hCrend->freq_buffer_re_fx[i][offset_in]; - pFreq_buf_im = &hCrend->freq_buffer_im_fx[i][offset_in]; - pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_re_fx[i][j][offset]; - pFreq_filt_im = &pCrend->hHrtfCrend->pOut_to_bin_im_fx[i][j][offset]; + pFreq_buf_re = &hCrend->freq_buffer_re_fx[i][offset_in]; // Qx + pFreq_buf_im = &hCrend->freq_buffer_im_fx[i][offset_in]; // Qx + pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_re_fx[i][j][offset]; // Q29 + pFreq_filt_im = &pCrend->hHrtfCrend->pOut_to_bin_im_fx[i][j][offset]; // Q29 FOR( k = 0; k < pCrend->hHrtfCrend->pIndex_frequency_max[i][j][m]; k++ ) { - tmp_out_re[k] = L_add( L_shl( Msub_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_re[k] ), pFreq_buf_im[k], pFreq_filt_im[k] ), 2 ), tmp_out_re[k] ); - tmp_out_im[k] = L_add( L_shl( Madd_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_im[k] ), pFreq_buf_im[k], pFreq_filt_re[k] ), 2 ), tmp_out_im[k] ); + tmp_out_re[k] = L_add( L_shl( Msub_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_re[k] ), pFreq_buf_im[k], pFreq_filt_im[k] ), 2 ), tmp_out_re[k] ); // Qx + tmp_out_im[k] = L_add( L_shl( Madd_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_im[k] ), pFreq_buf_im[k], pFreq_filt_re[k] ), 2 ), tmp_out_im[k] ); // Qx move32(); move32(); } @@ -3224,14 +3225,14 @@ static ivas_error ivas_rend_crendConvolver( offset_diffuse = offset_diffuse % pCrend->hHrtfCrend->num_iterations_diffuse[0]; move16(); offset_diffuse = imult1616( offset_diffuse, subframe_length ); - pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[offset_diffuse]; - pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[offset_diffuse]; - pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_re_fx[j][offset]; - pFreq_filt_im = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_im_fx[j][offset]; + pFreq_buf_re = &hCrend->freq_buffer_re_diffuse_fx[offset_diffuse]; // Qx + pFreq_buf_im = &hCrend->freq_buffer_im_diffuse_fx[offset_diffuse]; // Qx + pFreq_filt_re = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_re_fx[j][offset]; // Q31 + pFreq_filt_im = &pCrend->hHrtfCrend->pOut_to_bin_diffuse_im_fx[j][offset]; // Q31 FOR( k = 0; k < pCrend->hHrtfCrend->pIndex_frequency_max_diffuse[j][m]; k++ ) { - tmp_out_re[k] = L_add( Msub_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_re[k] ), pFreq_buf_im[k], pFreq_filt_im[k] ), tmp_out_re[k] ); - tmp_out_im[k] = L_add( Madd_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_im[k] ), pFreq_buf_im[k], pFreq_filt_re[k] ), tmp_out_im[k] ); + tmp_out_re[k] = L_add( Msub_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_re[k] ), pFreq_buf_im[k], pFreq_filt_im[k] ), tmp_out_re[k] ); // Qx + tmp_out_im[k] = L_add( Madd_32_32( Mpy_32_32( pFreq_buf_re[k], pFreq_filt_im[k] ), pFreq_buf_im[k], pFreq_filt_re[k] ), tmp_out_im[k] ); // Qx move32(); move32(); } @@ -3243,11 +3244,11 @@ static ivas_error ivas_rend_crendConvolver( #ifdef DEBUGGING dbgwrite_txt( (const float *) pOut, subframe_length << 1, "Fixed_imdft_out.txt", NULL ); #endif - pFreq_buf_re = &pcm_out[j][imult1616( i_ts, subframe_length )]; + pFreq_buf_re = &pcm_out[j][i_ts * subframe_length]; FOR( k = 0; k < subframe_length; k++ ) { - pFreq_buf_re[k] = L_add( pOut[k], hCrend->prev_out_buffer_fx[j][k] ); - hCrend->prev_out_buffer_fx[j][k] = pOut[add( k, subframe_length )]; + pFreq_buf_re[k] = L_add( pOut[k], hCrend->prev_out_buffer_fx[j][k] ); // Qx + hCrend->prev_out_buffer_fx[j][k] = pOut[k + subframe_length]; // Qx move32(); move32(); } @@ -3454,7 +3455,7 @@ ivas_error ivas_rend_crendProcess( COMBINED_ORIENTATION_HANDLE hCombinedOrientationData, IVAS_OUTPUT_SETUP_HANDLE hIntSetup, EFAP_HANDLE hEFAPdata, - Word32 *output_fx[], /* i/o: input/output audio channels */ + Word32 *output_fx[], /* i/o: input/output audio channels Qx */ const Word32 output_Fs, const Word16 num_subframes /* i : number of subframes to render */ ) @@ -3735,8 +3736,8 @@ ivas_error ivas_rend_crendProcessSubframe( const IVAS_OUTPUT_SETUP_HANDLE hIntSetup, /* i : internal setup handle */ const EFAP_HANDLE hEFAPdata, /* i : EFAP handle */ DECODER_TC_BUFFER_HANDLE hTcBuffer, /* i/o: JBM handle */ - Word32 *input_f[], /* i : transport channels */ - Word32 *output[], /* i/o: input/output audio channels */ + Word32 *input_f[], /* i : transport channels Qx */ + Word32 *output[], /* i/o: input/output audio channels Qx */ const Word16 n_samples_to_render, /* i : output frame length per channel */ const Word32 output_Fs /* i : output sampling rate */ ) @@ -3879,7 +3880,7 @@ ivas_error ivas_rend_crendProcessSubframe( { FOR( Word16 j = 0; j < n_samples_to_render; j++ ) { - output[i][j] = L_shr( output[i][j], 2 ); + output[i][j] = L_shr( output[i][j], 2 ); // Q = *pCrend->p_io_qfactor move32(); } } @@ -3887,7 +3888,7 @@ ivas_error ivas_rend_crendProcessSubframe( /* move to output */ FOR( ch = 0; ch < nchan_out; ch++ ) { - MVR2R_WORD32( pcm_tmp_fx[ch], output[ch], n_samples_to_render ); + MVR2R_WORD32( pcm_tmp_fx[ch], output[ch], n_samples_to_render ); // Qx } hTcBuffer->subframes_rendered = last_sf; diff --git a/lib_rend/ivas_limiter.c b/lib_rend/ivas_limiter.c index 458dd5a08..199c14564 100644 --- a/lib_rend/ivas_limiter.c +++ b/lib_rend/ivas_limiter.c @@ -35,6 +35,7 @@ #include #include "prot.h" #include "ivas_prot_rend.h" +#include "ivas_rom_rend.h" #include "wmc_auto.h" #include #ifdef IVAS_FLOAT_FIXED @@ -49,823 +50,6 @@ #define ATTACK_CNST_8k ( 1913946752 ) // Q31 #endif -Word32 release_cnst_table[4][201] = // Q31 - { - { - 1913946752, - 1919716352, - 1925351680, - 1930855552, - 1936230784, - 1941479808, - 1946605312, - 1951609728, - 1956495744, - 1961265792, - 1965922304, - 1970467584, - 1974904320, - 1979234560, - 1983460736, - 1987585024, - 1991609856, - 1995537280, - 1999369344, - 2003108480, - 2006756480, - 2010315520, - 2013787520, - 2017174528, - 2020478464, - 2023701248, - 2026844672, - 2029910656, - 2032900992, - 2035817344, - 2038661376, - 2041435008, - 2044139648, - 2046777088, - 2049348864, - 2051856384, - 2054301440, - 2056685312, - 2059009536, - 2061275520, - 2063484672, - 2065638272, - 2067737856, - 2069784448, - 2071779584, - 2073724416, - 2075620096, - 2077467904, - 2079268992, - 2081024512, - 2082735488, - 2084403200, - 2086028416, - 2087612544, - 2089156352, - 2090660864, - 2092127104, - 2093555968, - 2094948480, - 2096305408, - 2097627776, - 2098916352, - 2100172032, - 2101395584, - 2102587776, - 2103749504, - 2104881408, - 2105984384, - 2107059072, - 2108106112, - 2109126400, - 2110120448, - 2111088896, - 2112032512, - 2112951808, - 2113847552, - 2114720128, - 2115570304, - 2116398592, - 2117205504, - 2117991552, - 2118757504, - 2119503616, - 2120230400, - 2120938496, - 2121628288, - 2122300288, - 2122954880, - 2123592576, - 2124213760, - 2124818944, - 2125408384, - 2125982592, - 2126541952, - 2127086848, - 2127617664, - 2128134656, - 2128638336, - 2129128832, - 2129606784, - 2130072192, - 2130525568, - 2130967296, - 2131397376, - 2131816448, - 2132224640, - 2132622080, - 2133009408, - 2133386496, - 2133753856, - 2134111744, - 2134460288, - 2134799744, - 2135130368, - 2135452416, - 2135766144, - 2136071680, - 2136369152, - 2136659072, - 2136941312, - 2137216256, - 2137484160, - 2137744896, - 2137998976, - 2138246400, - 2138487424, - 2138722176, - 2138950656, - 2139173376, - 2139390208, - 2139601408, - 2139807104, - 2140007424, - 2140202624, - 2140392576, - 2140577664, - 2140758016, - 2140933504, - 2141104512, - 2141271040, - 2141433216, - 2141591168, - 2141745024, - 2141894912, - 2142040832, - 2142182912, - 2142321408, - 2142456192, - 2142587392, - 2142715264, - 2142839808, - 2142961152, - 2143079296, - 2143194240, - 2143306240, - 2143415424, - 2143521664, - 2143625216, - 2143725952, - 2143824128, - 2143919744, - 2144012800, - 2144103424, - 2144191744, - 2144277760, - 2144361472, - 2144443136, - 2144522496, - 2144599936, - 2144675200, - 2144748544, - 2144820096, - 2144889600, - 2144957440, - 2145023488, - 2145087744, - 2145150336, - 2145211264, - 2145270656, - 2145328512, - 2145384832, - 2145439616, - 2145493120, - 2145545088, - 2145595776, - 2145645056, - 2145693184, - 2145739904, - 2145785472, - 2145829888, - 2145873152, - 2145915136, - 2145956224, - 2145996032, - 2146034944, - 2146072832, - 2146109696, - 2146145664, - 2146180608, - 2146214656, - 2146247808, - }, - { - 2027355264, - 2030408704, - 2033386624, - 2036290944, - 2039123328, - 2041885440, - 2044578944, - 2047205376, - 2049766528, - 2052263680, - 2054698496, - 2057072384, - 2059387008, - 2061643520, - 2063843328, - 2065987968, - 2068078720, - 2070116864, - 2072103552, - 2074040192, - 2075927936, - 2077767936, - 2079561472, - 2081309568, - 2083013376, - 2084673920, - 2086292352, - 2087869696, - 2089406976, - 2090905216, - 2092365184, - 2093788032, - 2095174528, - 2096525824, - 2097842432, - 2099125632, - 2100375808, - 2101594240, - 2102781312, - 2103938048, - 2105065216, - 2106163456, - 2107233536, - 2108276096, - 2109292032, - 2110281728, - 2111246080, - 2112185728, - 2113101056, - 2113992960, - 2114861824, - 2115708288, - 2116532992, - 2117336448, - 2118119168, - 2118881792, - 2119624704, - 2120348416, - 2121053440, - 2121740288, - 2122409344, - 2123061120, - 2123696128, - 2124314624, - 2124917120, - 2125504128, - 2126075776, - 2126632832, - 2127175296, - 2127703808, - 2128218624, - 2128720000, - 2129208448, - 2129684352, - 2130147712, - 2130599168, - 2131038976, - 2131467264, - 2131884416, - 2132290816, - 2132686592, - 2133072256, - 2133447680, - 2133813504, - 2134169856, - 2134516864, - 2134854784, - 2135184000, - 2135504640, - 2135816960, - 2136121216, - 2136417536, - 2136706048, - 2136987136, - 2137260928, - 2137527552, - 2137787264, - 2138040192, - 2138286592, - 2138526464, - 2138760192, - 2138987776, - 2139209472, - 2139425408, - 2139635712, - 2139840512, - 2140039936, - 2140234240, - 2140423424, - 2140607744, - 2140787200, - 2140962048, - 2141132288, - 2141298048, - 2141459584, - 2141616896, - 2141769984, - 2141919232, - 2142064512, - 2142205952, - 2142343808, - 2142478080, - 2142608768, - 2142736128, - 2142860032, - 2142980864, - 2143098368, - 2143212928, - 2143324544, - 2143433088, - 2143538944, - 2143641984, - 2143742336, - 2143840000, - 2143935232, - 2144027904, - 2144118144, - 2144206080, - 2144291712, - 2144375168, - 2144456320, - 2144535424, - 2144612480, - 2144687488, - 2144760448, - 2144831616, - 2144900992, - 2144968448, - 2145034112, - 2145098112, - 2145160448, - 2145221248, - 2145280256, - 2145337856, - 2145393920, - 2145448576, - 2145501696, - 2145553536, - 2145603968, - 2145653120, - 2145700992, - 2145747456, - 2145792896, - 2145837056, - 2145880064, - 2145922048, - 2145962880, - 2146002560, - 2146041344, - 2146078976, - 2146115712, - 2146151424, - 2146186240, - 2146220160, - 2146253184, - 2146285312, - 2146316672, - 2146347136, - 2146376832, - 2146405760, - 2146433920, - 2146461440, - 2146488192, - 2146514176, - 2146539520, - 2146564224, - 2146588160, - 2146611584, - 2146634368, - 2146656640, - 2146678272, - 2146699264, - 2146719744, - 2146739712, - 2146759168, - 2146778112, - 2146796544, - 2146814464, - 2146832000, - 2146849024, - 2146865664, - }, - { - 2086555136, - 2088125824, - 2089656576, - 2091148416, - 2092602240, - 2094018944, - 2095399680, - 2096745088, - 2098056192, - 2099333888, - 2100578816, - 2101792000, - 2102974080, - 2104125824, - 2105248128, - 2106341760, - 2107407232, - 2108445440, - 2109456896, - 2110442496, - 2111402624, - 2112338176, - 2113249664, - 2114137728, - 2115002880, - 2115845760, - 2116666880, - 2117466880, - 2118246272, - 2119005568, - 2119745280, - 2120465920, - 2121167872, - 2121851776, - 2122517888, - 2123166976, - 2123799168, - 2124414976, - 2125014912, - 2125599360, - 2126168704, - 2126723200, - 2127263360, - 2127789568, - 2128302208, - 2128801408, - 2129287808, - 2129761536, - 2130222976, - 2130672512, - 2131110272, - 2131536768, - 2131952128, - 2132356736, - 2132750848, - 2133134720, - 2133508736, - 2133872896, - 2134227584, - 2134573184, - 2134909696, - 2135237504, - 2135556736, - 2135867648, - 2136170624, - 2136465536, - 2136752896, - 2137032832, - 2137305344, - 2137570816, - 2137829376, - 2138081280, - 2138326528, - 2138565504, - 2138798080, - 2139024768, - 2139245440, - 2139460480, - 2139669888, - 2139873792, - 2140072320, - 2140265856, - 2140454144, - 2140637696, - 2140816384, - 2140990464, - 2141159936, - 2141325056, - 2141485824, - 2141642368, - 2141794944, - 2141943424, - 2142088064, - 2142228992, - 2142366208, - 2142499840, - 2142630016, - 2142756736, - 2142880128, - 2143000448, - 2143117440, - 2143231488, - 2143342592, - 2143450752, - 2143556096, - 2143658624, - 2143758592, - 2143855872, - 2143950592, - 2144043008, - 2144132864, - 2144220416, - 2144305664, - 2144388608, - 2144469504, - 2144548224, - 2144624896, - 2144699648, - 2144772352, - 2144843264, - 2144912256, - 2144979328, - 2145044864, - 2145108480, - 2145170560, - 2145231104, - 2145289856, - 2145347200, - 2145403008, - 2145457408, - 2145510400, - 2145561984, - 2145612160, - 2145661056, - 2145708672, - 2145755136, - 2145800192, - 2145844224, - 2145887104, - 2145928832, - 2145969408, - 2146008960, - 2146047616, - 2146085120, - 2146121600, - 2146157184, - 2146191872, - 2146225664, - 2146258560, - 2146290560, - 2146321792, - 2146352128, - 2146381696, - 2146410496, - 2146438528, - 2146465920, - 2146492416, - 2146518400, - 2146543616, - 2146568192, - 2146592128, - 2146615424, - 2146638080, - 2146660224, - 2146681728, - 2146702720, - 2146723072, - 2146743040, - 2146762368, - 2146781184, - 2146799616, - 2146817408, - 2146834816, - 2146851840, - 2146868352, - 2146884352, - 2146900096, - 2146915328, - 2146930176, - 2146944640, - 2146958720, - 2146972416, - 2146985856, - 2146998784, - 2147011456, - 2147023872, - 2147035904, - 2147047552, - 2147058944, - 2147070080, - 2147080832, - 2147091456, - 2147101696, - 2147111680, - 2147121408, - 2147130880, - 2147140096, - 2147149056, - 2147157760, - 2147166336, - 2147174656, - }, - { - 2106670080, - 2107727232, - 2108757120, - 2109760640, - 2110738432, - 2111691008, - 2112619136, - 2113523328, - 2114404352, - 2115262592, - 2116098816, - 2116913408, - 2117707136, - 2118480256, - 2119233536, - 2119967360, - 2120682240, - 2121378688, - 2122057088, - 2122717952, - 2123361792, - 2123988992, - 2124599936, - 2125195136, - 2125774848, - 2126339584, - 2126889728, - 2127425536, - 2127947520, - 2128456064, - 2128951296, - 2129433856, - 2129903744, - 2130361600, - 2130807424, - 2131241728, - 2131664768, - 2132076928, - 2132478208, - 2132869248, - 2133250048, - 2133620992, - 2133982208, - 2134334080, - 2134676864, - 2135010688, - 2135335936, - 2135652608, - 2135961088, - 2136261504, - 2136554112, - 2136839168, - 2137116800, - 2137387136, - 2137650560, - 2137907072, - 2138156928, - 2138400256, - 2138637184, - 2138867968, - 2139092864, - 2139311744, - 2139524992, - 2139732736, - 2139934976, - 2140131968, - 2140323840, - 2140510720, - 2140692736, - 2140870016, - 2141042688, - 2141210752, - 2141374592, - 2141534080, - 2141689344, - 2141840640, - 2141987968, - 2142131456, - 2142271232, - 2142407424, - 2142539904, - 2142669056, - 2142794752, - 2142917248, - 2143036544, - 2143152640, - 2143265792, - 2143375872, - 2143483264, - 2143587712, - 2143689472, - 2143788544, - 2143885056, - 2143979136, - 2144070656, - 2144159872, - 2144246656, - 2144331264, - 2144413568, - 2144493824, - 2144571904, - 2144647936, - 2144722048, - 2144794240, - 2144864512, - 2144932864, - 2144999552, - 2145064448, - 2145127680, - 2145189248, - 2145249152, - 2145307520, - 2145364480, - 2145419776, - 2145473792, - 2145526272, - 2145577472, - 2145627264, - 2145675776, - 2145723008, - 2145768960, - 2145813760, - 2145857408, - 2145899904, - 2145941376, - 2145981696, - 2146020864, - 2146059136, - 2146096384, - 2146132608, - 2146167936, - 2146202368, - 2146235776, - 2146268416, - 2146300160, - 2146331136, - 2146361216, - 2146390528, - 2146419200, - 2146446976, - 2146474112, - 2146500480, - 2146526208, - 2146551168, - 2146575488, - 2146599296, - 2146622464, - 2146644864, - 2146666880, - 2146688128, - 2146708992, - 2146729216, - 2146748928, - 2146768128, - 2146786816, - 2146805120, - 2146822784, - 2146840064, - 2146856960, - 2146873344, - 2146889216, - 2146904832, - 2146919936, - 2146934656, - 2146948992, - 2146962944, - 2146976640, - 2146989824, - 2147002752, - 2147015296, - 2147027584, - 2147039488, - 2147051136, - 2147062400, - 2147073408, - 2147084160, - 2147094528, - 2147104768, - 2147114624, - 2147124352, - 2147133696, - 2147142912, - 2147151744, - 2147160448, - 2147168896, - 2147177088, - 2147185152, - 2147192960, - 2147200512, - 2147207936, - 2147215104, - 2147222144, - 2147229056, - 2147235712, - 2147242112, - 2147248384, - 2147254656, - 2147260544, - 2147266432, - 2147272064, - 2147277568, - }, - - - }; /*-------------------------------------------------------------------* * detect_strong_saturations() @@ -925,11 +109,11 @@ static int16_t detect_strong_saturations( } #else static Word16 detect_strong_saturations_fx( - const Word16 BER_detect, /* i : BER detect flag */ - Word16 *strong_saturation_cnt, /* i/o: counter of strong saturations */ - const Word32 max_val, /* i : maximum absolute value */ - Word32 *frame_gain, /* i/o: frame gain value */ - Word16 q_factor /* i : Q factor of the output samples */ + const Word16 BER_detect, /* i : BER detect flag */ + Word16 *strong_saturation_cnt, /* i/o: counter of strong saturations */ + const Word32 max_val, /* i : maximum absolute value q_factor */ + Word32 *frame_gain, /* i/o: frame gain value Q30 */ + Word16 q_factor /* i : Q factor of the output samples */ ) { Word16 apply_strong_limiting; @@ -937,8 +121,8 @@ static Word16 detect_strong_saturations_fx( apply_strong_limiting = 0; move16(); - compare_max_value_Mul_3 = W_shl( 98187, q_factor ); // 3 * IVAS_LIMITER_THRESHOLD - compare_max_value_Mul_10 = W_shl( 327290, q_factor ); // 10 * IVAS_LIMITER_THRESHOLD + compare_max_value_Mul_3 = W_shl( 98187, q_factor ); // 3 * IVAS_LIMITER_THRESHOLD : Q(q_factor) + compare_max_value_Mul_10 = W_shl( 327290, q_factor ); // 10 * IVAS_LIMITER_THRESHOLD : Q(q_factor) test(); IF( BER_detect ) { @@ -1035,19 +219,19 @@ ivas_error ivas_limiter_open_fx( SWITCH( sampling_rate ) { case 48000: - attack_cnst_fx = ATTACK_CNST_48k; + attack_cnst_fx = ATTACK_CNST_48k; /*Q31*/ move32(); BREAK; case 32000: - attack_cnst_fx = ATTACK_CNST_32k; + attack_cnst_fx = ATTACK_CNST_32k; /*Q31*/ move32(); BREAK; case 16000: - attack_cnst_fx = ATTACK_CNST_16k; + attack_cnst_fx = ATTACK_CNST_16k; /*Q31*/ move32(); BREAK; case 8000: - attack_cnst_fx = ATTACK_CNST_8k; + attack_cnst_fx = ATTACK_CNST_8k; /*Q31*/ move32(); BREAK; default: @@ -1164,12 +348,12 @@ void ivas_limiter_close( #ifdef IVAS_FLOAT_FIXED void ivas_limiter_dec_fx( - IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ - Word32 *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer */ - const Word16 num_channels, /* i : number of channels to be processed */ - const Word16 output_frame, /* i : number of samples per channel in the buffer */ - const Word16 BER_detect, /* i : BER detect flag */ - Word16 q_factor /* i : Q factor of the output samples */ + IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ + Word32 *output[MAX_OUTPUT_CHANNELS], /* i/o: input/output buffer Q : q_factor */ + const Word16 num_channels, /* i : number of channels to be processed */ + const Word16 output_frame, /* i : number of samples per channel in the buffer */ + const Word16 BER_detect, /* i : BER detect flag */ + Word16 q_factor /* i : Q factor of the output samples */ ) { Word16 c; @@ -1191,9 +375,9 @@ void ivas_limiter_dec_fx( FOR( c = 0; c < num_channels; ++c ) { - channels[c] = output[c]; + channels[c] = output[c]; /*q_factor*/ } - Word32 limiter_thresold = L_shl( IVAS_LIMITER_THRESHOLD, q_factor ); + Word32 limiter_thresold = L_shl( IVAS_LIMITER_THRESHOLD, q_factor ); /*q_factor*/ limiter_process_fx( hLimiter, output_frame, limiter_thresold, BER_detect, &hLimiter->strong_saturation_count, q_factor ); return; @@ -1243,12 +427,12 @@ void ivas_limiter_dec( #ifdef IVAS_FLOAT_FIXED void limiter_process_fx( - IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ - const Word16 output_frame, /* i : number of samples to be processed per channel in the I/O buffer */ - const Word32 threshold, /* i : signal amplitude above which limiting starts to be applied */ - const Word16 BER_detect, /* i : BER detect flag */ - Word16 *strong_saturation_cnt, /* i/o: counter of strong saturations (can be NULL) */ - Word16 q_factor /* i : Q factor of output samples */ + IVAS_LIMITER_HANDLE hLimiter, /* i/o: limiter struct handle */ + const Word16 output_frame, /* i : number of samples to be processed per channel in the I/O buffer */ + const Word32 threshold, /* i : signal amplitude above which limiting starts to be applied Q : q_factor */ + const Word16 BER_detect, /* i : BER detect flag */ + Word16 *strong_saturation_cnt, /* i/o: counter of strong saturations (can be NULL) */ + Word16 q_factor /* i : Q factor of output samples */ ) { Word16 i, c; @@ -1274,7 +458,7 @@ void limiter_process_fx( apply_strong_limiting = 0; move16(); - gain = hLimiter->gain_fx; + gain = hLimiter->gain_fx; /* Q30 */ move32(); output = hLimiter->channel_ptrs_fx; num_channels = hLimiter->num_channels; @@ -1296,7 +480,7 @@ void limiter_process_fx( tmp = L_abs( output[c][i] ); if ( GT_32( tmp, max_val ) ) { - max_val = tmp; + max_val = tmp; /*q_factor*/ move32(); } } @@ -1321,15 +505,15 @@ void limiter_process_fx( case 640: case 320: case 160: - releaseHeuristic_cnst = 85899345; + releaseHeuristic_cnst = 85899345; /*Q30*/ move32(); - releaseHeuristic_cnst_2 = 21474836; + releaseHeuristic_cnst_2 = 21474836; /*Q30*/ move32(); BREAK; default: - releaseHeuristic_cnst = 21474836; + releaseHeuristic_cnst = 21474836; /*Q30*/ move32(); - releaseHeuristic_cnst_2 = 5368709; + releaseHeuristic_cnst_2 = 5368709; /*Q30*/ move32(); BREAK; } @@ -1338,7 +522,7 @@ void limiter_process_fx( IF( GT_32( max_val, threshold ) ) { - frame_gain = L_shl( divide3232( threshold, max_val ), 15 ); // to q30 + frame_gain = L_shl( divide3232( threshold, max_val ), 15 ); // to Q30 releaseHeuristic = L_min( ONE_IN_Q30, L_add( releaseHeuristic, releaseHeuristic_cnst ) ); // releaseHeuristic_cnst is Q30 of ( 4.f * output_frame / sampling_rate ) // release_constant = powf( 0.01f, 1.0f / ( 0.005f * powf( 200.f, .08 ) * sampling_rate ) ); /* Unoptimized code for reference */ @@ -1365,6 +549,7 @@ void limiter_process_fx( /* No samples above threshold but gain from previous frame is not 1.f, * transition to gain == 1.f */ frame_gain = ONE_IN_Q30; + move32(); } /* Detection of very strong saturations */ IF( strong_saturation_cnt != NULL ) @@ -1376,9 +561,9 @@ void limiter_process_fx( /* Limit gain reduction to 20dB. Any peaks that require gain reduction * higher than this are most likely due to bit errors during decoding */ test(); - IF( LT_32( frame_gain, compare_value ) && !apply_strong_limiting ) + if ( LT_32( frame_gain, compare_value ) && !apply_strong_limiting ) { - frame_gain = compare_value; + frame_gain = compare_value; /*Q30*/ move32(); } @@ -1394,7 +579,8 @@ void limiter_process_fx( result = BASOP_Util_Divide3232_Scale( releaseHeuristic, div32, &scale ); idx = extract_l( Mpy_32_32( hLimiter->sampling_rate, 134218 ) ); - release_constant = release_cnst_table[idx][shr( result, sub( 15, scale ) )]; /* Q31 */ + result = shr( result, sub( 15, scale ) ); + release_constant = release_cnst_table[idx][result]; /* Q31 */ move32(); /* Unoptimized code for reference */ /* releaseTimeInSeconds = 0.005f * powf(200.f, releaseHeuristic); <-- Map heuristic value (0; 1) exponentially to range (0.005; 1) diff --git a/lib_rend/ivas_objectRenderer_mix.c b/lib_rend/ivas_objectRenderer_mix.c index 72b35aa90..ff5642344 100644 --- a/lib_rend/ivas_objectRenderer_mix.c +++ b/lib_rend/ivas_objectRenderer_mix.c @@ -51,8 +51,8 @@ #define RESAMPLE_FACTOR_32_48 ( 32.0f / 48.0f ) #ifdef IVAS_FLOAT_FIXED -#define RESAMPLE_FACTOR_16_48_FX ( 5461 ) -#define RESAMPLE_FACTOR_32_48_FX ( 10922 ) +#define RESAMPLE_FACTOR_16_48_FX ( 5461 ) // Q14 +#define RESAMPLE_FACTOR_32_48_FX ( 10922 ) // Q14 #endif @@ -73,8 +73,8 @@ static ivas_error DefaultBSplineModel_fx( TDREND_HRFILT_FiltSet_t *HrFiltSet_p, #ifdef IVAS_FLOAT_FIXED void TDREND_MIX_LIST_SetPos_fx( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - const Word32 *Pos_p /* i : Listener's position */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const Word32 *Pos_p /* i : Listener's position */ // Q Pos_fx->q_fact ) { TDREND_MIX_Listener_t *Listener_p; @@ -85,7 +85,7 @@ void TDREND_MIX_LIST_SetPos_fx( IF( NE_32( Pos_p[0], Listener_p->Pos_fx[0] ) || NE_32( Pos_p[1], Listener_p->Pos_fx[1] ) || NE_32( Pos_p[2], Listener_p->Pos_fx[2] ) ) { /* Set position */ - Copy32( Pos_p, Listener_p->Pos_fx, 3 ); + Copy32( Pos_p, Listener_p->Pos_fx, 3 ); // Q Pos_fx->q_fact /* Set pose update flag */ Listener_p->PoseUpdated = TRUE; @@ -154,9 +154,11 @@ ivas_error TDREND_MIX_LIST_SetOrient( #else ivas_error TDREND_MIX_LIST_SetOrient_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - const Word32 *FrontVec_p_fx, /* i : Listener's orientation front vector */ - const Word32 *UpVec_p_fx, /* i : Listener's orientation up vector */ - const Word16 orient_q /* i : Listener's orientation q-factor */ + const Word32 *FrontVec_p_fx, + /* i : Listener's orientation front vector */ // orient_q + const Word32 *UpVec_p_fx, + /* i : Listener's orientation up vector */ // orient_q + const Word16 orient_q /* i : Listener's orientation q-factor */ ) { @@ -180,7 +182,7 @@ ivas_error TDREND_MIX_LIST_SetOrient_fx( List_p = hBinRendererTd->Listener_p; /* Evaluate the normalized orientation vectors and set pose update flag */ - List_p->PoseUpdated = TDREND_SPATIAL_EvalOrthonormOrient_fx( List_p->Front_fx, List_p->Up_fx, List_p->Right_fx, FrontVec_p_fx, UpVec_p_fx, orient_q ); + List_p->PoseUpdated = TDREND_SPATIAL_EvalOrthonormOrient_fx( List_p->Front_fx, List_p->Up_fx, List_p->Right_fx, FrontVec_p_fx, UpVec_p_fx, orient_q ); // Q0 move16(); return IVAS_ERR_OK; @@ -313,10 +315,10 @@ void TDREND_MIX_Dealloc( --------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED ivas_error TDREND_MIX_Init_fx( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HRTF data (initialized in case of NULL) */ - const TDREND_MixSpatSpec_t *MixSpatSpec_p, /* i : Mixer spatial specification */ - const Word32 output_Fs /* i : Output sampling rate */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + TDREND_HRFILT_FiltSet_t **hHrtfTD, /* i/o: HRTF data (initialized in case of NULL) */ + const TDREND_MixSpatSpec_t *MixSpatSpec_p, /* i : Mixer spatial specification */ + const Word32 output_Fs /* i : Output sampling rate */ // Q0 ) { ivas_error error; @@ -326,16 +328,16 @@ ivas_error TDREND_MIX_Init_fx( /* Spatial settings */ IF( MixSpatSpec_p != NULL ) { - hBinRendererTd->UseCommonDistAttenModel = MixSpatSpec_p->UseCommonDistAttenModel; + hBinRendererTd->UseCommonDistAttenModel = MixSpatSpec_p->UseCommonDistAttenModel; // Q0 move16(); - hBinRendererTd->DistAttenModel = MixSpatSpec_p->DistAttenModel; + hBinRendererTd->DistAttenModel = MixSpatSpec_p->DistAttenModel; // Q0 move16(); } ELSE { - hBinRendererTd->UseCommonDistAttenModel = TRUE; + hBinRendererTd->UseCommonDistAttenModel = TRUE; // Q0 move16(); - hBinRendererTd->DistAttenModel = 0x0000; /* Distance attenuation not activated; */ + hBinRendererTd->DistAttenModel = 0x0000; /* Distance attenuation not activated; */ // Q0 move16(); } /* Init virtual and rendering listeners for spatial mixers */ @@ -452,15 +454,15 @@ ivas_error TDREND_MIX_SetDistAttenModel( ELSE { /* Set the common distance attenuation model */ - hBinRendererTd->DistAttenModel = DistAttenModel; + hBinRendererTd->DistAttenModel = DistAttenModel; // Q0 move32(); /* If using common distance attenuation model, set it. */ IF( hBinRendererTd->UseCommonDistAttenModel ) { - hBinRendererTd->DistAttenEnabled = TRUE; + hBinRendererTd->DistAttenEnabled = TRUE; // Q0 move16(); - hBinRendererTd->DistAttenModel = DistAttenModel; + hBinRendererTd->DistAttenModel = DistAttenModel; // Q0 move32(); } } @@ -504,8 +506,9 @@ ivas_error TDREND_MIX_SetDistAttenModel( #ifdef IVAS_FLOAT_FIXED ivas_error TDREND_MIX_AddSrc_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - Word16 *SrcInd, /* o : Source index */ - const TDREND_PosType_t PosType /* i : Position type (absolute/relative) */ + Word16 *SrcInd, + /* o : Source index */ // Q0 + const TDREND_PosType_t PosType /* i : Position type (absolute/relative) */ ) { TDREND_SRC_t *Src_p; @@ -514,11 +517,11 @@ ivas_error TDREND_MIX_AddSrc_fx( error = IVAS_ERR_OK; move32(); /* Get unique source index */ - *SrcInd = add( hBinRendererTd->MaxSrcInd, 1 ); + *SrcInd = add( hBinRendererTd->MaxSrcInd, 1 ); // Q0 move16(); - hBinRendererTd->MaxSrcInd = add( hBinRendererTd->MaxSrcInd, 1 ); + hBinRendererTd->MaxSrcInd = add( hBinRendererTd->MaxSrcInd, 1 ); // Q0 move16(); - hBinRendererTd->NumOfSrcs = add( hBinRendererTd->NumOfSrcs, 1 ); + hBinRendererTd->NumOfSrcs = add( hBinRendererTd->NumOfSrcs, 1 ); // Q0 move16(); IF( GT_16( hBinRendererTd->NumOfSrcs, MAX_NUM_TDREND_CHANNELS ) ) @@ -545,9 +548,9 @@ ivas_error TDREND_MIX_AddSrc_fx( /* Special OpenAL initialization due to a common distance attenuation model */ IF( NE_16( hBinRendererTd->DistAttenModel, 0 ) ) { - Src_p->SrcSpatial_p->DistAttenEnabled = TRUE; + Src_p->SrcSpatial_p->DistAttenEnabled = TRUE; // Q0 move16(); - Src_p->SrcSpatial_p->DistAtten.DistAttenModel = hBinRendererTd->DistAttenModel; + Src_p->SrcSpatial_p->DistAtten.DistAttenModel = hBinRendererTd->DistAttenModel; // Q0 move32(); } /* Add source to mixer */ @@ -662,8 +665,8 @@ static ivas_error BSplineModelEvalAlloc( #ifdef IVAS_FLOAT_FIXED static ivas_error DefaultBSplineModel_fx( - TDREND_HRFILT_FiltSet_t *HrFiltSet_p, /* o : Loaded HR filter set */ - const Word32 output_Fs /* i : Output sampling rate */ + TDREND_HRFILT_FiltSet_t *HrFiltSet_p, /* o : Loaded HR filter set */ + const Word32 output_Fs /* i : Output sampling rate */ // Q0 ) { ModelParams_t *model; @@ -678,19 +681,19 @@ static ivas_error DefaultBSplineModel_fx( SWITCH( output_Fs ) { case 48000: - HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_48kHz_fx; - HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_48kHz_fx; - HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_48kHz_fx; + HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_48kHz_fx; // Q23 + HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_48kHz_fx; // Q23 + HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_48kHz_fx; // Q23 BREAK; case 32000: - HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_32kHz_fx; - HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_32kHz_fx; - HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_32kHz_fx; + HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_32kHz_fx; // Q23 + HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_32kHz_fx; // Q23 + HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_32kHz_fx; // Q23 BREAK; case 16000: - HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_16kHz_fx; - HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_16kHz_fx; - HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_16kHz_fx; + HrFiltSet_p->lr_energy_and_iac_fx[0] = defaultHRIR_left_avg_power_16kHz_fx; // Q23 + HrFiltSet_p->lr_energy_and_iac_fx[1] = defaultHRIR_right_avg_power_16kHz_fx; // Q23 + HrFiltSet_p->lr_energy_and_iac_fx[2] = defaultHRIR_coherence_16kHz_fx; // Q23 BREAK; } @@ -699,52 +702,52 @@ static ivas_error DefaultBSplineModel_fx( move16(); /* int16_t parameters */ - model->UseItdModel = 1; + model->UseItdModel = 1; // Q0 move16(); - model->SplineDegree = 4; + model->SplineDegree = 4; // Q0 move16(); - model->elevDim2 = 17; + model->elevDim2 = 17; // Q0 move16(); - model->elevDim3 = 15; + model->elevDim3 = 15; // Q0 move16(); - model->AlphaN = 470; + model->AlphaN = 470; // Q0 move16(); - model->num_unique_azim_splines = 1; + model->num_unique_azim_splines = 1; // Q0 move16(); - model->elevSegSamples = 4; + model->elevSegSamples = 4; // Q0 move16(); - model->elevBsLen[0] = 5; + model->elevBsLen[0] = 5; // Q0 move16(); - model->elevBsLen[1] = 9; + model->elevBsLen[1] = 9; // Q0 move16(); - model->elevBsLen[2] = 13; + model->elevBsLen[2] = 13; // Q0 move16(); - model->elevBsLen[3] = 9; + model->elevBsLen[3] = 9; // Q0 move16(); - model->elevBsStart[0] = 0; + model->elevBsStart[0] = 0; // Q0 move16(); - model->elevBsStart[1] = 5; + model->elevBsStart[1] = 5; // Q0 move16(); - model->elevBsStart[2] = 14; + model->elevBsStart[2] = 14; // Q0 move16(); - model->elevBsStart[3] = 27; + model->elevBsStart[3] = 27; // Q0 move16(); - model->azimDim2 = defaultHRIR_rom_azimDim2; - model->azimDim3 = defaultHRIR_rom_azimDim3; - model->azim_start_idx = defaultHRIR_rom_azim_start_idx; - model->azimSegSamples = defaultHRIR_rom_azimSegSamples; - model->azimShapeIdx = defaultHRIR_rom_azimShapeIdx; - model->azimShapeSampFactor = defaultHRIR_rom_azimShapeSampFactor; + model->azimDim2 = defaultHRIR_rom_azimDim2; // Q0 + model->azimDim3 = defaultHRIR_rom_azimDim3; // Q0 + model->azim_start_idx = defaultHRIR_rom_azim_start_idx; // Q0 + model->azimSegSamples = defaultHRIR_rom_azimSegSamples; // Q0 + model->azimShapeIdx = defaultHRIR_rom_azimShapeIdx; // Q0 + model->azimShapeSampFactor = defaultHRIR_rom_azimShapeSampFactor; // Q0 - model->elevKSeq_fx = defaultHRIR_rom_elevKSeq_fx; - model->elevBsShape_fx = (const Word32 *) defaultHRIR_rom_elevBsShape_fx; + model->elevKSeq_fx = defaultHRIR_rom_elevKSeq_fx; // Q22 + model->elevBsShape_fx = (const Word32 *) defaultHRIR_rom_elevBsShape_fx; // Q30 IF( ( model->azimBsShape_fx = (const Word32 **) malloc( model->num_unique_azim_splines * sizeof( Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); } - model->azimBsShape_fx[0] = defaultHRIR_rom_azimBsShape_fx; + model->azimBsShape_fx[0] = defaultHRIR_rom_azimBsShape_fx; // Q30 IF( ( model->azimKSeq_fx = (Word32 **) malloc( 18 * sizeof( Word32 * ) ) ) == NULL ) { return ( IVAS_ERROR( IVAS_ERR_FAILED_ALLOC, "Can not allocate memory for Binaural TD renderer\n" ) ); @@ -759,8 +762,8 @@ static ivas_error DefaultBSplineModel_fx( } model->azimKSeq_fx[0][0] = 0; model->azimKSeq_fx[model->elevDim3 - 1][0] = 0; - model->azimKSeq_fx[0][1] = 360 << Q22; - model->azimKSeq_fx[model->elevDim3 - 1][1] = 360 << Q22; + model->azimKSeq_fx[0][1] = 360 << Q22; // Q22 + model->azimKSeq_fx[model->elevDim3 - 1][1] = 360 << Q22; // Q22 move32(); move32(); move32(); @@ -774,7 +777,7 @@ static ivas_error DefaultBSplineModel_fx( } FOR( j = 0; j < model->azimDim2[i]; j++ ) { - model->azimKSeq_fx[i][j] = L_shl( L_mult0( defaultHRIR_rom_azimSegSamples[0], j ), Q22 ); + model->azimKSeq_fx[i][j] = L_shl( L_mult0( defaultHRIR_rom_azimSegSamples[0], j ), Q22 ); // Q22 move32(); } } @@ -782,65 +785,65 @@ static ivas_error DefaultBSplineModel_fx( SWITCH( output_Fs ) { case 48000: - model->AlphaL_fx = (const Word32 *) defaultHRIR_rom_AlphaL48_fx; + model->AlphaL_fx = (const Word32 *) defaultHRIR_rom_AlphaL48_fx; // Q30 model->AlphaL_e = 1; move16(); - model->AlphaR_fx = (const Word32 *) defaultHRIR_rom_AlphaR48_fx; + model->AlphaR_fx = (const Word32 *) defaultHRIR_rom_AlphaR48_fx; // Q30 model->AlphaR_e = 1; move16(); - model->EL_fx = (const Word32 *) defaultHRIR_rom_EL48_fx; + model->EL_fx = (const Word32 *) defaultHRIR_rom_EL48_fx; // Q28 model->EL_e = 3; move16(); - model->ER_fx = (const Word32 *) defaultHRIR_rom_ER48_fx; + model->ER_fx = (const Word32 *) defaultHRIR_rom_ER48_fx; // Q28 model->ER_e = 3; move16(); - model->K = 128; + model->K = 128; // Q0 move16(); IF( HrFiltSet_p->ModelParams.UseItdModel ) { - modelITD->resamp_factor_fx = ONE_IN_Q14; + modelITD->resamp_factor_fx = ONE_IN_Q14; // Q14 move16(); } BREAK; case 32000: - model->AlphaL_fx = (const Word32 *) defaultHRIR_rom_AlphaL32_fx; + model->AlphaL_fx = (const Word32 *) defaultHRIR_rom_AlphaL32_fx; // Q30 model->AlphaL_e = 1; move16(); - model->AlphaR_fx = (const Word32 *) defaultHRIR_rom_AlphaR32_fx; + model->AlphaR_fx = (const Word32 *) defaultHRIR_rom_AlphaR32_fx; // Q30 model->AlphaR_e = 1; move16(); - model->EL_fx = (const Word32 *) defaultHRIR_rom_EL32_fx; + model->EL_fx = (const Word32 *) defaultHRIR_rom_EL32_fx; // Q28 model->EL_e = 3; move16(); - model->ER_fx = (const Word32 *) defaultHRIR_rom_ER32_fx; + model->ER_fx = (const Word32 *) defaultHRIR_rom_ER32_fx; // Q28 model->ER_e = 3; move16(); - model->K = 86; + model->K = 86; // Q0 move16(); IF( HrFiltSet_p->ModelParams.UseItdModel ) { - modelITD->resamp_factor_fx = RESAMPLE_FACTOR_32_48_FX; + modelITD->resamp_factor_fx = RESAMPLE_FACTOR_32_48_FX; // Q14 move16(); } BREAK; case 16000: - model->AlphaL_fx = (const Word32 *) defaultHRIR_rom_AlphaL16_fx; + model->AlphaL_fx = (const Word32 *) defaultHRIR_rom_AlphaL16_fx; // Q30 model->AlphaL_e = 1; move16(); - model->AlphaR_fx = (const Word32 *) defaultHRIR_rom_AlphaR16_fx; + model->AlphaR_fx = (const Word32 *) defaultHRIR_rom_AlphaR16_fx; // Q30 model->AlphaR_e = 1; move16(); - model->EL_fx = (const Word32 *) defaultHRIR_rom_EL16_fx; + model->EL_fx = (const Word32 *) defaultHRIR_rom_EL16_fx; // Q28 model->EL_e = 3; move16(); - model->ER_fx = (const Word32 *) defaultHRIR_rom_ER16_fx; + model->ER_fx = (const Word32 *) defaultHRIR_rom_ER16_fx; // Q28 model->ER_e = 3; move16(); - model->K = 43; + model->K = 43; // Q0 move16(); IF( HrFiltSet_p->ModelParams.UseItdModel ) { - modelITD->resamp_factor_fx = RESAMPLE_FACTOR_16_48_FX; + modelITD->resamp_factor_fx = RESAMPLE_FACTOR_16_48_FX; // Q14 move16(); } BREAK; @@ -848,69 +851,69 @@ static ivas_error DefaultBSplineModel_fx( BREAK; } - modelITD->N = 4; + modelITD->N = 4; // Q0 move16(); - modelITD->elevDim2 = 20; + modelITD->elevDim2 = 20; // Q0 move16(); - modelITD->elevDim3 = 18; + modelITD->elevDim3 = 18; // Q0 move16(); - modelITD->azimDim2 = 41; + modelITD->azimDim2 = 41; // Q0 move16(); - modelITD->azimDim3 = 41; + modelITD->azimDim3 = 41; // Q0 move16(); - modelITD->elevSegSamples = 3; + modelITD->elevSegSamples = 3; // Q0 move16(); - modelITD->elevBsLen[0] = 4; + modelITD->elevBsLen[0] = 4; // Q0 move16(); - modelITD->elevBsLen[1] = 7; + modelITD->elevBsLen[1] = 7; // Q0 move16(); - modelITD->elevBsLen[2] = 10; + modelITD->elevBsLen[2] = 10; // Q0 move16(); - modelITD->elevBsLen[3] = 7; + modelITD->elevBsLen[3] = 7; // Q0 move16(); - modelITD->elevBsStart[0] = 0; + modelITD->elevBsStart[0] = 0; // Q0 move16(); - modelITD->elevBsStart[1] = 4; + modelITD->elevBsStart[1] = 4; // Q0 move16(); - modelITD->elevBsStart[2] = 11; + modelITD->elevBsStart[2] = 11; // Q0 move16(); - modelITD->elevBsStart[3] = 21; + modelITD->elevBsStart[3] = 21; // Q0 move16(); - modelITD->elevKSeq_fx = defaultHRIR_rom_ITD_elevKSeq_fx; + modelITD->elevKSeq_fx = defaultHRIR_rom_ITD_elevKSeq_fx; // Q22 - modelITD->azimBsLen[0] = 11; + modelITD->azimBsLen[0] = 11; // Q0 move16(); - modelITD->azimBsLen[1] = 21; + modelITD->azimBsLen[1] = 21; // Q0 move16(); - modelITD->azimBsLen[2] = 31; + modelITD->azimBsLen[2] = 31; // Q0 move16(); - modelITD->azimBsLen[3] = 21; + modelITD->azimBsLen[3] = 21; // Q0 move16(); - modelITD->azimBsStart[0] = 0; + modelITD->azimBsStart[0] = 0; // Q0 move16(); - modelITD->azimBsStart[1] = 11; + modelITD->azimBsStart[1] = 11; // Q0 move16(); - modelITD->azimBsStart[2] = 32; + modelITD->azimBsStart[2] = 32; // Q0 move16(); - modelITD->azimBsStart[3] = 63; + modelITD->azimBsStart[3] = 63; // Q0 move16(); - modelITD->azimSegSamples = 10; + modelITD->azimSegSamples = 10; // Q0 move16(); - modelITD->azimKSeq_fx = defaultHRIR_rom_ITD_azimKSeq_fx; + modelITD->azimKSeq_fx = defaultHRIR_rom_ITD_azimKSeq_fx; // Q22 modelITD->W_fx = (const Word32 *) defaultHRIR_rom_ITD_W_fx; // Q25 modelITD->W_e = 6; move16(); - modelITD->azimBsShape_fx = defaultHRIR_rom_ITD_azimBsShape_fx; - modelITD->elevBsShape_fx = defaultHRIR_rom_ITD_elevBsShape_fx; + modelITD->azimBsShape_fx = defaultHRIR_rom_ITD_azimBsShape_fx; // Q30 + modelITD->elevBsShape_fx = defaultHRIR_rom_ITD_elevBsShape_fx; // Q30 HRTF_model_precalc( model ); - HrFiltSet_p->latency_s_fx = defaultHRIR_rom_latency_s_fx; + HrFiltSet_p->latency_s_fx = defaultHRIR_rom_latency_s_fx; // Q31 move32(); - HrFiltSet_p->SampleRate = output_Fs; + HrFiltSet_p->SampleRate = output_Fs; // Q0 move32(); - HrFiltSet_p->FiltLength = HrFiltSet_p->ModelParams.K; + HrFiltSet_p->FiltLength = HrFiltSet_p->ModelParams.K; // Q0 move16(); IF( NE_32( ( error = BSplineModelEvalAlloc_fx( &HrFiltSet_p->ModelParams, &HrFiltSet_p->ModelEval ) ), IVAS_ERR_OK ) ) diff --git a/lib_rend/ivas_objectRenderer_sfx.c b/lib_rend/ivas_objectRenderer_sfx.c index cbd860f49..cc81d0d6d 100644 --- a/lib_rend/ivas_objectRenderer_sfx.c +++ b/lib_rend/ivas_objectRenderer_sfx.c @@ -168,10 +168,10 @@ void TDREND_Apply_ITD_fx( Word32 *input_fx, /* i : Input subframe to be time adjusted Qx */ Word32 *out_left_fx, /* o : Output left channel with ITD applied Qx */ Word32 *out_right_fx, /* o : Output right channel with ITD applied Qx */ - Word16 *previtd, /* i/o: Previous ITD value */ - const Word16 itd, /* i : Current subframe ITD value */ + Word16 *previtd, /* i/o: Previous ITD value Q0 */ + const Word16 itd, /* i : Current subframe ITD value Q0 */ Word32 *mem_itd_fx, /* i/o: ITD buffer memory Qx */ - const Word16 length /* i : Subframe length */ + const Word16 length /* i : Subframe length Q0 */ ) { Word16 transition_len; @@ -183,95 +183,95 @@ void TDREND_Apply_ITD_fx( Word32 *pstart1_fx; Word32 *pstart2_fx; Word32 *pstart3_fx; - Word32 buffer_fx[ITD_MEM_LEN + L_SUBFRAME5MS_48k]; + Word32 buffer_fx[ITD_MEM_LEN + L_SUBFRAME5MS_48k]; // Qx Word32 *p_input_fx; Word32 *out_buf_A_fx, *out_buf_B_fx; push_wmops( "TDREND_Apply_ITD" ); /* Prepare resampling buffer */ - Copy32( mem_itd_fx, buffer_fx, ITD_MEM_LEN ); /* Retrieve memory */ - p_input_fx = buffer_fx + ITD_MEM_LEN; /* pointer to the current subframe */ - Copy32( input_fx, p_input_fx, length ); /* input current subframe */ - Copy32( buffer_fx + length, mem_itd_fx, ITD_MEM_LEN ); /* update memory for next frame */ + Copy32( mem_itd_fx, buffer_fx, ITD_MEM_LEN ); /* Retrieve memory */ // Qx + p_input_fx = buffer_fx + ITD_MEM_LEN; /* pointer to the current subframe */ // Qx + Copy32( input_fx, p_input_fx, length ); /* input current subframe */ // Qx + Copy32( buffer_fx + length, mem_itd_fx, ITD_MEM_LEN ); /* update memory for next frame */ // Qx - currShift = abs_s( itd ); - prevShift = abs_s( *previtd ); - tlen3 = s_max( 0, sub( SFX_SPAT_BIN_SINC_M, currShift ) ); /* Make sure there is enough look-ahead for the sinc resampling */ - transition_len = sub( length, tlen3 ); + currShift = abs_s( itd ); // Q0 + prevShift = abs_s( *previtd ); // Q0 + tlen3 = s_max( 0, sub( SFX_SPAT_BIN_SINC_M, currShift ) ); /* Make sure there is enough look-ahead for the sinc resampling */ // Q0 + transition_len = sub( length, tlen3 ); // Q0 IF( i_mult( ( *previtd ), itd ) < 0 ) { /* ITD sign change - apply shift on both channels */ - Word16 tmp1 = imult1616( transition_len, prevShift ); - Word16 tmp2 = add( prevShift, currShift ); + Word16 tmp1 = imult1616( transition_len, prevShift ); // Q0 + Word16 tmp2 = add( prevShift, currShift ); // Q0 Word16 tmp_e; - Word16 tmp3 = BASOP_Util_Divide1616_Scale( tmp1, tmp2, &tmp_e ); + Word16 tmp3 = BASOP_Util_Divide1616_Scale( tmp1, tmp2, &tmp_e ); // exp(tmp_e) Word16 tmp4; - Word16 tmp_e2 = BASOP_Util_Add_MantExp( tmp3, tmp_e, ONE_IN_Q14, 0, &tmp4 ); - tmp4 = shr( tmp4, sub( 15, tmp_e2 ) ); // Q0 - tlen1 = tmp4; + Word16 tmp_e2 = BASOP_Util_Add_MantExp( tmp3, tmp_e, ONE_IN_Q14, 0, &tmp4 ); // exp(tmp4) + tmp4 = shr( tmp4, sub( 15, tmp_e2 ) ); // Q0 + tlen1 = tmp4; // Q0 move16(); - tlen2 = sub( transition_len, tlen1 ); - pstart1_fx = p_input_fx - prevShift; - length_in1 = add( tlen1, prevShift ); - pstart2_fx = pstart1_fx + length_in1; - length_in2 = sub( tlen2, currShift ); - pstart3_fx = pstart2_fx + length_in2; + tlen2 = sub( transition_len, tlen1 ); // Q0 + pstart1_fx = p_input_fx - prevShift; // Qx + length_in1 = add( tlen1, prevShift ); // Q0 + pstart2_fx = pstart1_fx + length_in1; // Qx + length_in2 = sub( tlen2, currShift ); // Q0 + pstart3_fx = pstart2_fx + length_in2; // Qx } ELSE { /* ITD sign stays the same, or one of them is zero */ - tlen1 = transition_len; + tlen1 = transition_len; // Q0 move16(); - tlen2 = 0; + tlen2 = 0; // Q0 move16(); - pstart1_fx = p_input_fx - prevShift; - length_in1 = sub( add( transition_len, prevShift ), currShift ); - pstart2_fx = pstart1_fx + length_in1; - length_in2 = 0; + pstart1_fx = p_input_fx - prevShift; // Qx + length_in1 = sub( add( transition_len, prevShift ), currShift ); // Q0 + pstart2_fx = pstart1_fx + length_in1; // Qx + length_in2 = 0; // Q0 move16(); - pstart3_fx = pstart2_fx + add( length_in2, currShift ); + pstart3_fx = pstart2_fx + add( length_in2, currShift ); // Qx } IF( *previtd == 0 ) { IF( itd > 0 ) { - out_buf_A_fx = out_right_fx; - out_buf_B_fx = out_left_fx; + out_buf_A_fx = out_right_fx; // Qx + out_buf_B_fx = out_left_fx; // Qx } ELSE { - out_buf_A_fx = out_left_fx; - out_buf_B_fx = out_right_fx; + out_buf_A_fx = out_left_fx; // Qx + out_buf_B_fx = out_right_fx; // Qx } } ELSE { IF( *previtd > 0 ) { - out_buf_A_fx = out_right_fx; - out_buf_B_fx = out_left_fx; + out_buf_A_fx = out_right_fx; // Qx + out_buf_B_fx = out_left_fx; // Qx } ELSE { - out_buf_A_fx = out_left_fx; - out_buf_B_fx = out_right_fx; + out_buf_A_fx = out_left_fx; // Qx + out_buf_B_fx = out_right_fx; // Qx } } /* Output buffer A */ sincResample_fx( pstart1_fx, out_buf_A_fx, length_in1, tlen1 ); - Copy32( pstart2_fx, out_buf_A_fx + tlen1, sub( length, tlen1 ) ); + Copy32( pstart2_fx, out_buf_A_fx + tlen1, sub( length, tlen1 ) ); // Qx /* Output buffer B */ - Copy32( p_input_fx, out_buf_B_fx, tlen1 ); + Copy32( p_input_fx, out_buf_B_fx, tlen1 ); // Qx sincResample_fx( pstart2_fx, out_buf_B_fx + tlen1, length_in2, tlen2 ); - Copy32( pstart3_fx, out_buf_B_fx + transition_len, tlen3 ); + Copy32( pstart3_fx, out_buf_B_fx + transition_len, tlen3 ); // Qx - *previtd = itd; + *previtd = itd; // Q0 move16(); pop_wmops(); @@ -355,8 +355,8 @@ static void sincResample( static void sincResample_fx( const Word32 *input_fx, /*i : Input signal Qx */ Word32 *output_fx, /*o : Output signal Qx */ - const Word16 length_in, /*i : Input length */ - const Word16 length_out /*i : Output length */ + const Word16 length_in, /*i : Input length Q0 */ + const Word16 length_out /*i : Output length Q0 */ ) { Word16 snc0; @@ -366,7 +366,7 @@ static void sincResample_fx( Word16 t_step_e; Word32 t_frac_fx; Word16 t_frac_e; - Word64 tmp64_fx; + Word64 tmp64_fx; // Qx + 32 const Word32 *p_mid_fx; const Word32 *p_forward_fx; const Word32 *p_backward_fx; @@ -374,7 +374,7 @@ static void sincResample_fx( const Word32 *p_sinc_backward_fx; // epsilon: 1e-15f - const Word32 eps = 1208925824; + const Word32 eps = 1208925824; // exp(eps_e) move32(); const Word16 eps_e = -49; move16(); @@ -386,7 +386,7 @@ static void sincResample_fx( } /* Compute fractional time step */ - t_step_fx = L_deposit_h( BASOP_Util_Divide1616_Scale( length_in, length_out, &t_step_e ) ); + t_step_fx = L_deposit_h( BASOP_Util_Divide1616_Scale( length_in, length_out, &t_step_e ) ); // exp(t_step_e) t_frac_fx = 0; move32(); t_frac_e = 0; @@ -395,42 +395,42 @@ static void sincResample_fx( FOR( i = 0; i < length_out; i++ ) { Word16 t_frac_plus_eps_e; - Word32 t_frac_plus_eps = BASOP_Util_Add_Mant32Exp( t_frac_fx, t_frac_e, eps, eps_e, &t_frac_plus_eps_e ); - t = extract_l( L_shr( t_frac_plus_eps, sub( 31, t_frac_plus_eps_e ) ) ); // Q0 + Word32 t_frac_plus_eps = BASOP_Util_Add_Mant32Exp( t_frac_fx, t_frac_e, eps, eps_e, &t_frac_plus_eps_e ); // exp(t_frac_plus_eps_e) + t = extract_l( L_shr( t_frac_plus_eps, sub( 31, t_frac_plus_eps_e ) ) ); // Q0 /* Calculate the sinc-index for the center value of the sinc */ Word32 center_val; Word16 center_val_e; - center_val = BASOP_Util_Add_Mant32Exp( t_frac_plus_eps, t_frac_plus_eps_e, L_negate( L_deposit_h( t ) ), 15, ¢er_val_e ); - center_val_e = add( center_val_e, 6 ); // center_val * SFX_SPAT_BIN_NUM_SUBSAMPLES (i.e. 64) - center_val = BASOP_Util_Add_Mant32Exp( center_val, center_val_e, ONE_IN_Q29, 1, ¢er_val_e ); - snc0 = extract_l( L_shr( center_val, sub( 31, center_val_e ) ) ); + center_val = BASOP_Util_Add_Mant32Exp( t_frac_plus_eps, t_frac_plus_eps_e, L_negate( L_deposit_h( t ) ), 15, ¢er_val_e ); // exp(center_val_e) + center_val_e = add( center_val_e, 6 ); // center_val * SFX_SPAT_BIN_NUM_SUBSAMPLES (i.e. 64) + center_val = BASOP_Util_Add_Mant32Exp( center_val, center_val_e, ONE_IN_Q29, 1, ¢er_val_e ); // exp(center_val_e) + snc0 = extract_l( L_shr( center_val, sub( 31, center_val_e ) ) ); // Q0 /* Run convolution forward and backward from mid point */ - p_mid_fx = input_fx + t; - p_forward_fx = p_mid_fx + 1; - p_backward_fx = p_mid_fx - 1; - p_sinc_forward_fx = SincTable_fx + sub( SFX_SPAT_BIN_NUM_SUBSAMPLES, snc0 ); - p_sinc_backward_fx = SincTable_fx + add( SFX_SPAT_BIN_NUM_SUBSAMPLES, snc0 ); + p_mid_fx = input_fx + t; // Qx + p_forward_fx = p_mid_fx + 1; // Qx + p_backward_fx = p_mid_fx - 1; // Qx + p_sinc_forward_fx = SincTable_fx + sub( SFX_SPAT_BIN_NUM_SUBSAMPLES, snc0 ); // Q31 + p_sinc_backward_fx = SincTable_fx + add( SFX_SPAT_BIN_NUM_SUBSAMPLES, snc0 ); // Q31 - tmp64_fx = W_mult_32_32( *p_mid_fx, SincTable_fx[snc0] ); /* Middle point */ + tmp64_fx = W_mult_32_32( *p_mid_fx, SincTable_fx[snc0] ); /* Middle point */ // Qx + 32 FOR( j = 0; j < SFX_SPAT_BIN_SINC_M - 1; j++ ) { - tmp64_fx = W_add( tmp64_fx, W_mac_32_32( W_mult_32_32( *p_forward_fx, *p_sinc_forward_fx ), *p_backward_fx, *p_sinc_backward_fx ) ); - p_sinc_forward_fx += SFX_SPAT_BIN_NUM_SUBSAMPLES; - p_sinc_backward_fx += SFX_SPAT_BIN_NUM_SUBSAMPLES; - p_forward_fx++; - p_backward_fx--; + tmp64_fx = W_add( tmp64_fx, W_mac_32_32( W_mult_32_32( *p_forward_fx, *p_sinc_forward_fx ), *p_backward_fx, *p_sinc_backward_fx ) ); // Qx + 32 + p_sinc_forward_fx += SFX_SPAT_BIN_NUM_SUBSAMPLES; // Q31 + p_sinc_backward_fx += SFX_SPAT_BIN_NUM_SUBSAMPLES; // Q31 + p_forward_fx++; // Qx + p_backward_fx--; // Qx } - tmp64_fx = W_mac_32_32( tmp64_fx, *p_forward_fx, *p_sinc_forward_fx ); /* Integer index always rounded down --> 4 steps backward, 5 steps forward */ + tmp64_fx = W_mac_32_32( tmp64_fx, *p_forward_fx, *p_sinc_forward_fx ); /* Integer index always rounded down --> 4 steps backward, 5 steps forward */ // Qx + 32 - output_fx[i] = W_extract_h( tmp64_fx ); + output_fx[i] = W_extract_h( tmp64_fx ); // Qx move32(); /* Advance fractional time */ - t_frac_fx = BASOP_Util_Add_Mant32Exp( t_frac_fx, t_frac_e, t_step_fx, t_step_e, &t_frac_e ); + t_frac_fx = BASOP_Util_Add_Mant32Exp( t_frac_fx, t_frac_e, t_step_fx, t_step_e, &t_frac_e ); // exp( t_frac_fx ) } return; @@ -501,39 +501,39 @@ void TDREND_firfilt( #else void TDREND_firfilt_fx( Word32 *signal_fx, /* i/o: Input signal / Filtered signal Qx */ - Word32 *filter_fx, /* i/o: FIR filter Qy */ - const Word16 filter_e, /* i : FIR filter exp */ - const Word32 *filter_delta_fx, /* i : FIR filter delta Qy */ - const Word16 intp_count, /* i : interpolation count */ + Word32 *filter_fx, /* i/o: FIR filter filter_e */ + const Word16 filter_e, /* i : FIR filter exp Q0 */ + const Word32 *filter_delta_fx, /* i : FIR filter delta filter_e */ + const Word16 intp_count, /* i : interpolation count Q0 */ Word32 *mem_fx, /* i/o: filter memory Qx */ - const Word16 subframe_length, /* i : Length of signal */ - const Word16 filterlength, /* i : Filter length */ + const Word16 subframe_length, /* i : Length of signal Q0 */ + const Word16 filterlength, /* i : Filter length Q0 */ const Word16 Gain_fx, /* i : Gain Q14 */ const Word16 prevGain_fx /* i : Previous gain Q14 */ ) { /* NOTE: this function is implemented with the assumption that the exponent/Q-factor of input signal will not change. */ - Word32 buffer_fx[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 + L_SUBFRAME5MS_48k]; - Word32 *p_signal_fx; - Word32 *p_tmp_fx; - Word32 *p_filter_fx; + Word32 buffer_fx[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 + L_SUBFRAME5MS_48k]; // Qx + Word32 *p_signal_fx; // Qx + Word32 *p_tmp_fx; // Qx + Word32 *p_filter_fx; // exp(filter_e) Word16 i, j; Word32 tmp_fx; - Word16 step_fx, gain_tmp_fx, gain_delta_fx; + Word16 step_fx /* Q15 */, gain_tmp_fx /* Q15 */, gain_delta_fx /* Q14 */; Word16 tmp_e; Word64 tmp64_fx; - gain_delta_fx = sub( Gain_fx, prevGain_fx ); // Q14 - step_fx = BASOP_Util_Divide1616_Scale( gain_delta_fx, subframe_length, &tmp_e ); + gain_delta_fx = sub( Gain_fx, prevGain_fx ); // Q14 + step_fx = BASOP_Util_Divide1616_Scale( gain_delta_fx, subframe_length, &tmp_e ); // exp(tmp_e) tmp_e = sub( tmp_e, Q14 ); step_fx = shl_sat( step_fx, tmp_e ); // Q15 gain_tmp_fx = shl_sat( prevGain_fx, 1 ); // Q15 /* Handle memory */ - p_signal_fx = buffer_fx + sub( filterlength, 1 ); - Copy32( mem_fx, buffer_fx, sub( filterlength, 1 ) ); /* Insert memory */ - Copy32( signal_fx, buffer_fx + sub( filterlength, 1 ), subframe_length ); /* Insert current frame */ - Copy32( signal_fx + add( sub( subframe_length, filterlength ), 1 ), mem_fx, sub( filterlength, 1 ) ); /* Update memory for next frame */ + p_signal_fx = buffer_fx + sub( filterlength, 1 ); // Qx + Copy32( mem_fx, buffer_fx, sub( filterlength, 1 ) ); /* Insert memory */ // Qx + Copy32( signal_fx, buffer_fx + sub( filterlength, 1 ), subframe_length ); /* Insert current frame */ // Qx + Copy32( signal_fx + add( sub( subframe_length, filterlength ), 1 ), mem_fx, sub( filterlength, 1 ) ); /* Update memory for next frame */ // Qx /* Convolution */ FOR( i = 0; i < subframe_length; i++ ) @@ -542,28 +542,28 @@ void TDREND_firfilt_fx( move64(); tmp_e = 0; move16(); - p_tmp_fx = p_signal_fx + i; - p_filter_fx = filter_fx; + p_tmp_fx = p_signal_fx + i; // Qx + p_filter_fx = filter_fx; // exp(filter_e) FOR( j = 0; j < filterlength; j++ ) { - tmp64_fx = W_mac_32_32( tmp64_fx, *p_filter_fx, *p_tmp_fx ); - p_filter_fx++; - p_tmp_fx--; + tmp64_fx = W_mac_32_32( tmp64_fx, *p_filter_fx, *p_tmp_fx ); // Qx + (Q31 - filter_e) + 1 + p_filter_fx++; // exp(filter_e) + p_tmp_fx--; // Qx } // This is done to keep the output Q same as input Q for signal - tmp64_fx = W_shl( tmp64_fx, filter_e ); - tmp_fx = W_extract_h( tmp64_fx ); + tmp64_fx = W_shl( tmp64_fx, filter_e ); // Qx + 32 + tmp_fx = W_extract_h( tmp64_fx ); // Qx /* Apply linear gain interpolation in case of abrupt gain changes */ - gain_tmp_fx = add( gain_tmp_fx, step_fx ); - signal_fx[i] = Mpy_32_16_1( tmp_fx, gain_tmp_fx ); + gain_tmp_fx = add( gain_tmp_fx, step_fx ); // Q15 + signal_fx[i] = Mpy_32_16_1( tmp_fx, gain_tmp_fx ); // Qx move32(); IF( LT_16( i, intp_count ) ) { - v_add_fx( filter_fx, filter_delta_fx, filter_fx, filterlength ); + v_add_fx( filter_fx, filter_delta_fx, filter_fx, filterlength ); // exp(filter_e) } } diff --git a/lib_rend/ivas_objectRenderer_sources.c b/lib_rend/ivas_objectRenderer_sources.c index 066e77796..c9d841915 100644 --- a/lib_rend/ivas_objectRenderer_sources.c +++ b/lib_rend/ivas_objectRenderer_sources.c @@ -72,7 +72,7 @@ static void TDREND_SRC_SPATIAL_Dealloc( TDREND_SRC_SPATIAL_t *SrcSpatial_p ); ivas_error TDREND_MIX_SRC_SetPos_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ const Word16 SrcInd, /* i : Source index */ - const Word32 *Vec_p /* i : Position vector */ + const Word32 *Vec_p /* i : Position vector Q25 */ ) { TDREND_SRC_SPATIAL_t *SrcSpatial_p; @@ -84,11 +84,11 @@ ivas_error TDREND_MIX_SRC_SetPos_fx( ELSE { SrcSpatial_p = hBinRendererTd->Sources[SrcInd]->SrcSpatial_p; - SrcSpatial_p->Pos_p_fx[0] = L_shr( SrcSpatial_p->Pos_p_fx[0], sub( SrcSpatial_p->q_Pos_p, Q25 ) ); + SrcSpatial_p->Pos_p_fx[0] = L_shr( SrcSpatial_p->Pos_p_fx[0], sub( SrcSpatial_p->q_Pos_p, Q25 ) ); // Q25 move32(); - SrcSpatial_p->Pos_p_fx[1] = L_shr( SrcSpatial_p->Pos_p_fx[1], sub( SrcSpatial_p->q_Pos_p, Q25 ) ); + SrcSpatial_p->Pos_p_fx[1] = L_shr( SrcSpatial_p->Pos_p_fx[1], sub( SrcSpatial_p->q_Pos_p, Q25 ) ); // Q25 move32(); - SrcSpatial_p->Pos_p_fx[2] = L_shr( SrcSpatial_p->Pos_p_fx[2], sub( SrcSpatial_p->q_Pos_p, Q25 ) ); + SrcSpatial_p->Pos_p_fx[2] = L_shr( SrcSpatial_p->Pos_p_fx[2], sub( SrcSpatial_p->q_Pos_p, Q25 ) ); // Q25 move32(); SrcSpatial_p->q_Pos_p = Q25; move16(); @@ -96,7 +96,7 @@ ivas_error TDREND_MIX_SRC_SetPos_fx( test(); IF( NE_32( SrcSpatial_p->Pos_p_fx[0], Vec_p[0] ) || NE_32( SrcSpatial_p->Pos_p_fx[1], Vec_p[1] ) || NE_32( SrcSpatial_p->Pos_p_fx[2], Vec_p[2] ) ) { - Copy32( Vec_p, SrcSpatial_p->Pos_p_fx, 3 ); + Copy32( Vec_p, SrcSpatial_p->Pos_p_fx, 3 ); // Q25 SrcSpatial_p->Updated = TRUE; move16(); } @@ -140,10 +140,10 @@ ivas_error TDREND_MIX_SRC_SetPos( --------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED ivas_error TDREND_MIX_SRC_SetDir_fx( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - const Word16 SrcInd, /* i : Source index */ - const Word32 *Vec_p, /* i : Direction vector */ - const Word16 Vec_p_q /* i : Direction vector q */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const Word16 SrcInd, /* i : Source index */ + const Word32 *Vec_p, /* i : Direction vector Vec_p_q */ + const Word16 Vec_p_q /* i : Direction vector q */ ) { TDREND_SRC_SPATIAL_t *SrcSpatial_p; @@ -204,8 +204,8 @@ ivas_error TDREND_MIX_SRC_SetDir( --------------------------------------------------------------------*/ #ifdef IVAS_FLOAT_FIXED ivas_error TDREND_MIX_SRC_SetDirAtten_fx( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - const Word16 SrcInd, /* i : Source index */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const Word16 SrcInd, /* i : Source index Q0 */ const TDREND_DirAtten_t *DirAtten_p /* i : Directional attenuation specifier */ ) { @@ -253,8 +253,8 @@ ivas_error TDREND_MIX_SRC_SetDirAtten( #ifdef IVAS_FLOAT_FIXED ivas_error TDREND_MIX_SRC_SetPlayState( - BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ - const Word16 SrcInd, /* i : Source index */ + BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ + const Word16 SrcInd, /* i : Source index Q0 */ const TDREND_PlayStatus_t PlayStatus /* i : Play state */ ) { @@ -334,11 +334,11 @@ static void TDREND_SRC_REND_Init_fx( /* SrcGain */ FOR( nC = 0; nC < SPAT_BIN_MAX_INPUT_CHANNELS; nC++ ) { - SrcRend_p->SrcGainMin_p_fx[nC] = 0; /*Assuming Q15*/ + SrcRend_p->SrcGainMin_p_fx[nC] = 0; /* Q15 */ move16(); - SrcRend_p->SrcGain_p_fx[nC] = ONE_IN_Q14; + SrcRend_p->SrcGain_p_fx[nC] = ONE_IN_Q14; // Q14 move16(); - SrcRend_p->SrcGainMax_p_fx[nC] = 32767; /*Assuming Q15*/ + SrcRend_p->SrcGainMax_p_fx[nC] = 32767; /* Q15 */ move16(); } SrcRend_p->SrcGainUpdated = FALSE; @@ -346,9 +346,9 @@ static void TDREND_SRC_REND_Init_fx( /* Init directional and distance gains */ FOR( nC = 0; nC < SPAT_BIN_MAX_INPUT_CHANNELS; nC++ ) { - SrcRend_p->DirGain_p_fx[nC] = ONE_IN_Q14; + SrcRend_p->DirGain_p_fx[nC] = ONE_IN_Q14; // Q14 move16(); - SrcRend_p->DistGain_p_fx[nC] = ONE_IN_Q14; + SrcRend_p->DistGain_p_fx[nC] = ONE_IN_Q14; // Q14 move16(); } return; @@ -520,19 +520,31 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( BINAURAL_TD_OBJECT_RENDERER_HANDLE hBinRendererTd, /* i/o: TD renderer handle */ TDREND_SRC_REND_t *SrcRend_p, /* i/o: Source object */ TDREND_SRC_SPATIAL_t *SrcSpatial_p, /* i : Spatial aspects of source */ - Word32 *hrf_left_prev, /* i/o: Left filter */ - Word16 *hrf_left_prev_e, /* i/o: Left filter exponent */ - Word32 *hrf_right_prev, /* i/o: Right filter */ - Word16 *hrf_right_prev_e, /* i/o: Right filter exponent */ - Word32 *hrf_left_delta, /* o : Left filter interpolation delta */ - Word16 *hrf_left_delta_e, /* o : Left filter interpolation delta exponent */ - Word32 *hrf_right_delta, /* o : Right filter interpolation delta */ - Word16 *hrf_right_delta_e, /* o : Right filter interpolation delta exponent */ - Word16 *intp_count, /* o : Interpolation count */ - Word16 *filterlength, /* o : Length of filters */ - Word16 *itd, /* o : ITD value */ - Word16 *Gain, /* o : Gain value */ - TDREND_SRC_t *Src_p, /* i/o: Source pointer */ + Word32 *hrf_left_prev, + /* i/o: Left filter */ // exp(hrf_left_prev_e) + Word16 *hrf_left_prev_e, + /* i/o: Left filter exponent */ // Q0 + Word32 *hrf_right_prev, + /* i/o: Right filter */ // exp(hrf_right_prev_e) + Word16 *hrf_right_prev_e, + /* i/o: Right filter exponent */ // Q0 + Word32 *hrf_left_delta, + /* o : Left filter interpolation delta */ // exp(hrf_left_delta_e) + Word16 *hrf_left_delta_e, + /* o : Left filter interpolation delta exponent */ // Q0 + Word32 *hrf_right_delta, + /* o : Right filter interpolation delta */ // exp(hrf_right_delta_e) + Word16 *hrf_right_delta_e, + /* o : Right filter interpolation delta exponent */ // Q0 + Word16 *intp_count, + /* o : Interpolation count */ // Q0 + Word16 *filterlength, + /* o : Length of filters */ // Q0 + Word16 *itd, + /* o : ITD value */ // Q0 + Word16 *Gain, + /* o : Gain value */ // Q14 + TDREND_SRC_t *Src_p, /* i/o: Source pointer */ const Word16 subframe_update_flag ) { TDREND_MIX_Listener_t *Listener_p; @@ -552,7 +564,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( Listener_p = hBinRendererTd->Listener_p; HrFiltSet_p = hBinRendererTd->HrFiltSet_p; - *filterlength = s_min( HrFiltSet_p->FiltLength, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); + *filterlength = s_min( HrFiltSet_p->FiltLength, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); // Q0 move16(); IF( EQ_16( SrcSpatial_p->PosType, TDREND_POSTYPE_ABSOLUTE ) ) { @@ -575,16 +587,16 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( } ELSE { - Word32 tmp1 = Mpy_32_32( ListRelPos[0], ListRelPos[0] ); - Word32 tmp2 = Mpy_32_32( ListRelPos[1], ListRelPos[1] ); - Word32 tmp3 = L_add( tmp1, tmp2 ); + Word32 tmp1 = Mpy_32_32( ListRelPos[0], ListRelPos[0] ); // exp(2*ListRelPos_e) + Word32 tmp2 = Mpy_32_32( ListRelPos[1], ListRelPos[1] ); // exp(2*ListRelPos_e) + Word32 tmp3 = L_add( tmp1, tmp2 ); // exp(2*ListRelPos_e) Word16 tmp_e = shl( ListRelPos_e, 1 ); - Word32 tmp4 = Sqrt32( tmp3, &tmp_e ); - Word16 tmp5 = BASOP_util_atan2( ListRelPos[2], tmp4, sub( ListRelPos_e, tmp_e ) ); - Word32 tmp6 = Mpy_32_16_1( _180_OVER_PI_Q25, tmp5 ); // Q25 + Q13 - Q15 = Q23 + Word32 tmp4 = Sqrt32( tmp3, &tmp_e ); // exp(tmp_e) + Word16 tmp5 = BASOP_util_atan2( ListRelPos[2], tmp4, sub( ListRelPos_e, tmp_e ) ); // Q13 + Word32 tmp6 = Mpy_32_16_1( _180_OVER_PI_Q25, tmp5 ); // Q25 + Q13 - Q15 = Q23 /* Basis set is [front, right, up], which is a left-handed coordinate system. Minus sign here is to change to a positive-left system for azimuth */ - Word16 tmp7 = BASOP_util_atan2( ListRelPos[1], ListRelPos[0], 0 ); - Word32 tmp8 = L_negate( Mpy_32_16_1( _180_OVER_PI_Q25, tmp7 ) ); // Q25 + Q13 - Q15 = Q23 + Word16 tmp7 = BASOP_util_atan2( ListRelPos[1], ListRelPos[0], 0 ); // Q13 + Word32 tmp8 = L_negate( Mpy_32_16_1( _180_OVER_PI_Q25, tmp7 ) ); // Q25 + Q13 - Q15 = Q23 Elev = L_shr( tmp6, 1 ); // Q22 Azim = L_shr( tmp8, 1 ); // Q22 @@ -594,7 +606,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( /* 6. Evaluate the directional and distance gains */ /* Directional gain */ - *SrcRend_p->DirGain_p_fx = ONE_IN_Q14; + *SrcRend_p->DirGain_p_fx = ONE_IN_Q14; // Q14 move16(); IF( SrcSpatial_p->DirAttenEnabled ) { @@ -602,7 +614,7 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( } /* Distance gain */ - *SrcRend_p->DistGain_p_fx = ONE_IN_Q14; + *SrcRend_p->DistGain_p_fx = ONE_IN_Q14; // Q14 move16(); IF( hBinRendererTd->UseCommonDistAttenModel ) { @@ -610,69 +622,69 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( { SrcSpatial_p->DistAtten.DistAttenModel = hBinRendererTd->DistAttenModel; move32(); - *SrcRend_p->DistGain_p_fx = TDREND_SRC_SPATIAL_GetDistGain_fx( &SrcSpatial_p->DistAtten, ListRelDist, ListRelDist_e ); + *SrcRend_p->DistGain_p_fx = TDREND_SRC_SPATIAL_GetDistGain_fx( &SrcSpatial_p->DistAtten, ListRelDist, ListRelDist_e ); // Q14 move32(); } } ELSE IF( SrcSpatial_p->DistAttenEnabled ) { - *SrcRend_p->DistGain_p_fx = TDREND_SRC_SPATIAL_GetDistGain_fx( &SrcSpatial_p->DistAtten, ListRelDist, ListRelDist_e ); + *SrcRend_p->DistGain_p_fx = TDREND_SRC_SPATIAL_GetDistGain_fx( &SrcSpatial_p->DistAtten, ListRelDist, ListRelDist_e ); // Q14 move32(); } /* Update total gains */ - *Gain = extract_h( L_shl( Mpy_32_32( L_shl( L_mult( *SrcRend_p->SrcGain_p_fx, *SrcRend_p->DirGain_p_fx ), 1 ), L_shl( L_mult( *SrcRend_p->DistGain_p_fx, hBinRendererTd->Gain_fx ), 1 ) ), 1 ) ); + *Gain = extract_h( L_shl( Mpy_32_32( L_shl( L_mult( *SrcRend_p->SrcGain_p_fx, *SrcRend_p->DirGain_p_fx ), 1 ), L_shl( L_mult( *SrcRend_p->DistGain_p_fx, hBinRendererTd->Gain_fx ), 1 ) ), 1 ) ); // Q14 move16(); /* Delta for interpolation, in case the angular step exceeds MAX_ANGULAR_STEP */ - Word32 ele_tmp = Src_p->elev_prev_fx; + Word32 ele_tmp = Src_p->elev_prev_fx; // Q22 move32(); IF( GT_32( ele_tmp, DEG_180_IN_Q22 ) ) { - ele_tmp = L_sub( ele_tmp, DEG_360_IN_Q22 ); + ele_tmp = L_sub( ele_tmp, DEG_360_IN_Q22 ); // Q22 } ELSE IF( LT_32( ele_tmp, -DEG_180_IN_Q22 ) ) { - ele_tmp = L_add( ele_tmp, DEG_360_IN_Q22 ); + ele_tmp = L_add( ele_tmp, DEG_360_IN_Q22 ); // Q22 } - elev_delta = L_sub( Elev, ele_tmp ); + elev_delta = L_sub( Elev, ele_tmp ); // Q22 - Word32 azi_tmp = Src_p->azim_prev_fx; + Word32 azi_tmp = Src_p->azim_prev_fx; // Q22 IF( GT_32( azi_tmp, DEG_180_IN_Q22 ) ) { - azi_tmp = L_sub( azi_tmp, DEG_360_IN_Q22 ); + azi_tmp = L_sub( azi_tmp, DEG_360_IN_Q22 ); // Q22 } ELSE IF( LT_32( azi_tmp, -DEG_180_IN_Q22 ) ) { - azi_tmp = L_add( azi_tmp, DEG_360_IN_Q22 ); + azi_tmp = L_add( azi_tmp, DEG_360_IN_Q22 ); // Q22 } - azim_delta = L_sub( Azim, azi_tmp ); + azim_delta = L_sub( Azim, azi_tmp ); // Q22 - Src_p->elev_prev_fx = Elev; + Src_p->elev_prev_fx = Elev; // Q22 move32(); - Src_p->azim_prev_fx = Azim; + Src_p->azim_prev_fx = Azim; // Q22 move32(); /* map to -180:180 range */ IF( GT_32( azim_delta, DEG_180_IN_Q22 ) ) { - azim_delta = L_sub( azim_delta, DEG_360_IN_Q22 ); + azim_delta = L_sub( azim_delta, DEG_360_IN_Q22 ); // Q22 } ELSE IF( LT_32( azim_delta, -DEG_180_IN_Q22 ) ) { - azim_delta = L_add( azim_delta, DEG_360_IN_Q22 ); + azim_delta = L_add( azim_delta, DEG_360_IN_Q22 ); // Q22 } Word16 tmp1 = extract_l( Mpy_32_32( L_abs( azim_delta ), 100 << Q9 ) ); // Q22 + Q9 - Q31 = Q0 Word16 tmp2 = extract_l( Mpy_32_32( L_abs( elev_delta ), 100 << Q9 ) ); // Q22 + Q9 - Q31 = Q0 - *intp_count = s_min( MAX_INTERPOLATION_STEPS, s_max( tmp1, tmp2 ) ); + *intp_count = s_min( MAX_INTERPOLATION_STEPS, s_max( tmp1, tmp2 ) ); // Q0 move16(); } ELSE /* TDREND_POSTYPE_NON_DIEGETIC */ { - *itd = 0; + *itd = 0; // Q0 move16(); - *Gain = ONE_IN_Q14; + *Gain = ONE_IN_Q14; // Q14 move16(); set32_fx( hrf_left, 0, *filterlength ); set32_fx( hrf_right, 0, *filterlength ); @@ -684,11 +696,11 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( move16(); hrf_right_e = 6; move16(); - *intp_count = MAX_INTERPOLATION_STEPS; + *intp_count = MAX_INTERPOLATION_STEPS; // Q22 move16(); - Src_p->elev_prev_fx = 0; + Src_p->elev_prev_fx = 0; // Q22 move16(); - Src_p->azim_prev_fx = DEG_360_IN_Q22; /* Dummy angle -- sets max interpolation if switching to TDREND_POSTYPE_ABSOLUTE */ + Src_p->azim_prev_fx = DEG_360_IN_Q22; /* Dummy angle -- sets max interpolation if switching to TDREND_POSTYPE_ABSOLUTE */ // Q22 move16(); } @@ -700,47 +712,47 @@ void TDREND_SRC_REND_UpdateFiltersFromSpatialParams_fx( tmp_e = s_max( *hrf_left_prev_e, hrf_left_e ); FOR( Word16 i = 0; i < *filterlength; i++ ) { - hrf_left[i] = L_shr( hrf_left[i], sub( tmp_e, hrf_left_e ) ); + hrf_left[i] = L_shr( hrf_left[i], sub( tmp_e, hrf_left_e ) ); // exp(tmp_e) move32(); - hrf_left_prev[i] = L_shr( hrf_left_prev[i], sub( tmp_e, *hrf_left_prev_e ) ); + hrf_left_prev[i] = L_shr( hrf_left_prev[i], sub( tmp_e, *hrf_left_prev_e ) ); // exp(tmp_e) move32(); } *hrf_left_prev_e = tmp_e; move16(); hrf_left_e = tmp_e; move16(); - v_sub_32( hrf_left, hrf_left_prev, hrf_left_delta, *filterlength ); + v_sub_32( hrf_left, hrf_left_prev, hrf_left_delta, *filterlength ); // exp(tmp_e) *hrf_left_delta_e = tmp_e; move16(); - Word32 fac = L_deposit_h( div_s( 1, *intp_count ) ); - v_multc_fixed( hrf_left_delta, fac, hrf_left_delta, *filterlength ); + Word32 fac = L_deposit_h( div_s( 1, *intp_count ) ); // Q15 + v_multc_fixed( hrf_left_delta, fac, hrf_left_delta, *filterlength ); // exp(hrf_left_delta_e) tmp_e = s_max( *hrf_right_prev_e, hrf_right_e ); FOR( Word16 i = 0; i < *filterlength; i++ ) { - hrf_right[i] = L_shr( hrf_right[i], sub( tmp_e, hrf_right_e ) ); + hrf_right[i] = L_shr( hrf_right[i], sub( tmp_e, hrf_right_e ) ); // exp(tmp_e) move32(); - hrf_right_prev[i] = L_shr( hrf_right_prev[i], sub( tmp_e, *hrf_right_prev_e ) ); + hrf_right_prev[i] = L_shr( hrf_right_prev[i], sub( tmp_e, *hrf_right_prev_e ) ); // exp(tmp_e) move32(); } *hrf_right_prev_e = tmp_e; move16(); hrf_right_e = tmp_e; move16(); - v_sub_32( hrf_right, hrf_right_prev, hrf_right_delta, *filterlength ); + v_sub_32( hrf_right, hrf_right_prev, hrf_right_delta, *filterlength ); // exp(hrf_right_delta_e) *hrf_right_delta_e = tmp_e; move16(); - v_multc_fixed( hrf_right_delta, fac, hrf_right_delta, *filterlength ); + v_multc_fixed( hrf_right_delta, fac, hrf_right_delta, *filterlength ); // exp(hrf_right_delta_e) } ELSE { /* No interpolation, just set the new filters and reset deltas */ - Copy32( hrf_left, hrf_left_prev, *filterlength ); + Copy32( hrf_left, hrf_left_prev, *filterlength ); // exp(hrf_left_prev_e) *hrf_left_prev_e = hrf_left_e; move16(); - Copy32( hrf_right, hrf_right_prev, *filterlength ); + Copy32( hrf_right, hrf_right_prev, *filterlength ); // exp(hrf_right_prev_e) *hrf_right_prev_e = hrf_right_e; move16(); set32_fx( hrf_left_delta, 0, *filterlength ); @@ -830,7 +842,7 @@ static void TDREND_SRC_SPATIAL_Init_fx( const TDREND_PosType_t PosType /* i : Relative/absolute position type */ ) { - Word16 nC; + Word16 nC; // Q0 /* Initialize variables */ SrcSpatial_p->Updated = FALSE; @@ -854,25 +866,25 @@ static void TDREND_SRC_SPATIAL_Init_fx( #endif /* Source directional attenuation */ - SrcSpatial_p->DirAttenEnabled = FALSE; + SrcSpatial_p->DirAttenEnabled = FALSE; // Q0 move16(); - SrcSpatial_p->DirAtten.ConeInnerAngle_fx = DEG_360_IN_Q22; + SrcSpatial_p->DirAtten.ConeInnerAngle_fx = DEG_360_IN_Q22; // Q22 move32(); - SrcSpatial_p->DirAtten.ConeOuterAngle_fx = DEG_360_IN_Q22; + SrcSpatial_p->DirAtten.ConeOuterAngle_fx = DEG_360_IN_Q22; // Q22 move32(); - SrcSpatial_p->DirAtten.ConeOuterGain_fx = ONE_IN_Q30; + SrcSpatial_p->DirAtten.ConeOuterGain_fx = ONE_IN_Q30; // Q30 move16(); /* Source distance attenuation */ - SrcSpatial_p->DistAttenEnabled = FALSE; + SrcSpatial_p->DistAttenEnabled = FALSE; // Q0 move16(); - SrcSpatial_p->DistAtten.DistAttenModel = TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED; + SrcSpatial_p->DistAtten.DistAttenModel = TDREND_DIST_ATTEN_MODEL_INV_DIST_CLAMPED; // Q0 move16(); - SrcSpatial_p->DistAtten.RefDist_fx = ONE_IN_Q30; + SrcSpatial_p->DistAtten.RefDist_fx = ONE_IN_Q30; // Q30 move32(); SrcSpatial_p->DistAtten.MaxDist_fx = 2113929216; /* Maximum radius (2^ISM_RADIUS_NBITS-1)*0.25 */ /*15.75 in Q27*/ move32(); - SrcSpatial_p->DistAtten.RollOffFactor_fx = ONE_IN_Q30; + SrcSpatial_p->DistAtten.RollOffFactor_fx = ONE_IN_Q30; // Q30 move16(); return; @@ -928,10 +940,10 @@ static void TDREND_SRC_SPATIAL_SetDirAtten_fx( ) { /* Set directional attenuation */ - SrcSpatial_p->DirAttenEnabled = TRUE; - SrcSpatial_p->DirAtten.ConeInnerAngle_fx = DirAtten_p->ConeInnerAngle_fx; - SrcSpatial_p->DirAtten.ConeOuterAngle_fx = DirAtten_p->ConeOuterAngle_fx; - SrcSpatial_p->DirAtten.ConeOuterGain_fx = DirAtten_p->ConeOuterGain_fx; + SrcSpatial_p->DirAttenEnabled = TRUE; // Q0 + SrcSpatial_p->DirAtten.ConeInnerAngle_fx = DirAtten_p->ConeInnerAngle_fx; // Q22 + SrcSpatial_p->DirAtten.ConeOuterAngle_fx = DirAtten_p->ConeOuterAngle_fx; // Q22 + SrcSpatial_p->DirAtten.ConeOuterGain_fx = DirAtten_p->ConeOuterGain_fx; // Q30 move16(); move16(); move16(); @@ -1008,9 +1020,9 @@ static float TDREND_SRC_SPATIAL_GetDirGain( #else static Word16 TDREND_SRC_SPATIAL_GetDirGain_fx( /* o : Directional Gain Output Q14 */ const TDREND_DirAtten_t *DirAtten_p, /* i : Directional attenuation specification */ - const Word32 *Front_p_fx, /* i : Front-pointing vector */ + const Word32 *Front_p_fx, /* i : Front-pointing vector Q30 */ const Word32 *RelPos_p_fx, /* i : Relative position */ - const Word16 RelPos_p_e /* i : Relative position exp */ + const Word16 RelPos_p_e /* i : Relative position exp RelPos_p_e */ ) { Word16 DirGain_fx; // Q14 @@ -1028,12 +1040,12 @@ static Word16 TDREND_SRC_SPATIAL_GetDirGain_fx( /* Angle = acos ( Proj coeff from projecting -RelPos onto Front / norm(RelPos) ); */ FOR( Word16 i = 0; i < 3; i++ ) { - Vec_fx[i] = L_negate( RelPos_p_fx[i] ); + Vec_fx[i] = L_negate( RelPos_p_fx[i] ); // exp(RelPos_p_e) move32(); } ProjCoef_fx = dotp_fixed( Vec_fx, Front_p_fx, 3 ); // exp: RelPos_p_e + 1 ProjCoef_e = add( RelPos_p_e, 1 ); - NormRelPos_fx = TDREND_SPATIAL_VecNorm_fx( RelPos_p_fx, RelPos_p_e, &NormRelPos_e ); + NormRelPos_fx = TDREND_SPATIAL_VecNorm_fx( RelPos_p_fx, RelPos_p_e, &NormRelPos_e ); // exp(NormRelPos_e) IF( NormRelPos_fx != 0 ) { @@ -1043,15 +1055,15 @@ static Word16 TDREND_SRC_SPATIAL_GetDirGain_fx( Word32 tmp1, tmp2, tmp3, tmp4; // acos(x/y) = atan( sqrt(1-(x/y)^2) / (x/y) ) - tmp1 = L_deposit_h( BASOP_Util_Divide3232_Scale( ProjCoef_fx, NormRelPos_fx, &tmp_e1 ) ); // x/y + tmp1 = L_deposit_h( BASOP_Util_Divide3232_Scale( ProjCoef_fx, NormRelPos_fx, &tmp_e1 ) ); // x/y /* exp(tmp_e1) */ tmp_e1 = add( tmp_e1, sub( ProjCoef_e, NormRelPos_e ) ); - tmp2 = Mpy_32_32( tmp1, tmp1 ); // (x/y)^2 + tmp2 = Mpy_32_32( tmp1, tmp1 ); // (x/y)^2 /* exp(tmp_e2 */ tmp_e2 = shl( tmp_e1, 1 ); - tmp3 = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, L_negate( tmp2 ), tmp_e2, &tmp_e3 ); // 1 - (x/y)^2 + tmp3 = BASOP_Util_Add_Mant32Exp( ONE_IN_Q30, 1, L_negate( tmp2 ), tmp_e2, &tmp_e3 ); // 1 - (x/y)^2 /* exp(tmp_e3) */ tmp_e4 = tmp_e3; move16(); tmp3 = L_abs( tmp3 ); // for safety: sometimes it can go negative due to slight precision difference between numerator and denominator. - tmp4 = Sqrt32( tmp3, &tmp_e4 ); // sqrt(1 - (x/y)^2) + tmp4 = Sqrt32( tmp3, &tmp_e4 ); // sqrt(1 - (x/y)^2) /* exp(tmp_e4) */ acosfx = BASOP_util_atan2( tmp4, tmp1, sub( tmp_e4, tmp_e1 ) ); // 2Q13 AngleDeg_fx = L_shr( Mpy_32_16_1( _180_OVER_PI_Q25, acosfx ), 1 ); // Q22 } @@ -1063,21 +1075,21 @@ static Word16 TDREND_SRC_SPATIAL_GetDirGain_fx( IF( LE_32( AngleDeg_fx, L_shr( DirAtten_p->ConeInnerAngle_fx, 1 ) ) ) { - DirGain_fx = ONE_IN_Q14; + DirGain_fx = ONE_IN_Q14; // Q14 move16(); } ELSE IF( LE_32( AngleDeg_fx, L_shr( DirAtten_p->ConeOuterAngle_fx, 1 ) ) ) { // DirGain = 1.0f - ( 2.0f * AngleDeg - DirAtten_p->ConeInnerAngle ) / ( DirAtten_p->ConeOuterAngle - DirAtten_p->ConeInnerAngle ) * ( 1.0f - DirAtten_p->ConeOuterGain ); Word32 tmp1, tmp2, tmp3; - tmp1 = L_sub( ONE_IN_Q30, DirAtten_p->ConeOuterGain_fx ); - tmp2 = L_sub( DirAtten_p->ConeOuterAngle_fx, DirAtten_p->ConeInnerAngle_fx ); - tmp3 = L_sub( L_shl( AngleDeg_fx, 1 ), DirAtten_p->ConeInnerAngle_fx ); - DirGain_fx = sub( ONE_IN_Q14, div_l( Mpy_32_32( tmp1, tmp3 ), extract_h( tmp2 ) ) ); + tmp1 = L_sub( ONE_IN_Q30, DirAtten_p->ConeOuterGain_fx ); // Q30 + tmp2 = L_sub( DirAtten_p->ConeOuterAngle_fx, DirAtten_p->ConeInnerAngle_fx ); // Q22 + tmp3 = L_sub( L_shl( AngleDeg_fx, 1 ) /* 2.0f * AngleDeg */, DirAtten_p->ConeInnerAngle_fx ); // Q22 + DirGain_fx = sub( ONE_IN_Q14, div_l( Mpy_32_32( tmp1, tmp3 ), extract_h( tmp2 ) ) ); // Q14 } ELSE { - DirGain_fx = extract_h( DirAtten_p->ConeOuterGain_fx ); + DirGain_fx = extract_h( DirAtten_p->ConeOuterGain_fx ); // Q14 } return DirGain_fx; @@ -1131,11 +1143,11 @@ static float TDREND_SRC_SPATIAL_GetDistGain( #else static Word16 TDREND_SRC_SPATIAL_GetDistGain_fx( /* o : Distance gain Q14 */ const TDREND_DistAtten_t *DistAtten_p, /* i : Distance attenuation parameters */ - const Word32 Dist_fx, /* i : Distance value */ + const Word32 Dist_fx, /* i : Distance value Dist_e */ const Word16 Dist_e /* i : Distance value exp */ ) { - Word16 DistGain_fx; + Word16 DistGain_fx; // Q14 Word32 Dist2_fx; Word16 Dist2_e; Word16 tmp_e; @@ -1143,7 +1155,7 @@ static Word16 TDREND_SRC_SPATIAL_GetDistGain_fx( Word32 tmp32; Word16 flag; - DistGain_fx = ONE_IN_Q14; + DistGain_fx = ONE_IN_Q14; // Q14 move16(); DistGain_e = 1; move16(); @@ -1158,7 +1170,7 @@ static Word16 TDREND_SRC_SPATIAL_GetDistGain_fx( tmp32 = BASOP_Util_Add_Mant32Exp( Dist2_fx, Dist2_e, L_negate( DistAtten_p->RefDist_fx ), 1, &tmp_e ); // exp: tmp_e tmp32 = Mpy_32_32( tmp32, DistAtten_p->RollOffFactor_fx ); // exp: 1 + tmp_e tmp32 = BASOP_Util_Add_Mant32Exp( DistAtten_p->RefDist_fx, 1, tmp32, add( 1, tmp_e ), &tmp_e ); // exp: tmp_e - DistGain_fx = BASOP_Util_Divide3232_Scale( DistAtten_p->RefDist_fx, tmp32, &DistGain_e ); + DistGain_fx = BASOP_Util_Divide3232_Scale( DistAtten_p->RefDist_fx, tmp32, &DistGain_e ); // exp: DistGain_e DistGain_e = add( DistGain_e, sub( 1, tmp_e ) ); BREAK; @@ -1166,7 +1178,7 @@ static Word16 TDREND_SRC_SPATIAL_GetDistGain_fx( flag = BASOP_Util_Cmp_Mant32Exp( Dist2_fx, Dist2_e, DistAtten_p->RefDist_fx, 1 ); IF( flag < 0 ) { - Dist2_fx = DistAtten_p->RefDist_fx; + Dist2_fx = DistAtten_p->RefDist_fx; // Q30 move32(); Dist2_e = 1; move16(); @@ -1174,7 +1186,7 @@ static Word16 TDREND_SRC_SPATIAL_GetDistGain_fx( flag = BASOP_Util_Cmp_Mant32Exp( Dist2_fx, Dist2_e, DistAtten_p->MaxDist_fx, 4 ); IF( flag > 0 ) { - Dist2_fx = DistAtten_p->MaxDist_fx; + Dist2_fx = DistAtten_p->MaxDist_fx; // Q27 move32(); Dist2_e = 4; move16(); @@ -1182,7 +1194,7 @@ static Word16 TDREND_SRC_SPATIAL_GetDistGain_fx( tmp32 = BASOP_Util_Add_Mant32Exp( Dist2_fx, Dist2_e, L_negate( DistAtten_p->RefDist_fx ), 1, &tmp_e ); // exp: tmp_e tmp32 = Mpy_32_32( tmp32, DistAtten_p->RollOffFactor_fx ); // exp: 1 + tmp_e tmp32 = BASOP_Util_Add_Mant32Exp( DistAtten_p->RefDist_fx, 1, tmp32, add( 1, tmp_e ), &tmp_e ); // exp: tmp_e - DistGain_fx = BASOP_Util_Divide3232_Scale( DistAtten_p->RefDist_fx, tmp32, &DistGain_e ); + DistGain_fx = BASOP_Util_Divide3232_Scale( DistAtten_p->RefDist_fx, tmp32, &DistGain_e ); // exp: DistGain_e DistGain_e = add( DistGain_e, sub( 1, tmp_e ) ); BREAK; @@ -1339,11 +1351,11 @@ void TDREND_SRC_Init_fx( TDREND_SRC_REND_Init_fx( Src_p->SrcRend_p ); /* Reset memory buffers */ - Src_p->itd = 0; + Src_p->itd = 0; // Q0 move16(); - Src_p->previtd = 0; + Src_p->previtd = 0; // Q0 move16(); - Src_p->filterlength = 1; /* Init to unit impulse of length 1 */ + Src_p->filterlength = 1; /* Init to unit impulse of length 1 */ // Q0 move16(); set32_fx( Src_p->mem_itd_fx, 0, ITD_MEM_LEN ); set32_fx( Src_p->mem_hrf_left_fx, 0, SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1 ); @@ -1351,21 +1363,21 @@ void TDREND_SRC_Init_fx( set32_fx( Src_p->hrf_left_prev_fx, 0, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); set32_fx( Src_p->hrf_right_prev_fx, 0, SFX_SPAT_BIN_MAX_FILTER_LENGTH ); - Src_p->hrf_left_prev_fx[0] = ONE_IN_Q30; + Src_p->hrf_left_prev_fx[0] = ONE_IN_Q30; // Q30 move32(); Src_p->hrf_left_prev_e = 1; move16(); - Src_p->hrf_right_prev_fx[0] = ONE_IN_Q30; + Src_p->hrf_right_prev_fx[0] = ONE_IN_Q30; // Q30 move32(); Src_p->hrf_right_prev_e = 1; move16(); - Src_p->azim_prev_fx = 0; + Src_p->azim_prev_fx = 0; // Q22 move32(); - Src_p->elev_prev_fx = 0; + Src_p->elev_prev_fx = 0; // Q22 move32(); - Src_p->Gain_fx = ONE_IN_Q14; + Src_p->Gain_fx = ONE_IN_Q14; // Q14 move16(); - Src_p->prevGain_fx = ONE_IN_Q14; + Src_p->prevGain_fx = ONE_IN_Q14; // Q14 move16(); return; } diff --git a/lib_rend/ivas_reverb_filter_design.c b/lib_rend/ivas_reverb_filter_design.c index b4cc42a34..c0d147123 100644 --- a/lib_rend/ivas_reverb_filter_design.c +++ b/lib_rend/ivas_reverb_filter_design.c @@ -46,12 +46,15 @@ * Local constants *------------------------------------------------------------------------------------------*/ -#define STEP_LIMIT_PIVOT_FREQ ( 1000.0f ) /* Pivot (initial reference) frequency for response gradient limit */ -#define RESPONSE_STEP_LIMIT_LF ( 4.0f ) /* Maximum step in dB per bin at low frequencies (< pivot frequency) */ -#define RESPONSE_STEP_LIMIT_LF_FX ( 536870912 ) /* Maximum step in dB per bin at low frequencies (< pivot frequency) */ -#define RESPONSE_STEP_LIMIT_HF ( 1.5f ) /* Maximum step in dB per bin at high frequencies (> pivot frequency) */ -#define RESPONSE_STEP_LIMIT_HF_FX ( 1610612736 ) /* Maximum step in dB per bin at high frequencies (> pivot frequency) */ -#define EPS ( 1e-30f ) +#ifndef IVAS_FLOAT_FIXED +#define STEP_LIMIT_PIVOT_FREQ ( 1000.0f ) /* Pivot (initial reference) frequency for response gradient limit */ +#define RESPONSE_STEP_LIMIT_LF ( 4.0f ) /* Maximum step in dB per bin at low frequencies (< pivot frequency) */ +#define RESPONSE_STEP_LIMIT_HF ( 1.5f ) /* Maximum step in dB per bin at high frequencies (> pivot frequency) */ +#define EPS ( 1e-30f ) +#else +#define RESPONSE_STEP_LIMIT_LF_FX ( 536870912 ) /* Q27 Maximum step in dB per bin at low frequencies (< pivot frequency) */ +#define RESPONSE_STEP_LIMIT_HF_FX ( 1610612736 ) /* Q30 Maximum step in dB per bin at high frequencies (> pivot frequency) */ +#endif /*------------------------------------------------------------------------------------------* @@ -194,9 +197,9 @@ static void calc_min_phase( #endif #ifdef IVAS_FLOAT_FIXED static void calc_min_phase_fx( - rv_fftwf_type_complex_fx *pSpectrum, + rv_fftwf_type_complex_fx *pSpectrum /*Q31*/, const Word16 fft_size, - Word32 *pMinPhase, + Word32 *pMinPhase, /*q_pCepstrum*/ Word16 *q_pCepstrum ) { Word16 idx; @@ -244,13 +247,13 @@ static void calc_min_phase_fx( /* Initial angle set to match Hann window alignment in Matlab */ - initial_angle = shr( add( ( EVS_PI_FX ), shr( angle_increment, 2 ) ), 1 ); // q = 13 + initial_angle = shr( add( ( EVS_PI_FX /*Q13*/ ), shr( angle_increment, 2 ) ), 1 ); // Q13 FOR( idx = 0; idx < cepstrum_smoothing_extent; idx++ ) { - const Word16 sine_value = getSinWord16( add( initial_angle, shl( mult( shl( idx, 8 ), angle_increment ), 5 ) ) ); // q15 + const Word16 sine_value = getSinWord16( add( initial_angle, shl( mult( shl( idx, 8 ), angle_increment ), 5 ) ) ); // Q15 - pFolded_cepstrum_smoothing_win[add( idx, sub( half_fft_size, cepstrum_smoothing_extent ) )] = L_mult( sine_value, sine_value ); // q31 + pFolded_cepstrum_smoothing_win[idx + half_fft_size - cepstrum_smoothing_extent] = L_mult( sine_value, sine_value ); // Q31 move32(); } @@ -264,9 +267,9 @@ static void calc_min_phase_fx( /* Compute the log amplitude spectrum */ FOR( idx = 0; idx < spectrum_size; idx++ ) { - W_tmp0 = W_mult_32_32( pSpectrum[idx][0], pSpectrum[idx][0] ); - W_tmp1 = W_mult_32_32( pSpectrum[idx][1], pSpectrum[idx][1] ); - W_tmp0 = W_add( W_tmp0, W_tmp1 ); + W_tmp0 = W_mult_32_32( pSpectrum[idx][0], pSpectrum[idx][0] ); // Q30 * 2 - 1 + W_tmp1 = W_mult_32_32( pSpectrum[idx][1], pSpectrum[idx][1] ); // Q30 * 2 - 1 + W_tmp0 = W_add( W_tmp0, W_tmp1 ); // Q30 * 2 - 1 W_shift = W_norm( W_tmp0 ); pCepstrum[idx] = Mpy_32_32( L_add( BASOP_Util_Log2( W_extract_h( W_shl( W_tmp0, W_shift ) ) ), L_shl( negate( W_shift ), 25 ) ), LN_2_Q31 ); /* log2 = 0.693147, q = 31, value = 1488521848 */ // q =26 move32(); @@ -275,7 +278,7 @@ static void calc_min_phase_fx( /* Extending one-sided spectrum to double-sided one */ FOR( idx = spectrum_size; idx < fft_size; idx++ ) { - pCepstrum[idx] = pCepstrum[sub( fft_size, idx )]; + pCepstrum[idx] = pCepstrum[fft_size - idx]; move32(); } Word16 guarded_bits; @@ -311,7 +314,7 @@ static void calc_min_phase_fx( { pFolded_cepstrum_re[idx] = L_shl( pCepstrum[idx], 1 ); // q = q_pCepstrum move32(); - pFolded_cepstrum_im[idx] = L_negate( L_shl( pCepstrum[sub( fft_size, idx )], 1 ) ); // q = q_pCepstrum + pFolded_cepstrum_im[idx] = L_negate( L_shl( pCepstrum[fft_size - idx], 1 ) ); // q = q_pCepstrum move32(); /* Note: sign inverted because of fft rather than ifft used before */ } @@ -414,7 +417,7 @@ static void calc_min_phase_filter( #ifdef IVAS_FLOAT_FIXED static void calc_min_phase_filter_fx( - rv_fftwf_type_complex_fx *pH_flt, + rv_fftwf_type_complex_fx *pH_flt, // Q31 const Word16 fft_size ) { const Word16 spectrum_size = add( shr( fft_size, 1 ), 1 ); @@ -433,21 +436,21 @@ static void calc_min_phase_filter_fx( /* Cancel out initial phase by computing amplitude */ /* Note: slightly different (but mathematically equivalent) approach used for better efficiency */ move16(); - W_tmp1 = W_mult_32_32( pH_flt[idx][0], pH_flt[idx][0] ); - W_tmp2 = W_mult_32_32( pH_flt[idx][1], pH_flt[idx][1] ); - W_tmp1 = W_add( W_tmp1, W_tmp2 ); + W_tmp1 = W_mult_32_32( pH_flt[idx][0], pH_flt[idx][0] ); // Q31 *2 - 1 + W_tmp2 = W_mult_32_32( pH_flt[idx][1], pH_flt[idx][1] ); // Q31 *2 - 1 + W_tmp1 = W_add( W_tmp1, W_tmp2 ); // Q31 *2 - 1 W_shift = W_norm( W_tmp1 ); - L_tmp = W_extract_h( W_shl( W_tmp1, W_shift ) ); - Word16 exp = negate( W_shift ); // 31-31-W_shift + L_tmp = W_extract_h( W_shl( W_tmp1, W_shift ) ); // Q31 *2 - 1 + W_shift - 31 + Word16 exp = negate( W_shift ); // 31-31-W_shift - Word32 current_ampl = Sqrt32( L_tmp, &exp ); // q = 31 -exp == 31 - current_ampl = L_shl( current_ampl, exp ); + Word32 current_ampl = Sqrt32( L_tmp, &exp ); // q = 31 - exp = q31 + current_ampl = L_shl( current_ampl, exp ); // Q31 /* Using the phase computed by calc_min_phase() + additional delay */ /* Apply the computed phase */ - pH_flt[idx][0] = Mpy_32_16_1( current_ampl, shl_sat( getCosWord16( abs_s( (Word16) L_shr( pMin_phase[idx], sub( q_pMin_phase, 13 ) ) ) ), 1 ) ); // shifting right for next function. + pH_flt[idx][0] = Mpy_32_16_1( current_ampl, shl_sat( getCosWord16( abs_s( (Word16) L_shr( pMin_phase[idx], sub( q_pMin_phase, 13 ) ) ) ), 1 ) ); // shifting right for next function.//Q31 + Q13 + 1 - 15 move32(); - pH_flt[idx][1] = Mpy_32_16_1( current_ampl, getSinWord16( (Word16) L_shr( pMin_phase[idx], sub( q_pMin_phase, 13 ) ) ) ); + pH_flt[idx][1] = Mpy_32_16_1( current_ampl, getSinWord16( (Word16) L_shr( pMin_phase[idx], sub( q_pMin_phase, 13 ) ) ) ); // Q31 + Q15 - 15 move32(); } @@ -511,8 +514,8 @@ static void apply_window_fft( #endif #ifdef IVAS_FLOAT_FIXED static void apply_window_fft_fx( - rv_fftwf_type_complex_fx *pH_flt, - const Word32 *pWindow, + rv_fftwf_type_complex_fx *pH_flt, // q_pFilter + const Word32 *pWindow, // Q30 const Word16 fft_size, Word16 *q_pFilter ) { @@ -525,13 +528,13 @@ static void apply_window_fft_fx( /* Real parts */ FOR( idx = 0; idx <= half_fft_size; idx++ ) { - pFilter[idx] = pH_flt[idx][0]; + pFilter[idx] = pH_flt[idx][0]; // Q31 move32(); } /* Img parts */ FOR( idx = 1; idx < half_fft_size; idx++ ) { - pFilter[sub( fft_size, idx )] = pH_flt[idx][1]; + pFilter[fft_size - idx] = pH_flt[idx][1]; // Q31 move32(); } *q_pFilter = 31; @@ -545,10 +548,11 @@ static void apply_window_fft_fx( { FOR( Word16 j = 0; j < fft_size; j++ ) { - pFilter[j] = L_shl( pFilter[j], temp ); + pFilter[j] = L_shl( pFilter[j], temp ); // q_pFilter + temp move32(); } *q_pFilter = add( *q_pFilter, temp ); + move16(); } ifft_rel_fx32( pFilter, fft_size, log2_fft_size ); @@ -575,12 +579,12 @@ static void apply_window_fft_fx( move16(); } - fft_rel_fx32( pFilter, fft_size, log2_fft_size ); // q = q_pFilter + fft_rel_fx32( pFilter, fft_size, log2_fft_size ); // q_pFilter /* Copy data to the output with format conversion */ - pH_flt[0][0] = pFilter[0]; + pH_flt[0][0] = pFilter[0]; // q_pFilter move32(); - pH_flt[half_fft_size][0] = pFilter[half_fft_size]; + pH_flt[half_fft_size][0] = pFilter[half_fft_size]; // q_pFilter move32(); pH_flt[0][1] = 0; move32(); @@ -588,9 +592,9 @@ static void apply_window_fft_fx( move32(); FOR( idx = 1; idx < half_fft_size; idx++ ) { - pH_flt[idx][0] = pFilter[idx]; + pH_flt[idx][0] = pFilter[idx]; // q_pFilter move32(); - pH_flt[idx][1] = pFilter[sub( fft_size, idx )]; + pH_flt[idx][1] = pFilter[fft_size - idx]; // q_pFilter move32(); } @@ -665,17 +669,20 @@ static void response_step_limit( return; } #else - static void response_step_limit_fx( - Word32 *X, + Word32 *X, // Q30 const Word16 dim_x, const Word16 pivot_bin_idx ) { Word16 i; - const Word32 positive_step_limit_lf = 1701766107; - const Word32 negative_step_limit_lf = 677485289; // 1.0f / positive_step_limit_lf = 0.63095734448019324;//q = 30 - const Word32 positive_step_limit_hf = 1276144549; - const Word32 negative_step_limit_hf = 903441154; // 1.0f / positive_step_limit_hf = 1.26209271246779263; //q = 30 + const Word32 positive_step_limit_lf = 1701766107; // Q30 + const Word32 negative_step_limit_lf = 677485289; // 1.0f / positive_step_limit_lf = 0.63095734448019324;//q = 30 + const Word32 positive_step_limit_hf = 1276144549; // Q30 + const Word32 negative_step_limit_hf = 903441154; // 1.0f / positive_step_limit_hf = 1.26209271246779263; //q = 30 + move32(); + move32(); + move32(); + move32(); /* Go up from pivot frequency and limit the slope to the maximum given by T. */ FOR( i = add( pivot_bin_idx, 1 ); i < dim_x; i++ ) @@ -695,7 +702,7 @@ static void response_step_limit_fx( IF( GT_16( desiredChange_q, 30 ) ) { - desiredChange = L_shr( desiredChange, desiredChange_q - 30 ); + desiredChange = L_shr( desiredChange, sub( desiredChange_q, 30 ) ); // Q30 desiredChange_q = 30; move16(); } @@ -703,23 +710,23 @@ static void response_step_limit_fx( IF( GE_32( X[i], X[i - 1] ) ) { - IF( GT_32( change, L_shr( positive_step_limit_hf, 30 - desiredChange_q ) ) ) + IF( GT_32( change, L_shr( positive_step_limit_hf, sub( 30, desiredChange_q ) ) ) ) { - change = positive_step_limit_hf; // q = 30; + change = positive_step_limit_hf; // Q30 move32(); - temp = W_mult0_32_32( X[i - 1], change ); - X[i] = (Word32) W_shr( temp, 30 ); + temp = W_mult0_32_32( X[i - 1], change ); // Q30+Q30 + X[i] = (Word32) W_shr( temp, 30 ); // Q30 move32(); } } ELSE { - IF( LT_32( change, L_shr( negative_step_limit_hf, 30 - desiredChange_q ) ) ) + IF( LT_32( change, L_shr( negative_step_limit_hf, sub( 30, desiredChange_q ) ) ) ) { - change = negative_step_limit_hf; // q = 30; + change = negative_step_limit_hf; // Q30; move32(); - temp = W_mult0_32_32( X[i - 1], change ); - X[i] = (Word32) W_shr( temp, 30 ); + temp = W_mult0_32_32( X[i - 1], change ); // Q30+Q30 + X[i] = (Word32) W_shr( temp, 30 ); // Q30 move32(); } } @@ -742,7 +749,7 @@ static void response_step_limit_fx( } IF( GT_16( desiredChange_q, 30 ) ) { - desiredChange = L_shr( desiredChange, desiredChange_q - 30 ); + desiredChange = L_shr( desiredChange, sub( desiredChange_q, 30 ) ); // Q30 desiredChange_q = 30; move16(); } @@ -752,10 +759,10 @@ static void response_step_limit_fx( { IF( GT_32( change, L_shr( positive_step_limit_lf, sub( 30, desiredChange_q ) ) ) ) { - change = positive_step_limit_lf; // q = 30; + change = positive_step_limit_lf; // Q30 move32(); - temp = W_mult0_32_32( X[i + 1], change ); - X[i] = (Word32) W_shr( temp, 30 ); + temp = W_mult0_32_32( X[i + 1], change ); // Q30 + Q30 + X[i] = (Word32) W_shr( temp, 30 ); // Q30 move32(); } } @@ -763,10 +770,10 @@ static void response_step_limit_fx( { IF( LT_32( change, L_shr( negative_step_limit_lf, sub( 30, desiredChange_q ) ) ) ) { - change = negative_step_limit_lf; // q = 30; + change = negative_step_limit_lf; // Q30 move32(); - temp = W_mult0_32_32( X[i + 1], change ); - X[i] = (Word32) W_shr( temp, 30 ); + temp = W_mult0_32_32( X[i + 1], change ); // Q30 + Q30 + X[i] = (Word32) W_shr( temp, 30 ); // Q30 move32(); } } @@ -820,7 +827,6 @@ void ivas_reverb_define_window_fft( return; } #else - void ivas_reverb_define_window_fft_fx( Word32 *pWindow, // output in Q31 const Word16 transitionStart, @@ -836,32 +842,32 @@ void ivas_reverb_define_window_fft_fx( /* The first portion of the sequence is kept unchanged, window == 1 */ FOR( idx = 0; idx < transitionStart; idx++ ) { - pWindow[idx] = ONE_IN_Q31; // q31 + pWindow[idx] = ONE_IN_Q31; // Q31 move32(); } /* Adding Hann half-window for smooth transition */ Word16 s1 = sub( norm_s( shr( EVS_PI_FX, 1 ) ), 1 ); Word16 s2 = norm_s( sub( shl( transitionLength, 1 ), 1 ) ); - Word16 var1 = shl( EVS_PI_FX, s1 ); + Word16 var1 = shl( EVS_PI_FX, s1 ); // Q13+s1 Word16 var2 = shl( sub( shl( transitionLength, 1 ), 1 ), s2 ); - angle_increment = div_s( shr( var1, 5 ), var2 ); // q = 15 + angle_increment = div_s( shr( var1, 5 ), var2 ); // Q15 /* Initial angle set to match Hann window alignment in Matlab */ - initial_angle = shr( add( ( EVS_PI_FX ), shr( angle_increment, 2 ) ), 1 ); // q = 13 + initial_angle = shr( add( ( EVS_PI_FX ), shr( angle_increment, 2 ) ), 1 ); // Q13 FOR( idx = 0; idx < transitionLength; idx++ ) { - const Word16 sine_value = getSineWord16R2( mult( add( initial_angle, shl( mult( shl( idx, 8 ), angle_increment ), 5 ) ), 20858 ) ); // q31 + const Word16 sine_value = getSineWord16R2( mult( add( initial_angle, shl( mult( shl( idx, 8 ), angle_increment ), 5 ) ), 20858 ) ); // Q31 - pWindow[add( idx, transitionStart )] = L_mult( sine_value, sine_value ); + pWindow[idx + transitionStart] = L_mult( sine_value, sine_value ); // Q31 move32(); } /* Padding the rest with zeros */ FOR( idx = add( transitionStart, transitionLength ); idx < fftLength; idx++ ) { - pWindow[idx] = 0; + pWindow[idx] = 0; // Q31 move32(); } @@ -918,12 +924,12 @@ int16_t ivas_reverb_calc_color_filters( #endif #ifdef IVAS_FLOAT_FIXED Word16 ivas_reverb_calc_color_filters_fx( - const Word32 *pTargetL, - const Word32 *pTargetR, - const Word32 *pWindow, + const Word32 *pTargetL, // Q30 + const Word32 *pTargetR, // Q30 + const Word32 *pWindow, // Q30 const Word16 fft_size, - rv_fftwf_type_complex_fx *pBeqL, - rv_fftwf_type_complex_fx *pBeqR, + rv_fftwf_type_complex_fx *pBeqL, // q_pBeqL + rv_fftwf_type_complex_fx *pBeqR, // q_pBeqR Word16 *q_pBeqL, Word16 *q_pBeqR ) { @@ -932,11 +938,11 @@ Word16 ivas_reverb_calc_color_filters_fx( half_fft_size = shr( fft_size, 1 ); FOR( idx = 0; idx <= half_fft_size; idx++ ) { - pBeqL[idx][0] = L_shl( pTargetL[idx], 1 ); + pBeqL[idx][0] = L_shl( pTargetL[idx], 1 ); // Q31 move32(); pBeqL[idx][1] = 0; move32(); - pBeqR[idx][0] = L_shl( pTargetR[idx], 1 ); + pBeqR[idx][0] = L_shl( pTargetR[idx], 1 ); // Q31 move32(); pBeqR[idx][1] = 0; move32(); @@ -1172,7 +1178,6 @@ void ivas_reverb_calc_color_levels( return; } #else - void ivas_reverb_calc_color_levels_fx( const Word32 output_Fs, const Word16 freq_count, @@ -1229,9 +1234,9 @@ void ivas_reverb_calc_color_levels_fx( /* Obtaining T60 filters coefficients for the current loop */ FOR( i = 0; i < nrcoefs; i++ ) { - coefA[i] = pT60_filter_coeff[add( i_mult( shl( nrcoefs, 1 ), loop_idx ), add( i, nrcoefs ) )]; // q = 31 + coefA[i] = pT60_filter_coeff[2 * nrcoefs * loop_idx + i + nrcoefs]; // q = 31 move32(); - coefB[i] = pT60_filter_coeff[add( i_mult( shl( nrcoefs, 1 ), loop_idx ), i )]; // // q = 31 + coefB[i] = pT60_filter_coeff[2 * nrcoefs * loop_idx + i]; // // q = 31 move32(); } t60_e[freq_count] = -100; @@ -1270,7 +1275,7 @@ void ivas_reverb_calc_color_levels_fx( /* Dividing by the number of loops to compute the average T60 estimate */ FOR( freq_idx = 0; freq_idx < freq_count; freq_idx++ ) { - t60[freq_idx] = Mpy_32_32( t60[freq_idx], L_shl( loop_count_inverted, 16 ) ); + t60[freq_idx] = Mpy_32_32( t60[freq_idx], L_shl( loop_count_inverted, 16 ) ); // t60_e[freq_idx] + 31 - 15 + 16 move32(); } @@ -1410,11 +1415,11 @@ void ivas_reverb_interpolate_acoustic_data_fx( const Word32 *pInput_t60, // input in Q26 const Word32 *pInput_dsr, // input in Q30 const Word16 output_table_size, - const Word32 *pOutput_fc, - Word32 *pOutput_t60, - Word32 *pOutput_dsr, - Word16 *pOutput_t60_e, // output e - Word16 *pOutput_dsr_e // output e + const Word32 *pOutput_fc, // Q16 + Word32 *pOutput_t60, // pOutput_t60_e + Word32 *pOutput_dsr, // pOutput_dsr_e + Word16 *pOutput_t60_e, // output e + Word16 *pOutput_dsr_e // output e ) { Word16 input_idx, output_idx; @@ -1657,10 +1662,10 @@ void ivas_reverb_get_hrtf_set_properties( #else void ivas_reverb_get_hrtf_set_properties_fx( - Word32 **ppHrtf_set_L_re, - Word32 **ppHrtf_set_L_im, - Word32 **ppHrtf_set_R_re, - Word32 **ppHrtf_set_R_im, + Word32 **ppHrtf_set_L_re, // Q29 + Word32 **ppHrtf_set_L_im, // Q29 + Word32 **ppHrtf_set_R_re, // Q29 + Word32 **ppHrtf_set_R_im, // Q29 const AUDIO_CONFIG input_audio_config, const Word16 hrtf_count, const Word16 in_freq_count, @@ -1675,6 +1680,18 @@ void ivas_reverb_get_hrtf_set_properties_fx( { MAX_WORD16, 0, MAX_WORD16 }, { MAX_WORD16, 0, -MAX_WORD16 } }; + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); + move16(); const Word32 inp_freq_step = divide3232( ONE_IN_Q22, L_shl( in_freq_count, 23 ) ); // q= 15 const Word32 inp_freq_offset = L_shr( inp_freq_step, 1 ); // q= 15 const Word16 out_freq_step = divide3232( ONE_IN_Q21, L_shl( L_sub( out_freq_count, 1 ), 22 ) ); // q = 15 @@ -1743,7 +1760,7 @@ void ivas_reverb_get_hrtf_set_properties_fx( IF( GT_32( base_idx, L_sub( in_freq_count, 2 ) ) ) /* In case of extrapolation (above last bin), choose nearest */ { base_idx = L_sub( in_freq_count, 2 ); - relative_pos = ONE_IN_Q31; + relative_pos = ONE_IN_Q31; // Q31 move32(); } } @@ -1781,10 +1798,10 @@ void ivas_reverb_get_hrtf_set_properties_fx( /* In case of 5.1 or 7.1 formats, use the available HRTF paires directly*/ IF( !is_ambisonics ) { - current_base_L_ptr_re = ( ppHrtf_set_L_re[hrtf_idx] + base_idx ); - current_base_R_ptr_re = ( ppHrtf_set_R_re[hrtf_idx] + base_idx ); - current_base_L_ptr_im = ( ppHrtf_set_L_im[hrtf_idx] + base_idx ); - current_base_R_ptr_im = ( ppHrtf_set_R_im[hrtf_idx] + base_idx ); + current_base_L_ptr_re = ( ppHrtf_set_L_re[hrtf_idx] + base_idx ); // Q29 + current_base_R_ptr_re = ( ppHrtf_set_R_re[hrtf_idx] + base_idx ); // Q29 + current_base_L_ptr_im = ( ppHrtf_set_L_im[hrtf_idx] + base_idx ); // Q29 + current_base_R_ptr_im = ( ppHrtf_set_R_im[hrtf_idx] + base_idx ); // Q29 } /* In case of FOA format, combine the W channel with the X/Y channels */ @@ -1803,31 +1820,31 @@ void ivas_reverb_get_hrtf_set_properties_fx( FOR( ch_index = 0; ch_index < 3; ch_index++ ) { - combined_channels_L_re[freq_idx] = L_add( combined_channels_L_re[freq_idx], Mpy_32_16_1( ppHrtf_set_L_re[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); + combined_channels_L_re[freq_idx] = L_add( combined_channels_L_re[freq_idx], Mpy_32_16_1( ppHrtf_set_L_re[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); // Q29 + Q15 - 15 move32(); - combined_channels_R_re[freq_idx] = L_add( combined_channels_R_re[freq_idx], Mpy_32_16_1( ppHrtf_set_R_re[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); + combined_channels_R_re[freq_idx] = L_add( combined_channels_R_re[freq_idx], Mpy_32_16_1( ppHrtf_set_R_re[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); // Q29 + Q15 - 15 move32(); - combined_channels_L_im[freq_idx] = L_add( combined_channels_L_im[freq_idx], Mpy_32_16_1( ppHrtf_set_L_im[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); + combined_channels_L_im[freq_idx] = L_add( combined_channels_L_im[freq_idx], Mpy_32_16_1( ppHrtf_set_L_im[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); // Q29 + Q15 - 15 move32(); - combined_channels_R_im[freq_idx] = L_add( combined_channels_R_im[freq_idx], Mpy_32_16_1( ppHrtf_set_R_im[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); + combined_channels_R_im[freq_idx] = L_add( combined_channels_R_im[freq_idx], Mpy_32_16_1( ppHrtf_set_R_im[ch_index][base_idx + freq_idx], foa_sum_coeffs[hrtf_idx][ch_index] ) ); // Q29 + Q15 - 15 move32(); } } - current_base_L_ptr_re = &combined_channels_L_re[0]; - current_base_R_ptr_re = &combined_channels_R_re[0]; - current_base_L_ptr_im = &combined_channels_L_im[0]; - current_base_R_ptr_im = &combined_channels_R_im[0]; + current_base_L_ptr_re = &combined_channels_L_re[0]; // Q29 + current_base_R_ptr_re = &combined_channels_R_re[0]; // Q29 + current_base_L_ptr_im = &combined_channels_L_im[0]; // Q29 + current_base_R_ptr_im = &combined_channels_R_im[0]; // Q29 } FOR( freq_idx = 0; freq_idx < 2; freq_idx++ ) { Word32 L_re, L_im, R_re, R_im, C_re; - L_re = current_base_L_ptr_re[freq_idx]; // q = 29 - R_re = current_base_R_ptr_re[freq_idx]; // q = 29 - L_im = current_base_L_ptr_im[freq_idx]; // q = 29 - R_im = current_base_R_ptr_im[freq_idx]; // q = 29 + L_re = current_base_L_ptr_re[freq_idx]; // Q29 + R_re = current_base_R_ptr_re[freq_idx]; // Q29 + L_im = current_base_L_ptr_im[freq_idx]; // Q29 + R_im = current_base_R_ptr_im[freq_idx]; // Q29 move32(); move32(); move32(); @@ -1872,9 +1889,9 @@ void ivas_reverb_get_hrtf_set_properties_fx( IA_coherence[freq_idx] = L_shl( IA_coherence[freq_idx], sub( 27, sub( 15, temp ) ) ); // q = 27 move32(); /* Limiting to (0...1) range in case of small numerical errors or negative values */ - IA_coherence[freq_idx] = min( IA_coherence[freq_idx], ONE_IN_Q27 ); + IA_coherence[freq_idx] = min( IA_coherence[freq_idx], ONE_IN_Q27 ); // Q27 move32(); - IA_coherence[freq_idx] = max( IA_coherence[freq_idx], 0 ); + IA_coherence[freq_idx] = max( IA_coherence[freq_idx], 0 ); // Q27 move32(); } diff --git a/lib_rend/ivas_rom_rend.c b/lib_rend/ivas_rom_rend.c index b78c6fba1..caaea5173 100644 --- a/lib_rend/ivas_rom_rend.c +++ b/lib_rend/ivas_rom_rend.c @@ -1155,6 +1155,825 @@ const float ivas_reverb_default_DSR[IVAS_REVERB_DEFAULT_N_BANDS] = 6.2001e-08f, 2.8483e-08f, 2.6267e-08f }; +Word32 release_cnst_table[4][201] = // Q31 + { + { + 1913946752, + 1919716352, + 1925351680, + 1930855552, + 1936230784, + 1941479808, + 1946605312, + 1951609728, + 1956495744, + 1961265792, + 1965922304, + 1970467584, + 1974904320, + 1979234560, + 1983460736, + 1987585024, + 1991609856, + 1995537280, + 1999369344, + 2003108480, + 2006756480, + 2010315520, + 2013787520, + 2017174528, + 2020478464, + 2023701248, + 2026844672, + 2029910656, + 2032900992, + 2035817344, + 2038661376, + 2041435008, + 2044139648, + 2046777088, + 2049348864, + 2051856384, + 2054301440, + 2056685312, + 2059009536, + 2061275520, + 2063484672, + 2065638272, + 2067737856, + 2069784448, + 2071779584, + 2073724416, + 2075620096, + 2077467904, + 2079268992, + 2081024512, + 2082735488, + 2084403200, + 2086028416, + 2087612544, + 2089156352, + 2090660864, + 2092127104, + 2093555968, + 2094948480, + 2096305408, + 2097627776, + 2098916352, + 2100172032, + 2101395584, + 2102587776, + 2103749504, + 2104881408, + 2105984384, + 2107059072, + 2108106112, + 2109126400, + 2110120448, + 2111088896, + 2112032512, + 2112951808, + 2113847552, + 2114720128, + 2115570304, + 2116398592, + 2117205504, + 2117991552, + 2118757504, + 2119503616, + 2120230400, + 2120938496, + 2121628288, + 2122300288, + 2122954880, + 2123592576, + 2124213760, + 2124818944, + 2125408384, + 2125982592, + 2126541952, + 2127086848, + 2127617664, + 2128134656, + 2128638336, + 2129128832, + 2129606784, + 2130072192, + 2130525568, + 2130967296, + 2131397376, + 2131816448, + 2132224640, + 2132622080, + 2133009408, + 2133386496, + 2133753856, + 2134111744, + 2134460288, + 2134799744, + 2135130368, + 2135452416, + 2135766144, + 2136071680, + 2136369152, + 2136659072, + 2136941312, + 2137216256, + 2137484160, + 2137744896, + 2137998976, + 2138246400, + 2138487424, + 2138722176, + 2138950656, + 2139173376, + 2139390208, + 2139601408, + 2139807104, + 2140007424, + 2140202624, + 2140392576, + 2140577664, + 2140758016, + 2140933504, + 2141104512, + 2141271040, + 2141433216, + 2141591168, + 2141745024, + 2141894912, + 2142040832, + 2142182912, + 2142321408, + 2142456192, + 2142587392, + 2142715264, + 2142839808, + 2142961152, + 2143079296, + 2143194240, + 2143306240, + 2143415424, + 2143521664, + 2143625216, + 2143725952, + 2143824128, + 2143919744, + 2144012800, + 2144103424, + 2144191744, + 2144277760, + 2144361472, + 2144443136, + 2144522496, + 2144599936, + 2144675200, + 2144748544, + 2144820096, + 2144889600, + 2144957440, + 2145023488, + 2145087744, + 2145150336, + 2145211264, + 2145270656, + 2145328512, + 2145384832, + 2145439616, + 2145493120, + 2145545088, + 2145595776, + 2145645056, + 2145693184, + 2145739904, + 2145785472, + 2145829888, + 2145873152, + 2145915136, + 2145956224, + 2145996032, + 2146034944, + 2146072832, + 2146109696, + 2146145664, + 2146180608, + 2146214656, + 2146247808, + }, + { + 2027355264, + 2030408704, + 2033386624, + 2036290944, + 2039123328, + 2041885440, + 2044578944, + 2047205376, + 2049766528, + 2052263680, + 2054698496, + 2057072384, + 2059387008, + 2061643520, + 2063843328, + 2065987968, + 2068078720, + 2070116864, + 2072103552, + 2074040192, + 2075927936, + 2077767936, + 2079561472, + 2081309568, + 2083013376, + 2084673920, + 2086292352, + 2087869696, + 2089406976, + 2090905216, + 2092365184, + 2093788032, + 2095174528, + 2096525824, + 2097842432, + 2099125632, + 2100375808, + 2101594240, + 2102781312, + 2103938048, + 2105065216, + 2106163456, + 2107233536, + 2108276096, + 2109292032, + 2110281728, + 2111246080, + 2112185728, + 2113101056, + 2113992960, + 2114861824, + 2115708288, + 2116532992, + 2117336448, + 2118119168, + 2118881792, + 2119624704, + 2120348416, + 2121053440, + 2121740288, + 2122409344, + 2123061120, + 2123696128, + 2124314624, + 2124917120, + 2125504128, + 2126075776, + 2126632832, + 2127175296, + 2127703808, + 2128218624, + 2128720000, + 2129208448, + 2129684352, + 2130147712, + 2130599168, + 2131038976, + 2131467264, + 2131884416, + 2132290816, + 2132686592, + 2133072256, + 2133447680, + 2133813504, + 2134169856, + 2134516864, + 2134854784, + 2135184000, + 2135504640, + 2135816960, + 2136121216, + 2136417536, + 2136706048, + 2136987136, + 2137260928, + 2137527552, + 2137787264, + 2138040192, + 2138286592, + 2138526464, + 2138760192, + 2138987776, + 2139209472, + 2139425408, + 2139635712, + 2139840512, + 2140039936, + 2140234240, + 2140423424, + 2140607744, + 2140787200, + 2140962048, + 2141132288, + 2141298048, + 2141459584, + 2141616896, + 2141769984, + 2141919232, + 2142064512, + 2142205952, + 2142343808, + 2142478080, + 2142608768, + 2142736128, + 2142860032, + 2142980864, + 2143098368, + 2143212928, + 2143324544, + 2143433088, + 2143538944, + 2143641984, + 2143742336, + 2143840000, + 2143935232, + 2144027904, + 2144118144, + 2144206080, + 2144291712, + 2144375168, + 2144456320, + 2144535424, + 2144612480, + 2144687488, + 2144760448, + 2144831616, + 2144900992, + 2144968448, + 2145034112, + 2145098112, + 2145160448, + 2145221248, + 2145280256, + 2145337856, + 2145393920, + 2145448576, + 2145501696, + 2145553536, + 2145603968, + 2145653120, + 2145700992, + 2145747456, + 2145792896, + 2145837056, + 2145880064, + 2145922048, + 2145962880, + 2146002560, + 2146041344, + 2146078976, + 2146115712, + 2146151424, + 2146186240, + 2146220160, + 2146253184, + 2146285312, + 2146316672, + 2146347136, + 2146376832, + 2146405760, + 2146433920, + 2146461440, + 2146488192, + 2146514176, + 2146539520, + 2146564224, + 2146588160, + 2146611584, + 2146634368, + 2146656640, + 2146678272, + 2146699264, + 2146719744, + 2146739712, + 2146759168, + 2146778112, + 2146796544, + 2146814464, + 2146832000, + 2146849024, + 2146865664, + }, + { + 2086555136, + 2088125824, + 2089656576, + 2091148416, + 2092602240, + 2094018944, + 2095399680, + 2096745088, + 2098056192, + 2099333888, + 2100578816, + 2101792000, + 2102974080, + 2104125824, + 2105248128, + 2106341760, + 2107407232, + 2108445440, + 2109456896, + 2110442496, + 2111402624, + 2112338176, + 2113249664, + 2114137728, + 2115002880, + 2115845760, + 2116666880, + 2117466880, + 2118246272, + 2119005568, + 2119745280, + 2120465920, + 2121167872, + 2121851776, + 2122517888, + 2123166976, + 2123799168, + 2124414976, + 2125014912, + 2125599360, + 2126168704, + 2126723200, + 2127263360, + 2127789568, + 2128302208, + 2128801408, + 2129287808, + 2129761536, + 2130222976, + 2130672512, + 2131110272, + 2131536768, + 2131952128, + 2132356736, + 2132750848, + 2133134720, + 2133508736, + 2133872896, + 2134227584, + 2134573184, + 2134909696, + 2135237504, + 2135556736, + 2135867648, + 2136170624, + 2136465536, + 2136752896, + 2137032832, + 2137305344, + 2137570816, + 2137829376, + 2138081280, + 2138326528, + 2138565504, + 2138798080, + 2139024768, + 2139245440, + 2139460480, + 2139669888, + 2139873792, + 2140072320, + 2140265856, + 2140454144, + 2140637696, + 2140816384, + 2140990464, + 2141159936, + 2141325056, + 2141485824, + 2141642368, + 2141794944, + 2141943424, + 2142088064, + 2142228992, + 2142366208, + 2142499840, + 2142630016, + 2142756736, + 2142880128, + 2143000448, + 2143117440, + 2143231488, + 2143342592, + 2143450752, + 2143556096, + 2143658624, + 2143758592, + 2143855872, + 2143950592, + 2144043008, + 2144132864, + 2144220416, + 2144305664, + 2144388608, + 2144469504, + 2144548224, + 2144624896, + 2144699648, + 2144772352, + 2144843264, + 2144912256, + 2144979328, + 2145044864, + 2145108480, + 2145170560, + 2145231104, + 2145289856, + 2145347200, + 2145403008, + 2145457408, + 2145510400, + 2145561984, + 2145612160, + 2145661056, + 2145708672, + 2145755136, + 2145800192, + 2145844224, + 2145887104, + 2145928832, + 2145969408, + 2146008960, + 2146047616, + 2146085120, + 2146121600, + 2146157184, + 2146191872, + 2146225664, + 2146258560, + 2146290560, + 2146321792, + 2146352128, + 2146381696, + 2146410496, + 2146438528, + 2146465920, + 2146492416, + 2146518400, + 2146543616, + 2146568192, + 2146592128, + 2146615424, + 2146638080, + 2146660224, + 2146681728, + 2146702720, + 2146723072, + 2146743040, + 2146762368, + 2146781184, + 2146799616, + 2146817408, + 2146834816, + 2146851840, + 2146868352, + 2146884352, + 2146900096, + 2146915328, + 2146930176, + 2146944640, + 2146958720, + 2146972416, + 2146985856, + 2146998784, + 2147011456, + 2147023872, + 2147035904, + 2147047552, + 2147058944, + 2147070080, + 2147080832, + 2147091456, + 2147101696, + 2147111680, + 2147121408, + 2147130880, + 2147140096, + 2147149056, + 2147157760, + 2147166336, + 2147174656, + }, + { + 2106670080, + 2107727232, + 2108757120, + 2109760640, + 2110738432, + 2111691008, + 2112619136, + 2113523328, + 2114404352, + 2115262592, + 2116098816, + 2116913408, + 2117707136, + 2118480256, + 2119233536, + 2119967360, + 2120682240, + 2121378688, + 2122057088, + 2122717952, + 2123361792, + 2123988992, + 2124599936, + 2125195136, + 2125774848, + 2126339584, + 2126889728, + 2127425536, + 2127947520, + 2128456064, + 2128951296, + 2129433856, + 2129903744, + 2130361600, + 2130807424, + 2131241728, + 2131664768, + 2132076928, + 2132478208, + 2132869248, + 2133250048, + 2133620992, + 2133982208, + 2134334080, + 2134676864, + 2135010688, + 2135335936, + 2135652608, + 2135961088, + 2136261504, + 2136554112, + 2136839168, + 2137116800, + 2137387136, + 2137650560, + 2137907072, + 2138156928, + 2138400256, + 2138637184, + 2138867968, + 2139092864, + 2139311744, + 2139524992, + 2139732736, + 2139934976, + 2140131968, + 2140323840, + 2140510720, + 2140692736, + 2140870016, + 2141042688, + 2141210752, + 2141374592, + 2141534080, + 2141689344, + 2141840640, + 2141987968, + 2142131456, + 2142271232, + 2142407424, + 2142539904, + 2142669056, + 2142794752, + 2142917248, + 2143036544, + 2143152640, + 2143265792, + 2143375872, + 2143483264, + 2143587712, + 2143689472, + 2143788544, + 2143885056, + 2143979136, + 2144070656, + 2144159872, + 2144246656, + 2144331264, + 2144413568, + 2144493824, + 2144571904, + 2144647936, + 2144722048, + 2144794240, + 2144864512, + 2144932864, + 2144999552, + 2145064448, + 2145127680, + 2145189248, + 2145249152, + 2145307520, + 2145364480, + 2145419776, + 2145473792, + 2145526272, + 2145577472, + 2145627264, + 2145675776, + 2145723008, + 2145768960, + 2145813760, + 2145857408, + 2145899904, + 2145941376, + 2145981696, + 2146020864, + 2146059136, + 2146096384, + 2146132608, + 2146167936, + 2146202368, + 2146235776, + 2146268416, + 2146300160, + 2146331136, + 2146361216, + 2146390528, + 2146419200, + 2146446976, + 2146474112, + 2146500480, + 2146526208, + 2146551168, + 2146575488, + 2146599296, + 2146622464, + 2146644864, + 2146666880, + 2146688128, + 2146708992, + 2146729216, + 2146748928, + 2146768128, + 2146786816, + 2146805120, + 2146822784, + 2146840064, + 2146856960, + 2146873344, + 2146889216, + 2146904832, + 2146919936, + 2146934656, + 2146948992, + 2146962944, + 2146976640, + 2146989824, + 2147002752, + 2147015296, + 2147027584, + 2147039488, + 2147051136, + 2147062400, + 2147073408, + 2147084160, + 2147094528, + 2147104768, + 2147114624, + 2147124352, + 2147133696, + 2147142912, + 2147151744, + 2147160448, + 2147168896, + 2147177088, + 2147185152, + 2147192960, + 2147200512, + 2147207936, + 2147215104, + 2147222144, + 2147229056, + 2147235712, + 2147242112, + 2147248384, + 2147254656, + 2147260544, + 2147266432, + 2147272064, + 2147277568, + }, + + + }; + + /*----------------------------------------------------------------------------------* * Renderer SBA & MC enc/dec matrices *----------------------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_rom_rend.h b/lib_rend/ivas_rom_rend.h index 06590cee1..f98897eca 100644 --- a/lib_rend/ivas_rom_rend.h +++ b/lib_rend/ivas_rom_rend.h @@ -186,6 +186,8 @@ extern const float ivas_reverb_default_fc[]; extern const float ivas_reverb_default_RT60[]; extern const float ivas_reverb_default_DSR[]; +Word32 release_cnst_table[4][201]; // Q31 + /*----------------------------------------------------------------------------------* * Renderer SBA & MC enc/dec matrices *----------------------------------------------------------------------------------*/ diff --git a/lib_rend/ivas_shoebox.c b/lib_rend/ivas_shoebox.c index 585696760..1cbdc63c1 100644 --- a/lib_rend/ivas_shoebox.c +++ b/lib_rend/ivas_shoebox.c @@ -49,18 +49,19 @@ * Local constants *------------------------------------------------------------------------*/ -#define ER_MAX_SOURCES 25 -#define ER_REF_ORDER 1 +#define ER_MAX_SOURCES 25 +#define ER_REF_ORDER 1 +#ifndef IVAS_FLOAT_FIXED #define ER_AIR_COEFF ( 0.00137f ) #define ER_SOUND_SPEED ( 343.0f ) #define ER_MIN_WALL_DIST ( 0.1f ) #define ER_EUCLIDEAN_SCALE ( 1.29246971E-26f ) -#ifdef IVAS_FLOAT_FIXED -#define ER_AIR_COEFF_FX ( Word32 )( 0.00137 * ONE_IN_Q31 ) // Q.31 -#define ER_SOUND_SPEED_FX ( Word32 )( 1 / 343.0 * ONE_IN_Q31 ) // 1/343.0f in Q1.31 -#define ER_MIN_WALL_DIST_FX ( Word32 )( 0.1 * ONE_IN_Q22 ) // Q.22 -#define ER_EUCLIDEAN_SCALE_FX ( 0x1 ) ////Q.22 -#define ER_RECIPROCAL_EUCLIDEAN_SCALE_FX ( 0x1 ) // Q.22 +#else +#define ER_AIR_COEFF_FX ( Word32 )( 2942053 ) // 0.00137f in Q.31 +#define ER_SOUND_SPEED_FX ( Word32 )( 6260885 ) // 1/343.0f in Q1.31 +#define ER_MIN_WALL_DIST_FX ( Word32 )( 419430 ) // Q.22 +#define ER_EUCLIDEAN_SCALE_FX ( 0x1 ) // Q.22 +#define ER_RECIPROCAL_EUCLIDEAN_SCALE_FX ( 0x1 ) // Q.22 #endif @@ -192,9 +193,8 @@ void ivas_shoebox_init( move32(); /* Add defaults */ obj->max_bands = 1; - obj->MAX_SOURCES = ER_MAX_SOURCES; - obj->REF_ORDER = ER_REF_ORDER; - move16(); + obj->MAX_SOURCES = ER_MAX_SOURCES; // Q0 + obj->REF_ORDER = ER_REF_ORDER; // Q0 move16(); move16(); move16(); @@ -225,10 +225,10 @@ void ivas_shoebox_init( move16(); /* Params */ - obj->radius_fx = ER_RADIUS_FX; - obj->min_wall_dist_fx = ER_MIN_WALL_DIST_FX; - obj->soundspeed_fx = ER_SOUND_SPEED_FX; - obj->air_coeff_fx = ER_AIR_COEFF_FX; + obj->radius_fx = ER_RADIUS_FX; // Q30 + obj->min_wall_dist_fx = ER_MIN_WALL_DIST_FX; // Q22 + obj->soundspeed_fx = ER_SOUND_SPEED_FX; // Q31 + obj->air_coeff_fx = ER_AIR_COEFF_FX; // Q31 move32(); move32(); move32(); @@ -305,7 +305,8 @@ static void shoebox_bound( #else static void shoebox_bound_fx( shoebox_obj_t *obj, - Word32 *out_pos ) + Word32 *out_pos // Q22 +) { Word32 out_tmp, out_tmp1; Word32 i; @@ -360,7 +361,7 @@ static void shoebox_bound_fx( } move32(); } - out_pos[1] = W_extract_l( W_mult0_32_32( out_tmp, i ) ); + out_pos[1] = W_extract_l( W_mult0_32_32( out_tmp, i ) ); // Q22 move32(); } @@ -387,7 +388,7 @@ static void shoebox_bound_fx( } move32(); } - out_pos[2] = (Word32) W_mult0_32_32( out_tmp, (Word32) i ); + out_pos[2] = W_extract_l( W_mult0_32_32( out_tmp, (Word32) i ) ); // Q22 move32(); } @@ -482,9 +483,9 @@ static void shoebox_get_coord( static void shoebox_get_coord_fx( shoebox_obj_t *obj, - Word32 *fcnOutput_data, - const Word32 src_pos_data[], - Word32 *tmp_pos, + Word32 *fcnOutput_data, // 0th and 1st idx in Q0 and 2nd idx in Q30 + const Word32 src_pos_data[], // Q22 + Word32 *tmp_pos, // Q22 Word32 out_tmp, Word32 coord, Word32 loop_ub, @@ -501,18 +502,18 @@ static void shoebox_get_coord_fx( IF( obj->isCartesian == 0 ) { /* Convert Spherical to Cartesian */ - tmp_data[2] = Mpy_32_32( fcnOutput_data[2], shoebox_sin_cos_tbl_fx[fcnOutput_data[1]][0] ); //.29 = .30 * .30 + tmp_data[2] = Mpy_32_32( fcnOutput_data[2] /* Q30 */, shoebox_sin_cos_tbl_fx[fcnOutput_data[1] /* Q0 */][0] ); // Q29 = .Q30 * Q30 move32(); - rcoselev = Mpy_32_32( fcnOutput_data[2], shoebox_sin_cos_tbl_fx[fcnOutput_data[1]][1] ); //.29 = .30 * .30 - tmp_data[0] = Mpy_32_32( rcoselev, shoebox_sin_cos_tbl_fx[fcnOutput_data[0]][1] ); // .28 =.29*.30 + rcoselev = Mpy_32_32( fcnOutput_data[2] /* Q30 */, shoebox_sin_cos_tbl_fx[fcnOutput_data[1] /* Q0 */][1] ); // Q29 = Q30 * Q30 + tmp_data[0] = Mpy_32_32( rcoselev, shoebox_sin_cos_tbl_fx[fcnOutput_data[0] /* Q0 */][1] ); // Q28 =Q29*Q30 move32(); - tmp_data[1] = Mpy_32_32( rcoselev, shoebox_sin_cos_tbl_fx[fcnOutput_data[0]][0] ); // .28 = .29*.30 + tmp_data[1] = Mpy_32_32( rcoselev, shoebox_sin_cos_tbl_fx[fcnOutput_data[0] /* Q0 */][0] ); // Q28 = Q29*Q30 move32(); - tmp_data[0] = L_shr( tmp_data[0], 6 ); + tmp_data[0] = L_shr( tmp_data[0], 6 ); // Q28 -> Q22 move32(); - tmp_data[1] = L_shr( tmp_data[1], 6 ); + tmp_data[1] = L_shr( tmp_data[1], 6 ); // Q28 -> Q22 move32(); - tmp_data[2] = L_shr( tmp_data[2], 7 ); + tmp_data[2] = L_shr( tmp_data[2], 7 ); // Q29 -> Q22 move32(); } ELSE @@ -528,14 +529,14 @@ static void shoebox_get_coord_fx( IF( obj->isZHeight != 0 ) { /* FIX Z COORDINATE */ - tmp_data[2] = L_sub( src_pos_data[L_add( k, 2 )], L_shr( obj->cal.room_H_fx, 1 ) ); + tmp_data[2] = L_sub( src_pos_data[k + 2] /* Q22 */, L_shr( obj->cal.room_H_fx, 1 ) ); // Q22 move32(); } } FOR( k = 0; k < tmp_size_idx_1; k++ ) { - obj->src_pos_fx[L_add( coord, k ) - 1] = tmp_data[k]; //.22 + obj->src_pos_fx[coord + k - 1] = tmp_data[k]; // Q22 move32(); } @@ -543,18 +544,18 @@ static void shoebox_get_coord_fx( k = L_add( out_tmp, 1 ); - tmp_pos[0] = obj->src_pos_fx[k - 1]; //.22 - tmp_pos[1] = obj->src_pos_fx[k]; - tmp_pos[2] = obj->src_pos_fx[k + 1]; + tmp_pos[0] = obj->src_pos_fx[k - 1]; // Q22 + tmp_pos[1] = obj->src_pos_fx[k]; // Q22 + tmp_pos[2] = obj->src_pos_fx[k + 1]; // Q22 move32(); move32(); move32(); IF( isRelative != 0 ) { - tmp_pos[0] = L_add( tmp_pos[0], obj->list_pos_fx[0] ); //.22 - tmp_pos[1] = L_add( tmp_pos[1], obj->list_pos_fx[1] ); - tmp_pos[2] = L_add( tmp_pos[2], obj->list_pos_fx[2] ); + tmp_pos[0] = L_add( tmp_pos[0], obj->list_pos_fx[0] ); // Q22 + tmp_pos[1] = L_add( tmp_pos[1], obj->list_pos_fx[1] ); // Q22 + tmp_pos[2] = L_add( tmp_pos[2], obj->list_pos_fx[2] ); // Q22 move32(); move32(); @@ -627,13 +628,14 @@ static float shoebox_get_euclidian_distance_internal( #else static Word32 shoebox_get_euclidian_distance_internal_fx( shoebox_obj_t *obj, - Word32 *tmp_pos, - Word32 *scale ) + Word32 *tmp_pos, // Q22 + Word32 *scale // Q22 +) { Word32 absxk, out_tmp, t; Word16 q; - absxk = L_abs( L_sub( obj->list_pos_fx[0], tmp_pos[0] ) ); // Q.22-Q22 + absxk = L_abs( L_sub( obj->list_pos_fx[0], tmp_pos[0] ) ); // Q22-Q22 IF( GT_32( absxk, ER_EUCLIDEAN_SCALE_FX ) ) { @@ -658,15 +660,15 @@ static Word32 shoebox_get_euclidian_distance_internal_fx( out_tmp = W_extract_h( W_shl( W_mult_32_32( out_tmp, t ), q ) ); // Q22 + Q31 + Q1 - 32 = Q22 out_tmp = W_extract_h( W_shl( W_mult_32_32( out_tmp, t ), q ) ); // Q22 + Q31 + Q1 - 32 = Q22 - out_tmp = L_add( out_tmp, ONE_IN_Q22 ); //.22 - *scale = absxk; // Q.22 + out_tmp = L_add( out_tmp, ONE_IN_Q22 ); // Q22 + *scale = absxk; // Q22 move32(); } ELSE { t = (Word32) BASOP_Util_Divide3232_Scale_cadence( absxk, *scale, &q ); t = W_extract_h( W_shl( W_mult_32_32( t, t ), sub( shl( q, 1 ), 9 ) ) ); // Q31 + Q31 + Q1 - 9 - 32 = Q22 - out_tmp = L_add( out_tmp, t ); //.22 + out_tmp = L_add( out_tmp, t ); // Q22 move32(); } @@ -676,17 +678,17 @@ static Word32 shoebox_get_euclidian_distance_internal_fx( { t = (Word32) BASOP_Util_Divide3232_Scale_cadence( *scale, absxk, &q ); - out_tmp = W_extract_h( W_shl( W_mult_32_32( out_tmp, t ), q ) ); // Q22 + Q31 + Q1 - 32 = Q22 - out_tmp = W_extract_h( W_shl( W_mult_32_32( out_tmp, t ), q ) ); // Q22 + Q31 + Q1 - 32 = Q22 - out_tmp = L_add( out_tmp, ONE_IN_Q22 ); //.22 - *scale = absxk; // Q.22 + out_tmp = W_extract_h( W_shl( W_mult_32_32( out_tmp, t ), q ) ); // Q22 + Q31 + Q1 - 32 = Q22 + out_tmp = W_extract_h( W_shl( W_mult_32_32( out_tmp, t ), q ) ); // Q22 + Q31 + Q1 - 32 = Q22 + out_tmp = L_add( out_tmp, ONE_IN_Q22 ); // Q22 + *scale = absxk; // Q22 move32(); } ELSE { t = (Word32) BASOP_Util_Divide3232_Scale_cadence( absxk, *scale, &q ); t = W_extract_h( W_shl( W_mult_32_32( t, t ), sub( shl( q, 1 ), 9 ) ) ); // Q31 + Q31 + Q1 - 9 - 32 = Q22 - out_tmp = L_add( out_tmp, t ); //.22 + out_tmp = L_add( out_tmp, t ); // Q22 } return out_tmp; @@ -851,8 +853,8 @@ void ivas_shoebox_set_scene( void ivas_shoebox_set_scene( shoebox_obj_t *obj, shoebox_output_t *ER_PARAMS, - const Word32 list_pos_fx[3], - const Word32 src_pos_data[], + const Word32 list_pos_fx[3], // Q22 + const Word32 src_pos_data[], // 0th and 1st idx in Q0 and 2nd idx in Q30 const UWord16 isCartesian, const UWord16 isRelative ) { @@ -881,20 +883,20 @@ void ivas_shoebox_set_scene( set32_fx( &obj->src_pos_fx[0], 0, 75U ); - obj->list_pos_fx[0] = list_pos_fx[0]; - obj->list_pos_fx[1] = list_pos_fx[1]; - obj->list_pos_fx[2] = list_pos_fx[2]; + obj->list_pos_fx[0] = list_pos_fx[0]; // Q22 + obj->list_pos_fx[1] = list_pos_fx[1]; // Q22 + obj->list_pos_fx[2] = list_pos_fx[2]; // Q22 move32(); move32(); move32(); /* ---------- ADJUST LISTENER ------------- */ IF( obj->isZHeight != 0 ) { - obj->list_pos_fx[2] = L_sub( list_pos_fx[2], L_shr( obj->cal.room_H_fx, 1 ) ); // Q.22 + obj->list_pos_fx[2] = L_sub( list_pos_fx[2], L_shr( obj->cal.room_H_fx, 1 ) ); // Q22 move32(); } - tmp_pos_fx[1] = obj->list_pos_fx[1]; - tmp_pos_fx[2] = obj->list_pos_fx[2]; + tmp_pos_fx[1] = obj->list_pos_fx[1]; // Q22 + tmp_pos_fx[2] = obj->list_pos_fx[2]; // Q22 move32(); move32(); @@ -922,14 +924,14 @@ void ivas_shoebox_set_scene( FOR( n = 0; n < loop_ub; n++ ) { - fcnOutput_data_fx[n] = src_pos_data[L_add( k, n )]; + fcnOutput_data_fx[n] = src_pos_data[k + n]; move32(); } shoebox_get_coord_fx( obj, fcnOutput_data_fx, src_pos_data, tmp_pos_fx, out_tmp, coord, loop_ub, k, isRelative ); shoebox_bound_fx( obj, tmp_pos_fx ); - scale_fx = ER_EUCLIDEAN_SCALE_FX; + scale_fx = ER_EUCLIDEAN_SCALE_FX; // Q22 move32(); out_tmp_fx = shoebox_get_euclidian_distance_internal_fx( obj, tmp_pos_fx, &scale_fx ); q_format = Q31 - Q22; @@ -950,7 +952,7 @@ void ivas_shoebox_set_scene( /* 2. ER_struct : Early reflection structure */ /* 3. src_num : Index of source to compute patterns for */ /* ------ */ - out_tmp_fx = obj->src_dist_fx[j]; + out_tmp_fx = obj->src_dist_fx[j]; // Q22 move32(); FOR( loop_ub = 0; loop_ub < 6; loop_ub++ ) @@ -970,8 +972,8 @@ void ivas_shoebox_set_scene( /* Initialize image position coordinates */ im_pos_fx[0] = tmp_pos_fx[0]; // Q:22 - im_pos_fx[1] = tmp_pos_fx[1]; - im_pos_fx[2] = tmp_pos_fx[2]; + im_pos_fx[1] = tmp_pos_fx[1]; // Q:22 + im_pos_fx[2] = tmp_pos_fx[2]; // Q:22 move32(); move32(); move32(); @@ -996,7 +998,7 @@ void ivas_shoebox_set_scene( im_pos_fx[coord] = L_add( tmp_pos_fx[coord], - L_shl( L_sub( L_shr( (Word32) W_mult0_32_32( ( L_negate( L_sub( 1, L_shl( L_and( L_add( loop_ub, 1 ), 1 ), 1 ) ) ) ), scale_fx ), 1 ), tmp_pos_fx[coord] ), 1 ) ); // Q:22 + L_shl( L_sub( L_shr( W_extract_l( W_mult0_32_32( ( L_negate( L_sub( 1, L_shl( L_and( L_add( loop_ub, 1 ), 1 ), 1 ) ) ) ), scale_fx ) ), 1 ), tmp_pos_fx[coord] ), 1 ) ); // Q:22 move32(); /* 0. Get euclidean distance from IMAGE SOURCE [N,W] to LIST */ @@ -1006,23 +1008,23 @@ void ivas_shoebox_set_scene( q_format = Q31 - Q22; move16(); - path_dist_fx = Sqrt32( path_dist_fx, &q_format ); // Input: Q:22, Output : Q.30 + path_dist_fx = Sqrt32( path_dist_fx, &q_format ); // Input: Q:22, Output : Q30 - path_dist_fx = Mpy_32_32( scale_fx, path_dist_fx ); // Q22 * Q = Q - path_dist_fx = L_shl( path_dist_fx, q_format ); + path_dist_fx = Mpy_32_32( scale_fx, path_dist_fx ); // Q22 + (31 - q_format) - 31 = Q22 - q_format + path_dist_fx = L_shl( path_dist_fx, q_format ); // Q22 - q_format + (q_format) = Q22 /* 1. Compute time-of arrival (TOA) */ - ER_PARAMS->times.data_fx[rcoselev - 1] = Mpy_32_32( path_dist_fx, obj->soundspeed_fx ); // Q.22 + ER_PARAMS->times.data_fx[rcoselev - 1] = Mpy_32_32( path_dist_fx, obj->soundspeed_fx ); // Q22 move32(); /* 2./3. DOA */ - sub_im_nd_list_pos_1 = L_sub( im_pos_fx[1], obj->list_pos_fx[1] ); // Q.22 - sub_im_nd_list_pos_0 = L_sub( im_pos_fx[0], obj->list_pos_fx[0] ); // Q.22 + sub_im_nd_list_pos_1 = L_sub( im_pos_fx[1], obj->list_pos_fx[1] ); // Q22 + sub_im_nd_list_pos_0 = L_sub( im_pos_fx[0], obj->list_pos_fx[0] ); // Q22 q_format = Q22 - Q22; move16(); - atan_pos = BASOP_util_atan2( sub_im_nd_list_pos_1, sub_im_nd_list_pos_0, q_format ); // Q.13 - az_angle_d = rad2deg_fx( atan_pos ); // Q.23 + atan_pos = BASOP_util_atan2( sub_im_nd_list_pos_1, sub_im_nd_list_pos_0, q_format ); // Q13 + az_angle_d = rad2deg_fx( atan_pos ); // Q23 ER_PARAMS->az_angle.data_fx[rcoselev - 1] = az_angle_d; move32(); @@ -1045,7 +1047,7 @@ void ivas_shoebox_set_scene( q_format_n = Q31 - Q31; asin_val = BASOP_util_atan2( sub_im_nd_list_div_path, one_minus_sub_im_nd_list_div_path_sq_rt, q_format_n ); // Q13 - asin_val_deg = rad2deg_fx( asin_val ); // Q.23 + asin_val_deg = rad2deg_fx( asin_val ); // Q23 ER_PARAMS->el_angle.data_fx[rcoselev - 1] = asin_val_deg; move32(); @@ -1054,7 +1056,7 @@ void ivas_shoebox_set_scene( /* and propagation loss */ if ( LT_32( path_dist_fx, out_tmp_fx ) ) { - path_dist_fx = out_tmp_fx; + path_dist_fx = out_tmp_fx; // Q22 move32(); } @@ -1068,7 +1070,7 @@ void ivas_shoebox_set_scene( pro_pd_air_coeff = Mpy_32_32( path_dist_fx, obj->air_coeff_fx ); // Q.22 *Q.31 =Q.22 result_gain = L_sub( product, pro_pd_air_coeff ); - ER_PARAMS->gains.data_fx[rcoselev - 1] = result_gain; + ER_PARAMS->gains.data_fx[rcoselev - 1] = result_gain; // Q22 move32(); } } diff --git a/lib_rend/ivas_stat_rend.h b/lib_rend/ivas_stat_rend.h index b6f6274cf..03b8fd46e 100644 --- a/lib_rend/ivas_stat_rend.h +++ b/lib_rend/ivas_stat_rend.h @@ -94,10 +94,10 @@ typedef struct ivas_output_setup_structure typedef struct ivas_td_decorr_APD_filt_state_t { - int16_t order[IVAS_MAX_DECORR_APD_SECTIONS]; - int16_t idx[IVAS_MAX_DECORR_APD_SECTIONS]; + Word16 order[IVAS_MAX_DECORR_APD_SECTIONS]; + Word16 idx[IVAS_MAX_DECORR_APD_SECTIONS]; #ifdef IVAS_FLOAT_FIXED - Word16 coeffs[IVAS_MAX_DECORR_APD_SECTIONS]; + Word16 coeffs[IVAS_MAX_DECORR_APD_SECTIONS]; // Q15 Word32 *state[IVAS_MAX_DECORR_APD_SECTIONS]; #else float coeffs[IVAS_MAX_DECORR_APD_SECTIONS]; @@ -116,11 +116,11 @@ typedef struct ivas_td_decorr_state_t #endif ivas_td_decorr_APD_filt_state_t APD_filt_state[IVAS_MAX_DECORR_CHS]; - int16_t num_apd_outputs; - int16_t num_apd_sections; - int16_t ducking_flag; + Word16 num_apd_outputs; + Word16 num_apd_sections; + Word16 ducking_flag; - int16_t offset; + Word16 offset; } ivas_td_decorr_state_t; @@ -132,8 +132,8 @@ typedef struct ivas_td_decorr_state_t /*Onset detector*/ typedef struct dirac_onset_detection_params_structure { - int16_t num_freq_bands; - int16_t max_band_decorr; + Word16 num_freq_bands; + Word16 max_band_decorr; } DIRAC_ONSET_DETECTION_PARAMS; @@ -153,11 +153,11 @@ typedef struct dirac_onset_detection_state_structure /*Decorrelator*/ typedef struct dirac_decorr_params_structure { - int16_t max_band_decorr; - int16_t max_frequency; + Word16 max_band_decorr; + Word16 max_frequency; - int16_t *pre_delay; - int16_t *filter_length; + Word16 *pre_delay; + Word16 *filter_length; #ifndef IVAS_FLOAT_FIXED float *filter_coeff_num_real; float *filter_coeff_den_real; @@ -169,11 +169,11 @@ typedef struct dirac_decorr_params_structure Word16 *phase_coeff_real_fx; /* Q14 */ Word16 *phase_coeff_imag_fx; /* Q14 */ #endif - int16_t *split_frequency_bands; - int16_t num_split_frequency_bands; + Word16 *split_frequency_bands; + Word16 num_split_frequency_bands; - int16_t use_ducker; - int16_t add_back_onsets_on; + Word16 use_ducker; + Word16 add_back_onsets_on; DIRAC_ONSET_DETECTION_PARAMS h_onset_detection_power_params; @@ -201,23 +201,23 @@ typedef struct dirac_decorr_state_structure typedef struct ivas_spatial_parametric_rend_common_data_structure { - int16_t slot_size; - int16_t subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; - int16_t subframes_rendered; - int16_t slots_rendered; - int16_t num_slots; - int16_t render_to_md_map[MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME]; - int16_t nb_subframes; + Word16 slot_size; + Word16 subframe_nbslots[MAX_JBM_SUBFRAMES_5MS]; + Word16 subframes_rendered; + Word16 slots_rendered; + Word16 num_slots; + Word16 render_to_md_map[MAX_JBM_SUBFRAMES_5MS * JBM_CLDFB_SLOTS_IN_SUBFRAME]; + Word16 nb_subframes; - int16_t num_freq_bands; - int16_t numSimultaneousDirections; /* From 1 to 2 + MAX_NUM_OBJECTS */ - int16_t numParametricDirections; /* 1 or 2 */ - int16_t numIsmDirections; /* From 0 to MAX_NUM_OBJECTS */ + Word16 num_freq_bands; + Word16 numSimultaneousDirections; /* From 1 to 2 + MAX_NUM_OBJECTS */ + Word16 numParametricDirections; /* 1 or 2 */ + Word16 numIsmDirections; /* From 0 to MAX_NUM_OBJECTS */ - int16_t **azimuth; - int16_t **elevation; - int16_t **azimuth2; - int16_t **elevation2; + Word16 **azimuth; + Word16 **elevation; + Word16 **azimuth2; + Word16 **elevation2; #ifndef IVAS_FLOAT_FIXED float **diffuseness_vector; @@ -241,9 +241,9 @@ typedef struct ivas_spatial_parametric_rend_common_data_structure #endif /* Metadata access indices and buffer size */ - int16_t dirac_bs_md_write_idx; - int16_t dirac_read_idx; - int16_t dirac_md_buffer_length; + Word16 dirac_bs_md_write_idx; + Word16 dirac_read_idx; + Word16 dirac_md_buffer_length; } SPAT_PARAM_REND_COMMON_DATA, *SPAT_PARAM_REND_COMMON_DATA_HANDLE; @@ -335,9 +335,9 @@ typedef struct dirac_dec_stack_mem /*Output synthesis*/ typedef struct dirac_output_synthesis_params_structure { - int16_t max_band_decorr; + Word16 max_band_decorr; - int16_t use_onset_filters; + Word16 use_onset_filters; #ifndef IVAS_FLOAT_FIXED float *interpolator; @@ -348,8 +348,8 @@ typedef struct dirac_output_synthesis_params_structure Word16 *alpha_synthesis_fx; /* Q15 */ Word16 *alpha_synthesis_fast_fx; /* Q15 */ #endif - int16_t numAlphas; - int16_t numAlphasFast; + Word16 numAlphas; + Word16 numAlphasFast; #ifdef IVAS_FLOAT_FIXED Word32 *proto_matrix_fx; @@ -521,7 +521,7 @@ typedef struct MASA_TRANSPORT_SIGNAL_TYPE current_stereo_type; MASA_TRANSPORT_SIGNAL_TYPE type_change_direction; - int16_t dipole_freq_range[2]; + Word16 dipole_freq_range[2]; #ifndef IVAS_FLOAT_FIXED float left_bb_power; @@ -584,8 +584,8 @@ typedef struct Word32 subtract_target_ratio_db_fx; /* Q21 */ #endif - int16_t counter; - int16_t interpolator; + Word16 counter; + Word16 interpolator; } MASA_STEREO_TYPE_DETECT; @@ -597,7 +597,7 @@ typedef struct ivas_mcmasa_lfe_synth_struct #else Word16 lfeToTotalEnergyRatio_fx[MAX_PARAM_SPATIAL_SUBFRAMES]; /* Q14 */ #endif - int16_t lfeGainPrevIndex; + Word16 lfeGainPrevIndex; #ifndef IVAS_FLOAT_FIXED float transportEneSmooth; float protoLfeEneSmooth; @@ -619,41 +619,41 @@ typedef struct ivas_mcmasa_lfe_synth_struct #else Word32 *lfeSynthRingBuffer_fx; /* Q11 */ #endif - int16_t ringBufferLoPointer; - int16_t ringBufferHiPointer; + Word16 ringBufferLoPointer; + Word16 ringBufferHiPointer; #ifndef IVAS_FLOAT_FIXED float lowpassSum; #else Word32 lowpassSum_fx; /* Q11 */ #endif - int16_t ringBufferSize; + Word16 ringBufferSize; #ifndef IVAS_FLOAT_FIXED float *lfeSynthRingBuffer2; #else Word32 *lfeSynthRingBuffer2_fx; /* Q11 */ #endif - int16_t ringBufferLoPointer2; + Word16 ringBufferLoPointer2; #ifndef IVAS_FLOAT_FIXED float lowpassSum2; #else Word32 lowpassSum2_fx; /* Q11 */ #endif - int16_t ringBufferSize2; + Word16 ringBufferSize2; #ifndef IVAS_FLOAT_FIXED float *delayBuffer_syncLp; #else Word32 *delayBuffer_syncLp_fx; /* Q11 */ #endif - int16_t delayBuffer_syncLp_size; + Word16 delayBuffer_syncLp_size; #ifndef IVAS_FLOAT_FIXED float *delayBuffer_syncDirAC; #else Word32 *delayBuffer_syncDirAC_fx; /* Q11 */ #endif - int16_t delayBuffer_syncDirAC_size; + Word16 delayBuffer_syncDirAC_size; #ifndef IVAS_FLOAT_FIXED float lfeGainPrev; @@ -673,7 +673,7 @@ typedef struct ivas_dirac_rend_data_structure IVAS_OUTPUT_SETUP hOutSetup; /*Parameter estimation*/ - int16_t index_buffer_intensity; + Word16 index_buffer_intensity; #ifndef IVAS_FLOAT_FIXED float *buffer_intensity_real[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; float *buffer_energy; @@ -697,19 +697,19 @@ typedef struct ivas_dirac_rend_data_structure #endif /*Decoder parameters */ /*Prototypes*/ - int16_t num_outputs_dir; - int16_t num_outputs_diff; - int16_t num_protos_dir; - int16_t num_protos_diff; - int16_t num_protos_ambi; + Word16 num_outputs_dir; + Word16 num_outputs_diff; + Word16 num_protos_dir; + Word16 num_protos_diff; + Word16 num_protos_ambi; DIRAC_SYNTHESIS_CONFIG synthesisConf; DIRAC_PANNING_CONFIG panningConf; /* prototype computing */ - int16_t *proto_index_dir; - int16_t *proto_index_diff; + Word16 *proto_index_dir; + Word16 *proto_index_diff; - int16_t proto_signal_decorr_on; + Word16 proto_signal_decorr_on; /*Decoder states=memories*/ #ifndef IVAS_FLOAT_FIXED @@ -727,9 +727,9 @@ typedef struct ivas_dirac_rend_data_structure DIRAC_DEC_STACK_MEM stack_mem; MASA_STEREO_TYPE_DETECT *masa_stereo_type_detect; - int16_t num_ele_spk_no_diffuse_rendering; + Word16 num_ele_spk_no_diffuse_rendering; - const int16_t *sba_map_tc; + const Word16 *sba_map_tc; DIRAC_OUTPUT_SYNTHESIS_PARAMS h_output_synthesis_psd_params; DIRAC_OUTPUT_SYNTHESIS_STATE h_output_synthesis_psd_state; @@ -748,7 +748,7 @@ typedef struct ivas_dirac_rend_data_structure * with a precalculated inverse matrix */ typedef struct vbap_vs_triplet_structure { - uint8_t speaker_node[3]; + UWord8 speaker_node[3]; #ifndef IVAS_FLOAT_FIXED float inverse_matrix[3][3]; #else @@ -763,8 +763,8 @@ typedef struct vbap_vs_triplet_structure typedef struct triplet_search_structure { VBAP_VS_TRIPLET *triplets; - int16_t num_triplets; - int16_t initial_search_indices[VBAP_NUM_SEARCH_SECTORS]; + Word16 num_triplets; + Word16 initial_search_indices[VBAP_NUM_SEARCH_SECTORS]; } VBAP_SEARCH_STRUCT; @@ -773,12 +773,12 @@ typedef struct triplet_search_structure typedef struct vbap_data_structure { VBAP_SEARCH_STRUCT search_struct[2]; /* Default to max two groups in this implementation */ - int16_t num_search_structs; - int16_t num_speaker_nodes; - int16_t num_speaker_nodes_internal; - int16_t top_virtual_speaker_node_index; /* These indices can be negative */ - int16_t bottom_virtual_speaker_node_index; - int16_t back_virtual_speaker_node_index; + Word16 num_search_structs; + Word16 num_speaker_nodes; + Word16 num_speaker_nodes_internal; + Word16 top_virtual_speaker_node_index; /* These indices can be negative */ + Word16 bottom_virtual_speaker_node_index; + Word16 back_virtual_speaker_node_index; #ifdef IVAS_FLOAT_FIXED Word16 *bottom_virtual_speaker_node_division_gains_fx; Word16 *top_virtual_speaker_node_division_gains_fx; @@ -904,7 +904,7 @@ typedef struct ivas_dirac_dec_binaural_data_structure float earlyPartEneCorrection[CLDFB_NO_CHANNELS_MAX]; #endif REVERB_STRUCT_HANDLE hReverb; - uint8_t renderStereoOutputInsteadOfBinaural; + UWord8 renderStereoOutputInsteadOfBinaural; #ifndef IVAS_FLOAT_FIXED float frameMeanDiffuseness[CLDFB_NO_CHANNELS_MAX]; float processMtxRePrev[BINAURAL_CHANNELS][BINAURAL_CHANNELS + MAX_NUM_OBJECTS][CLDFB_NO_CHANNELS_MAX]; @@ -968,7 +968,7 @@ typedef struct ivas_dirac_dec_binaural_data_structure Word32 diffuseFieldCoherenceY_fx[BINAURAL_COHERENCE_DIFFERENCE_BINS]; Word32 diffuseFieldCoherenceZ_fx[BINAURAL_COHERENCE_DIFFERENCE_BINS]; #endif - uint16_t useTdDecorr; + UWord16 useTdDecorr; ivas_td_decorr_state_t *hTdDecorr; #ifndef IVAS_FLOAT_FIXED float reqularizationFactor; @@ -1046,8 +1046,8 @@ typedef struct EFAP_VERTEX typedef struct EFAP_VERTEX_DATA { EFAP_VERTEX *vertexArray; /* Array of vertices */ - int16_t numVtx; /* Number of vertices */ - int16_t *vtxOrder; /* Array that indicates the order of the vertex ranked by increasing azimuth */ + Word16 numVtx; /* Number of vertices */ + Word16 *vtxOrder; /* Array that indicates the order of the vertex ranked by increasing azimuth */ } EFAP_VERTEX_DATA; #ifndef IVAS_FLOAT_FIXED @@ -1073,22 +1073,22 @@ typedef struct EFAP_POLYSET #endif typedef struct EFAP_LS_TRIANGLE { - int16_t LS[3]; /* Array indicating the loudspeaker index of the triangle vertices */ + Word16 LS[3]; /* Array indicating the loudspeaker index of the triangle vertices */ } EFAP_LS_TRIANGLE; typedef struct EFAP_POLYSET_DATA { EFAP_POLYSET polysetArray[EFAP_MAX_POLY_SET]; /* Array of polygons */ - int16_t numPoly; /* Number of polygons */ + Word16 numPoly; /* Number of polygons */ EFAP_LS_TRIANGLE triArray[EFAP_MAX_POLY_SET]; /* Array of triangles */ - int16_t numTri; /* Number of triangles */ + Word16 numTri; /* Number of triangles */ } EFAP_POLYSET_DATA; typedef struct EFAP { - int16_t numSpk; /* Number of loudspeakers */ + Word16 numSpk; /* Number of loudspeakers */ #ifndef IVAS_FLOAT_FIXED float *aziSpk; /* Loudspeaker azimuths */ float *eleSpk; /* Loudspeaker elevations */ @@ -1107,7 +1107,7 @@ typedef struct EFAP Word32 *bufferLong_fx; /* tmp buffer that will be given as a parameter for computing the gain; this is a 1D array of length numVtx */ Word32 *bufferShort_fx; /* tmp buffer that will be given as a parameter for computing the gain; this is the result of downMixMatrix*bufferLong, length is numSpk */ #endif - int16_t numTot; /* Total number of real + ghost loudspeakers, used later for freeing memory */ + Word16 numTot; /* Total number of real + ghost loudspeakers, used later for freeing memory */ } EFAP, *EFAP_HANDLE; @@ -1317,21 +1317,21 @@ typedef struct ivas_rev_delay_line_t #else Word32 *pBuffer_fx; #endif - uint16_t MaxDelay; - int16_t Delay; - uint16_t BufferPos; + UWord16 MaxDelay; + Word16 Delay; + UWord16 BufferPos; #ifndef IVAS_FLOAT_FIXED float Gain; #else - Word16 Gain_fx; + Word16 Gain_fx; // Q14 #endif } ivas_rev_delay_line_t; typedef struct ivas_rev_iir_filter_t { - uint16_t MaxTaps; - uint16_t nr_taps; - uint16_t isFIR; + UWord16 MaxTaps; + UWord16 nr_taps; + UWord16 isFIR; #ifndef IVAS_FLOAT_FIXED float Output; float CoefA[IVAS_REV_MAX_IIR_FILTER_LENGTH]; @@ -1397,14 +1397,14 @@ typedef struct ivas_reverb_state_t ivas_rev_delay_line_t predelay_line; Word32 *pPredelay_buffer_fx; /* jot reverberator: */ - uint16_t nr_of_branches; /* number of feedback loops */ + UWord16 nr_of_branches; /* number of feedback loops */ ivas_rev_delay_line_t delay_line[IVAS_REV_MAX_NR_BRANCHES]; /* feedback loop delays */ Word32 *loop_delay_buffer_fx[IVAS_REV_MAX_NR_BRANCHES]; /* feedback loop delay sample buffers */ ivas_rev_iir_filter_t t60[IVAS_REV_MAX_NR_BRANCHES]; /* feedback loop filters */ Word32 gain_matrix_fx[IVAS_REV_MAX_NR_BRANCHES][IVAS_REV_MAX_NR_BRANCHES]; /* feedback matrix */ Word16 mixer_fx[BINAURAL_CHANNELS][IVAS_REV_MAX_NR_BRANCHES]; /* binauralization filters: */ - int16_t do_corr_filter; + Word16 do_corr_filter; ivas_reverb_t2f_f2t_t fft_filter_ols; ivas_reverb_fft_filter_t fft_filter_correl_0; ivas_reverb_fft_filter_t fft_filter_correl_1; @@ -1473,24 +1473,24 @@ typedef struct float abs_coeff[IVAS_ROOM_ABS_COEFF]; float list_orig[3]; #else - Word32 room_L_fx; - Word32 room_W_fx; - Word32 room_H_fx; - Word32 abs_coeff_fx[IVAS_ROOM_ABS_COEFF]; - Word32 list_orig_fx[3]; + Word32 room_L_fx; // Q22 + Word32 room_W_fx; // Q22 + Word32 room_H_fx; // Q22 + Word32 abs_coeff_fx[IVAS_ROOM_ABS_COEFF]; // Q30 + Word32 list_orig_fx[3]; // Q22 #endif } shoebox_config_t; /* Structure to hold the corrected( bounded ) source and listener positions */ typedef struct { - uint16_t isCartesian; - uint16_t isRelative; - uint16_t isZHeight; - uint16_t isRadians; - uint16_t MAX_SOURCES; - uint16_t max_bands; - uint16_t REF_ORDER; + UWord16 isCartesian; + UWord16 isRelative; + UWord16 isZHeight; + UWord16 isRadians; + UWord16 MAX_SOURCES; + UWord16 max_bands; + UWord16 REF_ORDER; #ifndef IVAS_FLOAT_FIXED float src_pos[75]; @@ -1501,15 +1501,15 @@ typedef struct float soundspeed; float air_coeff; #else - Word32 src_dist_fx[25]; - Word32 list_pos_fx[3]; - Word32 src_pos_fx[75]; - Word32 radius_fx; - Word32 min_wall_dist_fx; - Word32 soundspeed_fx; - Word32 air_coeff_fx; + Word32 src_dist_fx[25]; // Q22 + Word32 list_pos_fx[3]; // Q22 + Word32 src_pos_fx[75]; // Q22 + Word32 radius_fx; // Q30 + Word32 min_wall_dist_fx; // Q22 + Word32 soundspeed_fx; // Q31 + Word32 air_coeff_fx; // Q31 #endif // IVAS_FLOAT_FIXED - uint16_t nSrc; + UWord16 nSrc; shoebox_config_t cal; @@ -1520,7 +1520,7 @@ typedef struct shoebox_data_t #ifndef IVAS_FLOAT_FIXED float data[150]; #else - Word32 data_fx[150]; + Word32 data_fx[150]; // Q22 #endif Word32 size[1]; @@ -1528,8 +1528,8 @@ typedef struct shoebox_data_t typedef struct { - uint16_t n_sources; - uint16_t n_ref; + UWord16 n_sources; + UWord16 n_ref; shoebox_data_t times; shoebox_data_t gains; shoebox_data_t az_angle; @@ -1584,24 +1584,24 @@ typedef struct er_struct_t typedef struct { - int16_t modelROM; /* Flag that indicates that the model resides in ROM (controls init/dealloc). */ - int16_t UseItdModel; /* Controls whether ITD model is used. */ - int16_t SplineDegree; /* Degree of the spline functions */ - int16_t K; /* Length of filter */ - int16_t elevDim2; - int16_t elevDim3; - int16_t AlphaN; /* Number of rows in Alpha matrices */ - int16_t num_unique_azim_splines; - int16_t elevSegSamples; - - int16_t elevBsLen[HRTF_MODEL_BSPLINE_NUM_COEFFS]; - int16_t elevBsStart[HRTF_MODEL_BSPLINE_NUM_COEFFS]; - const int16_t *azimDim2; - const int16_t *azimDim3; - const int16_t *azim_start_idx; - const int16_t *azimSegSamples; - const int16_t *azimShapeIdx; - const int16_t *azimShapeSampFactor; + Word16 modelROM; /* Flag that indicates that the model resides in ROM (controls init/dealloc). */ + Word16 UseItdModel; /* Controls whether ITD model is used. */ + Word16 SplineDegree; /* Degree of the spline functions */ + Word16 K; /* Length of filter */ + Word16 elevDim2; + Word16 elevDim3; + Word16 AlphaN; /* Number of rows in Alpha matrices */ + Word16 num_unique_azim_splines; + Word16 elevSegSamples; + + Word16 elevBsLen[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + Word16 elevBsStart[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + const Word16 *azimDim2; + const Word16 *azimDim3; + const Word16 *azim_start_idx; + const Word16 *azimSegSamples; + const Word16 *azimShapeIdx; + const Word16 *azimShapeSampFactor; #ifdef IVAS_FLOAT_FIXED const Word32 *elevKSeq_fx; /* Array, N x elevDim2 x elevDim3 */ @@ -1625,9 +1625,9 @@ typedef struct const float **azimBsShape; #endif // IVAS_FLOAT_FIXED - int16_t azimDim3Max; - int16_t iSecFirst[HRTF_MODEL_N_SECTIONS]; /* Indices for start of sections */ - int16_t iSecLast[HRTF_MODEL_N_SECTIONS]; /* Indices for end of sections */ + Word16 azimDim3Max; + Word16 iSecFirst[HRTF_MODEL_N_SECTIONS]; /* Indices for start of sections */ + Word16 iSecLast[HRTF_MODEL_N_SECTIONS]; /* Indices for end of sections */ #ifndef IVAS_FLOAT_FIXED const float *EL; /* Array, size (AlphaN*HRTF_MODEL_N_SECTIONS) */ const float *ER; /* Array, size (AlphaN*HRTF_MODEL_N_SECTIONS) */ @@ -1656,12 +1656,12 @@ typedef struct float *elevKSeq_dyn; float *elevBsShape_dyn; #endif - int16_t *azimDim2_dyn; - int16_t *azimDim3_dyn; - int16_t *azim_start_idx_dyn; - int16_t *azimSegSamples_dyn; - int16_t *azimShapeIdx_dyn; - int16_t *azimShapeSampFactor_dyn; + Word16 *azimDim2_dyn; + Word16 *azimDim3_dyn; + Word16 *azim_start_idx_dyn; + Word16 *azimSegSamples_dyn; + Word16 *azimShapeIdx_dyn; + Word16 *azimShapeSampFactor_dyn; #ifdef IVAS_FLOAT_FIXED Word32 **azimBsShape_dyn_fx; #else @@ -1672,33 +1672,33 @@ typedef struct typedef struct { - int16_t N; /* Polynomial degree */ + Word16 N; /* Polynomial degree */ - int16_t elevDim2; - int16_t elevDim3; + Word16 elevDim2; + Word16 elevDim3; #ifndef IVAS_FLOAT_FIXED const float *elevKSeq; /* Array, length elevDim3-2 */ #endif - int16_t azimDim2; - int16_t azimDim3; + Word16 azimDim2; + Word16 azimDim3; #ifndef IVAS_FLOAT_FIXED const float *azimKSeq; /* Array, length azimDim3-2 */ const float *W; /* Array, size (elevDim3*azimDim3) x K */ #endif - int16_t azimBsLen[HRTF_MODEL_BSPLINE_NUM_COEFFS]; - int16_t azimBsStart[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + Word16 azimBsLen[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + Word16 azimBsStart[HRTF_MODEL_BSPLINE_NUM_COEFFS]; #ifndef IVAS_FLOAT_FIXED const float *azimBsShape; #endif - int16_t azimSegSamples; + Word16 azimSegSamples; - int16_t elevBsLen[HRTF_MODEL_BSPLINE_NUM_COEFFS]; - int16_t elevBsStart[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + Word16 elevBsLen[HRTF_MODEL_BSPLINE_NUM_COEFFS]; + Word16 elevBsStart[HRTF_MODEL_BSPLINE_NUM_COEFFS]; #ifndef IVAS_FLOAT_FIXED const float *elevBsShape; #endif - int16_t elevSegSamples; + Word16 elevSegSamples; #ifndef IVAS_FLOAT_FIXED float resamp_factor; #else @@ -1743,7 +1743,7 @@ typedef struct #else Word32 val_fx; #endif - int16_t i; + Word16 i; } ValueIndex_t; @@ -1757,8 +1757,8 @@ typedef struct #endif ValueIndex_t BMEnergiesL[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; ValueIndex_t BMEnergiesR[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; - int16_t UseIndsL[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; - int16_t UseIndsR[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; + Word16 UseIndsL[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; + Word16 UseIndsR[HRTF_MODEL_BSPLINE_NUM_COEFFS_SQ]; #ifndef IVAS_FLOAT_FIXED float *hrfModL; float *hrfModR; @@ -1786,7 +1786,7 @@ typedef struct /* Mixer listener */ typedef struct { - int16_t PoseUpdated; + Word16 PoseUpdated; #ifdef IVAS_FLOAT_FIXED Word32 Pos_fx[3]; Word16 Pos_q; @@ -1802,16 +1802,16 @@ typedef struct float Vel[3]; #endif // IVAS_FLOAT_FIXED - int16_t VelUpdated; + Word16 VelUpdated; } TDREND_MIX_Listener_t; /* HR filter */ typedef struct TDREND_HRFILT_FiltSet_struct { - int32_t SampleRate; /* Sample rate of the HR filter */ - int16_t NumPos; - int16_t NumElev; + Word32 SampleRate; /* Sample rate of the HR filter */ + Word16 NumPos; + Word16 NumElev; #ifndef IVAS_FLOAT_FIXED float Dist; float *ItdSet_p; @@ -1819,7 +1819,7 @@ typedef struct TDREND_HRFILT_FiltSet_struct Word32 Dist_fx; Word32 *ItdSet_p_fx; #endif - int16_t FiltLength; + Word16 FiltLength; #ifndef IVAS_FLOAT_FIXED float *Azim_p; float *Elev_p; @@ -1883,18 +1883,18 @@ typedef struct /* Mixer spatial specification */ typedef struct { - int16_t UseCommonDistAttenModel; /* Common distance attenuation model flag */ + Word16 UseCommonDistAttenModel; /* Common distance attenuation model flag */ TDREND_DistAttenModel_t DistAttenModel; /* Distance attenuation model */ } TDREND_MixSpatSpec_t; typedef struct TDREND_SRC_REND_s { - int16_t InputAvailable; + Word16 InputAvailable; TDREND_PlayStatus_t PlayStatus; /* Gains */ - int16_t SrcGainUpdated; + Word16 SrcGainUpdated; #ifdef IVAS_FLOAT_FIXED Word16 SrcGain_p_fx[SPAT_BIN_MAX_INPUT_CHANNELS]; // Q14 Word16 SrcGainMin_p_fx[SPAT_BIN_MAX_INPUT_CHANNELS]; @@ -1913,7 +1913,7 @@ typedef struct TDREND_SRC_REND_s /* Source spatial parameters */ typedef struct { - int16_t Updated; + Word16 Updated; TDREND_PosType_t PosType; #ifndef IVAS_FLOAT_FIXED float Pos_p[3 * SPAT_BIN_MAX_INPUT_CHANNELS]; @@ -1924,9 +1924,9 @@ typedef struct Word16 q_Pos_p; Word32 Front_p_fx[3 * SPAT_BIN_MAX_INPUT_CHANNELS]; // Q30 #endif // IVAS_FLOAT_FIXED - int16_t DirAttenEnabled; + Word16 DirAttenEnabled; TDREND_DirAtten_t DirAtten; - int16_t DistAttenEnabled; + Word16 DistAttenEnabled; TDREND_DistAtten_t DistAtten; } TDREND_SRC_SPATIAL_t; @@ -1940,9 +1940,9 @@ typedef struct #endif TDREND_SRC_SPATIAL_t *SrcSpatial_p; TDREND_SRC_REND_t *SrcRend_p; - int16_t itd; - int16_t previtd; - int16_t filterlength; + Word16 itd; + Word16 previtd; + Word16 filterlength; #ifdef IVAS_FLOAT_FIXED Word32 mem_itd_fx[ITD_MEM_LEN]; /* Q11 */ Word32 mem_hrf_left_fx[SFX_SPAT_BIN_MAX_FILTER_LENGTH - 1]; @@ -1974,8 +1974,8 @@ typedef struct ivas_binaural_td_rendering_struct { TDREND_MixSpatSpec_t *TdRend_MixSpatSpec_p; TDREND_DirAtten_t *DirAtten_p; - int16_t NumOfSrcs; - int16_t MaxSrcInd; + Word16 NumOfSrcs; + Word16 MaxSrcInd; TDREND_SRC_t *Sources[MAX_NUM_TDREND_CHANNELS]; #ifdef IVAS_FLOAT_FIXED @@ -1987,8 +1987,8 @@ typedef struct ivas_binaural_td_rendering_struct TDREND_MIX_Listener_t *Listener_p; /* The virtual listener */ TDREND_HRFILT_FiltSet_t *HrFiltSet_p; /* HR filter set */ - int16_t UseCommonDistAttenModel; /* Use common dist atten model (TRUE/FALSE) */ - int16_t DistAttenEnabled; /* (TRUE/FALSE) */ + Word16 UseCommonDistAttenModel; /* Use common dist atten model (TRUE/FALSE) */ + Word16 DistAttenEnabled; /* (TRUE/FALSE) */ TDREND_DistAttenModel_t DistAttenModel; /* Common distance attenuation model */ } BINAURAL_TD_OBJECT_RENDERER, *BINAURAL_TD_OBJECT_RENDERER_HANDLE; @@ -2008,10 +2008,10 @@ typedef struct #ifdef IVAS_FLOAT_FIXED typedef struct ivas_hrtfs_structure { - Word32 *pOut_to_bin_re_fx[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; - Word32 *pOut_to_bin_im_fx[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; - Word32 *pOut_to_bin_diffuse_re_fx[BINAURAL_CHANNELS]; - Word32 *pOut_to_bin_diffuse_im_fx[BINAURAL_CHANNELS]; + Word32 *pOut_to_bin_re_fx[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; // Q29 + Word32 *pOut_to_bin_im_fx[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; // Q29 + Word32 *pOut_to_bin_diffuse_re_fx[BINAURAL_CHANNELS]; // Q31 + Word32 *pOut_to_bin_diffuse_im_fx[BINAURAL_CHANNELS]; // Q31 UWord16 num_iterations[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; UWord16 num_iterations_diffuse[BINAURAL_CHANNELS]; UWord16 *pIndex_frequency_max[MAX_INTERN_CHANNELS][BINAURAL_CHANNELS]; @@ -2019,9 +2019,9 @@ typedef struct ivas_hrtfs_structure UWord16 index_frequency_max_diffuse; Word16 max_num_ir; Word16 max_num_iterations; - Word16 inv_diffuse_weight_fx[MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] */ + Word16 inv_diffuse_weight_fx[MAX_INTERN_CHANNELS]; /* inverse diffuse weights array, access one inverse weight by pInvDiffuseWeight[channel] Q15 */ Word32 latency_s_fx; - Word16 gain_lfe_fx; + Word16 gain_lfe_fx; // Q14 } HRTFS_DATA, *HRTFS_HANDLE; #else typedef struct ivas_hrtfs_structure @@ -2202,7 +2202,7 @@ typedef struct ivas_hrtfs_fastconv_struct float FASTCONV_FOA_latency_s; #endif - int16_t allocate_init_flag; /*Memory allocation flag 0: if the hrtf pointers are allocated at application level , 1: of allocated at ivas_binaural_hrtf_open() */ + Word16 allocate_init_flag; /*Memory allocation flag 0: if the hrtf pointers are allocated at application level , 1: of allocated at ivas_binaural_hrtf_open() */ #ifdef IVAS_FLOAT_FIXED Word32 fastconvReverberationTimes_fx[CLDFB_NO_CHANNELS_MAX]; /* Q31 */ @@ -2290,8 +2290,8 @@ typedef struct ivas_LS_setupconversion_struct #else Word32 *dmxEnergyPrev_fx[MAX_OUTPUT_CHANNELS]; #endif - int16_t sfbOffset[MAX_SFB + 2]; - int16_t sfbCnt; + Word16 sfbOffset[MAX_SFB + 2]; + Word16 sfbCnt; #ifdef IVAS_FLOAT_FIXED Word16 te_prev_exp; Word16 dmx_prev_exp; @@ -2388,8 +2388,8 @@ typedef enum typedef struct ivas_masa_external_rendering_struct { - int16_t nchan_input; - int16_t nchan_output; + Word16 nchan_input; + Word16 nchan_output; RENDERER_TYPE renderer_type; DIRAC_REND_HANDLE hDirACRend; SPAT_PARAM_REND_COMMON_DATA_HANDLE hSpatParamRendCom; @@ -2495,10 +2495,10 @@ typedef struct ivas_mcmasa_ana_data_structure typedef struct ivas_omasa_ana_data_structure { - int16_t nbands; + Word16 nbands; /* CLDFB analysis */ - int16_t num_Cldfb_instances; + Word16 num_Cldfb_instances; HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[MAX_NUM_OBJECTS]; /* DirAC parameter estimation */ @@ -2507,11 +2507,11 @@ typedef struct ivas_omasa_ana_data_structure float **direction_vector_m[DIRAC_NUM_DIMS]; /* Average direction vector */ #endif - int16_t band_grouping[MASA_FREQUENCY_BANDS + 1]; - int16_t block_grouping[5]; + Word16 band_grouping[MASA_FREQUENCY_BANDS + 1]; + Word16 block_grouping[5]; /* diffuseness */ - int16_t index_buffer_intensity; + Word16 index_buffer_intensity; #ifndef IVAS_FLOAT_FIXED float *buffer_intensity_real[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; @@ -2560,10 +2560,10 @@ typedef struct ivas_omasa_ana_data_structure #ifdef IVAS_FLOAT_FIXED typedef struct ivas_dirac_ana_data_structure { - int16_t nbands; + Word16 nbands; /* CLDFB analysis */ - int16_t num_Cldfb_instances; + Word16 num_Cldfb_instances; HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[DIRAC_MAX_ANA_CHANS]; /* DirAC parameter estimation */ @@ -2572,11 +2572,11 @@ typedef struct ivas_dirac_ana_data_structure #else Word32 **direction_vector_m_fx[DIRAC_NUM_DIMS]; /* Average direction vector */ #endif - int16_t band_grouping[MASA_FREQUENCY_BANDS + 1]; - int16_t block_grouping[5]; + Word16 band_grouping[MASA_FREQUENCY_BANDS + 1]; + Word16 block_grouping[5]; /* diffuseness */ - int16_t index_buffer_intensity; + Word16 index_buffer_intensity; #ifndef IVAS_FLOAT_FIXED float *buffer_intensity_real[DIRAC_NUM_DIMS][DIRAC_NO_COL_AVG_DIFF]; #else @@ -2632,7 +2632,7 @@ typedef struct ivas_dirac_ana_data_structure typedef struct ivas_masa_prerend_data_structure { /* CLDFB analysis */ - int16_t num_Cldfb_instances; + Word16 num_Cldfb_instances; HANDLE_CLDFB_FILTER_BANK cldfbAnaEnc[MASA_MAX_TRANSPORT_CHANNELS]; MASA_DECODER_EXT_OUT_META_HANDLE hMasaOut; diff --git a/lib_rend/ivas_td_decorr.c b/lib_rend/ivas_td_decorr.c index 1e6632af4..ab172f972 100644 --- a/lib_rend/ivas_td_decorr.c +++ b/lib_rend/ivas_td_decorr.c @@ -90,30 +90,30 @@ static const float ivas_three_pow_frac[IVAS_MAX_DECORR_APD_SECTIONS] = { }; #else -static const Word16 ivas_hadamard_decorr_APD_coeff[IVAS_APD_16_SECT][IVAS_APD_16_SECT] = { - { 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107 }, - { 13107, -13107, 13107, -13107, 13107, -13107, 13107, -13107, 13107, -13107, 13107, -13107, 13107, -13107, 13107, -13107 }, - { 13107, 13107, -13107, -13107, 13107, 13107, -13107, -13107, 13107, 13107, -13107, -13107, 13107, 13107, -13107, -13107 }, - { 13107, -13107, -13107, 13107, 13107, -13107, -13107, 13107, 13107, -13107, -13107, 13107, 13107, -13107, -13107, 13107 }, - { 13107, 13107, 13107, 13107, -13107, -13107, -13107, -13107, 13107, 13107, 13107, 13107, -13107, -13107, -13107, -13107 }, - { 13107, -13107, 13107, -13107, -13107, 13107, -13107, 13107, 13107, -13107, 13107, -13107, -13107, 13107, -13107, 13107 }, - { 13107, 13107, -13107, -13107, -13107, -13107, 13107, 13107, 13107, 13107, -13107, -13107, -13107, -13107, 13107, 13107 }, - { 13107, -13107, -13107, 13107, -13107, 13107, 13107, -13107, 13107, -13107, -13107, 13107, -13107, 13107, 13107, -13107 }, - { 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, -13107, -13107, -13107, -13107, -13107, -13107, -13107, -13107 }, - { 13107, -13107, 13107, -13107, 13107, -13107, 13107, -13107, -13107, 13107, -13107, 13107, -13107, 13107, -13107, 13107 }, - { 13107, 13107, -13107, -13107, 13107, 13107, -13107, -13107, -13107, -13107, 13107, 13107, -13107, -13107, 13107, 13107 }, - { 13107, -13107, -13107, 13107, 13107, -13107, -13107, 13107, -13107, 13107, 13107, -13107, -13107, 13107, 13107, -13107 }, - { 13107, 13107, 13107, 13107, -13107, -13107, -13107, -13107, -13107, -13107, -13107, -13107, 13107, 13107, 13107, 13107 }, - { 13107, -13107, 13107, -13107, -13107, 13107, -13107, 13107, -13107, 13107, -13107, 13107, 13107, -13107, 13107, -13107 }, - { 13107, 13107, -13107, -13107, -13107, -13107, 13107, 13107, -13107, -13107, 13107, 13107, 13107, 13107, -13107, -13107 }, - { 13107, -13107, -13107, 13107, -13107, 13107, 13107, -13107, -13107, 13107, 13107, -13107, 13107, -13107, -13107, 13107 } +static const Word16 ivas_hadamard_decorr_APD_coeff[IVAS_APD_16_SECT][IVAS_APD_16_SECT] = { /* Q15 */ + { 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107 }, + { 13107, -13107, 13107, -13107, 13107, -13107, 13107, -13107, 13107, -13107, 13107, -13107, 13107, -13107, 13107, -13107 }, + { 13107, 13107, -13107, -13107, 13107, 13107, -13107, -13107, 13107, 13107, -13107, -13107, 13107, 13107, -13107, -13107 }, + { 13107, -13107, -13107, 13107, 13107, -13107, -13107, 13107, 13107, -13107, -13107, 13107, 13107, -13107, -13107, 13107 }, + { 13107, 13107, 13107, 13107, -13107, -13107, -13107, -13107, 13107, 13107, 13107, 13107, -13107, -13107, -13107, -13107 }, + { 13107, -13107, 13107, -13107, -13107, 13107, -13107, 13107, 13107, -13107, 13107, -13107, -13107, 13107, -13107, 13107 }, + { 13107, 13107, -13107, -13107, -13107, -13107, 13107, 13107, 13107, 13107, -13107, -13107, -13107, -13107, 13107, 13107 }, + { 13107, -13107, -13107, 13107, -13107, 13107, 13107, -13107, 13107, -13107, -13107, 13107, -13107, 13107, 13107, -13107 }, + { 13107, 13107, 13107, 13107, 13107, 13107, 13107, 13107, -13107, -13107, -13107, -13107, -13107, -13107, -13107, -13107 }, + { 13107, -13107, 13107, -13107, 13107, -13107, 13107, -13107, -13107, 13107, -13107, 13107, -13107, 13107, -13107, 13107 }, + { 13107, 13107, -13107, -13107, 13107, 13107, -13107, -13107, -13107, -13107, 13107, 13107, -13107, -13107, 13107, 13107 }, + { 13107, -13107, -13107, 13107, 13107, -13107, -13107, 13107, -13107, 13107, 13107, -13107, -13107, 13107, 13107, -13107 }, + { 13107, 13107, 13107, 13107, -13107, -13107, -13107, -13107, -13107, -13107, -13107, -13107, 13107, 13107, 13107, 13107 }, + { 13107, -13107, 13107, -13107, -13107, 13107, -13107, 13107, -13107, 13107, -13107, 13107, 13107, -13107, 13107, -13107 }, + { 13107, 13107, -13107, -13107, -13107, -13107, 13107, 13107, -13107, -13107, 13107, 13107, 13107, 13107, -13107, -13107 }, + { 13107, -13107, -13107, 13107, -13107, 13107, 13107, -13107, -13107, 13107, 13107, -13107, 13107, -13107, -13107, 13107 } }; /* For R = 3.^([0:obj.parm_APD_nSections-1]/4); Q22 */ -static const Word32 ivas_three_pow_frac[IVAS_MAX_DECORR_APD_SECTIONS] = { - 4194304, 5520015, 7264748, 9560946, 12582912, 16560043, 21794242, - 28682836, 37748736, 49680132, 65382728, 86048512, 113246208, - 149040384, 196148192, 258145536 +static const Word32 ivas_three_pow_frac[IVAS_MAX_DECORR_APD_SECTIONS] = { /* Q22 */ + 4194304, 5520015, 7264748, 9560946, 12582912, 16560043, 21794242, + 28682836, 37748736, 49680132, 65382728, 86048512, 113246208, + 149040384, 196148192, 258145536 }; #endif @@ -212,12 +212,12 @@ ivas_error ivas_td_decorr_reconfig_dec( IF( LT_32( ivas_total_brate, IVAS_24k4 ) ) { - ( *hTdDecorr )->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR; + ( *hTdDecorr )->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN_LOW_BR; // Q29 move32(); } ELSE { - ( *hTdDecorr )->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN; + ( *hTdDecorr )->pTrans_det->duck_mult_fac = IVAS_TDET_DUCK_MULT_FAC_PARA_BIN; // Q29 move32(); } } @@ -349,8 +349,7 @@ ivas_error ivas_td_decorr_dec_open_fx( ivas_td_decorr_state_t *hTdDecorr_loc; ivas_error error; - buf_len = extract_l( Mpy_32_32( output_Fs, 4294968 ) ); - // IVAS_DECORR_PARM_LOOKAHEAD_TAU * 2 ^ 31 -> 4294968 + buf_len = extract_l( Mpy_32_32( output_Fs, 4294968 ) ); // IVAS_DECORR_PARM_LOOKAHEAD_TAU * 2 ^ 31 -> 4294968 num_out_chans = sub( nchan_internal, 1 ); @@ -678,7 +677,7 @@ static void ivas_td_decorr_init( FOR( j = 0; j < hTdDecorr->num_apd_sections; j++ ) { hTdDecorr->APD_filt_state[i].order[j] = hTdDecorr->APD_filt_state[0].order[j]; - hTdDecorr->APD_filt_state[i].coeffs[j] = ivas_hadamard_decorr_APD_coeff[i][j]; + hTdDecorr->APD_filt_state[i].coeffs[j] = ivas_hadamard_decorr_APD_coeff[i][j]; // Q15 hTdDecorr->APD_filt_state[i].idx[j] = 0; move16(); @@ -825,7 +824,7 @@ void ivas_td_decorr_process( void ivas_td_decorr_APD_iir_filter_fx( ivas_td_decorr_APD_filt_state_t *filter_state, - Word32 *pIn_out, + Word32 *pIn_out, // Q11 const Word16 num_APD_sections, const Word16 length ) { @@ -838,7 +837,7 @@ void ivas_td_decorr_APD_iir_filter_fx( FOR( k = 0; k < num_APD_sections; k++ ) { Word32 *pFilt_state = filter_state->state[k]; - Word16 filt_coeff = filter_state->coeffs[k]; + Word16 filt_coeff = filter_state->coeffs[k]; // Q15 Word16 order = filter_state->order[k]; move16(); move16(); @@ -851,10 +850,10 @@ void ivas_td_decorr_APD_iir_filter_fx( tmp_pIn_buf_i = pIn[i]; move32(); - pOut[i] = Madd_32_16( pFilt_state[idx], pIn[i], filt_coeff ); + pOut[i] = Madd_32_16( pFilt_state[idx], pIn[i], filt_coeff ); // Q11 move32(); - pFilt_state[idx++] = Msub_32_16( tmp_pIn_buf_i, pOut[i], filt_coeff ); + pFilt_state[idx++] = Msub_32_16( tmp_pIn_buf_i, pOut[i], filt_coeff ); // Q11 move32(); if ( EQ_16( order, idx ) ) @@ -898,8 +897,8 @@ static void ivas_td_decorr_APD_sections_fx( void ivas_td_decorr_process_fx( ivas_td_decorr_state_t *hTdDecorr, /* i/o: SPAR Covar. decoder handle */ - Word32 *pcm_in[], /* i : input audio channels */ - Word32 **ppOut_pcm, /* o : output audio channels */ + Word32 *pcm_in[], /* i : input audio channels Q11 */ + Word32 **ppOut_pcm, /* o : output audio channels Q11 */ const Word16 output_frame /* i : output frame length */ ) { @@ -917,7 +916,7 @@ void ivas_td_decorr_process_fx( FOR( j = 0; j < output_frame; j++ ) { - ppOut_pcm[0][j] = L_shl( Mpy_32_32( ppOut_pcm[0][j], in_duck_gain[j] ), 1 ); + ppOut_pcm[0][j] = L_shl( Mpy_32_32( ppOut_pcm[0][j], in_duck_gain[j] ), 1 ); // Q11 move32(); } } @@ -937,7 +936,7 @@ void ivas_td_decorr_process_fx( { FOR( j = 0; j < output_frame; j++ ) { - ppOut_pcm[i][j] = L_shl( Mpy_32_32( ppOut_pcm[i][j], out_duck_gain[j] ), 1 ); + ppOut_pcm[i][j] = L_shl( Mpy_32_32( ppOut_pcm[i][j], out_duck_gain[j] ), 1 ); // Q11 move32(); } } -- GitLab