Loading lib_com/ivas_tools_fx.c +10 −0 Original line number Diff line number Diff line Loading @@ -606,7 +606,9 @@ Word64 dot_product_cholesky_fixed( { Word16 i, j; Word64 suma, tmp_sum; #ifndef OPT_MCT_ENC_V3_BE Word32 mul; #endif Word32 tmp; const Word32 *pt_x, *pt_A; pt_A = A; Loading @@ -621,12 +623,20 @@ Word64 dot_product_cholesky_fixed( FOR( j = 0; j <= i; j++ ) { #ifdef OPT_MCT_ENC_V3_BE tmp_sum = W_add( tmp_sum, Mpy_32_32( *pt_x++, *pt_A++ ) ); #else mul = Mpy_32_32( *pt_x++, *pt_A++ ); tmp_sum = W_add( tmp_sum, W_deposit32_l( mul ) ); #endif } #ifdef OPT_MCT_ENC_V3_BE tmp = W_shl_sat_l( tmp_sum, -4 ); // to make sure that the tmp_sum will not overflow #else tmp_sum = W_shr( tmp_sum, 4 ); // to make sure that the tmp_sum will not overflow tmp = W_extract_l( tmp_sum ); #endif suma = W_mac_32_32( suma, tmp, tmp ); } Loading lib_com/options.h +5 −0 Original line number Diff line number Diff line Loading @@ -79,8 +79,10 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ #define OPT_MCT_ENC_V3_BE #define OPT_MCT_ENC_V3_NBE #define OPT_MCT_ENC_V2_BE #define OPT_BIN_REND_V2_NBE #define OPT_MCH_DEC_V1_NBE #define OPT_MASA_DEC_V1_NBE #define OPT_MASA_DEC_V2_NBE Loading Loading @@ -143,4 +145,7 @@ #define NONBE_FIX_TCX5_INTERLEAVING_FOR_FS_IN_UNEQUAL_FS_OUT /* FhG: apply correct TCX5 grouping/interleaving when input_fs != output_fs */ #define FIX_1824 #define FIX_1822 #endif lib_dec/FEC_HQ_phase_ecu_fx.c +2 −2 Original line number Diff line number Diff line Loading @@ -1440,7 +1440,7 @@ static void ivas_spec_ana_fx( man = mult_r( man, FEC_HQ_ECU_ROOT2 ); /* FEC_HQ_ECU_ROOT2 is sqrt(2) in Q14 */ expoBy2 = sub( expoBy2, 1 ); } *pXfp++ = shr( man, expoBy2 ); *pXfp++ = shr_sat( man, expoBy2 ); move16(); /* Denormalize the mantissa back to Q0. */ } } Loading Loading @@ -2138,7 +2138,7 @@ static void ivas_subst_spec_fx( move16(); im = *pImX; move16(); tmp = sub( mult_r( re, cos_F ), mult_r( im, sin_F ) ); tmp = sub_sat( mult_r( re, cos_F ), mult_r( im, sin_F ) ); im = add( mult_r( re, sin_F ), mult_r( im, cos_F ) ); IF( LT_16( alpha[k], 32766 ) ) { Loading lib_dec/ivas_binRenderer_internal_fx.c +384 −338 Original line number Diff line number Diff line Loading @@ -72,12 +72,17 @@ static void ivas_binRenderer_filterModule_fx( Q_filterStates = hBinRenderer->hBinRenConvModule->Q_filterStatesLeft; move16(); // to be checked: feasibility with 32 bit buffers #ifdef OPT_BIN_REND_V2_NBE shift_q = add( sub( Q_filterStates, Q_curr ), 1 ); hBinRenderer->hBinRenConvModule->Q_filterStatesLeft = Q_curr; #else /* OPT_BIN_REND_V2_NBE */ Word64 Cldfb_RealBuffer_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES]; Word64 Cldfb_ImagBuffer_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES]; #endif /* OPT_BIN_REND_V2_NBE */ FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { #ifndef OPT_BIN_REND_V2_NBE set64_fx( &Cldfb_RealBuffer_64fx[0][0], 0, BINAURAL_CHANNELS * MAX_PARAM_SPATIAL_SUBFRAMES ); set64_fx( &Cldfb_ImagBuffer_64fx[0][0], 0, BINAURAL_CHANNELS * MAX_PARAM_SPATIAL_SUBFRAMES ); Loading @@ -91,6 +96,7 @@ static void ivas_binRenderer_filterModule_fx( filterTapsRightRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx]; // Q29 filterTapsRightImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx]; // Q29 #endif /* OPT_BIN_REND_V2_NBE */ FOR( k = 0; k < numTimeSlots; k++ ) { Word64 outRealLeft_fx = 0, outRealRight_fx = 0, outImagLeft_fx = 0, outImagRight_fx = 0; Loading @@ -98,6 +104,23 @@ static void ivas_binRenderer_filterModule_fx( move64(); move64(); move64(); #ifdef OPT_BIN_REND_V2_NBE Word64 outRealLeft = 0, outRealRight = 0, outImagLeft = 0, outImagRight = 0; move64(); move64(); move64(); move64(); FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) { filterStatesLeftRealPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx][0] ); filterStatesLeftImagPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx][0] ); filterTapsLeftRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx]; // Q29 filterTapsLeftImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx]; // Q29 filterTapsRightRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx]; // Q29 filterTapsRightImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx]; // Q29 #endif /* OPT_BIN_REND_V2_NBE */ FOR( tapIdx = hBinRenderer->hBinRenConvModule->numTapsArray[bandIdx] - 1; tapIdx > 0; tapIdx-- ) { Loading @@ -121,6 +144,7 @@ static void ivas_binRenderer_filterModule_fx( outImagRight_fx = W_mac_32_32( outImagRight_fx, filterStatesLeftImagPtr_fx[tapIdx], filterTapsRightRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates } #ifndef OPT_BIN_REND_V2_NBE shift_q = add( sub( Q_filterStates, Q_curr ), 1 ); IF( shift_q != 0 ) Loading @@ -132,13 +156,34 @@ static void ivas_binRenderer_filterModule_fx( hBinRenderer->hBinRenConvModule->Q_filterStatesLeft = Q_curr; move16(); } #endif /* OPT_BIN_REND_V2_NBE */ filterStatesLeftRealPtr_fx[0] = CLDFB_real[chIdx][k][bandIdx]; move32(); filterStatesLeftImagPtr_fx[0] = CLDFB_imag[chIdx][k][bandIdx]; move32(); #ifdef OPT_BIN_REND_V2_NBE /* Left Real and Imag */ Word32 neg_temp2 = L_negate( filterStatesLeftImagPtr_fx[0] ); // Q_curr -1 outRealLeft = W_mac_32_32( W_mac_32_32( outRealLeft, filterStatesLeftRealPtr_fx[0], filterTapsLeftRealPtr_fx[0] ), neg_temp2, filterTapsLeftImagPtr_fx[0] ); outImagLeft = W_mac_32_32( W_mac_32_32( outImagLeft, filterStatesLeftImagPtr_fx[0], filterTapsLeftRealPtr_fx[0] ), filterStatesLeftRealPtr_fx[0], filterTapsLeftImagPtr_fx[0] ); /* Right Real and Imag */ outRealRight = W_mac_32_32( W_mac_32_32( outRealRight, neg_temp2, filterTapsRightImagPtr_fx[0] ), filterStatesLeftRealPtr_fx[0], filterTapsRightRealPtr_fx[0] ); outImagRight = W_mac_32_32( W_mac_32_32( outImagRight, filterStatesLeftImagPtr_fx[0], filterTapsRightRealPtr_fx[0] ), filterStatesLeftRealPtr_fx[0], filterTapsRightImagPtr_fx[0] ); } out_Conv_CLDFB_real[0][k][bandIdx] = W_shl_sat_l( W_add( W_shr( outRealLeft_fx, shift_q ), W_shr( outRealLeft, 1 ) ), shift_q6 ); out_Conv_CLDFB_real[1][k][bandIdx] = W_shl_sat_l( W_add( W_shr( outRealRight_fx, shift_q ), W_shr( outRealRight, 1 ) ), shift_q6 ); out_Conv_CLDFB_imag[0][k][bandIdx] = W_shl_sat_l( W_add( W_shr( outImagLeft_fx, shift_q ), W_shr( outImagLeft, 1 ) ), shift_q6 ); out_Conv_CLDFB_imag[1][k][bandIdx] = W_shl_sat_l( W_add( W_shr( outImagRight_fx, shift_q ), W_shr( outImagRight, 1 ) ), shift_q6 ); move32(); move32(); move32(); move32(); } #else /* OPT_BIN_REND_V2_NBE */ /* Left Real and Imag */ Word32 temp1 = L_shr( filterStatesLeftRealPtr_fx[0], 1 ); // Q_curr -1 Loading Loading @@ -178,6 +223,7 @@ static void ivas_binRenderer_filterModule_fx( move32(); } } #endif /* OPT_BIN_REND_V2_NBE */ } Loading lib_dec/ivas_jbm_dec_fx.c +7 −7 Original line number Diff line number Diff line Loading @@ -4066,16 +4066,16 @@ void ivas_jbm_dec_copy_tc_no_tsm_fx( &cldfb_real_buffer_fx[slot_idx * num_freq_bands * n_ch_cldfb + cldfb_ch * num_freq_bands], &cldfb_imag_buffer_fx[slot_idx * num_freq_bands * n_ch_cldfb + cldfb_ch * num_freq_bands], num_freq_bands, st_ivas->cldfbAnaDec[cldfb_ch], &Q_tc ); } } IF( EQ_16( (Word16) st_ivas->ivas_format, (Word16) MC_FORMAT ) ) { st_ivas->hParamMC->Cldfb_RealBuffer_tc_e = sub( 31, Q_tc ); st_ivas->hParamMC->Cldfb_ImagBuffer_tc_e = sub( 31, Q_tc ); st_ivas->hParamMC->Cldfb_RealBuffer_tc_e = 25; // 31-Q_tc = 31-(11-5) st_ivas->hParamMC->Cldfb_ImagBuffer_tc_e = 25; // 31-Q_tc = 31-(11-5) move16(); move16(); } } } } hTcBuffer->n_samples_rendered = 0; move16(); hTcBuffer->subframes_rendered = 0; Loading Loading
lib_com/ivas_tools_fx.c +10 −0 Original line number Diff line number Diff line Loading @@ -606,7 +606,9 @@ Word64 dot_product_cholesky_fixed( { Word16 i, j; Word64 suma, tmp_sum; #ifndef OPT_MCT_ENC_V3_BE Word32 mul; #endif Word32 tmp; const Word32 *pt_x, *pt_A; pt_A = A; Loading @@ -621,12 +623,20 @@ Word64 dot_product_cholesky_fixed( FOR( j = 0; j <= i; j++ ) { #ifdef OPT_MCT_ENC_V3_BE tmp_sum = W_add( tmp_sum, Mpy_32_32( *pt_x++, *pt_A++ ) ); #else mul = Mpy_32_32( *pt_x++, *pt_A++ ); tmp_sum = W_add( tmp_sum, W_deposit32_l( mul ) ); #endif } #ifdef OPT_MCT_ENC_V3_BE tmp = W_shl_sat_l( tmp_sum, -4 ); // to make sure that the tmp_sum will not overflow #else tmp_sum = W_shr( tmp_sum, 4 ); // to make sure that the tmp_sum will not overflow tmp = W_extract_l( tmp_sum ); #endif suma = W_mac_32_32( suma, tmp, tmp ); } Loading
lib_com/options.h +5 −0 Original line number Diff line number Diff line Loading @@ -79,8 +79,10 @@ /* Note: each compile switch (FIX_1101_...) is independent from the other ones */ #define OPT_MCT_ENC_V3_BE #define OPT_MCT_ENC_V3_NBE #define OPT_MCT_ENC_V2_BE #define OPT_BIN_REND_V2_NBE #define OPT_MCH_DEC_V1_NBE #define OPT_MASA_DEC_V1_NBE #define OPT_MASA_DEC_V2_NBE Loading Loading @@ -143,4 +145,7 @@ #define NONBE_FIX_TCX5_INTERLEAVING_FOR_FS_IN_UNEQUAL_FS_OUT /* FhG: apply correct TCX5 grouping/interleaving when input_fs != output_fs */ #define FIX_1824 #define FIX_1822 #endif
lib_dec/FEC_HQ_phase_ecu_fx.c +2 −2 Original line number Diff line number Diff line Loading @@ -1440,7 +1440,7 @@ static void ivas_spec_ana_fx( man = mult_r( man, FEC_HQ_ECU_ROOT2 ); /* FEC_HQ_ECU_ROOT2 is sqrt(2) in Q14 */ expoBy2 = sub( expoBy2, 1 ); } *pXfp++ = shr( man, expoBy2 ); *pXfp++ = shr_sat( man, expoBy2 ); move16(); /* Denormalize the mantissa back to Q0. */ } } Loading Loading @@ -2138,7 +2138,7 @@ static void ivas_subst_spec_fx( move16(); im = *pImX; move16(); tmp = sub( mult_r( re, cos_F ), mult_r( im, sin_F ) ); tmp = sub_sat( mult_r( re, cos_F ), mult_r( im, sin_F ) ); im = add( mult_r( re, sin_F ), mult_r( im, cos_F ) ); IF( LT_16( alpha[k], 32766 ) ) { Loading
lib_dec/ivas_binRenderer_internal_fx.c +384 −338 Original line number Diff line number Diff line Loading @@ -72,12 +72,17 @@ static void ivas_binRenderer_filterModule_fx( Q_filterStates = hBinRenderer->hBinRenConvModule->Q_filterStatesLeft; move16(); // to be checked: feasibility with 32 bit buffers #ifdef OPT_BIN_REND_V2_NBE shift_q = add( sub( Q_filterStates, Q_curr ), 1 ); hBinRenderer->hBinRenConvModule->Q_filterStatesLeft = Q_curr; #else /* OPT_BIN_REND_V2_NBE */ Word64 Cldfb_RealBuffer_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES]; Word64 Cldfb_ImagBuffer_64fx[BINAURAL_CHANNELS][MAX_PARAM_SPATIAL_SUBFRAMES]; #endif /* OPT_BIN_REND_V2_NBE */ FOR( bandIdx = 0; bandIdx < hBinRenderer->conv_band; bandIdx++ ) { #ifndef OPT_BIN_REND_V2_NBE set64_fx( &Cldfb_RealBuffer_64fx[0][0], 0, BINAURAL_CHANNELS * MAX_PARAM_SPATIAL_SUBFRAMES ); set64_fx( &Cldfb_ImagBuffer_64fx[0][0], 0, BINAURAL_CHANNELS * MAX_PARAM_SPATIAL_SUBFRAMES ); Loading @@ -91,6 +96,7 @@ static void ivas_binRenderer_filterModule_fx( filterTapsRightRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx]; // Q29 filterTapsRightImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx]; // Q29 #endif /* OPT_BIN_REND_V2_NBE */ FOR( k = 0; k < numTimeSlots; k++ ) { Word64 outRealLeft_fx = 0, outRealRight_fx = 0, outImagLeft_fx = 0, outImagRight_fx = 0; Loading @@ -98,6 +104,23 @@ static void ivas_binRenderer_filterModule_fx( move64(); move64(); move64(); #ifdef OPT_BIN_REND_V2_NBE Word64 outRealLeft = 0, outRealRight = 0, outImagLeft = 0, outImagRight = 0; move64(); move64(); move64(); move64(); FOR( chIdx = 0; chIdx < hBinRenderer->nInChannels; chIdx++ ) { filterStatesLeftRealPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftReal_fx[bandIdx][chIdx][0] ); filterStatesLeftImagPtr_fx = (Word32 *) &( hBinRenderer->hBinRenConvModule->filterStatesLeftImag_fx[bandIdx][chIdx][0] ); filterTapsLeftRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsLeftReal_fx[bandIdx][chIdx]; // Q29 filterTapsLeftImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsLeftImag_fx[bandIdx][chIdx]; // Q29 filterTapsRightRealPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightReal_fx[bandIdx][chIdx]; // Q29 filterTapsRightImagPtr_fx = hBinRenderer->hBinRenConvModule->filterTapsRightImag_fx[bandIdx][chIdx]; // Q29 #endif /* OPT_BIN_REND_V2_NBE */ FOR( tapIdx = hBinRenderer->hBinRenConvModule->numTapsArray[bandIdx] - 1; tapIdx > 0; tapIdx-- ) { Loading @@ -121,6 +144,7 @@ static void ivas_binRenderer_filterModule_fx( outImagRight_fx = W_mac_32_32( outImagRight_fx, filterStatesLeftImagPtr_fx[tapIdx], filterTapsRightRealPtr_fx[tapIdx] ); // Q30 + Q_filterStates } #ifndef OPT_BIN_REND_V2_NBE shift_q = add( sub( Q_filterStates, Q_curr ), 1 ); IF( shift_q != 0 ) Loading @@ -132,13 +156,34 @@ static void ivas_binRenderer_filterModule_fx( hBinRenderer->hBinRenConvModule->Q_filterStatesLeft = Q_curr; move16(); } #endif /* OPT_BIN_REND_V2_NBE */ filterStatesLeftRealPtr_fx[0] = CLDFB_real[chIdx][k][bandIdx]; move32(); filterStatesLeftImagPtr_fx[0] = CLDFB_imag[chIdx][k][bandIdx]; move32(); #ifdef OPT_BIN_REND_V2_NBE /* Left Real and Imag */ Word32 neg_temp2 = L_negate( filterStatesLeftImagPtr_fx[0] ); // Q_curr -1 outRealLeft = W_mac_32_32( W_mac_32_32( outRealLeft, filterStatesLeftRealPtr_fx[0], filterTapsLeftRealPtr_fx[0] ), neg_temp2, filterTapsLeftImagPtr_fx[0] ); outImagLeft = W_mac_32_32( W_mac_32_32( outImagLeft, filterStatesLeftImagPtr_fx[0], filterTapsLeftRealPtr_fx[0] ), filterStatesLeftRealPtr_fx[0], filterTapsLeftImagPtr_fx[0] ); /* Right Real and Imag */ outRealRight = W_mac_32_32( W_mac_32_32( outRealRight, neg_temp2, filterTapsRightImagPtr_fx[0] ), filterStatesLeftRealPtr_fx[0], filterTapsRightRealPtr_fx[0] ); outImagRight = W_mac_32_32( W_mac_32_32( outImagRight, filterStatesLeftImagPtr_fx[0], filterTapsRightRealPtr_fx[0] ), filterStatesLeftRealPtr_fx[0], filterTapsRightImagPtr_fx[0] ); } out_Conv_CLDFB_real[0][k][bandIdx] = W_shl_sat_l( W_add( W_shr( outRealLeft_fx, shift_q ), W_shr( outRealLeft, 1 ) ), shift_q6 ); out_Conv_CLDFB_real[1][k][bandIdx] = W_shl_sat_l( W_add( W_shr( outRealRight_fx, shift_q ), W_shr( outRealRight, 1 ) ), shift_q6 ); out_Conv_CLDFB_imag[0][k][bandIdx] = W_shl_sat_l( W_add( W_shr( outImagLeft_fx, shift_q ), W_shr( outImagLeft, 1 ) ), shift_q6 ); out_Conv_CLDFB_imag[1][k][bandIdx] = W_shl_sat_l( W_add( W_shr( outImagRight_fx, shift_q ), W_shr( outImagRight, 1 ) ), shift_q6 ); move32(); move32(); move32(); move32(); } #else /* OPT_BIN_REND_V2_NBE */ /* Left Real and Imag */ Word32 temp1 = L_shr( filterStatesLeftRealPtr_fx[0], 1 ); // Q_curr -1 Loading Loading @@ -178,6 +223,7 @@ static void ivas_binRenderer_filterModule_fx( move32(); } } #endif /* OPT_BIN_REND_V2_NBE */ } Loading
lib_dec/ivas_jbm_dec_fx.c +7 −7 Original line number Diff line number Diff line Loading @@ -4066,16 +4066,16 @@ void ivas_jbm_dec_copy_tc_no_tsm_fx( &cldfb_real_buffer_fx[slot_idx * num_freq_bands * n_ch_cldfb + cldfb_ch * num_freq_bands], &cldfb_imag_buffer_fx[slot_idx * num_freq_bands * n_ch_cldfb + cldfb_ch * num_freq_bands], num_freq_bands, st_ivas->cldfbAnaDec[cldfb_ch], &Q_tc ); } } IF( EQ_16( (Word16) st_ivas->ivas_format, (Word16) MC_FORMAT ) ) { st_ivas->hParamMC->Cldfb_RealBuffer_tc_e = sub( 31, Q_tc ); st_ivas->hParamMC->Cldfb_ImagBuffer_tc_e = sub( 31, Q_tc ); st_ivas->hParamMC->Cldfb_RealBuffer_tc_e = 25; // 31-Q_tc = 31-(11-5) st_ivas->hParamMC->Cldfb_ImagBuffer_tc_e = 25; // 31-Q_tc = 31-(11-5) move16(); move16(); } } } } hTcBuffer->n_samples_rendered = 0; move16(); hTcBuffer->subframes_rendered = 0; Loading