Commit cb17b506 authored by vaclav's avatar vaclav
Browse files

harmonize fft_fx

parent 00c9f59b
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -273,7 +273,7 @@ void edct_fx(
        tmp = sub( getScaleFactor32_cmplx( spec, len1 ), find_guarded_bits_fx( len1 ) );
        scale_sig32_cmplx( spec, len1, tmp );

        fft_cmplx_fx( spec, len1 );
        fft_fx( spec, len1 );
        *q = sub( *q, tmp );
        move16();

@@ -954,7 +954,7 @@ void edxt_fx(
            ELSE /* fft() doesn't support 512 */
            {
#ifdef OPTIMIZE_FFT_STACK
                fft_cmplx_fx( spec, length );
                fft_fx( spec, length );
#else
                fft_fx( re, im, length, 1 );
#endif
@@ -1136,7 +1136,7 @@ void edxt_fx(
            ELSE /* fft() doesn't support 512 */
            {
#ifdef OPTIMIZE_FFT_STACK
                fft_cmplx_fx( spec, length );
                fft_fx( spec, length );
#else
                fft_fx( re, im, length, 1 );
#endif
+60 −5
Original line number Diff line number Diff line
@@ -6928,6 +6928,7 @@ static void fft_lenN(
 * Complex-value FFT
 *-----------------------------------------------------------------*/

#ifndef HARMONIZE_DCT
void fft_fx(
    Word32 *re,          /* i/o: real part Qx          */
    Word32 *im,          /* i/o: imag part Qx          */
@@ -7013,10 +7014,8 @@ void fft_fx(

    return;
}


#ifdef OPTIMIZE_FFT_STACK
void fft_cmplx_fx(
#else
void fft_fx(
    cmplx *x,           /* i/o: complex data        */
    const Word16 length /* i  : length of fft       */
)
@@ -7093,6 +7092,9 @@ void rfft_fx(
    Word16 i, sizeOfFft2, sizeOfFft4;
    Word32 tmp, t1, t2, t3, t4;
    Word16 s1, s2;
#ifdef HARMONIZE_DCT
    cmplx spec[L_FRAME48k];
#endif

    sizeOfFft2 = shr( length, 1 );
    sizeOfFft4 = shr( length, 2 );
@@ -7163,10 +7165,43 @@ void rfft_fx(

    SWITCH( isign )
    {

        case -1:

#ifdef HARMONIZE_DCT
            FOR( i = 0; i < sizeOfFft2; i++ )
            {
                spec[i].re = x[2 * i];
                move32();
                spec[i].im = x[2 * i + 1];
                move32();
            }

            fft_fx( spec, sizeOfFft2 );

            FOR( i = 0; i < sizeOfFft4; i++ )
            {
                x[2 * i] = spec[i].re;
                move32();
                x[2 * i + 1] = spec[sizeOfFft2 - i - 1].re;
                move32();

                x[2 * i] = spec[i].im;
                move32();
                x[2 * i + 1] = L_negate( spec[sizeOfFft2 - i - 1].im );
                move32();
            }

            FOR( i = 0; i < sizeOfFft2; i++ )
            {
                x[2 * i] = spec[i].re;
                move32();
                x[2 * i + 1] = spec[i].im;
                move32();
            }
#else
            fft_fx( x, x + 1, sizeOfFft2, 2 );
#endif

            // Qx
            tmp = L_add( x[0], x[1] );
            x[1] = L_sub( x[0], x[1] ); // Qx
@@ -7222,7 +7257,27 @@ void rfft_fx(
                move32();
            }

#ifdef HARMONIZE_DCT
            FOR( i = 0; i < sizeOfFft2; i++ )
            {
                spec[i].re = x[2 * i];
                move32();
                spec[i].im = x[2 * i + 1];
                move32();
            }

            fft_fx( spec, sizeOfFft2 );

            FOR( i = 0; i < sizeOfFft2; i++ )
            {
                x[2 * i] = spec[i].re;
                move32();
                x[2 * i + 1] = spec[i].im;
                move32();
            }
#else
            fft_fx( x, x + 1, sizeOfFft2, 2 );
#endif

            FOR( i = 0; i < length; i += 2 )
            {
+58 −0
Original line number Diff line number Diff line
@@ -214,7 +214,29 @@ static void ivas_ifft_cplx1_fx(
        move32();
    }

#ifdef HARMONIZE_DCT
    cmplx x[L_FRAME48k];

    FOR( i = 0; i < length; i++ )
    {
        x[i].re = re[i];
        move32();
        x[i].im = im[i];
        move32();
    }

    fft_fx( x, length );

    FOR( i = 0; i < length; i++ )
    {
        re[i] = x[i].re;
        move32();
        im[i] = x[i].im;
        move32();
    }
#else
    fft_fx( re, im, length, 1 );
#endif

    return;
}
@@ -233,8 +255,12 @@ void ivas_mdft_fx(
    const Word16 mdft_length   /* i  : MDFT length                        */
)
{
#ifdef HARMONIZE_DCT
    cmplx spec[L_FRAME48k];
#else
    Word32 re[L_FRAME48k];
    Word32 im[L_FRAME48k];
#endif
    Word16 j, len_by_2;
    const Word32 *pTwid; // Q31
    len_by_2 = shr( mdft_length, 1 );
@@ -244,23 +270,53 @@ void ivas_mdft_fx(
    {
        FOR( j = 0; j < mdft_length; j++ )
        {
#ifdef HARMONIZE_DCT
            spec[j].re = Mpy_32_32( pIn[j], pTwid[j] ); // ( Qin + Q31 ) - Q31 -> Qin
            move32();
            spec[j].im = Mpy_32_32( L_negate( pIn[j] ), pTwid[mdft_length - j] ); // ( Qin + Q31 ) - Q31 -> Qin
            move32();
#else
            re[j] = Mpy_32_32( pIn[j], pTwid[j] ); // ( Qin + Q31 ) - Q31 -> Qin
            move32();
            im[j] = Mpy_32_32( L_negate( pIn[j] ), pTwid[mdft_length - j] ); // ( Qin + Q31 ) - Q31 -> Qin
            move32();
#endif
        }
    }
    ELSE
    {
        FOR( j = 0; j < mdft_length; j++ )
        {
#ifdef HARMONIZE_DCT
            spec[j].re = Msub_32_32( Mpy_32_32( pIn[j], pTwid[j] ), pIn[add( mdft_length, j )], pTwid[mdft_length - j] ); // ( Qin + Q31 ) - Q31 -> Qin
            move32();
            spec[j].im = Msub_32_32( Mpy_32_32( L_negate( pIn[j] ), pTwid[mdft_length - j] ), pIn[mdft_length + j], pTwid[j] ); // ( Qin + Q31 ) - Q31 -> Qin
            move32();
#else
            re[j] = Msub_32_32( Mpy_32_32( pIn[j], pTwid[j] ), pIn[add( mdft_length, j )], pTwid[mdft_length - j] ); // ( Qin + Q31 ) - Q31 -> Qin
            move32();
            im[j] = Msub_32_32( Mpy_32_32( L_negate( pIn[j] ), pTwid[mdft_length - j] ), pIn[mdft_length + j], pTwid[j] ); // ( Qin + Q31 ) - Q31 -> Qin
            move32();
#endif
        }
    }

#ifdef HARMONIZE_DCT
    fft_fx( spec, mdft_length );

    FOR( j = 0; j < len_by_2; j++ )
    {
        pOut_re[2 * j] = spec[j].re;
        move32();
        pOut_re[2 * j + 1] = spec[mdft_length - j - 1].re;
        move32();

        pOut_im[2 * j] = spec[j].im;
        move32();
        pOut_im[2 * j + 1] = L_negate( spec[mdft_length - j - 1].im );
        move32();
    }
#else
    fft_fx( re, im, mdft_length, 1 );
    FOR( j = 0; j < len_by_2; j++ )
    {
@@ -274,6 +330,8 @@ void ivas_mdft_fx(
        pOut_im[2 * j + 1] = L_negate( im[mdft_length - j - 1] ); // Qin
        move32();
    }
#endif

    return;
}

+4 −6
Original line number Diff line number Diff line
@@ -4128,19 +4128,17 @@ void DoFFT_fx(
    const Word16 length );

void fft_fx(
#ifndef HARMONIZE_DCT
    Word32 *re,          /* i/o: real part           */
    Word32 *im,          /* i/o: imag part           */
    const Word16 length, /* i  : length of fft       */
    const Word16 s       /* i  : sign                */
);

#ifdef OPTIMIZE_FFT_STACK
void fft_cmplx_fx(
#else
    cmplx *spec,        /* i/o: complex data        */
    const Word16 length /* i  : length of fft       */
#endif
);

#endif
void rfft_fx(
    Word32 *x,           /* i/o: values                    */
    const Word16 *w,     /* i  : window                    */