diff --git a/lib_com/options.h b/lib_com/options.h index bef48f081d02b25fcb1d2ef58add458f268715e2..44bb8d129296dd5826f372781908dccb0314a4a4 100644 --- a/lib_com/options.h +++ b/lib_com/options.h @@ -97,8 +97,8 @@ #define HARMONIZE_2595_reconfig_decoder_LPD /* FhG: Harmonize reconfig_decoder_LPD with its ivas derivate */ #define HARMONIZE_2596_SetModeIndex /* FhG: Harmonize SetModeIndex with its ivas derivate */ #define HARMONIZE_2597_ShapeSpectrum /* FhG: Harmonize ShapeSpectrum with its ivas derivate */ - #define HARMONIZE_2567_init_functions /* FhG: harmonize derivates for evs/ivas regarding functions init_acelp*(),init_tcx_cfg*(), init_tcx*(), init_coder_ace_plus*(), init_core_sig_ana*() and init_modes*() */ +#define HARMONIZE_2607_GetFilterParameters /* FhG: Harmonize GetFilterParameters with its ivas derivate */ /* #################### End BE switches ################################## */ diff --git a/lib_enc/tns_base_enc_fx.c b/lib_enc/tns_base_enc_fx.c index 37883fb487e560ec100718ce192a0713a35d5bc2..061c576161ec5113b7a14c641955e0d98800dae5 100644 --- a/lib_enc/tns_base_enc_fx.c +++ b/lib_enc/tns_base_enc_fx.c @@ -23,9 +23,13 @@ * @param maxOrder Maximum filter order/number of coefficients. * @param pTnsFilter Pointer to the output filter. */ +#ifndef HARMONIZE_2607_GetFilterParameters static void GetFilterParameters( Word32 rxx[], Word16 maxOrder, STnsFilter *pTnsFilter ); static void GetFilterParameters_ivas( Word32 rxx[], Word16 maxOrder, STnsFilter *pTnsFilter ); +#else +static void GetFilterParameters( Word32 rxx[], Word16 maxOrder, STnsFilter *pTnsFilter, Word16 element_mode ); +#endif /** Quantization for reflection coefficients. * @@ -150,7 +154,11 @@ void CalculateTnsFilt_fx( pFilter->spectrumLength = spectrumLength; move16(); /* Limit the maximum order to spectrum length/4 */ +#ifdef HARMONIZE_2607_GetFilterParameters + GetFilterParameters( rxx, s_min( pTnsConfig->maxOrder, shr( pFilter->spectrumLength, 2 ) ), pFilter, 1 /*signal non-EVS*/ ); +#else GetFilterParameters_ivas( rxx, s_min( pTnsConfig->maxOrder, shr( pFilter->spectrumLength, 2 ) ), pFilter ); +#endif } } @@ -368,7 +376,11 @@ Word16 DetectTnsFilt_fx( pFilter->spectrumLength = spectrumLength; move16(); /* Limit the maximum order to spectrum length/4 */ +#ifdef HARMONIZE_2607_GetFilterParameters + GetFilterParameters( rxx, s_min( pTnsConfig->maxOrder, shr( pFilter->spectrumLength, 2 ) ), pFilter, EVS_MONO ); +#else GetFilterParameters( rxx, s_min( pTnsConfig->maxOrder, shr( pFilter->spectrumLength, 2 ) ), pFilter ); +#endif } } @@ -527,10 +539,17 @@ Word16 WriteTnsData_fx( STnsConfig const *pTnsConfig, Word16 const *stream, Word /********************************/ /* Private functions */ /********************************/ +#ifdef HARMONIZE_2607_GetFilterParameters +static void GetFilterParameters( Word32 rxx[], Word16 maxOrder, STnsFilter *pTnsFilter, Word16 element_mode ) +#else static void GetFilterParameters_ivas( Word32 rxx[], Word16 maxOrder, STnsFilter *pTnsFilter ) +#endif { Word16 i; Word16 parCoeff[TNS_MAX_FILTER_ORDER + 1]; +#ifdef HARMONIZE_2607_GetFilterParameters + Word32 epsP[TNS_MAX_FILTER_ORDER + 1]; +#endif Word32 rxx_0; Word32 L_tmp; #if TNS_COEF_RES == 5 @@ -542,21 +561,36 @@ static void GetFilterParameters_ivas( Word32 rxx[], Word16 maxOrder, STnsFilter #endif Word16 *indexes = pTnsFilter->coefIndex; - rxx_0 = rxx[0]; - move32(); - /* compute TNS filter in lattice (ParCor) form with LeRoux-Gueguen algorithm */ - L_tmp = E_LPC_schur_ivas( rxx, parCoeff, maxOrder ); - BASOP_SATURATE_WARNING_OFF_EVS /* Allow saturation, this value is compared against a threshold. */ - Word16 temp_e = 0; - move16(); - Word16 temp = BASOP_Util_Divide3232_Scale( rxx_0, L_tmp, &temp_e ); - pTnsFilter->predictionGain32 = L_deposit_h( temp ); - move32(); - pTnsFilter->predictionGain_e = temp_e; - move16(); - pTnsFilter->predictionGain = shl_sat( temp, sub( temp_e, PRED_GAIN_E ) ); // Q7 - move16(); - BASOP_SATURATE_WARNING_ON_EVS +#ifdef HARMONIZE_2607_GetFilterParameters + IF( EQ_16( element_mode, EVS_MONO ) ) + { + /* compute TNS filter in lattice (ParCor) form with LeRoux-Gueguen algorithm */ + L_tmp = E_LPC_schur( rxx, parCoeff, epsP, maxOrder ); + BASOP_SATURATE_WARNING_OFF_EVS /* Allow saturation, this value is compared against a threshold. */ + pTnsFilter->predictionGain = divide3232( L_shr( epsP[0], PRED_GAIN_E ), L_tmp ); + BASOP_SATURATE_WARNING_ON_EVS + } + ELSE + { +#endif + rxx_0 = rxx[0]; + move32(); + /* compute TNS filter in lattice (ParCor) form with LeRoux-Gueguen algorithm */ + L_tmp = E_LPC_schur_ivas( rxx, parCoeff, maxOrder ); + BASOP_SATURATE_WARNING_OFF_EVS /* Allow saturation, this value is compared against a threshold. */ + Word16 temp_e = 0; + move16(); + Word16 temp = BASOP_Util_Divide3232_Scale( rxx_0, L_tmp, &temp_e ); + pTnsFilter->predictionGain32 = L_deposit_h( temp ); + move32(); + pTnsFilter->predictionGain_e = temp_e; + move16(); + pTnsFilter->predictionGain = shl_sat( temp, sub( temp_e, PRED_GAIN_E ) ); // Q7 + move16(); + BASOP_SATURATE_WARNING_ON_EVS +#ifdef HARMONIZE_2607_GetFilterParameters + } +#endif /* non-linear quantization of TNS lattice coefficients with given resolution */ Parcor2Index( parCoeff, indexes, maxOrder ); @@ -566,6 +600,7 @@ static void GetFilterParameters_ivas( Word32 rxx[], Word16 maxOrder, STnsFilter test(); WHILE( ( i >= 0 ) && ( indexes[i] == 0 ) ) { + test(); i = sub( i, 1 ); } @@ -590,6 +625,8 @@ static void GetFilterParameters_ivas( Word32 rxx[], Word16 maxOrder, STnsFilter /* assert(maxOrder == 8); pTnsFilter->avgSqrCoef = shr(pTnsFilter->avgSqrCoef, 3); */ } + +#ifndef HARMONIZE_2607_GetFilterParameters static void GetFilterParameters( Word32 rxx[], Word16 maxOrder, STnsFilter *pTnsFilter ) { Word16 i; @@ -643,6 +680,7 @@ static void GetFilterParameters( Word32 rxx[], Word16 maxOrder, STnsFilter *pTns /* assert(maxOrder == 8); pTnsFilter->avgSqrCoef = shr(pTnsFilter->avgSqrCoef, 3); */ } +#endif /*HARMONIZE_2607_GetFilterParameters*/ static void Parcor2Index( const Word16 parCoeff[] /*Q15*/, Word16 index[], Word16 order ) {