Commit 07d4ec1a authored by sekine's avatar sekine
Browse files

Updated the renormalization and fixed redundant codes

parent 8a6654bb
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -131,6 +131,8 @@
#define NONBE_FIX_987_PARAMC_BINAURAL_REVERB_RENDERING       /* FhG: issue 987: solution b: downmix HOA3 to stereo a input for the reverberator */
#define NONBE_FIX_1006_PAST_DMX_NRG_ERROR               /* Eri/FhG: Issue 1006: Bug fix in ivas_stereo_dft_dec not replicated in ivas_stereo_dft_dec_dmx */

#define FIX_1764_RENORM                       /* NTT: update renorm for ivas_stereo_dmx_evs */
#define FIX_1764_ABS                          /* NTT: use abs in ivas_stereo_dmx_evs */

/* #################### End BASOP porting switches ############################ */

+78 −0
Original line number Diff line number Diff line
@@ -98,8 +98,13 @@

#define STEREO_DMX_EVS_TRNS_EGY_FORGETTING_Q15 24576

#ifdef FIX_1764_RENORM
#define STEREO_DMX_EVS_POC_RENORM_TH    1048576 // 65536 * 16
#define STEREO_DMX_EVS_POC_RENORM_SHIFT 10
#else
#define STEREO_DMX_EVS_POC_RENORM_TH    33554432 // 65536 << 9
#define STEREO_DMX_EVS_POC_RENORM_SHIFT 3
#endif

#define STEREO_DMX_EVS_FAD_R                  3
#define STEREO_DMX_EVS_FAD_IR                 10923 /* 1/3 in Q15 */
@@ -227,6 +232,12 @@ static Word32 spectral_flatness_fx(
    const Word16 *sig_fx_e, /* i  : input signal (exponent) - can be NULL */
    const Word16 sig_length /* i  : input signal length        */
);
#ifdef FIX_1764_RENORM
static void renorm_poc_fx(
    Word32 *real,  /* i/o real-part*/
    Word32 *imag   /* i/o imaginary-part */
);
#endif
/*-------------------------------------------------------------------*
 * estimate_itd_wnd_fft()
 *
@@ -437,6 +448,10 @@ static void calc_poc_fx(
            Rr = L_add( L_add( specRr[i], Mpy_32_32_r( specLr[i], eps_cos ) ), Mpy_32_32_r( specLi[i], eps_sin ) );
            Ri = L_add( L_sub( specRi[i], Mpy_32_32_r( specLr[i], eps_sin ) ), Mpy_32_32_r( specLi[i], eps_cos ) );

#ifdef FIX_1764_RENORM
            renorm_poc_fx(&Lr, &Li);
            renorm_poc_fx(&Rr, &Ri);
#else
            IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) &&
                ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) &&
                ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) &&
@@ -447,6 +462,7 @@ static void calc_poc_fx(
                Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT );
                Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT );
            }
#endif

            specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e
            move32();
@@ -460,6 +476,10 @@ static void calc_poc_fx(
                Rr = L_add( L_sub( specRr[j], Mpy_32_32_r( specLr[j], eps_cos ) ), Mpy_32_32_r( specLi[j], eps_sin ) );
                Ri = L_sub( L_sub( specRi[j], Mpy_32_32_r( specLr[j], eps_sin ) ), Mpy_32_32_r( specLi[j], eps_cos ) );

#ifdef FIX_1764_RENORM
                renorm_poc_fx(&Lr, &Li);
                renorm_poc_fx(&Rr, &Ri);
#else
                IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) &&
                    ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) &&
                    ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) &&
@@ -470,6 +490,7 @@ static void calc_poc_fx(
                    Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT );
                    Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT );
                }
#endif

                specPOr[j] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e
                move32();
@@ -492,6 +513,10 @@ static void calc_poc_fx(
            Rr = L_add( L_add( specRr[i], Mpy_32_32_r( specLr[i], eps_cos ) ), Mpy_32_32_r( specLi[i], eps_sin ) );
            Ri = L_add( L_sub( specRi[i], Mpy_32_32_r( specLr[i], eps_sin ) ), Mpy_32_32_r( specLi[i], eps_cos ) );

#ifdef FIX_1764_RENORM
            renorm_poc_fx(&Lr, &Li);
            renorm_poc_fx(&Rr, &Ri);
#else
            IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) &&
                ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) &&
                ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) &&
@@ -502,6 +527,7 @@ static void calc_poc_fx(
                Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT );
                Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT );
            }
#endif

            specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e
            move32();
@@ -514,6 +540,10 @@ static void calc_poc_fx(
            Rr = L_add( L_sub( specRr[j], Mpy_32_32_r( specLr[j], eps_cos ) ), Mpy_32_32_r( specLi[j], eps_sin ) );
            Ri = L_sub( L_sub( specRi[j], Mpy_32_32_r( specLr[j], eps_sin ) ), Mpy_32_32_r( specLi[j], eps_cos ) );

#ifdef FIX_1764_RENORM
            renorm_poc_fx(&Lr, &Li);
            renorm_poc_fx(&Rr, &Ri);
#else
            IF( ( LT_32( L_abs( Lr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) &&
                ( LT_32( L_abs( Li ), STEREO_DMX_EVS_POC_RENORM_TH ) ) &&
                ( LT_32( L_abs( Rr ), STEREO_DMX_EVS_POC_RENORM_TH ) ) &&
@@ -524,6 +554,7 @@ static void calc_poc_fx(
                Rr = L_shl( Rr, STEREO_DMX_EVS_POC_RENORM_SHIFT );
                Ri = L_shl( Ri, STEREO_DMX_EVS_POC_RENORM_SHIFT );
            }
#endif

            specPOr[j] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) ); // 2*spec_e
            move32();
@@ -537,6 +568,11 @@ static void calc_poc_fx(
        Li = L_sub( specLi[i], Mpy_32_32_r( specRr[i], EPS ) );
        Rr = L_add( specRr[i], Mpy_32_32_r( specLi[i], EPS ) );
        Ri = L_sub( specRi[i], Mpy_32_32_r( specLr[i], EPS ) );

#ifdef FIX_1764_RENORM
        renorm_poc_fx(&Lr, &Li);
        renorm_poc_fx(&Rr, &Ri);
#endif
        specPOr[i] = L_add( Mpy_32_32_r( Lr, Rr ), Mpy_32_32_r( Li, Ri ) );
        move32();
        specPOi[i] = L_sub( Mpy_32_32_r( Lr, Ri ), Mpy_32_32_r( Li, Rr ) );
@@ -568,7 +604,11 @@ static void calc_poc_fx(
    {
        tmp1 = Mpy_32_32_r( wnd[i * step + bias], gamma ); // Q31

#ifdef FIX_1764_ABS
        IF(GT_32(L_abs(specPOr[i]), L_abs(specPOi[i])))
#else
        IF( W_mult0_32_32( L_sub( specPOr[i], specPOi[i] ), L_add( specPOr[i], specPOi[i] ) ) > 0 )
#endif
        {
            specPOr[i] = Mpy_32_16_1( tmp1, imult1616( sign_fx( specPOr[i] ), /*0.923880f*/ s[120 * mult_angle] ) ); /*  cos(PI/8)  Q31*/
            move32();
@@ -587,9 +627,17 @@ static void calc_poc_fx(
    FOR( ; i < end; i++ ) /* binary search from 16 angles */
    {
        tmp1 = Mpy_32_32_r( wnd[i * step + bias], gamma ); // Q31
#ifdef FIX_1764_ABS
        IF(GT_32(L_abs(specPOr[i]), L_abs(specPOi[i])))
#else
        IF( W_mult0_32_32( L_sub( specPOr[i], specPOi[i] ), L_add( specPOr[i], specPOi[i] ) ) > 0 )
#endif
        {
#ifdef FIX_1764_ABS
            IF(GT_32(L_abs(Mpy_32_16_1(specPOr[i], 13573 /*0.414213f*/)), L_abs(specPOi[i]))) /*tan(PI/8)*/
#else
            IF( W_mult0_32_32( L_sub( Mpy_32_16_1( specPOr[i], 13573 /*0.414213f*/ ), specPOi[i] ), L_add( Mpy_32_16_1( specPOr[i], 13573 /*0.414213f*/ ), specPOi[i] ) ) > 0 ) /*tan(PI/8)*/
#endif
            {
                specPOr[i] = Mpy_32_16_1( tmp1 /*0.980785f */, imult1616( sign_fx( specPOr[i] ), s[140 * mult_angle] ) ); /* cos(PI/16)  Q31*/
                move32();
@@ -606,7 +654,11 @@ static void calc_poc_fx(
        }
        ELSE
        {
#ifdef FIX_1764_ABS
            IF(GT_32(L_abs(Mpy_32_16_1(specPOi[i], 13573 /*0.414213f*/)), L_abs(specPOr[i]))) /*tan(PI/8)*/
#else
            IF( W_mult0_32_32( L_sub( specPOr[i], Mpy_32_16_1( specPOi[i], 13573 /*0.414213f*/ ) ), L_add( specPOr[i], Mpy_32_16_1( specPOi[i], 13573 /*0.414213f*/ ) ) ) > 0 ) /*tan(PI/8)*/
#endif
            {
                specPOr[i] = Mpy_32_16_1( tmp1 /** 0.555570f*/, imult1616( sign_fx( specPOr[i] ), s[60 * mult_angle] ) ); /*cos(PI*5/16)  Q31*/
                move32();
@@ -1822,6 +1874,32 @@ static Word32 spectral_flatness_fx(
    return L_shl_sat( L_deposit_h( sf ), L_tmp_e );
}

#ifdef FIX_1764_RENORM
/*-------------------------------------------------------------------*
 * renorm_poc_fx()
 *
 * two-stage renormalization of a complex number
 *-------------------------------------------------------------------*/
static void renorm_poc_fx(
	Word32 *real,  /* i/o real-part*/
	Word32 *imag   /* i/o imaginary-part */
)
{
	IF((LT_32(L_abs(*real), STEREO_DMX_EVS_POC_RENORM_TH)) &&
		(LT_32(L_abs(*imag), STEREO_DMX_EVS_POC_RENORM_TH)))
	{
		*real = L_shl(*real, STEREO_DMX_EVS_POC_RENORM_SHIFT);
		*imag = L_shl(*imag, STEREO_DMX_EVS_POC_RENORM_SHIFT);
		IF((LT_32(L_abs(*real), STEREO_DMX_EVS_POC_RENORM_TH)) &&
			(LT_32(L_abs(*imag), STEREO_DMX_EVS_POC_RENORM_TH)))
		{
			*real = L_shl(*real, STEREO_DMX_EVS_POC_RENORM_SHIFT);
			*imag = L_shl(*imag, STEREO_DMX_EVS_POC_RENORM_SHIFT);
		}
	}
}
#endif

/*-------------------------------------------------------------------*
 * calc_energy()
 *