Commit 9134870e authored by sekine's avatar sekine
Browse files

Further reduction of complexity by modifying if{}else{} clause.

parent 1f59b328
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -152,6 +152,7 @@

/* NTT switches */
#define NTT_REDUC_COMP_POC                              /* Contribution  : Complexity reduction of phase spectrum in stereo downmix*/
#define BOOL5

/* ################## End DEVELOPMENT switches ######################### */
/* clang-format on */
+165 −2
Original line number Diff line number Diff line
@@ -161,7 +161,7 @@ static void calc_poc(
    float aR, aI;                                               /*real and imaginary values for searching phase angle*/
    int16_t j;

    int16_t index_angles, mult_angle;
    int16_t mult_angle;

    bool diffIR;
    const float *cos_reverse;
@@ -169,6 +169,13 @@ static void calc_poc(
    float tmpPOC1[L_FRAME48k], tmpPOC2[L_FRAME48k];
    float rfft_buf[L_FRAME48k];
    int16_t step, bias;
#ifdef BOOL5
    bool diffIR0; /*angle */
    float up_down;
    int16_t index_angles;
#else
    int16_t index_angles;
#endif
#else
    float specPOr[L_FRAME48k], specPOi[L_FRAME48k];
    float tmpPOC1[L_FRAME48k], tmpPOC2[L_FRAME48k];
@@ -305,6 +312,159 @@ static void calc_poc(
        specPOr[i] = sign( specPOr[i] ) * tmp1;
        specPOi[i] = sign( specPOi[i] ) * tmp1; /* low accuracy is adequate for low frequency */
    }

#ifdef BOOL5
    for ( i = n0 >> 4; i<n0>> 3; i++ ) /* binary search from 8 angles */
    {
        aR = specPOr[i];
        aR *= aR;
        aI = specPOi[i];
        aI *= aI;
        diffIR = aR > aI;
        /* index_angles = 120 - (int16_t) diffIR * 80;*/
        tmp1 = wnd[i * step + bias] * gamma;
        gamma -= igamma;
        specPOr[i] = sign( specPOr[i] ) * cos_reverse[-( 120 - (int16_t) diffIR * 80 ) * mult_angle] * tmp1 /*s[cos_max - index_angles]*/;
        specPOi[i] = sign( specPOi[i] ) * s[( 120 - (int16_t) diffIR * 80 ) * mult_angle] * tmp1;
    }
    for ( i = n0 >> 3; i<n0>> 2; i++ ) /* binary search from 16 angles */
    {
        aR = specPOr[i];
        aR *= aR;
        aI = specPOi[i];
        aI *= aI;
        diffIR0 = aR > aI;
        /*index_angles = 140 - (int16_t) diffIR0*80; */
        up_down = ( /* 1.0f - 0.1715724f */ 0.82842759f ) * (float) diffIR0;
        diffIR = aR * ( 1.0f - up_down ) > aI * ( up_down + 0.1715724f );

        /* equivalent if{} else{}*/
        /* if ( aR > aI )
        {
            if (aR * tanf(PI/8)* tanf(PI/8)> aI){
            index_angles = 60 - (int16_t) diffIR * 40;
            }
            else{......}
        }
        */
        tmp1 = wnd[i * step + bias] * gamma;
        gamma -= igamma;
        specPOr[i] = sign( specPOr[i] ) /*((float)(aR>0)*2.f- 1.0f)*/ * cos_reverse[-( 140 - (int16_t) diffIR0 * 80 - (int16_t) diffIR * 40 ) * mult_angle] * tmp1 /*s[cos_max - index_angles]*/;
        specPOi[i] = sign( specPOi[i] ) /*( (float) ( aI > 0 ) * 2.f - 1.0f )*/ * s[( 140 - (int16_t) diffIR0 * 80 - (int16_t) diffIR * 40 ) * mult_angle] * tmp1;
    }
    for ( i = n0 >> 2; i</*min( n0, 320 )*/ n0>> 1; i++ ) /* binary search from 32 angles */
    {
        aR = specPOr[i];
        aR *= aR;
        aI = specPOi[i];
        aI *= aI;

        if ( aR > aI )
        {
            if ( aR * 0.1715724f /* tanf(PI/8)**2 = 0.414213f**2 */ > aI )
            {
                diffIR = aR * 0.039565188f /* tanf(PI/16)**2  */ > aI;
                index_angles = 30;
            }
            else
            {
                diffIR = aR * 0.446463176f /* tanf(PI*3/16)**2 */ > aI;
                index_angles = 70;
            }
        }
        else
        {
            if ( aR > aI * 0.1715724f /* tanf(PI/8)**2  */ )
            {
                diffIR = aR > aI * 0.446463176f /* tanf(PI*3/16)**2 */;
                index_angles = 110;
            }
            else
            {
                diffIR = aR > aI * 0.039565188f /* tanf(PI/16)**2 */;
                index_angles = 150;
            }
        }
        {
            tmp1 = wnd[i * step + bias] * gamma;
            gamma -= igamma;
            specPOr[i] = sign( specPOr[i] ) * cos_reverse[-( index_angles - (int16_t) diffIR * 20 ) * mult_angle] * tmp1 /*s[cos_max - index_angles]*/;
            specPOi[i] = sign( specPOi[i] ) * s[( index_angles - (int16_t) diffIR * 20 ) * mult_angle] * tmp1;
        }
    }

    for ( ; i < min( n0, 320 ); i++ ) /* binary search from 64 angles */
    {
        aR = specPOr[i];
        aR *= aR;
        aI = specPOi[i];
        aI *= aI;
        if ( aR > aI )
        {
            if ( aR * 0.1715724f /* tanf(PI/8)**2 */ > aI )
            {
                if ( aR * 0.039565188f /* tanf(PI/16)**2 */ > aI )
                {
                    diffIR = aR * 0.00970f /*0.098491f * 0.098491f*/ /*tanf(PI/32)*/ > aI;
                    index_angles = 15;
                }
                else
                {
                    diffIR = aR * 0.09201922 /* tanf(PI*3/32)**2 */ > aI;
                    index_angles = 35;
                }
            }
            else
            {
                if ( aR * 0.446463176f /* tanf(PI*3/16)**2 */ > aI )
                {
                    diffIR = aR * 0.285702f /*0.5345111f*0.5345111f*/ /* tanf(PI*5/32)**2 */ > aI;
                    index_angles = 55;
                }
                else
                {
                    diffIR = aR * 0.6735137f /*0.8206788f*0.8206788f */ /* tanf(PI*7/32)**2 */ > aI;
                    index_angles = 75;
                }
            }
        }
        else
        {
            if ( aR > aI * 0.1715724f /* tanf(PI/8)**2 */ )
            {
                if ( aR > aI * 0.446463176f /* tanf(PI*3/16)**2 */ )
                {
                    diffIR = aR > aI * 0.6735137f /*0.8206788f*0.8206788f */ /* tanf(PI*7/32)**2 */;
                    index_angles = 95;
                }
                else
                {
                    diffIR = aR > aI * 0.285702f /*0.5345111f*0.5345111f*/ /*tanf(PI*5/32)*/;
                    index_angles = 115;
                }
            }
            else
            {
                if ( aR > aI * 0.039565188f /* tanf(PI/16)**2 */ ) //
                {
                    diffIR = aR > aI * 0.09201922 /*0.3033467f*0.3033467f*/ /* tanf(PI*3/32)**2 */;
                    index_angles = 135;
                }
                else
                {
                    diffIR = aR > aI * 0.00970f /*0.098491f * 0.098491f*/ /* tanf(PI/32)**2 */;
                    index_angles = 155;
                }
            }
        }
        {
            tmp1 = wnd[i * step + bias] * gamma;
            gamma -= igamma;
            specPOr[i] = sign( specPOr[i] ) * cos_reverse[-( index_angles - (int16_t) diffIR * 10 ) * mult_angle] * tmp1 /*s[cos_max - index_angles]*/;
            specPOi[i] = sign( specPOi[i] ) * s[( index_angles - (int16_t) diffIR * 10 ) * mult_angle] * tmp1;
        }
    }
#else  /*BOOL5*/
    for ( i = n0 >> 4; i<n0>> 3; i++ ) /* binary search from 8 angles */
    {
        aR = fabsf( specPOr[i] );
@@ -450,6 +610,8 @@ static void calc_poc(
            specPOi[i] = sign( specPOi[i] ) * s[index_angles * mult_angle] * tmp1;
        }
    }
#endif /*BOOL5*/

    if ( i < n0 )
    {
        gamma -= igamma * ( n0 - 320 );
@@ -460,7 +622,8 @@ static void calc_poc(
        specPOi[i] = 0.f;
    }
    specPOr[n0] = sign( specLr[n0] ) * sign( specRr[n0] ) * wnd[i * step + bias] * gamma;
#else

#else /*end NTT_REDUC_COMP*/
    if ( input_frame == L_FRAME16k )
    {
        step = 3;