diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj
index 7109c9ebcfc05d7e8d4962a1daf73013eefc2c6b..99b025e52828398d5d6341f852105ad4e9934259 100644
--- a/Workspace_msvc/lib_com.vcxproj
+++ b/Workspace_msvc/lib_com.vcxproj
@@ -175,7 +175,6 @@
-
diff --git a/Workspace_msvc/lib_com.vcxproj.filters b/Workspace_msvc/lib_com.vcxproj.filters
index c8445d0f33767d266579773865583de67472c768..14f722f697b0bce3b56d14bbc83f00a231e27dc4 100644
--- a/Workspace_msvc/lib_com.vcxproj.filters
+++ b/Workspace_msvc/lib_com.vcxproj.filters
@@ -416,7 +416,6 @@
-
diff --git a/lib_com/fft.c b/lib_com/fft.c
index 7ae89b7d5c9b4c92dce6a6e9d0b238e2d9069cd7..be42d29cbf7914d72d4dc9def11afe41019a9359 100644
--- a/lib_com/fft.c
+++ b/lib_com/fft.c
@@ -48,6347 +48,9 @@
#endif
/*-----------------------------------------------------------------*
- * Local constants
- *-----------------------------------------------------------------*/
-
-#define FFT_15PONIT_WNK1 0.55901699f /* EDCT & EMDCT constants */
-#define FFT_15PONIT_WNK2 0.95105652f /* EDCT & EMDCT constants */
-#define FFT_15PONIT_WNK3 0.58778525f /* EDCT & EMDCT constants */
-#define FFT_15PONIT_WNK4 0.86602540f /* EDCT & EMDCT constants */
-#define FFT_15PONIT_WNK5 0.25000000f /* EDCT & EMDCT constants */
-
-/* FFT constants */
-#define FFT_C31 -0.8660254037f
-#define FFT_C51 0.9510565195f
-#define FFT_C52 -1.5388417989f
-#define FFT_C53 -0.3632712597f
-#define FFT_C54 0.5590169895f
-#define FFT_C55 -1.2500000000f
-#define FFT_C61 0.8660254036f
-#define FFT_C81 0.7071067811f
-#define FFT_C82 -0.7071067811f
-#define FFT_C161 0.7071067811f
-#define FFT_C162 -0.7071067811f
-#define FFT_C163 0.9238795325f
-#define FFT_C164 -0.9238795325f
-#define FFT_C165 0.3826834323f
-#define FFT_C166 -0.3826834323f
-
-
-/*-----------------------------------------------------------------*
- * Local function prototypes
- *-----------------------------------------------------------------*/
-
-static void cdftForw( int16_t n, float *a, const int16_t *ip, const float *w );
-static void bitrv2_SR( int16_t n, const int16_t *ip, float *a );
-static void cftfsub( int16_t n, float *a, const float *w );
-static void cft1st( int16_t n, float *a, const float *w );
-static void cftmdl( int16_t n, int16_t l, float *a, const float *w );
-static void fft16_ivas( float *x, float *y, const int16_t *Idx );
-static void fft5_shift1( int16_t n1, float *zRe, float *zIm, const int16_t *Idx );
-static void fft8( float *x, float *y, const int16_t *Idx );
-static void fft15_shift2( int16_t n1, float *zRe, float *zIm, const int16_t *Idx );
-static void fft15_shift8( int16_t n1, float *zRe, float *zIm, const int16_t *Idx );
-static void fft5_shift4( int16_t n1, float *zRe, float *zIm, const int16_t *Idx );
-static void fft5_32( float *zRe, float *zIm, const int16_t *Idx );
-static void fft64( float *x, float *y, const int16_t *Idx );
-static void fft32_15( float *x, float *y, const int16_t *Idx );
-static void fft32_5( float *x, float *y, const int16_t *Idx );
-static void fft8_5( float *x, float *y, const int16_t *Idx );
-static void fft5_8( int16_t n1, float *zRe, float *zIm, const int16_t *Idx );
-static void fft4_5( float *x, float *y, const int16_t *Idx );
-static void fft5_4( int16_t n1, float *zRe, float *zIm, const int16_t *Idx );
-
-static float fmac( float a, float b, float c )
-{
- return ( ( ( a ) * ( b ) ) + ( c ) );
-}
-
-static float fnms( float a, float b, float c )
-{
- return ( ( c ) - ( ( a ) * ( b ) ) );
-}
-
-/*-----------------------------------------------------------------*
- * fft15_shift2()
- * 15-point FFT with 2-point circular shift
- *-----------------------------------------------------------------*/
-
-static void fft15_shift2(
- int16_t n1, /* i : length of data */
- float *zRe, /* i/o: real part of input and output data */
- float *zIm, /* i/o: imaginary part of input and output data */
- const int16_t *Idx /* i : pointer of the address table */
-)
-{
- int16_t in0, in8, in16, in24, in32, in1, in9, in17, in25, in33, in2, in10, in18, in26, in34;
- float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8, fi9, fi10, fi11, fi12, fi13, fi14, fi15;
- float fi16, fi17, fi18, fi19, fi20, fi21, fi22, fi23, fi24, fi25, fi26, fi27, fi28, fi29, fi30;
- float f2i1, f2i2, f2i3, f2i4, f2i5, f2i6, f2i7, f2i8, f2i9, f2i10, f2i11, f2i12;
- float f2i13, f2i14, f2i15, f2i16, f2i17, f2i18, f2i19, f2i20, f2i21, f2i22, f2i23, f2i24;
- float f3i1, f3i2, f3i3, f3i4, f3i5, f3i6, f3i7, f3i8, f3i9, f3i10, f3i11, f3i12, f3i13, f3i14, f3i15;
- float f4i1, f4i2, f4i3, f4i4, f4i5, f4i6, f4i7, f4i8, f4i9;
- float f4i10, f4i11, f4i12, f4i13, f4i14, f4i15, f4i16, f4i17, f4i18, f4i19, f4i20, fo1, fo2, fo3, fo4;
- float fo5, fo6, fo7, fo8, fo9, fo10, fo11, fo12, fo13, fo14, fo15, fo16, fo17, fo18;
- float f2o1, f2o2, f2o3, f2o4, f2o5, f2o6, f2o7, f2o8, f2o9, f2o10, f2o11, f2o12, f2o13;
- float f2o14, f2o15, f3o1, f3o2, f3o3, f3o4, f3o5, f3o6, f3o7, f3o8, f3o9, f3o10, f3o11;
- float f3o12, f3o13, f3o14, f3o15, f4o1, f4o2, f4o3, f4o4, f4o5, f4o6;
- float f4o7, f4o8, f4o9, f4o10, f4o11, f4o12, f4o13, f4o14, f4o15, f4o16, f4o17, f4o18, f4o19;
-
- in0 = Idx[0];
- in8 = Idx[n1];
- in16 = Idx[n1 * 2];
- in24 = Idx[n1 * 3];
- in32 = Idx[n1 * 4];
- in1 = Idx[n1 * 5];
- in9 = Idx[n1 * 6];
- in17 = Idx[n1 * 7];
- in25 = Idx[n1 * 8];
- in33 = Idx[n1 * 9];
- in2 = Idx[n1 * 10];
- in10 = Idx[n1 * 11];
- in18 = Idx[n1 * 12];
- in26 = Idx[n1 * 13];
- in34 = Idx[n1 * 14];
-
- f2i13 = zRe[in0];
- f2i14 = zIm[in0];
- f2i21 = zRe[in1];
- f2i22 = zRe[in2];
- f2i23 = zIm[in1];
- f2i24 = zIm[in2];
-
- f2i15 = f2i21 + f2i22;
- f2i16 = FFT_15PONIT_WNK4 * ( f2i22 - f2i21 );
- f2i17 = FFT_15PONIT_WNK4 * ( f2i23 - f2i24 );
- f2i18 = f2i23 + f2i24;
- fi1 = f2i13 + f2i15;
- fi2 = f2i14 + f2i18;
-
- f2i19 = fnms( 0.5f, f2i15, f2i13 );
- f2i20 = fnms( 0.5f, f2i18, f2i14 );
- fi3 = f2i19 - f2i17;
- fi4 = f2i19 + f2i17;
- fi5 = f2i16 + f2i20;
- fi6 = f2i20 - f2i16;
-
- f3i1 = zRe[in9];
- f4i2 = zRe[in10];
- f4i3 = zRe[in8];
- f3i2 = f4i2 + f4i3;
- f3i3 = fnms( 0.5f, f3i2, f3i1 );
- f3i4 = FFT_15PONIT_WNK4 * ( f4i3 - f4i2 );
-
- f3i5 = zIm[in9];
- f4i4 = zIm[in10];
- f4i5 = zIm[in8];
- f3i6 = f4i4 + f4i5;
- f3i7 = FFT_15PONIT_WNK4 * ( f4i4 - f4i5 );
- f3i8 = fnms( 0.5f, f3i6, f3i5 );
-
- f3i9 = zRe[in33];
- f4i6 = zRe[in34];
- f4i7 = zRe[in32];
- f3i10 = f4i6 + f4i7;
- f3i11 = fnms( 0.5f, f3i10, f3i9 );
- f3i12 = FFT_15PONIT_WNK4 * ( f4i7 - f4i6 );
-
- f3i13 = zIm[in33];
- f4i8 = zIm[in34];
- f4i9 = zIm[in32];
- f3i14 = f4i8 + f4i9;
- f3i15 = FFT_15PONIT_WNK4 * ( f4i8 - f4i9 );
- f4i1 = fnms( 0.5f, f3i14, f3i13 );
-
- fi7 = f3i1 + f3i2;
- fi8 = f3i9 + f3i10;
- fi9 = fi7 + fi8;
- fi10 = f3i3 - f3i7;
- fi11 = f3i11 - f3i15;
- fi12 = fi10 + fi11;
- fi13 = f3i5 + f3i6;
- fi14 = f3i13 + f3i14;
- fi15 = fi13 + fi14;
- fi16 = f3i8 - f3i4;
- fi17 = f4i1 - f3i12;
- fi18 = fi16 + fi17;
- fi19 = f3i4 + f3i8;
- fi20 = f3i12 + f4i1;
- fi21 = fi19 + fi20;
- fi22 = f3i3 + f3i7;
- fi23 = f3i11 + f3i15;
- fi24 = fi22 + fi23;
-
- f4i10 = zRe[in24];
- fo6 = zRe[in25];
- fo7 = zRe[in26];
- f4i11 = fo6 + fo7;
- f4i12 = fnms( 0.5f, f4i11, f4i10 );
- f4i13 = FFT_15PONIT_WNK4 * ( fo7 - fo6 );
-
- f4i14 = zIm[in24];
- fo8 = zIm[in25];
- fo9 = zIm[in26];
- f4i15 = fo8 + fo9;
- f4i16 = FFT_15PONIT_WNK4 * ( fo8 - fo9 );
- f4i17 = fnms( 0.5f, f4i15, f4i14 );
-
- f4i18 = zRe[in18];
- f2o10 = zRe[in16];
- f2o11 = zRe[in17];
- f4i19 = f2o10 + f2o11;
- f4i20 = fnms( 0.5f, f4i19, f4i18 );
- fo1 = FFT_15PONIT_WNK4 * ( f2o11 - f2o10 );
-
- fo2 = zIm[in18];
- f2o12 = zIm[in16];
- f2o13 = zIm[in17];
- fo3 = f2o12 + f2o13;
- fo4 = FFT_15PONIT_WNK4 * ( f2o12 - f2o13 );
- fo5 = fnms( 0.5f, fo3, fo2 );
-
- fi25 = f4i10 + f4i11;
- fi26 = f4i18 + f4i19;
- fi27 = fi25 + fi26;
- fi28 = f4i12 - f4i16;
- fi29 = f4i20 - fo4;
- fi30 = fi28 + fi29;
- f2i1 = f4i14 + f4i15;
- f2i2 = fo2 + fo3;
- f2i3 = f2i1 + f2i2;
- f2i4 = f4i17 - f4i13;
- f2i5 = fo5 - fo1;
- f2i6 = f2i4 + f2i5;
- f2i7 = f4i13 + f4i17;
- f2i8 = fo1 + fo5;
- f2i9 = f2i7 + f2i8;
- f2i10 = f4i12 + f4i16;
- f2i11 = f4i20 + fo4;
- f2i12 = f2i10 + f2i11;
-
- fo10 = FFT_15PONIT_WNK1 * ( fi27 - fi9 );
- fo11 = fi27 + fi9;
- fo12 = fnms( FFT_15PONIT_WNK5, fo11, fi1 );
- fo15 = fi13 - fi14;
- fo16 = f2i1 - f2i2;
- fo13 = fnms( FFT_15PONIT_WNK3, fo16, FFT_15PONIT_WNK2 * fo15 );
- fo14 = fmac( FFT_15PONIT_WNK2, fo16, FFT_15PONIT_WNK3 * fo15 );
-
- zRe[in0] = fi1 + fo11;
- fo17 = fo10 + fo12;
- zRe[in18] = fo17 - fo14;
- zRe[in24] = fo17 + fo14;
- fo18 = fo12 - fo10;
- zRe[in9] = fo18 - fo13;
- zRe[in33] = fo18 + fo13;
-
- f2o1 = FFT_15PONIT_WNK1 * ( f2i3 - fi15 );
- f2o2 = f2i3 + fi15;
- f2o3 = fnms( FFT_15PONIT_WNK5, f2o2, fi2 );
- f2o6 = fi7 - fi8;
- f2o7 = fi25 - fi26;
- f2o4 = fnms( FFT_15PONIT_WNK3, f2o7, FFT_15PONIT_WNK2 * f2o6 );
- f2o5 = fmac( FFT_15PONIT_WNK2, f2o7, FFT_15PONIT_WNK3 * f2o6 );
- zIm[in0] = fi2 + f2o2;
- f2o8 = f2o1 + f2o3;
- zIm[in24] = f2o8 - f2o5;
- zIm[in18] = f2o5 + f2o8;
- f2o9 = f2o3 - f2o1;
- zIm[in33] = f2o9 - f2o4;
- zIm[in9] = f2o4 + f2o9;
-
- f2o14 = FFT_15PONIT_WNK1 * ( fi30 - fi12 );
- f2o15 = fi30 + fi12;
- f3o1 = fnms( FFT_15PONIT_WNK5, f2o15, fi3 );
- f3o4 = fi16 - fi17;
- f3o5 = f2i4 - f2i5;
- f3o2 = fnms( FFT_15PONIT_WNK3, f3o5, FFT_15PONIT_WNK2 * f3o4 );
- f3o3 = fmac( FFT_15PONIT_WNK2, f3o5, FFT_15PONIT_WNK3 * f3o4 );
- zRe[in2] = fi3 + f2o15;
- f3o6 = f2o14 + f3o1;
- zRe[in17] = f3o6 - f3o3;
- zRe[in26] = f3o6 + f3o3;
- f3o7 = f3o1 - f2o14;
- zRe[in8] = f3o7 - f3o2;
- zRe[in32] = f3o7 + f3o2;
-
- f3o8 = FFT_15PONIT_WNK1 * ( f2i6 - fi18 );
- f3o9 = f2i6 + fi18;
- f3o10 = fnms( FFT_15PONIT_WNK5, f3o9, fi6 );
- f3o13 = fi10 - fi11;
- f3o14 = fi28 - fi29;
- f3o11 = fnms( FFT_15PONIT_WNK3, f3o14, FFT_15PONIT_WNK2 * f3o13 );
- f3o12 = fmac( FFT_15PONIT_WNK2, f3o14, FFT_15PONIT_WNK3 * f3o13 );
- zIm[in2] = fi6 + f3o9;
- f3o15 = f3o8 + f3o10;
- zIm[in26] = f3o15 - f3o12;
- zIm[in17] = f3o12 + f3o15;
- f4o1 = f3o10 - f3o8;
- zIm[in8] = f3o11 + f4o1;
- zIm[in32] = f4o1 - f3o11;
-
- f4o2 = FFT_15PONIT_WNK1 * ( f2i9 - fi21 );
- f4o3 = f2i9 + fi21;
- f4o4 = fnms( FFT_15PONIT_WNK5, f4o3, fi5 );
- f4o7 = f2i10 - f2i11;
- f4o8 = fi22 - fi23;
- f4o5 = fmac( FFT_15PONIT_WNK2, f4o7, FFT_15PONIT_WNK3 * f4o8 );
- f4o6 = fnms( FFT_15PONIT_WNK3, f4o7, FFT_15PONIT_WNK2 * f4o8 );
- zIm[in1] = fi5 + f4o3;
- f4o9 = f4o4 - f4o2;
- f4o10 = f4o2 + f4o4;
-
- zIm[in10] = f4o6 + f4o9;
- zIm[in34] = f4o9 - f4o6;
- zIm[in25] = f4o10 - f4o5;
- zIm[in16] = f4o5 + f4o10;
-
- f4o11 = FFT_15PONIT_WNK1 * ( f2i12 - fi24 );
- f4o12 = f2i12 + fi24;
- f4o13 = fnms( FFT_15PONIT_WNK5, f4o12, fi4 );
- f4o16 = f2i7 - f2i8;
- f4o17 = fi19 - fi20;
- f4o14 = fmac( FFT_15PONIT_WNK2, f4o16, FFT_15PONIT_WNK3 * f4o17 );
- f4o15 = fnms( FFT_15PONIT_WNK3, f4o16, FFT_15PONIT_WNK2 * f4o17 );
- zRe[in1] = fi4 + f4o12;
- f4o18 = f4o13 - f4o11;
- f4o19 = f4o11 + f4o13;
-
- zRe[in10] = f4o18 - f4o15;
- zRe[in34] = f4o18 + f4o15;
- zRe[in16] = f4o19 - f4o14;
- zRe[in25] = f4o19 + f4o14;
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * fft15_shift8()
- * 15-point FFT with 8-point circular shift
- *-----------------------------------------------------------------*/
-
-static void fft15_shift8(
- int16_t n1, /* i : length of data */
- float *zRe, /* i/o: real part of input and output data */
- float *zIm, /* i/o: imaginary part of input and output data */
- const int16_t *Idx /* i : pointer of the address table */
-)
-{
- int16_t in0, in8, in16, in24, in32, in1, in9, in17, in25, in33, in2, in10, in18, in26, in34;
- float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8, fi9, fi10, fi11, fi12, fi13, fi14, fi15;
- float fi16, fi17, fi18, fi19, fi20, fi21, fi22, fi23, fi24, fi25, fi26, fi27, fi28, fi29, fi30;
- float f2i1, f2i2, f2i3, f2i4, f2i5, f2i6, f2i7, f2i8, f2i9, f2i10, f2i11, f2i12;
- float f2i13, f2i14, f2i15, f3i1, f3i2, f3i3, f3i4, f3i5, f3i6, f3i7, f3i8, f3i9;
- float f3i10, f3i11, f3i12, f3i13, f3i14, f3i15, f4i1, f4i2, f4i3, f4i4, f4i5, f4i6, f4i7, f4i8, f4i9;
- float f4i10, f4i11, f4i12, f4i13, f4i14, f4i15, fo1, fo2, fo3, fo4, fo5, fo6;
- float fo7, fo8, fo9, fo10, fo11, fo12, fo13, fo14, fo15, f2o1, f2o2, f2o3, f2o4;
- float f2o5, f2o6, f2o7, f2o8, f2o9, f2o10, f2o11, f2o12, f2o13, f2o14, f2o15;
- float f3o1, f3o2, f3o3, f3o4, f3o5, f3o6, f3o7, f3o8, f3o9, f3o10, f3o11, f3o12;
- float f3o13, f3o14, f3o15, f4o1, f4o2, f4o3, f4o4, f4o5, f4o6, f4o7, f4o8, f4o9;
- float f4o10, f4o11, f4o12, f4o13, f4o14, f4o15, f5o1, f5o2, f5o3, f5o4, f5o5, f5o6, f5o7;
- float f5o8, f5o9, f5o10, f5o11, f5o12, f5o13, f5o14, f5o15, f5o16, f5o17, f5o18, f5o19, f5o21, f5o22;
-
- in0 = Idx[0];
- in8 = Idx[n1];
- in16 = Idx[n1 * 2];
- in24 = Idx[n1 * 3];
- in32 = Idx[n1 * 4];
- in1 = Idx[n1 * 5];
- in9 = Idx[n1 * 6];
- in17 = Idx[n1 * 7];
- in25 = Idx[n1 * 8];
- in33 = Idx[n1 * 9];
- in2 = Idx[n1 * 10];
- in10 = Idx[n1 * 11];
- in18 = Idx[n1 * 12];
- in26 = Idx[n1 * 13];
- in34 = Idx[n1 * 14];
-
- f2i13 = zRe[in0];
- f2i14 = zIm[in0];
- f3i6 = zRe[in1];
- f3i7 = zRe[in2];
- f3i8 = zIm[in1];
- f3i9 = zIm[in2];
-
- f2i15 = f3i6 + f3i7;
- f3i1 = FFT_15PONIT_WNK4 * ( f3i7 - f3i6 );
- f3i2 = FFT_15PONIT_WNK4 * ( f3i8 - f3i9 );
- f3i3 = f3i8 + f3i9;
-
- fi1 = f2i13 + f2i15;
- fi2 = f2i14 + f3i3;
- f3i4 = fnms( 0.5f, f2i15, f2i13 );
- fi3 = f3i4 - f3i2;
- fi4 = f3i4 + f3i2;
- f3i5 = fnms( 0.5f, f3i3, f2i14 );
- fi5 = f3i1 + f3i5;
- fi6 = f3i5 - f3i1;
-
- f3i10 = zRe[in9];
- f4i11 = zRe[in10];
- f4i12 = zRe[in8];
- f3i14 = zIm[in9];
- f4i13 = zIm[in10];
- f4i14 = zIm[in8];
- f4i3 = zRe[in33];
- f4i15 = zRe[in34];
- fo1 = zRe[in32];
- f4i7 = zIm[in33];
- fo2 = zIm[in34];
- fo3 = zIm[in32];
-
-
- f3i11 = f4i11 + f4i12;
- f3i12 = fnms( 0.5f, f3i11, f3i10 );
- f3i13 = FFT_15PONIT_WNK4 * ( f4i12 - f4i11 );
- f3i15 = f4i13 + f4i14;
- f4i1 = FFT_15PONIT_WNK4 * ( f4i13 - f4i14 );
- f4i2 = fnms( 0.5f, f3i15, f3i14 );
- f4i4 = f4i15 + fo1;
- f4i5 = fnms( 0.5f, f4i4, f4i3 );
- f4i6 = FFT_15PONIT_WNK4 * ( fo1 - f4i15 );
- f4i8 = fo2 + fo3;
- f4i9 = FFT_15PONIT_WNK4 * ( fo2 - fo3 );
- f4i10 = fnms( 0.5f, f4i8, f4i7 );
-
- fi7 = f3i10 + f3i11;
- fi8 = f4i3 + f4i4;
- fi9 = fi7 + fi8;
- fi10 = f3i12 - f4i1;
- fi11 = f4i5 - f4i9;
- fi12 = fi10 + fi11;
- fi13 = f3i14 + f3i15;
- fi14 = f4i7 + f4i8;
- fi15 = fi13 + fi14;
- fi16 = f4i2 - f3i13;
- fi17 = f4i10 - f4i6;
- fi18 = fi16 + fi17;
- fi19 = f3i13 + f4i2;
- fi20 = f4i6 + f4i10;
- fi21 = fi19 + fi20;
- fi22 = f3i12 + f4i1;
- fi23 = f4i5 + f4i9;
- fi24 = fi22 + fi23;
-
- fo4 = zRe[in24];
- f2o5 = zRe[in25];
- f2o6 = zRe[in26];
- fo8 = zIm[in24];
- f2o7 = zIm[in25];
- f2o8 = zIm[in26];
- fo12 = zRe[in18];
- f2o9 = zRe[in16];
- f2o10 = zRe[in17];
- f2o1 = zIm[in18];
- f2o11 = zIm[in16];
- f2o12 = zIm[in17];
-
-
- fo5 = f2o5 + f2o6;
- fo6 = fnms( 0.5f, fo5, fo4 );
- fo7 = FFT_15PONIT_WNK4 * ( f2o6 - f2o5 );
- fo9 = f2o7 + f2o8;
- fo10 = FFT_15PONIT_WNK4 * ( f2o7 - f2o8 );
- fo11 = fnms( 0.5f, fo9, fo8 );
- fo13 = f2o9 + f2o10;
- fo14 = fnms( 0.5f, fo13, fo12 );
- fo15 = FFT_15PONIT_WNK4 * ( f2o10 - f2o9 );
- f2o2 = f2o11 + f2o12;
- f2o3 = FFT_15PONIT_WNK4 * ( f2o11 - f2o12 );
- f2o4 = fnms( 0.5f, f2o2, f2o1 );
-
- fi25 = fo4 + fo5;
- fi26 = fo12 + fo13;
- fi27 = fi25 + fi26;
- fi28 = fo6 - fo10;
- fi29 = fo14 - f2o3;
- fi30 = fi28 + fi29;
- f2i1 = fo8 + fo9;
- f2i2 = f2o1 + f2o2;
- f2i3 = f2i1 + f2i2;
- f2i4 = fo11 - fo7;
- f2i5 = f2o4 - fo15;
- f2i6 = f2i4 + f2i5;
- f2i7 = fo7 + fo11;
- f2i8 = fo15 + f2o4;
- f2i9 = f2i7 + f2i8;
- f2i10 = fo6 + fo10;
- f2i11 = fo14 + f2o3;
- f2i12 = f2i10 + f2i11;
-
- f2o13 = FFT_15PONIT_WNK1 * ( fi27 - fi9 );
- f2o14 = fi27 + fi9;
- f2o15 = fnms( FFT_15PONIT_WNK5, f2o14, fi1 );
- f3o3 = fi13 - fi14;
- f3o4 = f2i1 - f2i2;
- f3o1 = fnms( FFT_15PONIT_WNK3, f3o4, FFT_15PONIT_WNK2 * f3o3 );
- f3o2 = fmac( FFT_15PONIT_WNK2, f3o4, FFT_15PONIT_WNK3 * f3o3 );
- zRe[in0] = fi1 + f2o14;
- f3o5 = f2o13 + f2o15;
- zRe[in24] = f3o5 - f3o2;
- zRe[in18] = f3o5 + f3o2;
- f3o6 = f2o15 - f2o13;
- zRe[in33] = f3o6 - f3o1;
- zRe[in9] = f3o6 + f3o1;
-
- f3o7 = FFT_15PONIT_WNK1 * ( f2i3 - fi15 );
- f3o8 = f2i3 + fi15;
- f3o9 = fnms( FFT_15PONIT_WNK5, f3o8, fi2 );
- f3o12 = fi7 - fi8;
- f3o13 = fi25 - fi26;
- f3o10 = fnms( FFT_15PONIT_WNK3, f3o13, FFT_15PONIT_WNK2 * f3o12 );
- f3o11 = fmac( FFT_15PONIT_WNK2, f3o13, FFT_15PONIT_WNK3 * f3o12 );
- zIm[in0] = fi2 + f3o8;
- f3o14 = f3o7 + f3o9;
- zIm[in18] = f3o14 - f3o11;
- zIm[in24] = f3o11 + f3o14;
- f3o15 = f3o9 - f3o7;
- zIm[in9] = f3o15 - f3o10;
- zIm[in33] = f3o10 + f3o15;
-
- f4o1 = FFT_15PONIT_WNK1 * ( fi30 - fi12 );
- f4o2 = fi30 + fi12;
- f4o3 = fnms( FFT_15PONIT_WNK5, f4o2, fi3 );
- f4o6 = fi16 - fi17;
- f4o7 = f2i4 - f2i5;
- f4o4 = fnms( FFT_15PONIT_WNK3, f4o7, FFT_15PONIT_WNK2 * f4o6 );
- f4o5 = fmac( FFT_15PONIT_WNK2, f4o7, FFT_15PONIT_WNK3 * f4o6 );
- zRe[in2] = fi3 + f4o2;
- f4o8 = f4o1 + f4o3;
- zRe[in26] = f4o8 - f4o5;
- zRe[in17] = f4o8 + f4o5;
- f4o9 = f4o3 - f4o1;
- zRe[in32] = f4o9 - f4o4;
- zRe[in8] = f4o9 + f4o4;
-
- f4o10 = FFT_15PONIT_WNK1 * ( f2i6 - fi18 );
- f4o11 = f2i6 + fi18;
- f4o12 = fnms( FFT_15PONIT_WNK5, f4o11, fi6 );
- f4o15 = fi10 - fi11;
- f5o1 = fi28 - fi29;
- f4o13 = fnms( FFT_15PONIT_WNK3, f5o1, FFT_15PONIT_WNK2 * f4o15 );
- f4o14 = fmac( FFT_15PONIT_WNK2, f5o1, FFT_15PONIT_WNK3 * f4o15 );
- zIm[in2] = fi6 + f4o11;
- f5o2 = f4o10 + f4o12;
- zIm[in17] = f5o2 - f4o14;
- zIm[in26] = f4o14 + f5o2;
- f5o3 = f4o12 - f4o10;
- zIm[in32] = f4o13 + f5o3;
- zIm[in8] = f5o3 - f4o13;
-
- f5o4 = FFT_15PONIT_WNK1 * ( f2i9 - fi21 );
- f5o5 = f2i9 + fi21;
- f5o6 = fnms( FFT_15PONIT_WNK5, f5o5, fi5 );
- f5o9 = f2i10 - f2i11;
- f5o10 = fi22 - fi23;
- f5o7 = fmac( FFT_15PONIT_WNK2, f5o9, FFT_15PONIT_WNK3 * f5o10 );
- f5o8 = fnms( FFT_15PONIT_WNK3, f5o9, FFT_15PONIT_WNK2 * f5o10 );
- zIm[in1] = fi5 + f5o5;
- f5o11 = f5o6 - f5o4;
- f5o12 = f5o4 + f5o6;
- zIm[in34] = f5o8 + f5o11;
- zIm[in10] = f5o11 - f5o8;
-
- zIm[in16] = f5o12 - f5o7;
- zIm[in25] = f5o7 + f5o12;
-
- f5o13 = FFT_15PONIT_WNK1 * ( f2i12 - fi24 );
- f5o14 = f2i12 + fi24;
- f5o15 = fnms( FFT_15PONIT_WNK5, f5o14, fi4 );
- f5o18 = f2i7 - f2i8;
- f5o19 = fi19 - fi20;
- f5o16 = fmac( FFT_15PONIT_WNK2, f5o18, FFT_15PONIT_WNK3 * f5o19 );
- f5o17 = fnms( FFT_15PONIT_WNK3, f5o18, FFT_15PONIT_WNK2 * f5o19 );
- zRe[in1] = fi4 + f5o14;
- f5o21 = f5o15 - f5o13;
- f5o22 = f5o13 + f5o15;
-
- zRe[in34] = f5o21 - f5o17;
- zRe[in10] = f5o21 + f5o17;
- zRe[in25] = f5o22 - f5o16;
- zRe[in16] = f5o22 + f5o16;
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * fft5_shift1()
- * 5-point FFT with 1-point circular shift
- *-----------------------------------------------------------------*/
-
-static void fft5_shift1(
- int16_t n1, /* i : length of data */
- float *zRe, /* i/o: real part of input and output data */
- float *zIm, /* i/o: imaginary part of input and output data */
- const int16_t *Idx /* i : pointer of the address table */
-)
-{
- float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
- float fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
- int16_t in1, in2, in3, in4, in5;
-
- in1 = Idx[0];
- in2 = Idx[n1];
- in3 = Idx[n1 * 2];
- in4 = Idx[n1 * 3];
- in5 = Idx[n1 * 4];
-
- fi1 = zRe[in1];
- fi2 = zIm[in1];
- fo3 = zRe[in2];
- fo4 = zRe[in5];
- fo6 = zRe[in3];
- fo7 = zRe[in4];
-
- fo5 = fo3 + fo4;
- fo8 = fo6 + fo7;
- fi3 = fo5 + fo8;
- fi4 = fo6 - fo7;
- fi5 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
- fi6 = fo3 - fo4;
-
- fo3 = zIm[in2];
- fo4 = zIm[in5];
- fo6 = zIm[in3];
- fo7 = zIm[in4];
-
- fo5 = fo3 + fo4;
- fo8 = fo6 + fo7;
- fi7 = fo3 - fo4;
- fi8 = fo5 + fo8;
- fo1 = fo6 - fo7;
- fo2 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
-
- zRe[in1] = fi1 + fi3;
- zIm[in1] = fi2 + fi8;
-
- fo3 = FFT_15PONIT_WNK2 * fi7 + FFT_15PONIT_WNK3 * fo1;
- fo4 = FFT_15PONIT_WNK2 * fo1 - FFT_15PONIT_WNK3 * fi7;
- fo7 = fi1 - fi3 / 4;
- fo5 = fi5 + fo7;
- fo6 = fo7 - fi5;
-
- zRe[in2] = fo5 + fo3;
- zRe[in3] = fo6 - fo4;
- zRe[in4] = fo6 + fo4;
- zRe[in5] = fo5 - fo3;
-
- fo3 = FFT_15PONIT_WNK2 * fi6 + FFT_15PONIT_WNK3 * fi4;
- fo4 = FFT_15PONIT_WNK2 * fi4 - FFT_15PONIT_WNK3 * fi6;
- fo7 = fi2 - fi8 / 4;
- fo5 = fo2 + fo7;
- fo6 = fo7 - fo2;
-
- zIm[in2] = fo5 - fo3;
- zIm[in3] = fo4 + fo6;
- zIm[in4] = fo6 - fo4;
- zIm[in5] = fo3 + fo5;
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * fft5_shift4()
- * 5-point FFT with 4-point circular shift
- *-----------------------------------------------------------------*/
-
-static void fft5_shift4(
- int16_t n1, /* i : length of data */
- float *zRe, /* i/o: real part of input and output data */
- float *zIm, /* i/o: imaginary part of input and output data */
- const int16_t *Idx /* i : pointer of the address table */
-)
-{
- float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
- float fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
- int16_t in1, in2, in3, in4, in5;
-
- in1 = Idx[0];
- in2 = Idx[n1];
- in3 = Idx[n1 * 2];
- in4 = Idx[n1 * 3];
- in5 = Idx[n1 * 4];
-
- fi1 = zRe[in1];
- fi2 = zIm[in1];
- fo3 = zRe[in2];
- fo4 = zRe[in5];
- fo6 = zRe[in3];
- fo7 = zRe[in4];
-
- fo5 = fo3 + fo4;
- fo8 = fo6 + fo7;
- fi3 = fo5 + fo8;
- fi4 = fo6 - fo7;
- fi5 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
- fi6 = fo3 - fo4;
-
- fo3 = zIm[in2];
- fo4 = zIm[in5];
- fo6 = zIm[in3];
- fo7 = zIm[in4];
-
- fo5 = fo3 + fo4;
- fo8 = fo6 + fo7;
- fi7 = fo3 - fo4;
- fi8 = fo5 + fo8;
- fo1 = fo6 - fo7;
- fo2 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
-
- zRe[in1] = fi1 + fi3;
- zIm[in1] = fi2 + fi8;
-
- fo3 = FFT_15PONIT_WNK2 * fi7 + FFT_15PONIT_WNK3 * fo1;
- fo4 = FFT_15PONIT_WNK2 * fo1 - FFT_15PONIT_WNK3 * fi7;
- fo7 = fi1 - fi3 / 4;
- fo5 = fi5 + fo7;
- fo6 = fo7 - fi5;
- zRe[in2] = fo5 - fo3;
- zRe[in4] = fo6 - fo4;
- zRe[in3] = fo6 + fo4;
- zRe[in5] = fo5 + fo3;
-
- fo3 = FFT_15PONIT_WNK2 * fi6 + FFT_15PONIT_WNK3 * fi4;
- fo4 = FFT_15PONIT_WNK2 * fi4 - FFT_15PONIT_WNK3 * fi6;
- fo7 = fi2 - fi8 / 4;
- fo5 = fo2 + fo7;
- fo6 = fo7 - fo2;
-
- zIm[in3] = fo6 - fo4;
- zIm[in2] = fo3 + fo5;
- zIm[in4] = fo4 + fo6;
- zIm[in5] = fo5 - fo3;
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * fft5_32()
- * 5-point FFT called for 32 times
- *-----------------------------------------------------------------*/
-
-static void fft5_32(
- float *zRe, /* i/o: real part of input and output data */
- float *zIm, /* i/o: imaginary part of input and output data */
- const int16_t *Idx /* i : pointer of the address table */
-)
-{
- float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
- float fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
- int16_t in1, in2, in3, in4, in5;
-
- in1 = Idx[0];
- in2 = Idx[32];
- in3 = Idx[64];
- in4 = Idx[96];
- in5 = Idx[128];
-
- fi1 = zRe[in1];
- fi2 = zIm[in1];
- fo3 = zRe[in2];
- fo4 = zRe[in5];
- fo6 = zRe[in3];
- fo7 = zRe[in4];
-
- fo5 = fo3 + fo4;
- fo8 = fo6 + fo7;
- fi3 = fo5 + fo8;
- fi4 = fo6 - fo7;
- fi5 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
- fi6 = fo3 - fo4;
-
- fo3 = zIm[in2];
- fo4 = zIm[in5];
- fo6 = zIm[in3];
- fo7 = zIm[in4];
-
- fo5 = fo3 + fo4;
- fo8 = fo6 + fo7;
- fi7 = fo3 - fo4;
- fi8 = fo5 + fo8;
- fo1 = fo6 - fo7;
- fo2 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
-
- zRe[in1] = fi1 + fi3;
- zIm[in1] = fi2 + fi8;
-
- fo3 = FFT_15PONIT_WNK2 * fi7 + FFT_15PONIT_WNK3 * fo1;
- fo4 = FFT_15PONIT_WNK2 * fo1 - FFT_15PONIT_WNK3 * fi7;
- fo7 = fi1 - fi3 / 4;
- fo5 = fi5 + fo7;
- fo6 = fo7 - fi5;
-
- zRe[in2] = fo6 + fo4;
- zRe[in3] = fo5 + fo3;
- zRe[in4] = fo5 - fo3;
- zRe[in5] = fo6 - fo4;
-
- fo3 = FFT_15PONIT_WNK2 * fi6 + FFT_15PONIT_WNK3 * fi4;
- fo4 = FFT_15PONIT_WNK2 * fi4 - FFT_15PONIT_WNK3 * fi6;
- fo7 = fi2 - fi8 / 4;
- fo5 = fo2 + fo7;
- fo6 = fo7 - fo2;
-
- zIm[in2] = fo6 - fo4;
- zIm[in3] = fo5 - fo3;
- zIm[in4] = fo3 + fo5;
- zIm[in5] = fo4 + fo6;
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * fft64()
- * 64-point FFT
- *-----------------------------------------------------------------*/
-
-static void fft64(
- float *x, /* i/o: real part of input and output data */
- float *y, /* i/o: imaginary part of input and output data */
- const int16_t *Idx /* i : pointer of the address table */
-)
-{
- int16_t i, id, jd;
- float z[128];
- for ( i = 0; i < 64; i++ )
- {
- id = Idx[i];
- z[2 * i] = x[id];
- z[2 * i + 1] = y[id];
- }
-
- cdftForw( 128, z, Ip_fft64, w_fft64 );
-
- for ( i = 0; i < 64; i++ )
- {
- jd = Odx_fft64[i];
- id = Idx[jd];
- x[id] = z[2 * i];
- y[id] = z[2 * i + 1];
- }
-
- return;
-}
-
-
-/*-----------------------------------------------------------------*
- * fft32_15()
- * 32-point FFT called for 15 times
- *-----------------------------------------------------------------*/
-
-static void fft32_15(
- float *x, /* i/o: real part of input and output data */
- float *y, /* i/o: imaginary part of input and output data */
- const int16_t *Idx /* i : pointer of the address table */
-)
-{
- int16_t i, id, jd;
- float z[64];
-
- for ( i = 0; i < 32; i++ )
- {
- id = Idx[i];
- z[2 * i] = x[id];
- z[2 * i + 1] = y[id];
- }
-
- cdftForw( 64, z, Ip_fft32, w_fft32 );
-
- for ( i = 0; i < 32; i++ )
- {
- jd = Odx_fft32_15[i];
- id = Idx[jd];
- x[id] = z[2 * i];
- y[id] = z[2 * i + 1];
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * fft32_5()
- * 32-point FFT called for 5 times
- *-----------------------------------------------------------------*/
-
-static void fft32_5(
- float *x, /* i/o: real part of input and output data */
- float *y, /* i/o: imaginary part of input and output data */
- const int16_t *Idx /* i : pointer of the address table */
-)
-{
- int16_t i, id, jd;
- float z[64];
-
- for ( i = 0; i < 32; i++ )
- {
- id = Idx[i];
- z[2 * i] = x[id];
- z[2 * i + 1] = y[id];
- }
-
- cdftForw( 64, z, Ip_fft32, w_fft32 );
-
- for ( i = 0; i < 32; i++ )
- {
- jd = Odx_fft32_5[i];
- id = Idx[jd];
- x[id] = z[2 * i];
- y[id] = z[2 * i + 1];
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * fft16_ivas()
- * 16-point FFT
- *-----------------------------------------------------------------*/
-
-static void fft16_ivas(
- float *x, /* i/o: real part of input and output data */
- float *y, /* i/o: imaginary part of input and output data */
- const int16_t *Idx /* i : pointer of the address table */
-)
-{
- int16_t i, id, jd;
- float z[32];
-
- for ( i = 0; i < 16; i++ )
- {
- id = Idx[i];
- z[2 * i] = x[id];
- z[2 * i + 1] = y[id];
- }
-
- cdftForw( 32, z, Ip_fft16, w_fft16 );
-
- for ( i = 0; i < 16; i++ )
- {
- jd = Odx_fft16[i];
- id = Idx[jd];
- x[id] = z[2 * i];
- y[id] = z[2 * i + 1];
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * fft8()
- * 8-point FFT
- *-----------------------------------------------------------------*/
-
-static void fft8(
- float *x, /* i/o: real part of input and output data */
- float *y, /* i/o: imaginary part of input and output data */
- const int16_t *Idx /* i : pointer of the address table */
-)
-{
- int16_t i, id;
- float z[16];
-
- for ( i = 0; i < 8; i++ )
- {
- id = Idx[i];
- z[2 * i] = x[id];
- z[2 * i + 1] = y[id];
- }
-
- cdftForw( 16, z, Ip_fft8, w_fft8 );
-
- for ( i = 0; i < 8; i++ )
- {
- id = Idx[i];
- x[id] = z[2 * i];
- y[id] = z[2 * i + 1];
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * fft8_5()
- * 8-point FFT with shift 5
- *-----------------------------------------------------------------*/
-
-static void fft8_5(
- float *x, /* i/o: real part of input and output data */
- float *y, /* i/o: imaginary part of input and output data */
- const int16_t *Idx /* i : pointer of the address table */
-)
-{
- int16_t i, id, jd;
- float z[16];
-
- for ( i = 0; i < 8; i++ )
- {
- id = Idx[i];
- z[2 * i] = x[id];
- z[2 * i + 1] = y[id];
- }
-
- cdftForw( 16, z, Ip_fft8, w_fft8 );
-
- for ( i = 0; i < 8; i++ )
- {
- jd = Odx_fft8_5[i];
- id = Idx[jd];
- x[id] = z[2 * i];
- y[id] = z[2 * i + 1];
- }
- return;
-}
-
-/*-----------------------------------------------------------------*
- * fft5_8()
- * 5-point FFT with shift 2
- *-----------------------------------------------------------------*/
-
-static void fft5_8(
- int16_t n1, /* i : length of data */
- float *zRe, /* i/o: real part of input and output data */
- float *zIm, /* i/o: imaginary part of input and output data */
- const int16_t *Idx /* i : pointer of the address table */
-)
-{
- float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
- float fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
- int16_t in1, in2, in3, in4, in5;
-
- in1 = Idx[0];
- in2 = Idx[n1];
- in3 = Idx[n1 * 2];
- in4 = Idx[n1 * 3];
- in5 = Idx[n1 * 4];
-
- fi1 = zRe[in1];
- fi2 = zIm[in1];
- fo3 = zRe[in2];
- fo4 = zRe[in5];
- fo6 = zRe[in3];
- fo7 = zRe[in4];
-
- fo5 = fo3 + fo4;
- fo8 = fo6 + fo7;
- fi3 = fo5 + fo8;
- fi4 = fo6 - fo7;
- fi5 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
- fi6 = fo3 - fo4;
-
- fo3 = zIm[in2];
- fo4 = zIm[in5];
- fo6 = zIm[in3];
- fo7 = zIm[in4];
-
- fo5 = fo3 + fo4;
- fo8 = fo6 + fo7;
- fi7 = fo3 - fo4;
- fi8 = fo5 + fo8;
- fo1 = fo6 - fo7;
- fo2 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
-
- zRe[in1] = fi1 + fi3;
- zIm[in1] = fi2 + fi8;
-
- fo3 = FFT_15PONIT_WNK2 * fi7 + FFT_15PONIT_WNK3 * fo1;
- fo4 = FFT_15PONIT_WNK2 * fo1 - FFT_15PONIT_WNK3 * fi7;
- fo7 = fi1 - fi3 / 4;
- fo5 = fi5 + fo7;
- fo6 = fo7 - fi5;
-
- zRe[in2] = fo6 - fo4;
- zRe[in3] = fo5 - fo3;
- zRe[in5] = fo6 + fo4;
- zRe[in4] = fo5 + fo3;
-
- fo3 = FFT_15PONIT_WNK2 * fi6 + FFT_15PONIT_WNK3 * fi4;
- fo4 = FFT_15PONIT_WNK2 * fi4 - FFT_15PONIT_WNK3 * fi6;
- fo7 = fi2 - fi8 / 4;
- fo5 = fo2 + fo7;
- fo6 = fo7 - fo2;
-
- zIm[in2] = fo4 + fo6;
- zIm[in3] = fo3 + fo5;
- zIm[in4] = fo5 - fo3;
- zIm[in5] = fo6 - fo4;
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * fft4_5()
- * 8-point FFT with shift 1
- *-----------------------------------------------------------------*/
-
-static void fft4_5(
- float *x, /* i/o: real part of input and output data */
- float *y, /* i/o: imaginary part of input and output data */
- const int16_t *Idx /* i : pointer of the address table */
-)
-{
- int16_t i, id, jd;
- float z[8];
-
- for ( i = 0; i < 4; i++ )
- {
- id = Idx[i];
- z[2 * i] = x[id];
- z[2 * i + 1] = y[id];
- }
-
- cdftForw( 8, z, Ip_fft4, w_fft4 );
-
- for ( i = 0; i < 4; i++ )
- {
- jd = Odx_fft4_5[i];
- id = Idx[jd];
- x[id] = z[2 * i];
- y[id] = z[2 * i + 1];
- }
- return;
-}
-
-/*-----------------------------------------------------------------*
- * fft5_4()
- * 5-point FFT with shift 4
- *-----------------------------------------------------------------*/
-
-static void fft5_4(
- int16_t n1,
- float *zRe,
- float *zIm,
- const int16_t *Idx )
-{
- float fi1, fi2, fi3, fi4, fi5, fi6, fi7, fi8;
- float fo1, fo2, fo3, fo4, fo5, fo6, fo7, fo8;
- int16_t in1, in2, in3, in4, in5;
-
- in1 = Idx[0];
- in2 = Idx[n1];
- in3 = Idx[n1 * 2];
- in4 = Idx[n1 * 3];
- in5 = Idx[n1 * 4];
-
- fi1 = zRe[in1];
- fi2 = zIm[in1];
- fo3 = zRe[in2];
- fo4 = zRe[in5];
- fo6 = zRe[in3];
- fo7 = zRe[in4];
-
- fo5 = fo3 + fo4;
- fo8 = fo6 + fo7;
- fi3 = fo5 + fo8;
- fi4 = fo6 - fo7;
- fi5 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
- fi6 = fo3 - fo4;
-
- fo3 = zIm[in2];
- fo4 = zIm[in5];
- fo6 = zIm[in3];
- fo7 = zIm[in4];
-
- fo5 = fo3 + fo4;
- fo8 = fo6 + fo7;
- fi7 = fo3 - fo4;
- fi8 = fo5 + fo8;
- fo1 = fo6 - fo7;
- fo2 = FFT_15PONIT_WNK1 * ( fo5 - fo8 );
-
- zRe[in1] = fi1 + fi3;
- zIm[in1] = fi2 + fi8;
-
- fo3 = FFT_15PONIT_WNK2 * fi7 + FFT_15PONIT_WNK3 * fo1;
- fo4 = FFT_15PONIT_WNK2 * fo1 - FFT_15PONIT_WNK3 * fi7;
- fo7 = fi1 - fi3 / 4;
- fo5 = fi5 + fo7;
- fo6 = fo7 - fi5;
-
- zRe[in2] = fo5 - fo3;
- zRe[in4] = fo6 - fo4;
- zRe[in3] = fo6 + fo4;
- zRe[in5] = fo5 + fo3;
-
- fo3 = FFT_15PONIT_WNK2 * fi6 + FFT_15PONIT_WNK3 * fi4;
- fo4 = FFT_15PONIT_WNK2 * fi4 - FFT_15PONIT_WNK3 * fi6;
- fo7 = fi2 - fi8 / 4;
- fo5 = fo2 + fo7;
- fo6 = fo7 - fo2;
-
- zIm[in2] = fo3 + fo5;
- zIm[in3] = fo6 - fo4;
- zIm[in4] = fo4 + fo6;
- zIm[in5] = fo5 - fo3;
-
- return;
-}
-
-
-/*-----------------------------------------------------------------*
- * DoRTFT80()
- * a low complexity 2-dimensional DFT of 80 points
- *-----------------------------------------------------------------*/
-
-void DoRTFT80(
- float *x, /* i/o: real part of input and output data */
- float *y /* i/o: imaginary part of input and output data */
-)
-{
- int16_t j;
-
- /* Applying 16-point FFT for 5 times based on the address table Idx_dortft80 */
- for ( j = 0; j < 5; j++ )
- {
- fft16_ivas( x, y, Idx_dortft80 + 16 * j );
- }
-
- /* Applying 5-point FFT for 16 times based on the address table Idx_dortft80 */
- for ( j = 0; j < 16; j++ )
- {
- fft5_shift1( 16, x, y, Idx_dortft80 + j );
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * DoRTFT120()
- * a low complexity 2-dimensional DFT of 120 points
- *-----------------------------------------------------------------*/
-
-void DoRTFT120(
- float *x, /* i/o: real part of input and output data */
- float *y /* i/o: imaginary part of input and output data */
-)
-{
- int16_t j;
-
- /* Applying 8-point FFT for 15 times based on the address table Idx_dortft120 */
- for ( j = 0; j < 15; j++ )
- {
- fft8( x, y, Idx_dortft120 + 8 * j );
- }
-
- /* Applying 15-point FFT for 8 times based on the address table Idx_dortft120 */
- for ( j = 0; j < 8; j++ )
- {
- fft15_shift2( 8, x, y, Idx_dortft120 + j );
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * DoRTFT160()
- * a low complexity 2-dimensional DFT of 160 points
- *-----------------------------------------------------------------*/
-
-void DoRTFT160(
- float x[], /* i/o: real part of input and output data */
- float y[] /* i/o: imaginary part of input and output data */
-)
-{
- int16_t j;
-
- /* Applying 32-point FFT for 5 times based on the address table Idx_dortft160 */
- for ( j = 0; j < 5; j++ )
- {
- fft32_5( x, y, Idx_dortft160 + 32 * j );
- }
-
- /* Applying 5-point FFT for 32 times based on the address table Idx_dortft160 */
- for ( j = 0; j < 32; j++ )
- {
- fft5_32( x, y, Idx_dortft160 + j );
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * DoRTFT320()
- * a low complexity 2-dimensional DFT of 320 points
- *-----------------------------------------------------------------*/
-
-void DoRTFT320(
- float *x, /* i/o: real part of input and output data */
- float *y /* i/o: imaginary part of input and output data */
-)
-{
- int16_t j;
-
- /* Applying 64-point FFT for 5 times based on the address table Idx_dortft160 */
- for ( j = 0; j < 5; j++ )
- {
- fft64( x, y, Idx_dortft320 + 64 * j );
- }
-
- /* Applying 5-point FFT for 64 times based on the address table Idx_dortft160 */
- for ( j = 0; j < 64; j++ )
- {
- fft5_shift4( 64, x, y, Idx_dortft320 + j );
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * DoRTFT480()
- * a low complexity 2-dimensional DFT of 480 points
- *-----------------------------------------------------------------*/
-
-void DoRTFT480(
- float *x, /* i/o: real part of input and output data */
- float *y /* i/o: imaginary part of input and output data */
-)
-{
- int16_t j;
-
- /* Applying 32-point FFT for 15 times based on the address table Idx_dortft160 */
- for ( j = 0; j < 15; j++ )
- {
- fft32_15( x, y, Idx_dortft480 + 32 * j );
- }
-
- /* Applying 5-point FFT for 32 times based on the address table Idx_dortft160 */
- for ( j = 0; j < 32; j++ )
- {
- fft15_shift8( 32, x, y, Idx_dortft480 + j );
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * DoRTFT40()
- * a low complexity 2-dimensional DFT of 40 points
- *-----------------------------------------------------------------*/
-
-void DoRTFT40(
- float *x, /* i/o: real part of input and output data */
- float *y /* i/o: imaginary part of input and output data */
-)
-{
- int16_t j;
- /* Applying 8-point FFT for 5 times based on the address table Idx_dortft40 */
- for ( j = 0; j < 5; j++ )
- {
- fft8_5( x, y, Idx_dortft40 + 8 * j );
- }
-
- /* Applying 5-point FFT for 8 times based on the address table Idx_dortft40 */
- for ( j = 0; j < 8; j++ )
- {
- fft5_8( 8, x, y, Idx_dortft40 + j );
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * DoRTFT20()
- * a low complexity 2-dimensional DFT of 20 points
- *-----------------------------------------------------------------*/
-
-void DoRTFT20(
- float *x, /* i/o: real part of input and output data */
- float *y /* i/o: imaginary part of input and output data */
-)
-{
- int16_t j;
-
- /* Applying 4-point FFT for 5 times based on the address table Idx_dortft20 */
- for ( j = 0; j < 5; j++ )
- {
- fft4_5( x, y, Idx_dortft20 + 4 * j );
- }
-
- /* Applying 5-point FFT for 4 times based on the address table Idx_dortft20 */
- for ( j = 0; j < 4; j++ )
- {
- fft5_4( 4, x, y, Idx_dortft20 + j );
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * DoRTFT128()
- * FFT with 128 points
- *-----------------------------------------------------------------*/
-
-void DoRTFT128(
- float *x, /* i/o: real part of input and output data */
- float *y /* i/o: imaginary part of input and output data */
-)
-{
-
- int16_t i;
- float z[256];
-
- for ( i = 0; i < 128; i++ )
- {
- z[2 * i] = x[i];
- z[2 * i + 1] = y[i];
- }
-
- cdftForw( 256, z, Ip_fft128, w_fft128 );
-
- x[0] = z[0];
- y[0] = z[1];
- for ( i = 1; i < 128; i++ )
- {
- x[128 - i] = z[2 * i];
- y[128 - i] = z[2 * i + 1];
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * cdftForw()
- * Main fuction of Complex Discrete Fourier Transform
- *-----------------------------------------------------------------*/
-
-static void cdftForw(
- int16_t n, /* i : data length of real and imag */
- float *a, /* i/o: input/output data */
- const int16_t *ip, /* i : work area for bit reversal */
- const float *w /* i : cos/sin table */
-)
-{
- /* bit reversal */
- bitrv2_SR( n, ip + 2, a );
-
- /* Do FFT */
- cftfsub( n, a, w );
-}
-
-/*-----------------------------------------------------------------*
- * bitrv2_SR()
- * Bit reversal
- *-----------------------------------------------------------------*/
-
-static void bitrv2_SR(
- int16_t n, /* i : data length of real and imag */
- const int16_t *ip, /* i/o: work area for bit reversal */
- float *a /* i/o: input/output data */
-)
-{
- int16_t j, j1, k, k1, m, m2;
- int16_t l;
- float xr, xi, yr, yi;
-
- if ( n == 64 )
- {
- m = 4;
- l = -1;
- }
- else if ( n == 256 )
- {
- m = 8;
- l = -1;
- }
- else if ( n == 16 )
- {
- m = 2;
- l = -1;
- }
- else
- {
- l = n;
- m = 1;
-
- while ( ( m << 3 ) < l )
- {
- l >>= 1;
- m <<= 1;
- }
- l -= m * 8;
- }
-
- m2 = 2 * m;
-
- if ( l == 0 )
- {
- for ( k = 0; k < m; k++ )
- {
- for ( j = 0; j < k; j++ )
- {
- j1 = 2 * j + ip[k];
- k1 = 2 * k + ip[j];
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- j1 += m2;
- k1 += 2 * m2;
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- j1 += m2;
- k1 -= m2;
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- j1 += m2;
- k1 += 2 * m2;
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- }
-
- j1 = 2 * k + m2 + ip[k];
- k1 = j1 + m2;
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- }
- }
- else
- {
- for ( k = 1; k < m; k++ )
- {
- for ( j = 0; j < k; j++ )
- {
- j1 = 2 * j + ip[k];
- k1 = 2 * k + ip[j];
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- j1 += m2;
- k1 += m2;
- xr = a[j1];
- xi = a[j1 + 1];
- yr = a[k1];
- yi = a[k1 + 1];
- a[j1] = yr;
- a[j1 + 1] = yi;
- a[k1] = xr;
- a[k1 + 1] = xi;
- }
- }
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * cftfsub()
- * Complex Discrete Fourier Transform
- *-----------------------------------------------------------------*/
-
-static void cftfsub(
- int16_t n, /* i : data length of real and imag */
- float *a, /* i/o: input/output data */
- const float *w /* i : cos/sin table */
-)
-{
- int16_t j, j1, j2, j3, l;
- float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
- l = 2;
- if ( n > 8 )
- {
- cft1st( n, a, w );
-
- l = 8;
- while ( ( l << 2 ) < n )
- {
- cftmdl( n, l, a, w );
- l <<= 2;
- }
- }
-
- if ( ( l << 2 ) == n )
- {
- for ( j = 0; j < l; j += 2 )
- {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = a[j + 1] + a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = a[j + 1] - a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- a[j2] = x0r - x2r;
- a[j2 + 1] = x0i - x2i;
- a[j1] = x1r - x3i;
- a[j1 + 1] = x1i + x3r;
- a[j3] = x1r + x3i;
- a[j3 + 1] = x1i - x3r;
- }
- }
- else
- {
- for ( j = 0; j < l; j += 2 )
- {
- j1 = j + l;
- x0r = a[j] - a[j1];
- x0i = a[j + 1] - a[j1 + 1];
- a[j] += a[j1];
- a[j + 1] += a[j1 + 1];
- a[j1] = x0r;
- a[j1 + 1] = x0i;
- }
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * cft1st()
- * Subfunction of Complex Discrete Fourier Transform
- *-----------------------------------------------------------------*/
-
-static void cft1st(
- int16_t n, /* i : data length of real and imag */
- float *a, /* i/o: input/output data */
- const float *w /* i : cos/sin table */
-)
-{
- int16_t j, k1, k2;
- float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
- float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
- x0r = a[0] + a[2];
- x0i = a[1] + a[3];
- x1r = a[0] - a[2];
- x1i = a[1] - a[3];
- x2r = a[4] + a[6];
- x2i = a[5] + a[7];
- x3r = a[4] - a[6];
- x3i = a[5] - a[7];
- a[0] = x0r + x2r;
- a[1] = x0i + x2i;
- a[4] = x0r - x2r;
- a[5] = x0i - x2i;
- a[2] = x1r - x3i;
- a[3] = x1i + x3r;
- a[6] = x1r + x3i;
- a[7] = x1i - x3r;
- wk1r = w[2];
- x0r = a[8] + a[10];
- x0i = a[9] + a[11];
- x1r = a[8] - a[10];
- x1i = a[9] - a[11];
- x2r = a[12] + a[14];
- x2i = a[13] + a[15];
- x3r = a[12] - a[14];
- x3i = a[13] - a[15];
- a[8] = x0r + x2r;
- a[9] = x0i + x2i;
- a[12] = x2i - x0i;
- a[13] = x0r - x2r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[10] = wk1r * ( x0r - x0i );
- a[11] = wk1r * ( x0r + x0i );
- x0r = x3i + x1r;
- x0i = x3r - x1i;
- a[14] = wk1r * ( x0i - x0r );
- a[15] = wk1r * ( x0i + x0r );
- k1 = 0;
-
- for ( j = 16; j < n; j += 16 )
- {
- k1 += 2;
- k2 = 2 * k1;
- wk2r = w[k1];
- wk2i = w[k1 + 1];
- wk1r = w[k2];
- wk1i = w[k2 + 1];
- wk3r = wk1r - 2 * wk2i * wk1i;
- wk3i = 2 * wk2i * wk1r - wk1i;
- x0r = a[j] + a[j + 2];
- x0i = a[j + 1] + a[j + 3];
- x1r = a[j] - a[j + 2];
- x1i = a[j + 1] - a[j + 3];
- x2r = a[j + 4] + a[j + 6];
- x2i = a[j + 5] + a[j + 7];
- x3r = a[j + 4] - a[j + 6];
- x3i = a[j + 5] - a[j + 7];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- x0r -= x2r;
- x0i -= x2i;
- a[j + 4] = wk2r * x0r - wk2i * x0i;
- a[j + 5] = wk2r * x0i + wk2i * x0r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[j + 2] = wk1r * x0r - wk1i * x0i;
- a[j + 3] = wk1r * x0i + wk1i * x0r;
- x0r = x1r + x3i;
- x0i = x1i - x3r;
- a[j + 6] = wk3r * x0r - wk3i * x0i;
- a[j + 7] = wk3r * x0i + wk3i * x0r;
- wk1r = w[k2 + 2];
- wk1i = w[k2 + 3];
- wk3r = wk1r - 2 * wk2r * wk1i;
- wk3i = 2 * wk2r * wk1r - wk1i;
- x0r = a[j + 8] + a[j + 10];
- x0i = a[j + 9] + a[j + 11];
- x1r = a[j + 8] - a[j + 10];
- x1i = a[j + 9] - a[j + 11];
- x2r = a[j + 12] + a[j + 14];
- x2i = a[j + 13] + a[j + 15];
- x3r = a[j + 12] - a[j + 14];
- x3i = a[j + 13] - a[j + 15];
- a[j + 8] = x0r + x2r;
- a[j + 9] = x0i + x2i;
- x0r -= x2r;
- x0i -= x2i;
- a[j + 12] = -wk2i * x0r - wk2r * x0i;
- a[j + 13] = -wk2i * x0i + wk2r * x0r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[j + 10] = wk1r * x0r - wk1i * x0i;
- a[j + 11] = wk1r * x0i + wk1i * x0r;
- x0r = x1r + x3i;
- x0i = x1i - x3r;
- a[j + 14] = wk3r * x0r - wk3i * x0i;
- a[j + 15] = wk3r * x0i + wk3i * x0r;
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * cftmdl()
- * Subfunction of Complex Discrete Fourier Transform
- *-----------------------------------------------------------------*/
-
-static void cftmdl(
- int16_t n, /* i : data length of real and imag */
- int16_t l, /* i : initial shift for processing */
- float *a, /* i/o: input/output data */
- const float *w /* i : cos/sin table */
-)
-{
- int16_t j, j1, j2, j3, k, k1, k2, m, m2;
- float wk1r, wk1i, wk2r, wk2i, wk3r, wk3i;
- float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
- m = l << 2;
- for ( j = 0; j < l; j += 2 )
- {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = a[j + 1] + a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = a[j + 1] - a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- a[j2] = x0r - x2r;
- a[j2 + 1] = x0i - x2i;
- a[j1] = x1r - x3i;
- a[j1 + 1] = x1i + x3r;
- a[j3] = x1r + x3i;
- a[j3 + 1] = x1i - x3r;
- }
-
- wk1r = w[2];
- for ( j = m; j < l + m; j += 2 )
- {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = a[j + 1] + a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = a[j + 1] - a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- a[j2] = x2i - x0i;
- a[j2 + 1] = x0r - x2r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[j1] = wk1r * ( x0r - x0i );
- a[j1 + 1] = wk1r * ( x0r + x0i );
- x0r = x3i + x1r;
- x0i = x3r - x1i;
- a[j3] = wk1r * ( x0i - x0r );
- a[j3 + 1] = wk1r * ( x0i + x0r );
- }
-
- k1 = 0;
- m2 = 2 * m;
- for ( k = m2; k < n; k += m2 )
- {
- k1 += 2;
- k2 = 2 * k1;
- wk2r = w[k1];
- wk2i = w[k1 + 1];
- wk1r = w[k2];
- wk1i = w[k2 + 1];
- wk3r = wk1r - 2 * wk2i * wk1i;
- wk3i = 2 * wk2i * wk1r - wk1i;
- for ( j = k; j < l + k; j += 2 )
- {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = a[j + 1] + a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = a[j + 1] - a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- x0r -= x2r;
- x0i -= x2i;
- a[j2] = wk2r * x0r - wk2i * x0i;
- a[j2 + 1] = wk2r * x0i + wk2i * x0r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[j1] = wk1r * x0r - wk1i * x0i;
- a[j1 + 1] = wk1r * x0i + wk1i * x0r;
- x0r = x1r + x3i;
- x0i = x1i - x3r;
- a[j3] = wk3r * x0r - wk3i * x0i;
- a[j3 + 1] = wk3r * x0i + wk3i * x0r;
- }
-
- wk1r = w[k2 + 2];
- wk1i = w[k2 + 3];
- wk3r = wk1r - 2 * wk2r * wk1i;
- wk3i = 2 * wk2r * wk1r - wk1i;
- for ( j = k + m; j < l + ( k + m ); j += 2 )
- {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = a[j + 1] + a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = a[j + 1] - a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i + x2i;
- x0r -= x2r;
- x0i -= x2i;
- a[j2] = -wk2i * x0r - wk2r * x0i;
- a[j2 + 1] = -wk2i * x0i + wk2r * x0r;
- x0r = x1r - x3i;
- x0i = x1i + x3r;
- a[j1] = wk1r * x0r - wk1i * x0i;
- a[j1 + 1] = wk1r * x0i + wk1i * x0r;
- x0r = x1r + x3i;
- x0i = x1i - x3r;
- a[j3] = wk3r * x0r - wk3i * x0i;
- a[j3 + 1] = wk3r * x0i + wk3i * x0r;
- }
- }
-
- return;
-}
-
-static void cftbsub(
- int16_t n,
- float *a,
- const float *w /* i : cos/sin table */
-)
-{
- int16_t j, j1, j2, j3, l;
- float x0r, x0i, x1r, x1i, x2r, x2i, x3r, x3i;
-
- l = 2;
- if ( n > 8 )
- {
- cft1st( n, a, w );
- l = 8;
-
- while ( ( l << 2 ) < n )
- {
- cftmdl( n, l, a, w );
- l <<= 2;
- }
- }
-
- if ( ( l << 2 ) == n )
- {
- for ( j = 0; j < l; j += 2 )
- {
- j1 = j + l;
- j2 = j1 + l;
- j3 = j2 + l;
- x0r = a[j] + a[j1];
- x0i = -a[j + 1] - a[j1 + 1];
- x1r = a[j] - a[j1];
- x1i = -a[j + 1] + a[j1 + 1];
- x2r = a[j2] + a[j3];
- x2i = a[j2 + 1] + a[j3 + 1];
- x3r = a[j2] - a[j3];
- x3i = a[j2 + 1] - a[j3 + 1];
- a[j] = x0r + x2r;
- a[j + 1] = x0i - x2i;
- a[j2] = x0r - x2r;
- a[j2 + 1] = x0i + x2i;
- a[j1] = x1r - x3i;
- a[j1 + 1] = x1i - x3r;
- a[j3] = x1r + x3i;
- a[j3 + 1] = x1i + x3r;
- }
- }
- else
- {
- for ( j = 0; j < l; j += 2 )
- {
- j1 = j + l;
- x0r = a[j] - a[j1];
- x0i = -a[j + 1] + a[j1 + 1];
- a[j] += a[j1];
- a[j + 1] = -a[j + 1] - a[j1 + 1];
- a[j1] = x0r;
- a[j1 + 1] = x0i;
- }
- }
-
- return;
-}
-
-static void rftfsub(
- int16_t n,
- float *a,
- int16_t nc,
- const float *c )
-{
- int16_t j, k, kk, ks, m;
- float wkr, wki, xr, xi, yr, yi;
-
- m = n >> 1;
- ks = 2 * nc / m;
- kk = 0;
- for ( j = 2; j < m; j += 2 )
- {
- k = n - j;
- kk += ks;
- wkr = 0.5f - c[nc - kk];
- wki = c[kk];
- xr = a[j] - a[k];
- xi = a[j + 1] + a[k + 1];
- yr = wkr * xr - wki * xi;
- yi = wkr * xi + wki * xr;
- a[j] -= yr;
- a[j + 1] -= yi;
- a[k] += yr;
- a[k + 1] -= yi;
- }
-
- return;
-}
-
-
-static void rftbsub(
- int16_t n,
- float *a,
- int16_t nc,
- const float *c )
-{
- int16_t j, k, kk, ks, m;
- float wkr, wki, xr, xi, yr, yi;
-
- a[1] = -a[1];
- m = n >> 1;
- ks = 2 * nc / m;
- kk = 0;
- for ( j = 2; j < m; j += 2 )
- {
- k = n - j;
- kk += ks;
- wkr = 0.5f - c[nc - kk];
- wki = c[kk];
- xr = a[j] - a[k];
- xi = a[j + 1] + a[k + 1];
- yr = wkr * xr + wki * xi;
- yi = wkr * xi - wki * xr;
- a[j] -= yr;
- a[j + 1] = yi - a[j + 1];
- a[k] += yr;
- a[k + 1] = yi - a[k + 1];
- }
- a[m + 1] = -a[m + 1];
-
- return;
-}
-
-
-static void dctsub(
- int16_t n,
- float *a,
- int16_t nc,
- const float *c )
-{
- int16_t j, k, kk, ks, m;
- float wkr, wki, xr;
-
- m = n >> 1;
- ks = nc / n;
- kk = 0;
- for ( j = 1; j < m; j++ )
- {
- k = n - j;
- kk += ks;
- wkr = c[kk] - c[nc - kk];
- wki = c[kk] + c[nc - kk];
- xr = wki * a[j] - wkr * a[k];
- a[j] = wkr * a[j] + wki * a[k];
- a[k] = xr;
- }
- a[m] *= c[0];
-
- return;
-}
-
-
-/*-----------------------------------------------------------------*
- * edct2()
- *
- * Transformation of the signal to DCT domain
- * OR Inverse EDCT-II for short frames
- *-----------------------------------------------------------------*/
-
-void edct2(
- const int16_t n,
- const int16_t isgn,
- float *in,
- float *a,
- const int16_t *ip,
- const float *w )
-{
- int16_t j, nw, nc;
- float xr;
-
- mvr2r( in, a, n );
-
- nw = ip[0];
- if ( n > ( nw << 2 ) )
- {
- nw = n >> 2;
- }
-
- nc = ip[1];
- if ( n > nc )
- {
- nc = n;
- }
-
- if ( isgn < 0 )
- {
- xr = a[n - 1];
- for ( j = n - 2; j >= 2; j -= 2 )
- {
- a[j + 1] = a[j] - a[j - 1];
- a[j] += a[j - 1];
- }
- a[1] = a[0] - xr;
- a[0] += xr;
-
- if ( n > 4 )
- {
- rftbsub( n, a, nc, w + nw );
- bitrv2_SR( n, ip + 2, a );
- cftbsub( n, a, w );
- }
- else if ( n == 4 )
- {
- cftfsub( n, a, w );
- }
- }
-
- if ( isgn >= 0 )
- {
- a[0] *= 0.5f;
- }
-
- dctsub( n, a, nc, w + nw );
-
- if ( isgn >= 0 )
- {
- if ( n > 4 )
- {
- bitrv2_SR( n, ip + 2, a );
- cftfsub( n, a, w );
- rftfsub( n, a, nc, w + nw );
- }
- else if ( n == 4 )
- {
- cftfsub( n, a, w );
- }
- xr = a[0] - a[1];
- a[0] += a[1];
- for ( j = 2; j < n; j += 2 )
- {
- a[j - 1] = a[j] - a[j + 1];
- a[j] += a[j + 1];
- }
- a[n - 1] = xr;
-
- for ( j = 0; j < n; j++ )
- {
- a[j] /= 32.0f;
- }
- }
-}
-
-
-void DoRTFTn(
- float *x, /* i/o: real part of input and output data */
- float *y, /* i/o: imaginary part of input and output data */
- const int16_t n /* i : size of the FFT up to 1024 */
-)
-{
-
- int16_t i;
- float z[2048];
-
- for ( i = 0; i < n; i++ )
- {
- z[2 * i] = x[i];
- z[2 * i + 1] = y[i];
- }
-
- switch ( n )
- {
- case ( 16 ):
- cdftForw( 2 * n, z, Ip_fft16, w_fft16 );
- break;
- case ( 32 ):
- cdftForw( 2 * n, z, Ip_fft32, w_fft32 );
- break;
- case ( 64 ):
- cdftForw( 2 * n, z, Ip_fft64, w_fft64 );
- break;
- case ( 128 ):
- cdftForw( 2 * n, z, Ip_fft128, w_fft128 );
- break;
- case ( 256 ):
- cdftForw( 2 * n, z, Ip_fft256, w_fft256 );
- break;
- case ( 512 ):
- cdftForw( 2 * n, z, Ip_fft512, w_fft512 );
- break;
- default:
- assert( 0 );
- }
-
- x[0] = z[0];
- y[0] = z[1];
- for ( i = 1; i < n; i++ )
- {
- x[n - i] = z[2 * i];
- y[n - i] = z[2 * i + 1];
- }
-
- return;
-}
-
-
-void fft3(
- const float X[],
- float Y[],
- const int16_t n )
-{
- float Z[PH_ECU_SPEC_SIZE];
- float *Z0, *Z1, *Z2;
- float *z0, *z1, *z2;
- const float *x;
- const float *t_sin = sincos_t_rad3;
- int16_t m, step, order;
- int16_t i, j;
- int16_t c1_ind, s1_ind, c2_ind, s2_ind;
- int16_t c1_step, s1_step, c2_step, s2_step;
- float *RY, *IY, *RZ0, *IZ0, *RZ1, *IZ1, *RZ2, *IZ2;
-
- /* Determine the order of the transform, the length of decimated */
- /* transforms m, and the step for the sine and cosine tables. */
- switch ( n )
- {
- case 1536:
- order = 9;
- m = 512;
- step = 1;
- break;
- case 384:
- order = 7;
- m = 128;
- step = 4;
- break;
- default:
- order = 9;
- m = 512;
- step = 1;
- }
-
- /* Compose decimated sequences X[3i], X[3i+1],X[3i+2] */
- /* compute their FFT of length m. */
- Z0 = &Z[0];
- z0 = &Z0[0];
- Z1 = &Z0[m];
- z1 = &Z1[0]; /* Z1 = &Z[ m]; */
- Z2 = &Z1[m];
- z2 = &Z2[0]; /* Z2 = &Z[2m]; */
- x = &X[0];
- for ( i = 0; i < n / 3; i++ )
- {
- *z0++ = *x++; /* Z0[i] = X[3i]; */
- *z1++ = *x++; /* Z1[i] = X[3i+1]; */
- *z2++ = *x++; /* Z2[i] = X[3i+2]; */
- }
-
- fft_rel( &Z0[0], m, order );
- fft_rel( &Z1[0], m, order );
- fft_rel( &Z2[0], m, order );
-
- /* Butterflies of order 3. */
- /* pointer initialization */
- RY = &Y[0];
- IY = &Y[n];
- RZ0 = &Z0[0];
- IZ0 = &Z0[m];
- RZ1 = &Z1[0];
- IZ1 = &Z1[m];
- RZ2 = &Z2[0];
- IZ2 = &Z2[m];
-
- c1_step = -step;
- s1_step = step;
- c2_step = -2 * step;
- s2_step = 2 * step;
- c1_ind = T_SIN_PI_2 + c1_step;
- s1_ind = s1_step;
- c2_ind = T_SIN_PI_2 + c2_step;
- s2_ind = s2_step;
-
- /* special case: i = 0 */
- RY[0] = RZ0[0] + RZ1[0] + RZ2[0];
-
- /* first 3/12 */
- for ( i = 1; i < 3 * m / 8; i++, c1_ind += c1_step, s1_ind += s1_step, c2_ind += c2_step, s2_ind += s2_step )
- {
- RY[i] = RZ0[i] + RZ1[i] * t_sin[c1_ind] + IZ1[-i] * t_sin[s1_ind] + RZ2[i] * t_sin[c2_ind] + IZ2[-i] * t_sin[s2_ind];
- IY[-i] = IZ0[-i] - RZ1[i] * t_sin[s1_ind] + IZ1[-i] * t_sin[c1_ind] - RZ2[i] * t_sin[s2_ind] + IZ2[-i] * t_sin[c2_ind];
- }
-
- /* next 1/12 */
- for ( ; i < 4 * m / 8; i++, c1_ind += c1_step, s1_ind += s1_step, c2_ind -= c2_step, s2_ind -= s2_step )
- {
- RY[i] = RZ0[i] + RZ1[i] * t_sin[c1_ind] + IZ1[-i] * t_sin[s1_ind] - RZ2[i] * t_sin[c2_ind] + IZ2[-i] * t_sin[s2_ind];
- IY[-i] = IZ0[-i] - RZ1[i] * t_sin[s1_ind] + IZ1[-i] * t_sin[c1_ind] - RZ2[i] * t_sin[s2_ind] - IZ2[-i] * t_sin[c2_ind];
- }
-
- /* special case: i = m/2 i.e. 1/3 */
- RY[i] = RZ0[i] + RZ1[i] * t_sin[c1_ind] - RZ2[i] * t_sin[c2_ind];
- IY[-i] = -RZ1[i] * t_sin[s1_ind] - RZ2[i] * t_sin[s2_ind];
- i++;
-
- c1_ind += c1_step, s1_ind += s1_step, c2_ind -= c2_step, s2_ind -= s2_step;
-
- /* next 2/12 */
- for ( j = i - 2; i < 6 * m / 8; i++, j--, c1_ind += c1_step, s1_ind += s1_step, c2_ind -= c2_step, s2_ind -= s2_step )
- {
- RY[i] = RZ0[j] + RZ1[j] * t_sin[c1_ind] - IZ1[-j] * t_sin[s1_ind] - RZ2[j] * t_sin[c2_ind] - IZ2[-j] * t_sin[s2_ind];
- IY[-i] = -IZ0[-j] - RZ1[j] * t_sin[s1_ind] - IZ1[-j] * t_sin[c1_ind] - RZ2[j] * t_sin[s2_ind] + IZ2[-j] * t_sin[c2_ind];
- }
-
- /*--------------------------half--------------------------*/
- /* next 2/12 */
- for ( ; i < 8 * m / 8; i++, j--, c1_ind -= c1_step, s1_ind -= s1_step, c2_ind += c2_step, s2_ind += s2_step )
- {
- RY[i] = RZ0[j] - RZ1[j] * t_sin[c1_ind] - IZ1[-j] * t_sin[s1_ind] - RZ2[j] * t_sin[c2_ind] + IZ2[-j] * t_sin[s2_ind];
- IY[-i] = -IZ0[-j] - RZ1[j] * t_sin[s1_ind] + IZ1[-j] * t_sin[c1_ind] + RZ2[j] * t_sin[s2_ind] + IZ2[-j] * t_sin[c2_ind];
- }
-
- /* special case: i = m, i.e 2/3 */
- RY[i] = RZ0[j] - RZ1[j] * t_sin[c1_ind] - RZ2[j] * t_sin[c2_ind];
- IY[-i++] = -RZ1[j] * t_sin[s1_ind] + RZ2[j] * t_sin[s2_ind];
- c1_ind -= c1_step, s1_ind -= s1_step, c2_ind += c2_step, s2_ind += s2_step;
-
- /* next 1/12 */
- for ( j = 1; i < 9 * m / 8; i++, j++, c1_ind -= c1_step, s1_ind -= s1_step, c2_ind += c2_step, s2_ind += s2_step )
- {
- RY[i] = RZ0[j] - RZ1[j] * t_sin[c1_ind] + IZ1[-j] * t_sin[s1_ind] - RZ2[j] * t_sin[c2_ind] - IZ2[-j] * t_sin[s2_ind];
- IY[-i] = IZ0[-j] - RZ1[j] * t_sin[s1_ind] - IZ1[-j] * t_sin[c1_ind] + RZ2[j] * t_sin[s2_ind] - IZ2[-j] * t_sin[c2_ind];
- }
-
- /* last 3/12 */
- for ( ; i < 12 * m / 8; i++, j++, c1_ind -= c1_step, s1_ind -= s1_step, c2_ind -= c2_step, s2_ind -= s2_step )
- {
- RY[i] = RZ0[j] - RZ1[j] * t_sin[c1_ind] + IZ1[-j] * t_sin[s1_ind] + RZ2[j] * t_sin[c2_ind] - IZ2[-j] * t_sin[s2_ind];
- IY[-i] = IZ0[-j] - RZ1[j] * t_sin[s1_ind] - IZ1[-j] * t_sin[c1_ind] + RZ2[j] * t_sin[s2_ind] + IZ2[-j] * t_sin[c2_ind];
- }
-
- /* special case: i = 3*m/2 */
- RY[i] = RZ0[j] - RZ1[j] * t_sin[c1_ind] + RZ2[j] * t_sin[c2_ind];
-
- return;
-}
-
-void ifft3(
- const float Z[],
- float X[],
- const int16_t n )
-{
- float Y[PH_ECU_SPEC_SIZE];
- const float *t_sin = sincos_t_rad3;
- int16_t m, step, step2, order;
- int16_t i;
- int16_t c0_ind, s0_ind, c1_ind, s1_ind, c2_ind, s2_ind;
- float scale;
- const float *RZ0, *IZ0, *RZ1, *IZ1, *RZ2, *IZ2;
- float *RY0, *IY0, *RY1, *IY1, *RY2, *IY2, *y0, *y1, *y2;
-
- /* Determine the order of the transform, the length of decimated */
- /* transforms m, and the step for the sine and cosine tables. */
- switch ( n )
- {
- case 1536:
- order = 9;
- m = 512;
- step = 1;
- break;
- case 384:
- order = 7;
- m = 128;
- step = 4;
- break;
- default:
- order = 9;
- m = 512;
- step = 1;
- }
-
- /* pointer initialization */
- RY0 = &Y[0];
- IY0 = &RY0[m];
- RY1 = &RY0[m];
- IY1 = &RY1[m];
- RY2 = &RY1[m];
- IY2 = &RY2[m];
-
- RZ0 = &Z[0];
- RZ1 = RZ0 + m;
- RZ2 = RZ0 + n / 2 - m / 2;
- IZ0 = &Z[n];
- IZ1 = IZ0 - m;
- IZ2 = IZ0 - n / 2 + m / 2;
-
- /* Inverse butterflies of order 3. */
-
- /* Construction of Y0 */
- RY0[0] = RZ0[0] + RZ1[0] + RZ2[0];
- for ( i = 1; i < m / 2; i++ )
- {
- RY0[i] = RZ0[i] + RZ1[i] + RZ2[-i];
- IY0[-i] = IZ0[-i] + IZ1[-i] - IZ2[i];
- }
-
- /* m/2 */
- RY0[i] = RZ0[i] + RZ1[i] + RZ2[-i];
-
- /* Construction of Y1 */
- c0_ind = T_SIN_PI_2;
- s0_ind = 0;
- c1_ind = T_SIN_PI_2 * 1 / 3;
- s1_ind = T_SIN_PI_2 * 2 / 3;
- c2_ind = T_SIN_PI_2 * 1 / 3;
- s2_ind = T_SIN_PI_2 * 2 / 3;
-
- RY1[0] = RZ0[0] * t_sin[c0_ind] - RZ1[0] * t_sin[c1_ind] - RZ2[0] * t_sin[c2_ind] - IZ1[0] * t_sin[s1_ind] - IZ2[0] * t_sin[s2_ind];
-
- c0_ind -= step, s0_ind += step, c1_ind += step, s1_ind -= step, c2_ind -= step, s2_ind += step;
- for ( i = 1; i < m / 4; i++, c0_ind -= step, s0_ind += step, c1_ind += step, s1_ind -= step, c2_ind -= step, s2_ind += step )
- {
- RY1[i] = RZ0[i] * t_sin[c0_ind] - RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] - IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind];
- IY1[-i] = IZ0[-i] * t_sin[c0_ind] - IZ1[-i] * t_sin[c1_ind] + IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] + RZ1[i] * t_sin[s1_ind] - RZ2[-i] * t_sin[s2_ind];
- }
-
- for ( ; i < m / 2; i++, c0_ind -= step, s0_ind += step, c1_ind += step, s1_ind -= step, c2_ind += step, s2_ind -= step )
- {
- RY1[i] = RZ0[i] * t_sin[c0_ind] - RZ1[i] * t_sin[c1_ind] + RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] - IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind];
- IY1[-i] = IZ0[-i] * t_sin[c0_ind] - IZ1[-i] * t_sin[c1_ind] - IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] + RZ1[i] * t_sin[s1_ind] - RZ2[-i] * t_sin[s2_ind];
- }
-
- /* m/2 */
- RY1[i] = RZ0[i] * t_sin[c0_ind] - RZ1[i] * t_sin[c1_ind] + RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] - IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind];
-
- /* Construction of Y2 */
- c0_ind = T_SIN_PI_2;
- s0_ind = 0;
- c1_ind = T_SIN_PI_2 * 1 / 3;
- s1_ind = T_SIN_PI_2 * 2 / 3;
- c2_ind = T_SIN_PI_2 * 1 / 3;
- s2_ind = T_SIN_PI_2 * 2 / 3;
- step2 = 2 * step;
- RY2[0] = RZ0[0] * t_sin[c0_ind] - RZ1[0] * t_sin[c1_ind] - RZ2[0] * t_sin[c2_ind] + IZ1[0] * t_sin[s1_ind] + IZ2[0] * t_sin[s2_ind];
-
- c0_ind -= step2, s0_ind += step2, c1_ind -= step2, s1_ind += step2, c2_ind += step2, s2_ind -= step2;
- for ( i = 1; i < m / 8; i++, c0_ind -= step2, s0_ind += step2, c1_ind -= step2, s1_ind += step2, c2_ind += step2, s2_ind -= step2 )
- {
- RY2[i] = RZ0[i] * t_sin[c0_ind] - RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] + IZ1[-i] * t_sin[s1_ind] + IZ2[i] * t_sin[s2_ind];
- IY2[-i] = IZ0[-i] * t_sin[c0_ind] - IZ1[-i] * t_sin[c1_ind] + IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] - RZ1[i] * t_sin[s1_ind] + RZ2[-i] * t_sin[s2_ind];
- }
-
- for ( ; i < m / 4; i++, c0_ind -= step2, s0_ind += step2, c1_ind += step2, s1_ind -= step2, c2_ind += step2, s2_ind -= step2 )
- {
- RY2[i] = RZ0[i] * t_sin[c0_ind] + RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] + IZ1[-i] * t_sin[s1_ind] + IZ2[i] * t_sin[s2_ind];
- IY2[-i] = IZ0[-i] * t_sin[c0_ind] + IZ1[-i] * t_sin[c1_ind] + IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] - RZ1[i] * t_sin[s1_ind] + RZ2[-i] * t_sin[s2_ind];
- }
-
- for ( ; i < 3 * m / 8; i++, c0_ind -= step2, s0_ind += step2, c1_ind += step2, s1_ind -= step2, c2_ind -= step2, s2_ind += step2 )
- {
- RY2[i] = RZ0[i] * t_sin[c0_ind] + RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] + IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind];
- IY2[-i] = IZ0[-i] * t_sin[c0_ind] + IZ1[-i] * t_sin[c1_ind] + IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] - RZ1[i] * t_sin[s1_ind] - RZ2[-i] * t_sin[s2_ind];
- }
-
- for ( ; i < m / 2; i++, c0_ind += step2, s0_ind -= step2, c1_ind += step2, s1_ind -= step2, c2_ind -= step2, s2_ind += step2 )
- {
- RY2[i] = -RZ0[i] * t_sin[c0_ind] + RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] + IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind];
- IY2[-i] = -IZ0[-i] * t_sin[c0_ind] + IZ1[-i] * t_sin[c1_ind] + IZ2[i] * t_sin[c2_ind] + RZ0[i] * t_sin[s0_ind] - RZ1[i] * t_sin[s1_ind] - RZ2[-i] * t_sin[s2_ind];
- }
-
- /* m/2 */
- RY2[i] = -RZ0[i] * t_sin[c0_ind] + RZ1[i] * t_sin[c1_ind] - RZ2[-i] * t_sin[c2_ind] - IZ0[-i] * t_sin[s0_ind] + IZ1[-i] * t_sin[s1_ind] - IZ2[i] * t_sin[s2_ind];
-
- /* Compute the inverse FFT for all 3 blocks. */
- ifft_rel( RY0, m, order );
- ifft_rel( RY1, m, order );
- ifft_rel( RY2, m, order );
-
- y0 = RY0;
- y1 = RY1;
- y2 = RY2;
-
- /* Interlacing and scaling, scale = 1/3 */
- scale = 1.0f / 3;
- for ( i = 0; i < n; )
- {
- X[i++] = ( *y0++ ) * scale;
- X[i++] = ( *y1++ ) * scale;
- X[i++] = ( *y2++ ) * scale;
- }
-
- return;
-}
-
-
-static void rfft_post(
- const float *sine_table,
- float *buf,
- const int16_t len )
-{
- float tmp1, tmp2, tmp3, tmp4, s, c;
- int16_t i = 0;
-
- tmp1 = buf[0] + buf[1];
- buf[1] = buf[0] - buf[1];
- buf[0] = tmp1;
-
- for ( i = 1; i <= ( len + 2 ) / 4; i++ )
- {
- s = sine_table[i]; /* sin(pi*i/(len/2)) */
- c = sine_table[i + len / 4]; /* cos(pi*i/(len/2)) */
-
- tmp1 = buf[2 * i] - buf[len - 2 * i];
- tmp2 = buf[2 * i + 1] + buf[len - 2 * i + 1];
- tmp3 = s * tmp1 - c * tmp2; /* real part of j*W(k,N)*[T(k) - T'(N-k)] */
- tmp4 = c * tmp1 + s * tmp2; /* imag part of j*W(k,N)*[T(k) - T'(N-k)] */
- tmp1 = buf[2 * i] + buf[len - 2 * i];
- tmp2 = buf[2 * i + 1] - buf[len - 2 * i + 1];
-
- buf[2 * i] = 0.5f * ( tmp1 - tmp3 );
- buf[2 * i + 1] = 0.5f * ( tmp2 - tmp4 );
- buf[len - 2 * i] = 0.5f * ( tmp1 + tmp3 );
- buf[len - 2 * i + 1] = -0.5f * ( tmp2 + tmp4 );
- }
-}
-
-static void rfft_pre(
- const float *sine_table,
- float *buf,
- const int16_t len )
-{
- const float scale = 1.0f / len;
- float tmp1, tmp2, tmp3, tmp4, s, c;
- int16_t i = 0;
-
- tmp1 = buf[0] + buf[1];
- buf[1] = scale * ( buf[0] - buf[1] );
- buf[0] = scale * tmp1;
-
- for ( i = 1; i <= ( len + 2 ) / 4; i++ )
- {
- s = sine_table[i]; /* sin(pi*i/(len/2)) */
- c = sine_table[i + len / 4]; /* cos(pi*i/(len/2)) */
-
- tmp1 = buf[2 * i] - buf[len - 2 * i];
- tmp2 = buf[2 * i + 1] + buf[len - 2 * i + 1];
- tmp3 = s * tmp1 + c * tmp2; /* real part of j*W(k,N)*[T(k) - T'(N-k)] */
- tmp4 = -c * tmp1 + s * tmp2; /* imag part of j*W(k,N)*[T(k) - T'(N-k)] */
- tmp1 = buf[2 * i] + buf[len - 2 * i];
- tmp2 = buf[2 * i + 1] - buf[len - 2 * i + 1];
-
- buf[2 * i] = scale * ( tmp1 + tmp3 );
- buf[2 * i + 1] = -scale * ( tmp2 + tmp4 );
- buf[len - 2 * i] = scale * ( tmp1 - tmp3 );
- buf[len - 2 * i + 1] = scale * ( tmp2 - tmp4 );
- }
-
- return;
-}
-
-int16_t RFFTN(
- float *data,
- const float *sine_table,
- const int16_t len,
- const int16_t sign )
-{
- assert( len <= 640 && len > 0 );
-
- if ( len == 640 )
- {
- float x[320], y[320];
- int16_t i;
-
- if ( sign != -1 )
- {
- rfft_pre( sine_table, data, len );
- }
-
- for ( i = 0; i < 320; i++ )
- {
- x[i] = data[2 * i];
- y[i] = data[2 * i + 1];
- }
- DoRTFT320( x, y );
- for ( i = 0; i < 320; i++ )
- {
- data[2 * i] = x[i];
- data[2 * i + 1] = y[i];
- }
-
- if ( sign == -1 )
- {
- rfft_post( sine_table, data, len );
- }
- }
- else
- {
- if ( len == 512 )
- {
- int16_t i;
- const int16_t log2 = 9;
- float reordered_data[512];
-
- if ( sign == -1 )
- {
- fft_rel( data, len, log2 );
- reordered_data[0] = data[0];
- reordered_data[1] = data[len / 2];
- for ( i = 1; i < len / 2; i++ )
- {
- reordered_data[2 * i] = data[i];
- reordered_data[2 * i + 1] = data[len - i];
- }
- }
- else
- {
- reordered_data[0] = data[0];
- reordered_data[len / 2] = data[1];
- for ( i = 1; i < len / 2; i++ )
- {
- reordered_data[i] = data[2 * i];
- reordered_data[len - i] = data[2 * i + 1];
- }
- ifft_rel( reordered_data, len, log2 );
- }
- mvr2r( reordered_data, data, len );
- }
- else
- {
- assert( !"Not supported FFT length!" );
- }
- }
-
- return 0;
-}
-
-static void butterfly(
- const float a,
- const float b,
- float *aPlusb,
- float *aMinusb )
-{
- *aPlusb = a + b;
- *aMinusb = a - b;
-
- return;
-}
-
-static void fft2(
- float *pInOut )
-{
- /* FFT MATRIX:
- 1.0000 1.0000
- 1.0000 -1.0000
- */
- float re1, im1;
- float re2, im2;
-
- re1 = pInOut[0];
- im1 = pInOut[1];
- re2 = pInOut[2];
- im2 = pInOut[3];
- pInOut[0] = re1 + re2;
- pInOut[1] = im1 + im2;
-
- pInOut[2] = re1 - re2;
- pInOut[3] = im1 - im2;
-
- return;
-}
-
-static const float C31 = 0.5f; /* cos(PI/3); sin(2*PI/3) */
-static const float C32 = 0.866025403784439f; /* cos(PI/3); sin(2*PI/3) */
-
-static void fft3_2(
- float *pInOut )
-{
- float re1, im1;
- float re2, im2;
- float re3, im3;
-
- float tmp1, tmp2;
- float tmp3, tmp4;
-
- re1 = pInOut[0];
- im1 = pInOut[1];
- re2 = pInOut[2];
- im2 = pInOut[3];
- re3 = pInOut[4];
- im3 = pInOut[5];
-
- /* FFT MATRIX:
- 1.0000 1.0000 1.0000
- C31 C32
- 1.0000 -0.5000 - 0.8660i -0.5000 + 0.8660i
- 1.0000 -0.5000 + 0.8660i -0.5000 - 0.8660i
- */
- tmp1 = re2 + re3;
- tmp3 = im2 + im3;
- tmp2 = re2 - re3;
- tmp4 = im2 - im3;
- pInOut[0] = re1 + tmp1;
- pInOut[1] = im1 + tmp3;
- pInOut[2] = re1 - C31 * tmp1 + C32 * tmp4;
- pInOut[4] = re1 - C31 * tmp1 - C32 * tmp4;
-
- pInOut[3] = im1 - C32 * tmp2 - C31 * tmp3;
- pInOut[5] = im1 + C32 * tmp2 - C31 * tmp3;
-}
-
-
-static void fft4(
- float *pInOut )
-{
- float re1, im1;
- float re2, im2;
- float re3, im3;
- float re4, im4;
-
- float tmp1, tmp2;
- float tmp3, tmp4;
- float tmp5, tmp6;
- float tmp7, tmp8;
-
- re1 = pInOut[0];
- im1 = pInOut[1];
- re2 = pInOut[2];
- im2 = pInOut[3];
- re3 = pInOut[4];
- im3 = pInOut[5];
- re4 = pInOut[6];
- im4 = pInOut[7];
-
- /*
- 1.0000 1.0000 1.0000 1.0000
- 1.0000 -1.0000i -1.0000 1.0000i
- 1.0000 -1.0000 1.0000 -1.0000
- 1.0000 1.0000i -1.0000 -1.0000i
- */
- tmp1 = re1 + re3;
- tmp3 = re2 + re4;
- tmp5 = im1 + im3;
- tmp7 = im2 + im4;
- pInOut[0] = tmp1 + tmp3;
- pInOut[4] = tmp1 - tmp3;
-
- pInOut[1] = tmp5 + tmp7;
- pInOut[5] = tmp5 - tmp7;
- tmp2 = re1 - re3;
- tmp4 = re2 - re4;
- tmp6 = im1 - im3;
- tmp8 = im2 - im4;
- pInOut[2] = tmp2 + tmp8;
- pInOut[6] = tmp2 - tmp8;
-
- pInOut[3] = -tmp4 + tmp6;
- pInOut[7] = tmp4 + tmp6;
-
- return;
-}
-
-static const float C51 = 0.309016994374947f; /* cos(2*PI/5); */
-static const float C52 = 0.951056516295154f; /* sin(2*PI/5); */
-static const float C53 = 0.809016994374947f; /* cos( PI/5); */
-static const float C54 = 0.587785252292473f; /* sin( PI/5); */
-
-static void fft5(
- float *pInOut )
-{
- float re1, im1;
- float re2, im2;
- float re3, im3;
- float re4, im4;
- float re5, im5;
-
- float tmp1, tmp2;
- float tmp3, tmp4;
- float tmp5, tmp6;
- float tmp7, tmp8;
-
-
- re1 = pInOut[0];
- im1 = pInOut[1];
- re2 = pInOut[2];
- im2 = pInOut[3];
- re3 = pInOut[4];
- im3 = pInOut[5];
- re4 = pInOut[6];
- im4 = pInOut[7];
- re5 = pInOut[8];
- im5 = pInOut[9];
-
- /*
- 1.0000 1.0000 1.0000 1.0000 1.0000
- C51 C52 C53 C54
- 1.0000 0.3090 - 0.9511i -0.8090 - 0.5878i -0.8090 + 0.5878i 0.3090 + 0.9511i
- 1.0000 -0.8090 - 0.5878i 0.3090 + 0.9511i 0.3090 - 0.9511i -0.8090 + 0.5878i
- 1.0000 -0.8090 + 0.5878i 0.3090 - 0.9511i 0.3090 + 0.9511i -0.8090 - 0.5878i
- 1.0000 0.3090 + 0.9511i -0.8090 + 0.5878i -0.8090 - 0.5878i 0.3090 - 0.9511i
- */
- tmp1 = re2 + re5;
- tmp2 = re2 - re5;
- tmp3 = im2 + im5;
- tmp4 = im2 - im5;
- tmp5 = re3 + re4;
- tmp6 = re3 - re4;
- tmp7 = im3 + im4;
- tmp8 = im3 - im4;
-
-
- pInOut[0] = re1 + tmp1 + tmp5;
- pInOut[1] = im1 + tmp3 + tmp7;
-
- pInOut[2] = re1 + C51 * tmp1 - C53 * tmp5 + C52 * tmp4 + C54 * tmp8;
- pInOut[8] = re1 + C51 * tmp1 - C53 * tmp5 - C52 * tmp4 - C54 * tmp8;
- pInOut[3] = im1 - C52 * tmp2 - C54 * tmp6 + C51 * tmp3 - C53 * tmp7;
- pInOut[9] = im1 + C52 * tmp2 + C54 * tmp6 + C51 * tmp3 - C53 * tmp7;
- pInOut[4] = re1 - C53 * tmp1 + C51 * tmp5 + C54 * tmp4 - C52 * tmp8;
- pInOut[6] = re1 - C53 * tmp1 + C51 * tmp5 - C54 * tmp4 + C52 * tmp8;
- pInOut[5] = im1 - C54 * tmp2 + C52 * tmp6 - C53 * tmp3 + C51 * tmp7;
- pInOut[7] = im1 + C54 * tmp2 - C52 * tmp6 - C53 * tmp3 + C51 * tmp7;
-
- return;
-}
-
-static const float C81 = 0.707106781186548f; /* cos(PI/4); */
-
-static void fft8_2(
- float *pInOut )
-{
- float re0, im0, re4, im4;
-
- float re1_7p, re1_7m;
- float im1_7p, im1_7m;
- float re2_6p, re2_6m;
- float im2_6p, im2_6m;
- float re3_5p, re3_5m;
- float im3_5p, im3_5m;
-
- re0 = pInOut[0];
- im0 = pInOut[1];
- re4 = pInOut[8];
- im4 = pInOut[9];
- butterfly( pInOut[1 * 2], pInOut[7 * 2], &re1_7p, &re1_7m );
- butterfly( pInOut[1 * 2 + 1], pInOut[7 * 2 + 1], &im1_7p, &im1_7m );
- butterfly( pInOut[2 * 2], pInOut[6 * 2], &re2_6p, &re2_6m );
- butterfly( pInOut[2 * 2 + 1], pInOut[6 * 2 + 1], &im2_6p, &im2_6m );
- butterfly( pInOut[3 * 2], pInOut[5 * 2], &re3_5p, &re3_5m );
- butterfly( pInOut[3 * 2 + 1], pInOut[5 * 2 + 1], &im3_5p, &im3_5m );
-
- /*
- 0: 1 + 0i 1 + 0i 1 + 0i 1 + 0i 1 + 0i 1 + 0i 1 + 0i 1 + 0i
- 1: 1 + 0i C81 - C81i 0 - 1i -C81 - C81i -1 - 0i -C81 + C81i - 0 + 1i C81 + C81i
- 2: 1 + 0i 0 - 1i -1 - 0i - 0 + 1i 1 + 0i 0 - 1i - 1 - 0i - 0 + 1i
- 3: 1 + 0i -C81 - C81i -0 + 1i C81 - C81i -1 - 0i C81 + C81i 0 - 1i -C81 + C81i
- 4: 1 + 0i - 1 - 0i 1 + 0i - 1 - 0i 1 + 0i - 1 - 0i 1 + 0i - 1 - 0i
- 5: 1 + 0i -C81 + C81i 0 - 1i C81 + C81i -1 - 0i C81 - C81i - 0 + 1i -C81 - C81i
- 6: 1 + 0i - 0 + 1i -1 - 0i 0 - 1i 1 + 0i - 0 + 1i - 1 - 0i - 0 - 1i
- 7: 1 + 0i C81 + C81i -0 + 1i -C81 + C81i -1 - 0i -C81 - C81i - 0 - 1i C81 - C81i
- */
- pInOut[0] = re0 + re4 + re1_7p + re2_6p + re3_5p;
- pInOut[1] = im0 + im4 + im1_7p + im2_6p + im3_5p;
-
- pInOut[2] = re0 + C81 * ( re1_7p - re3_5p ) - re4 + C81 * ( im1_7m + im3_5m ) + im2_6m;
- pInOut[3] = im0 + C81 * ( im1_7p - im3_5p ) - im4 - C81 * ( re1_7m + re3_5m ) - re2_6m;
-
- pInOut[4] = re0 - re2_6p + re4 + im1_7m - im3_5m;
- pInOut[5] = im0 - im2_6p + im4 - re1_7m + re3_5m;
-
- pInOut[6] = re0 + C81 * ( -re1_7p + re3_5p ) - re4 + C81 * ( im1_7m + im3_5m ) - im2_6m;
- pInOut[7] = im0 + C81 * ( -im1_7p + im3_5p ) - im4 - C81 * ( re1_7m + re3_5m ) + re2_6m;
-
- pInOut[8] = re0 - re1_7p + re2_6p - re3_5p + re4;
- pInOut[9] = im0 - im1_7p + im2_6p - im3_5p + im4;
-
- pInOut[10] = re0 + C81 * ( -re1_7p + re3_5p ) - re4 - C81 * ( im1_7m + im3_5m ) + im2_6m;
- pInOut[11] = im0 + C81 * ( -im1_7p + im3_5p ) - im4 + C81 * ( re1_7m + re3_5m ) - re2_6m;
-
- pInOut[12] = re0 - re2_6p + re4 - im1_7m + im3_5m;
- pInOut[13] = im0 - im2_6p + im4 + re1_7m - re3_5m;
-
- pInOut[14] = re0 + C81 * ( re1_7p - re3_5p ) - re4 - C81 * ( im1_7m + im3_5m ) - im2_6m;
- pInOut[15] = im0 + C81 * ( im1_7p - im3_5p ) - im4 + C81 * ( re1_7m + re3_5m ) + re2_6m;
-
- return;
-}
-
-static void nextFFT(
- float *x,
- const int16_t length )
-{
- switch ( length )
- {
- case 2:
- fft2( x );
- break;
- case 3:
- fft3_2( x );
- break;
- case 4:
- fft4( x );
- break;
- case 5:
- fft5( x );
- break;
- case 8:
- fft8_2( x );
- break;
- default:
- assert( !"length not supported" );
- break;
- }
-
- return;
-}
-
-static const int16_t CTFFTfactors[] = { 9, 8, 7, 5, 4, 3, 2, 0 };
-
-static __inline int16_t findFactor(
- const int16_t length )
-{
- int16_t i = 0;
- int16_t factor = 0;
-
- while ( CTFFTfactors[i] != 0 )
- {
- if ( 0 == ( length % CTFFTfactors[i] ) )
- {
- factor = CTFFTfactors[i];
- break;
- }
- i++;
- }
- return factor;
-}
-
-static __inline void twiddle(
- float *x,
- const int16_t length,
- const int16_t n1,
- const int16_t n2 )
-{
- int16_t i, ii;
- double pi = 4. * atan( 1. );
- float sinValOrg, cosValOrg;
- float sinVal = 0.f, cosVal = 1.f;
- float twReal = 0.f, twImag = 1.f;
-
- cosValOrg = (float) cos( -2 * pi * 1. / (double) length );
- sinValOrg = (float) sin( -2 * pi * 1. / (double) length );
- for ( i = 1; i < n1; i++ )
- {
- float tmp;
- twReal = 1.f;
- twImag = 0.f;
- tmp = cosVal * cosValOrg - sinVal * sinValOrg;
- sinVal = sinVal * cosValOrg + cosVal * sinValOrg;
- cosVal = tmp;
- for ( ii = 1; ii < n2; ii++ )
- {
- float xRe, xIm, tmpReal;
- /* cos(x+y) = cos(x)*cos(y) - sin(x)*sin(y); */
- /* sin(x+y) = sin(x)*cos(y) + sin(y)*cos(x); */
- tmpReal = twReal * cosVal - twImag * sinVal;
- twImag = twImag * cosVal + sinVal * twReal;
- twReal = tmpReal;
- xRe = x[2 * ( i * n2 + ii )];
- xIm = x[2 * ( i * n2 + ii ) + 1];
- x[2 * ( i * n2 + ii )] = twReal * xRe - twImag * xIm;
- x[2 * ( i * n2 + ii ) + 1] = twImag * xRe + twReal * xIm;
- }
- tmp = cosVal;
- }
-
- return;
-}
-
-static void cooleyTukeyFFT(
- float *x,
- const int16_t length,
- float *scratch )
-{
- int16_t factor;
- int16_t i, ii;
- int16_t n1, n2;
- int16_t cnt = 0;
- float *src, *dest;
-
- switch ( length )
- {
- case 1:
- break;
- case 2:
- fft2( x );
- break;
- case 3:
- fft3_2( x );
- break;
- case 4:
- fft4( x );
- break;
- case 5:
- fft5( x );
- break;
- case 8:
- fft8_2( x );
- break;
- default:
- {
- factor = findFactor( length );
- if ( factor > 0 && ( length / factor > 1 ) )
- {
- n1 = factor;
- n2 = length / factor;
-
- /* DATA Resorting for stage1 */
- dest = scratch;
- for ( i = 0; i < 2 * n1; i += 2 )
- {
- src = x + i;
- for ( ii = 0; ii < n2; ii++ )
- {
- /* *dest++ = x[2*(i+ii*n1)]; */
- /* *dest++ = x[2*(i+ii*n1)+1]; */
- *dest++ = *src;
- *dest++ = *( src + 1 );
- src += 2 * n1;
- }
- }
- src = scratch;
- dest = x;
- for ( i = 0; i < length; i++ )
- {
- *dest++ = *src++;
- *dest++ = *src++;
- }
- /* perform n1 ffts of length n2 */
- for ( i = 0; i < n1; i++ )
- {
- cooleyTukeyFFT( x + 2 * i * n2, n2, scratch + 2 * i * n2 );
- }
- /*data twiddeling */
- twiddle( x, length, n1, n2 );
- /* DATA Resorting for stage2 */
- cnt = 0;
- for ( i = 0; i < n2; i++ )
- {
- for ( ii = 0; ii < n1; ii++ )
- {
- scratch[2 * cnt] = x[2 * ( i + ii * n2 )];
- scratch[2 * cnt + 1] = x[2 * ( i + ii * n2 ) + 1];
- cnt++;
- }
- }
- /* perform n2 ffts of length n1 */
- for ( i = 0; i < n2; i++ )
- {
- nextFFT( scratch + 2 * i * n1, n1 );
- }
- cnt = 0;
- for ( i = 0; i < n1; i++ )
- {
- for ( ii = 0; ii < n2; ii++ )
- {
- x[2 * cnt] = scratch[2 * ( i + ii * n1 )];
- x[2 * cnt + 1] = scratch[2 * ( i + ii * n1 ) + 1];
- cnt++;
- }
- }
- }
- else
- {
- assert( !"length not supported" );
- }
- }
- }
-
- return;
-}
-
-static void pfaDFT(
- float *x,
- const int16_t length,
- float *scratch1,
- const int16_t numFactors,
- const int16_t *factor )
-{
- int16_t i, ii;
- int16_t cnt;
-
- if ( numFactors > 1 )
- {
- float *tmp = scratch1;
- int16_t n1_inv = 1, n2_inv = 1;
- int16_t n2 = factor[0 /*idx*/];
- int16_t n1 = length / n2;
- int16_t idx, incr;
-
- while ( ( ( n1_inv * n1 ) % n2 ) != 1 )
- {
- n1_inv++;
- }
- while ( ( ( n2_inv * n2 ) % n1 ) != 1 )
- {
- n2_inv++;
- }
- idx = 0;
- incr = n1 * n1_inv;
- cnt = 0;
- for ( i = 0; i < n1; i++ )
- {
- for ( ii = 0; ii < n2 - 1; ii++ )
- {
- tmp[cnt++] = x[2 * idx];
- tmp[cnt++] = x[2 * idx + 1];
-
- idx += incr;
- if ( idx > length )
- {
- idx -= length;
- }
- }
- tmp[cnt++] = x[2 * idx];
- tmp[cnt++] = x[2 * idx + 1];
- idx++;
- }
- for ( cnt = 0; cnt < length; cnt += n2 )
- {
- cooleyTukeyFFT( tmp + 2 * cnt, n2, x + 2 * cnt );
- }
- for ( cnt = 0; cnt < n1; cnt++ )
- {
- for ( i = 0; i < n2; i++ )
- {
- x[2 * ( cnt + i * n1 )] = tmp[2 * ( cnt * n2 + i )];
- x[2 * ( cnt + i * n1 ) + 1] = tmp[2 * ( cnt * n2 + i ) + 1];
- }
- }
- for ( cnt = 0; cnt < length; cnt += n1 )
- {
- pfaDFT( x + 2 * cnt, n1, tmp, numFactors - 1, &factor[1] );
- }
- idx = 0;
- cnt = 0;
- for ( i = 0; i < n2; i++ )
- {
- idx = i * n1;
- for ( ii = 0; ii < n1; ii++ )
- {
- tmp[2 * idx] = x[cnt++];
- tmp[2 * idx + 1] = x[cnt++];
- idx += n2;
- if ( idx > length )
- {
- idx -= length;
- }
- }
- }
- for ( cnt = 0; cnt < length; cnt++ )
- {
- x[2 * cnt] = tmp[2 * cnt];
- x[2 * cnt + 1] = tmp[2 * cnt + 1];
- }
- }
- else
- {
- cooleyTukeyFFT( x, length, scratch1 );
- }
-
- return;
-}
-
-static void fftf_interleave(
- float *re,
- float *im,
- float *out,
- const int16_t len )
-{
- int16_t i = 0;
-
- for ( i = 0; i < len; i++ )
- {
- *out++ = *re++;
- *out++ = *im++;
- }
-
- return;
-}
-
-static void fftf_deinterleave(
- float *in,
- float *re,
- float *im,
- const int16_t len )
-{
- int16_t i = 0;
-
- for ( i = 0; i < len; i++ )
- {
- *re++ = *in++;
- *im++ = *in++;
- }
-
- return;
-}
-
-static void DoRTFT600(
- float *x, /* i/o: real part of input and output data */
- float *y /* i/o: imaginary part of input and output data */
-)
-{
- float scratch[1200], cmplx[1200];
- const int16_t factors[3] = { 25, 8, 3 };
-
- fftf_interleave( x, y, cmplx, 600 );
- pfaDFT( cmplx, 600, scratch, 3, factors );
- fftf_deinterleave( cmplx, x, y, 600 );
-
- return;
-}
-
-static void DoRTFT400(
- float *x, /* i/o: real part of input and output data */
- float *y /* i/o: imaginary part of input and output data */
-)
-{
- float scratch[800], cmplx[800];
- const int16_t factors[2] = { 25, 16 };
-
- fftf_interleave( x, y, cmplx, 400 );
- pfaDFT( cmplx, 400, scratch, 2, factors );
- fftf_deinterleave( cmplx, x, y, 400 );
-
-
- return;
-}
-
-static void DoRTFT240(
- float *x, /* i/o: real part of input and output data */
- float *y /* i/o: imaginary part of input and output data */
-)
-{
- float scratch[480], cmplx[480];
- const int16_t factors[3] = { 16, 5, 3 };
-
- fftf_interleave( x, y, cmplx, 240 );
- pfaDFT( cmplx, 240, scratch, 3, factors );
- fftf_deinterleave( cmplx, x, y, 240 );
-
- return;
-}
-
-static void DoRTFT200(
- float *x, /* i/o: real part of input and output data */
- float *y /* i/o: imaginary part of input and output data */
-)
-{
- float scratch[400], cmplx[400];
- const int16_t factors[2] = { 25, 8 };
-
- fftf_interleave( x, y, cmplx, 200 );
- pfaDFT( cmplx, 200, scratch, 2, factors );
- fftf_deinterleave( cmplx, x, y, 200 );
-
- return;
-}
-
-static void DoRTFT100(
- float *x, /* i/o: real part of input and output data */
- float *y /* i/o: imaginary part of input and output data */
-)
-{
- float scratch[200], cmplx[200];
- const int16_t factors[2] = { 25, 4 };
-
- fftf_interleave( x, y, cmplx, 100 );
- pfaDFT( cmplx, 100, scratch, 2, factors );
- fftf_deinterleave( cmplx, x, y, 100 );
-
- return;
-}
-
-
-void DoFFT(
- float *re2,
- float *im2,
- const int16_t length )
-{
- switch ( length )
- {
- case 600:
- DoRTFT600( re2, im2 );
- break;
- case 480:
- DoRTFT480( re2, im2 );
- break;
- case 400:
- DoRTFT400( re2, im2 );
- break;
- case 320:
- DoRTFT320( re2, im2 );
- break;
- case 256:
- DoRTFTn( re2, im2, 256 );
- break;
- case 240:
- DoRTFT240( re2, im2 );
- break;
- case 200:
- DoRTFT200( re2, im2 );
- break;
- case 160:
- DoRTFT160( re2, im2 );
- break;
- case 128:
- DoRTFT128( re2, im2 );
- break;
- case 120:
- DoRTFT120( re2, im2 );
- break;
- case 100:
- DoRTFT100( re2, im2 );
- break;
- case 80:
- DoRTFT80( re2, im2 );
- break;
- case 64:
- DoRTFTn( re2, im2, 64 );
- break;
- case 40:
- DoRTFT40( re2, im2 );
- break;
- case 20:
- DoRTFT20( re2, im2 );
- break;
- default:
- assert( !"fft is not supported!" );
- }
-
- return;
-}
-
-/*-----------------------------------------------------------------*
- * Low-complexity implementation of FFT
- *-----------------------------------------------------------------*/
-
-static void fft_len5(
- float *re,
- float *im,
- const int16_t s )
-{
- float x0, x1, x2, x3, x4;
- float r1, r2, r3, r4;
- float s1, s2, s3, s4;
- float t;
-
- x0 = re[s * 0];
- x1 = re[s * 1];
- x2 = re[s * 2];
- x3 = re[s * 3];
- x4 = re[s * 4];
-
- r1 = ( x1 + x4 );
- r4 = ( x1 - x4 );
- r3 = ( x2 + x3 );
- r2 = ( x2 - x3 );
- t = ( ( r1 - r3 ) * FFT_C54 );
- r1 = ( r1 + r3 );
- re[0] = ( x0 + r1 );
-
- r1 = ( re[0] + ( ( r1 * FFT_C55 ) ) );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( ( r4 + r2 ) * FFT_C51 );
-
- r4 = ( t + ( r4 * FFT_C52 ) );
- r2 = ( t + ( r2 * FFT_C53 ) );
-
- x0 = im[s * 0];
- x1 = im[s * 1];
- x2 = im[s * 2];
- x3 = im[s * 3];
- x4 = im[s * 4];
-
- s1 = ( x1 + x4 );
- s4 = ( x1 - x4 );
- s3 = ( x2 + x3 );
- s2 = ( x2 - x3 );
- t = ( ( s1 - s3 ) * FFT_C54 );
- s1 = ( s1 + s3 );
- im[0] = ( x0 + s1 );
-
- s1 = ( im[0] + ( s1 * FFT_C55 ) );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( ( s4 + s2 ) * FFT_C51 );
-
- s4 = ( t + ( s4 * FFT_C52 ) );
- s2 = ( t + ( s2 * FFT_C53 ) );
-
- re[s * 1] = ( r1 + s2 );
- re[s * 4] = ( r1 - s2 );
- re[s * 2] = ( r3 - s4 );
- re[s * 3] = ( r3 + s4 );
-
- im[s * 1] = ( s1 - r2 );
- im[s * 4] = ( s1 + r2 );
- im[s * 2] = ( s3 + r4 );
- im[s * 3] = ( s3 - r4 );
-
- return;
-}
-
-static void fft_len8(
- float *re,
- float *im,
- const int16_t s )
-{
- float x00, x01, x02, x03, x04, x05, x06, x07;
- float x08, x09, x10, x11, x12, x13, x14, x15;
- float t00, t01, t02, t03, t04, t05, t06, t07;
- float t08, t09, t10, t11, t12, t13, t14, t15;
- float s00, s01, s02, s03, s04, s05, s06, s07;
- float s08, s09, s10, s11, s12, s13, s14, s15;
-
- x00 = re[s * 0];
- x01 = im[s * 0];
- x02 = re[s * 1];
- x03 = im[s * 1];
- x04 = re[s * 2];
- x05 = im[s * 2];
- x06 = re[s * 3];
- x07 = im[s * 3];
- x08 = re[s * 4];
- x09 = im[s * 4];
- x10 = re[s * 5];
- x11 = im[s * 5];
- x12 = re[s * 6];
- x13 = im[s * 6];
- x14 = re[s * 7];
- x15 = im[s * 7];
-
- t00 = ( x00 + x08 );
- t02 = ( x00 - x08 );
- t01 = ( x01 + x09 );
- t03 = ( x01 - x09 );
- t04 = ( x02 + x10 );
- t06 = ( x02 - x10 );
- t05 = ( x03 + x11 );
- t07 = ( x03 - x11 );
- t08 = ( x04 + x12 );
- t10 = ( x04 - x12 );
- t09 = ( x05 + x13 );
- t11 = ( x05 - x13 );
- t12 = ( x06 + x14 );
- t14 = ( x06 - x14 );
- t13 = ( x07 + x15 );
- t15 = ( x07 - x15 );
-
- s00 = ( t00 + t08 );
- s04 = ( t00 - t08 );
- s01 = ( t01 + t09 );
- s05 = ( t01 - t09 );
- s08 = ( t02 - t11 );
- s10 = ( t02 + t11 );
- s09 = ( t03 + t10 );
- s11 = ( t03 - t10 );
- s02 = ( t04 + t12 );
- s07 = ( t04 - t12 );
- s03 = ( t05 + t13 );
- s06 = ( t13 - t05 );
-
- t01 = ( t06 + t14 );
- t02 = ( t06 - t14 );
- t00 = ( t07 + t15 );
- t03 = ( t07 - t15 );
-
- s12 = ( ( t00 + t02 ) * FFT_C81 );
- s14 = ( ( t00 - t02 ) * FFT_C81 );
- s13 = ( ( t03 - t01 ) * FFT_C81 );
- s15 = ( ( t01 + t03 ) * FFT_C82 );
-
- re[s * 0] = ( s00 + s02 );
- re[s * 4] = ( s00 - s02 );
- im[s * 0] = ( s01 + s03 );
- im[s * 4] = ( s01 - s03 );
- re[s * 2] = ( s04 - s06 );
- re[s * 6] = ( s04 + s06 );
- im[s * 2] = ( s05 - s07 );
- im[s * 6] = ( s05 + s07 );
- re[s * 3] = ( s08 + s14 );
- re[s * 7] = ( s08 - s14 );
- im[s * 3] = ( s09 + s15 );
- im[s * 7] = ( s09 - s15 );
- re[s * 1] = ( s10 + s12 );
- re[s * 5] = ( s10 - s12 );
- im[s * 1] = ( s11 + s13 );
- im[s * 5] = ( s11 - s13 );
-
- return;
-}
-
-static void fft_len10(
- float *re,
- float *im,
- const int16_t s )
-{
- float t;
- float x0, x1, x2, x3, x4;
- float r1, r2, r3, r4;
- float s1, s2, s3, s4;
- float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09;
- float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19;
-
- x0 = re[s * 0];
- x1 = re[s * 2];
- x2 = re[s * 4];
- x3 = re[s * 6];
- x4 = re[s * 8];
-
- r1 = ( x3 + x2 );
- r4 = ( x3 - x2 );
- r3 = ( x1 + x4 );
- r2 = ( x1 - x4 );
- t = ( ( r1 - r3 ) * FFT_C54 );
- r1 = ( r1 + r3 );
- y00 = ( x0 + r1 );
- r1 = ( y00 + ( ( r1 * FFT_C55 ) ) );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( ( ( r4 + r2 ) ) * FFT_C51 );
- r4 = ( t + ( r4 * FFT_C52 ) );
- r2 = ( t + ( r2 * FFT_C53 ) );
-
- x0 = im[s * 0];
- x1 = im[s * 2];
- x2 = im[s * 4];
- x3 = im[s * 6];
- x4 = im[s * 8];
-
- s1 = ( x3 + x2 );
- s4 = ( x3 - x2 );
- s3 = ( x1 + x4 );
- s2 = ( x1 - x4 );
- t = ( ( s1 - s3 ) * FFT_C54 );
- s1 = ( s1 + s3 );
- y01 = ( x0 + s1 );
- s1 = ( y01 + ( s1 * FFT_C55 ) );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( ( s4 + s2 ) * FFT_C51 );
- s4 = ( t + ( s4 * FFT_C52 ) );
- s2 = ( t + ( s2 * FFT_C53 ) );
-
- y04 = ( r1 + s2 );
- y16 = ( r1 - s2 );
- y08 = ( r3 - s4 );
- y12 = ( r3 + s4 );
-
- y05 = ( s1 - r2 );
- y17 = ( s1 + r2 );
- y09 = ( s3 + r4 );
- y13 = ( s3 - r4 );
-
- x0 = re[s * 5];
- x1 = re[s * 1];
- x2 = re[s * 3];
- x3 = re[s * 7];
- x4 = re[s * 9];
-
- r1 = ( x1 + x4 );
- r4 = ( x1 - x4 );
- r3 = ( x3 + x2 );
- r2 = ( x3 - x2 );
- t = ( ( r1 - r3 ) * FFT_C54 );
- r1 = ( r1 + r3 );
- y02 = ( x0 + r1 );
- r1 = ( y02 + ( ( r1 * FFT_C55 ) ) );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( ( ( r4 + r2 ) ) * FFT_C51 );
- r4 = ( t + ( r4 * FFT_C52 ) );
- r2 = ( t + ( r2 * FFT_C53 ) );
-
- x0 = im[s * 5];
- x1 = im[s * 1];
- x2 = im[s * 3];
- x3 = im[s * 7];
- x4 = im[s * 9];
-
- s1 = ( x1 + x4 );
- s4 = ( x1 - x4 );
- s3 = ( x3 + x2 );
- s2 = ( x3 - x2 );
- t = ( ( s1 - s3 ) * FFT_C54 );
- s1 = ( s1 + s3 );
- y03 = ( x0 + s1 );
- s1 = ( y03 + ( s1 * FFT_C55 ) );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( ( s4 + s2 ) * FFT_C51 );
- s4 = ( t + ( s4 * FFT_C52 ) );
- s2 = ( t + ( s2 * FFT_C53 ) );
-
- y06 = ( r1 + s2 );
- y18 = ( r1 - s2 );
- y10 = ( r3 - s4 );
- y14 = ( r3 + s4 );
-
- y07 = ( s1 - r2 );
- y19 = ( s1 + r2 );
- y11 = ( s3 + r4 );
- y15 = ( s3 - r4 );
-
- re[s * 0] = ( y00 + y02 );
- im[s * 0] = ( y01 + y03 );
- re[s * 5] = ( y00 - y02 );
- im[s * 5] = ( y01 - y03 );
-
- re[s * 2] = ( y04 + y06 );
- im[s * 2] = ( y05 + y07 );
- re[s * 7] = ( y04 - y06 );
- im[s * 7] = ( y05 - y07 );
-
- re[s * 4] = ( y08 + y10 );
- im[s * 4] = ( y09 + y11 );
- re[s * 9] = ( y08 - y10 );
- im[s * 9] = ( y09 - y11 );
-
- re[s * 6] = ( y12 + y14 );
- im[s * 6] = ( y13 + y15 );
- re[s * 1] = ( y12 - y14 );
- im[s * 1] = ( y13 - y15 );
-
- re[s * 8] = ( y16 + y18 );
- im[s * 8] = ( y17 + y19 );
- re[s * 3] = ( y16 - y18 );
- im[s * 3] = ( y17 - y19 );
-
- return;
-}
-
-static void fft_len15(
- float *re,
- float *im,
- const int16_t s )
-{
- float t;
- float r1, r2, r3, r4;
- float s1, s2, s3, s4;
- float x00, x01, x02, x03, x04, x05, x06, x07, x08, x09;
- float x10, x11, x12, x13, x14, x15, x16, x17, x18, x19;
- float x20, x21, x22, x23, x24, x25, x26, x27, x28, x29;
- float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09;
- float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19;
- float y20, y21, y22, y23, y24, y25, y26, y27, y28, y29;
-
- x00 = re[s * 0];
- x01 = im[s * 0];
- x02 = re[s * 3];
- x03 = im[s * 3];
- x04 = re[s * 6];
- x05 = im[s * 6];
- x06 = re[s * 9];
- x07 = im[s * 9];
- x08 = re[s * 12];
- x09 = im[s * 12];
-
- x10 = re[s * 5];
- x11 = im[s * 5];
- x12 = re[s * 8];
- x13 = im[s * 8];
- x14 = re[s * 11];
- x15 = im[s * 11];
- x16 = re[s * 14];
- x17 = im[s * 14];
- x18 = re[s * 2];
- x19 = im[s * 2];
-
- x20 = re[s * 10];
- x21 = im[s * 10];
- x22 = re[s * 13];
- x23 = im[s * 13];
- x24 = re[s * 1];
- x25 = im[s * 1];
- x26 = re[s * 4];
- x27 = im[s * 4];
- x28 = re[s * 7];
- x29 = im[s * 7];
-
- r1 = ( x02 + x08 );
- r4 = ( x02 - x08 );
- r3 = ( x04 + x06 );
- r2 = ( x04 - x06 );
- t = ( ( r1 - r3 ) * FFT_C54 );
- r1 = ( r1 + r3 );
- y00 = ( x00 + r1 );
- r1 = ( y00 + ( ( r1 * FFT_C55 ) ) );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( ( ( r4 + r2 ) ) * FFT_C51 );
- r4 = ( t + ( r4 * FFT_C52 ) );
- r2 = ( t + ( r2 * FFT_C53 ) );
-
- s1 = ( x03 + x09 );
- s4 = ( x03 - x09 );
- s3 = ( x05 + x07 );
- s2 = ( x05 - x07 );
- t = ( ( s1 - s3 ) * FFT_C54 );
- s1 = ( s1 + s3 );
- y01 = ( x01 + s1 );
- s1 = ( y01 + ( s1 * FFT_C55 ) );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( ( s4 + s2 ) * FFT_C51 );
- s4 = ( t + ( s4 * FFT_C52 ) );
- s2 = ( t + ( s2 * FFT_C53 ) );
-
- y02 = ( r1 + s2 );
- y08 = ( r1 - s2 );
- y04 = ( r3 - s4 );
- y06 = ( r3 + s4 );
-
- y03 = ( s1 - r2 );
- y09 = ( s1 + r2 );
- y05 = ( s3 + r4 );
- y07 = ( s3 - r4 );
-
- r1 = ( x12 + x18 );
- r4 = ( x12 - x18 );
- r3 = ( x14 + x16 );
- r2 = ( x14 - x16 );
- t = ( ( r1 - r3 ) * FFT_C54 );
- r1 = ( r1 + r3 );
- y10 = ( x10 + r1 );
- r1 = ( y10 + ( ( r1 * FFT_C55 ) ) );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( ( ( r4 + r2 ) ) * FFT_C51 );
- r4 = ( t + ( r4 * FFT_C52 ) );
- r2 = ( t + ( r2 * FFT_C53 ) );
-
- s1 = ( x13 + x19 );
- s4 = ( x13 - x19 );
- s3 = ( x15 + x17 );
- s2 = ( x15 - x17 );
- t = ( ( s1 - s3 ) * FFT_C54 );
- s1 = ( s1 + s3 );
- y11 = ( x11 + s1 );
- s1 = ( y11 + ( s1 * FFT_C55 ) );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( ( s4 + s2 ) * FFT_C51 );
- s4 = ( t + ( s4 * FFT_C52 ) );
- s2 = ( t + ( s2 * FFT_C53 ) );
-
- y12 = ( r1 + s2 );
- y18 = ( r1 - s2 );
- y14 = ( r3 - s4 );
- y16 = ( r3 + s4 );
-
- y13 = ( s1 - r2 );
- y19 = ( s1 + r2 );
- y15 = ( s3 + r4 );
- y17 = ( s3 - r4 );
-
- r1 = ( x22 + x28 );
- r4 = ( x22 - x28 );
- r3 = ( x24 + x26 );
- r2 = ( x24 - x26 );
- t = ( ( r1 - r3 ) * FFT_C54 );
- r1 = ( r1 + r3 );
- y20 = ( x20 + r1 );
- r1 = ( y20 + ( ( r1 * FFT_C55 ) ) );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( ( ( r4 + r2 ) ) * FFT_C51 );
- r4 = ( t + ( r4 * FFT_C52 ) );
- r2 = ( t + ( r2 * FFT_C53 ) );
-
- s1 = ( x23 + x29 );
- s4 = ( x23 - x29 );
- s3 = ( x25 + x27 );
- s2 = ( x25 - x27 );
- t = ( ( s1 - s3 ) * FFT_C54 );
- s1 = ( s1 + s3 );
- y21 = ( x21 + s1 );
- s1 = ( y21 + ( s1 * FFT_C55 ) );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( ( s4 + s2 ) * FFT_C51 );
- s4 = ( t + ( s4 * FFT_C52 ) );
- s2 = ( t + ( s2 * FFT_C53 ) );
-
- y22 = ( r1 + s2 );
- y28 = ( r1 - s2 );
- y24 = ( r3 - s4 );
- y26 = ( r3 + s4 );
-
- y23 = ( s1 - r2 );
- y29 = ( s1 + r2 );
- y25 = ( s3 + r4 );
- y27 = ( s3 - r4 );
-
- r1 = ( y10 + y20 );
- r2 = ( ( y10 - y20 ) * FFT_C31 );
- re[s * 0] = ( y00 + r1 );
- r1 = ( y00 - r1 * 0.5f );
-
- s1 = ( y11 + y21 );
- s2 = ( ( y11 - y21 ) * FFT_C31 );
- im[s * 0] = ( y01 + s1 );
- s1 = ( y01 - s1 * 0.5f );
-
- re[s * 10] = ( r1 - s2 );
- re[s * 5] = ( r1 + s2 );
- im[s * 10] = ( s1 + r2 );
- im[s * 5] = ( s1 - r2 );
-
- r1 = ( y12 + y22 );
- r2 = ( ( y12 - y22 ) * FFT_C31 );
- re[s * 6] = ( y02 + r1 );
- r1 = ( y02 - r1 * 0.5f );
-
- s1 = ( y13 + y23 );
- s2 = ( ( y13 - y23 ) * FFT_C31 );
- im[s * 6] = ( y03 + s1 );
- s1 = ( y03 - s1 * 0.5f );
-
- re[s * 1] = ( r1 - s2 );
- re[s * 11] = ( r1 + s2 );
- im[s * 1] = ( s1 + r2 );
- im[s * 11] = ( s1 - r2 );
-
- r1 = ( y14 + y24 );
- r2 = ( ( y14 - y24 ) * FFT_C31 );
- re[s * 12] = ( y04 + r1 );
- r1 = ( y04 - r1 * 0.5f );
-
- s1 = ( y15 + y25 );
- s2 = ( ( y15 - y25 ) * FFT_C31 );
- im[s * 12] = ( y05 + s1 );
- s1 = ( y05 - s1 * 0.5f );
-
- re[s * 7] = ( r1 - s2 );
- re[s * 2] = ( r1 + s2 );
- im[s * 7] = ( s1 + r2 );
- im[s * 2] = ( s1 - r2 );
-
- r1 = ( y16 + y26 );
- r2 = ( ( y16 - y26 ) * FFT_C31 );
- re[s * 3] = ( y06 + r1 );
- r1 = ( y06 - r1 * 0.5f );
-
- s1 = ( y17 + y27 );
- s2 = ( ( y17 - y27 ) * FFT_C31 );
- im[s * 3] = ( y07 + s1 );
- s1 = ( y07 - s1 * 0.5f );
-
- re[s * 13] = ( r1 - s2 );
- re[s * 8] = ( r1 + s2 );
- im[s * 13] = ( s1 + r2 );
- im[s * 8] = ( s1 - r2 );
-
- r1 = ( y18 + y28 );
- r2 = ( ( y18 - y28 ) * FFT_C31 );
- re[s * 9] = ( y08 + r1 );
- r1 = ( y08 - r1 * 0.5f );
-
- s1 = ( y19 + y29 );
- s2 = ( ( y19 - y29 ) * FFT_C31 );
- im[s * 9] = ( y09 + s1 );
- s1 = ( y09 - s1 * 0.5f );
-
- re[s * 4] = ( r1 - s2 );
- re[s * 14] = ( r1 + s2 );
- im[s * 4] = ( s1 + r2 );
- im[s * 14] = ( s1 - r2 );
-
- return;
-}
-
-static void fft_len16(
- float *re,
- float *im,
- const int16_t s )
-{
- float x0, x1, x2, x3, x4, x5, x6, x7;
- float t0, t1, t2, t3, t4, t5, t6, t7;
- float y00, y01, y02, y03, y04, y05, y06, y07;
- float y08, y09, y10, y11, y12, y13, y14, y15;
- float y16, y17, y18, y19, y20, y21, y22, y23;
- float y24, y25, y26, y27, y28, y29, y30, y31;
-
- x0 = re[s * 0];
- x1 = im[s * 0];
- x2 = re[s * 4];
- x3 = im[s * 4];
- x4 = re[s * 8];
- x5 = im[s * 8];
- x6 = re[s * 12];
- x7 = im[s * 12];
-
- t0 = ( x0 + x4 );
- t2 = ( x0 - x4 );
- t1 = ( x1 + x5 );
- t3 = ( x1 - x5 );
- t4 = ( x2 + x6 );
- t7 = ( x2 - x6 );
- t5 = ( x7 + x3 );
- t6 = ( x7 - x3 );
-
- y00 = ( t0 + t4 );
- y01 = ( t1 + t5 );
- y02 = ( t2 - t6 );
- y03 = ( t3 - t7 );
- y04 = ( t0 - t4 );
- y05 = ( t1 - t5 );
- y06 = ( t2 + t6 );
- y07 = ( t3 + t7 );
-
- x0 = re[s * 1];
- x1 = im[s * 1];
- x2 = re[s * 5];
- x3 = im[s * 5];
- x4 = re[s * 9];
- x5 = im[s * 9];
- x6 = re[s * 13];
- x7 = im[s * 13];
-
- t0 = ( x0 + x4 );
- t2 = ( x0 - x4 );
- t1 = ( x1 + x5 );
- t3 = ( x1 - x5 );
- t4 = ( x2 + x6 );
- t7 = ( x2 - x6 );
- t5 = ( x7 + x3 );
- t6 = ( x7 - x3 );
-
- y08 = ( t0 + t4 );
- y09 = ( t1 + t5 );
- y10 = ( t2 - t6 );
- y11 = ( t3 - t7 );
- y12 = ( t0 - t4 );
- y13 = ( t1 - t5 );
- y14 = ( t2 + t6 );
- y15 = ( t3 + t7 );
-
- x0 = re[s * 2];
- x1 = im[s * 2];
- x2 = re[s * 6];
- x3 = im[s * 6];
- x4 = re[s * 10];
- x5 = im[s * 10];
- x6 = re[s * 14];
- x7 = im[s * 14];
-
- t0 = ( x0 + x4 );
- t2 = ( x0 - x4 );
- t1 = ( x1 + x5 );
- t3 = ( x1 - x5 );
- t4 = ( x2 + x6 );
- t7 = ( x2 - x6 );
- t5 = ( x7 + x3 );
- t6 = ( x7 - x3 );
-
- y16 = ( t0 + t4 );
- y17 = ( t1 + t5 );
- y18 = ( t2 - t6 );
- y19 = ( t3 - t7 );
- y20 = ( t1 - t5 );
- y21 = ( t4 - t0 );
- y22 = ( t2 + t6 );
- y23 = ( t3 + t7 );
-
- x0 = re[s * 3];
- x1 = im[s * 3];
- x2 = re[s * 7];
- x3 = im[s * 7];
- x4 = re[s * 11];
- x5 = im[s * 11];
- x6 = re[s * 15];
- x7 = im[s * 15];
-
- t0 = ( x0 + x4 );
- t2 = ( x0 - x4 );
- t1 = ( x1 + x5 );
- t3 = ( x1 - x5 );
- t4 = ( x2 + x6 );
- t7 = ( x2 - x6 );
- t5 = ( x7 + x3 );
- t6 = ( x7 - x3 );
-
- y24 = ( t0 + t4 );
- y25 = ( t1 + t5 );
- y26 = ( t2 - t6 );
- y27 = ( t3 - t7 );
- y28 = ( t0 - t4 );
- y29 = ( t1 - t5 );
- y30 = ( t2 + t6 );
- y31 = ( t3 + t7 );
-
- x0 = ( y22 * FFT_C162 );
- x1 = ( y23 * FFT_C162 );
- y22 = ( x0 - x1 );
- y23 = ( x0 + x1 );
-
- x0 = ( y28 * FFT_C162 );
- x1 = ( y29 * FFT_C162 );
- y28 = ( x0 - x1 );
- y29 = ( x0 + x1 );
-
- x0 = ( y12 * FFT_C161 );
- x1 = ( y13 * FFT_C161 );
- y12 = ( x0 + x1 );
- y13 = ( x1 - x0 );
-
- x0 = ( y18 * FFT_C161 );
- x1 = ( y19 * FFT_C161 );
- y18 = ( x0 + x1 );
- y19 = ( x1 - x0 );
-
- x0 = ( y10 * FFT_C163 );
- x1 = ( y11 * FFT_C166 );
- x2 = ( y10 * FFT_C166 );
- x3 = ( y11 * FFT_C163 );
- y10 = ( x0 - x1 );
- y11 = ( x2 + x3 );
-
- x0 = ( y14 * FFT_C165 );
- x1 = ( y15 * FFT_C164 );
- x2 = ( y14 * FFT_C164 );
- x3 = ( y15 * FFT_C165 );
- y14 = ( x0 - x1 );
- y15 = ( x2 + x3 );
-
- x0 = ( y26 * FFT_C165 );
- x1 = ( y27 * FFT_C164 );
- x2 = ( y26 * FFT_C164 );
- x3 = ( y27 * FFT_C165 );
- y26 = ( x0 - x1 );
- y27 = ( x2 + x3 );
-
- x0 = ( y30 * FFT_C164 );
- x1 = ( y31 * FFT_C165 );
- x2 = ( y30 * FFT_C165 );
- x3 = ( y31 * FFT_C164 );
- y30 = ( x0 - x1 );
- y31 = ( x2 + x3 );
-
- t0 = ( y00 + y16 );
- t2 = ( y00 - y16 );
- t1 = ( y01 + y17 );
- t3 = ( y01 - y17 );
- t4 = ( y08 + y24 );
- t7 = ( y08 - y24 );
- t5 = ( y25 + y09 );
- t6 = ( y25 - y09 );
-
- re[s * 0] = ( t0 + t4 );
- im[s * 0] = ( t1 + t5 );
- re[s * 4] = ( t2 - t6 );
- im[s * 4] = ( t3 - t7 );
- re[s * 8] = ( t0 - t4 );
- im[s * 8] = ( t1 - t5 );
- re[s * 12] = ( t2 + t6 );
- im[s * 12] = ( t3 + t7 );
-
- t0 = ( y02 + y18 );
- t2 = ( y02 - y18 );
- t1 = ( y03 + y19 );
- t3 = ( y03 - y19 );
- t4 = ( y10 + y26 );
- t7 = ( y10 - y26 );
- t5 = ( y27 + y11 );
- t6 = ( y27 - y11 );
-
- re[s * 1] = ( t0 + t4 );
- im[s * 1] = ( t1 + t5 );
- re[s * 5] = ( t2 - t6 );
- im[s * 5] = ( t3 - t7 );
- re[s * 9] = ( t0 - t4 );
- im[s * 9] = ( t1 - t5 );
- re[s * 13] = ( t2 + t6 );
- im[s * 13] = ( t3 + t7 );
-
- t0 = ( y04 + y20 );
- t2 = ( y04 - y20 );
- t1 = ( y05 + y21 );
- t3 = ( y05 - y21 );
- t4 = ( y12 + y28 );
- t7 = ( y12 - y28 );
- t5 = ( y29 + y13 );
- t6 = ( y29 - y13 );
-
- re[s * 2] = ( t0 + t4 );
- im[s * 2] = ( t1 + t5 );
- re[s * 6] = ( t2 - t6 );
- im[s * 6] = ( t3 - t7 );
- re[s * 10] = ( t0 - t4 );
- im[s * 10] = ( t1 - t5 );
- re[s * 14] = ( t2 + t6 );
- im[s * 14] = ( t3 + t7 );
-
- t0 = ( y06 + y22 );
- t2 = ( y06 - y22 );
- t1 = ( y07 + y23 );
- t3 = ( y07 - y23 );
- t4 = ( y14 + y30 );
- t7 = ( y14 - y30 );
- t5 = ( y31 + y15 );
- t6 = ( y31 - y15 );
-
- re[s * 3] = ( t0 + t4 );
- im[s * 3] = ( t1 + t5 );
- re[s * 7] = ( t2 - t6 );
- im[s * 7] = ( t3 - t7 );
- re[s * 11] = ( t0 - t4 );
- im[s * 11] = ( t1 - t5 );
- re[s * 15] = ( t2 + t6 );
- im[s * 15] = ( t3 + t7 );
-
- return;
-}
-
-static void fft_len20(
- float *re,
- float *im,
- const int16_t s )
-{
- float r1, r2, r3, r4;
- float s1, s2, s3, s4;
- float x0, x1, x2, x3, x4;
- float t, t0, t1, t2, t3, t4, t5, t6, t7;
- float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09;
- float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19;
- float y20, y21, y22, y23, y24, y25, y26, y27, y28, y29;
- float y30, y31, y32, y33, y34, y35, y36, y37, y38, y39;
-
- x0 = re[s * 0];
- x1 = re[s * 16];
- x2 = re[s * 12];
- x3 = re[s * 8];
- x4 = re[s * 4];
-
- r1 = ( x1 + x4 );
- r4 = ( x1 - x4 );
- r3 = ( x2 + x3 );
- r2 = ( x2 - x3 );
- t = ( ( r1 - r3 ) * FFT_C54 );
- r1 = ( r1 + r3 );
- y00 = ( x0 + r1 );
- r1 = ( y00 + ( ( r1 * FFT_C55 ) ) );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( ( ( r4 + r2 ) ) * FFT_C51 );
- r4 = ( t + ( r4 * FFT_C52 ) );
- r2 = ( t + ( r2 * FFT_C53 ) );
-
- x0 = im[s * 0];
- x1 = im[s * 16];
- x2 = im[s * 12];
- x3 = im[s * 8];
- x4 = im[s * 4];
-
- s1 = ( x1 + x4 );
- s4 = ( x1 - x4 );
- s3 = ( x2 + x3 );
- s2 = ( x2 - x3 );
- t = ( ( s1 - s3 ) * FFT_C54 );
- s1 = ( s1 + s3 );
- y01 = ( x0 + s1 );
- s1 = ( y01 + ( s1 * FFT_C55 ) );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( ( s4 + s2 ) * FFT_C51 );
- s4 = ( t + ( s4 * FFT_C52 ) );
- s2 = ( t + ( s2 * FFT_C53 ) );
-
- y08 = ( r1 + s2 );
- y32 = ( r1 - s2 );
- y16 = ( r3 - s4 );
- y24 = ( r3 + s4 );
-
- y09 = ( s1 - r2 );
- y33 = ( s1 + r2 );
- y17 = ( s3 + r4 );
- y25 = ( s3 - r4 );
-
- x0 = re[s * 5];
- x1 = re[s * 1];
- x2 = re[s * 17];
- x3 = re[s * 13];
- x4 = re[s * 9];
-
- r1 = ( x1 + x4 );
- r4 = ( x1 - x4 );
- r3 = ( x2 + x3 );
- r2 = ( x2 - x3 );
- t = ( ( r1 - r3 ) * FFT_C54 );
- r1 = ( r1 + r3 );
- y02 = ( x0 + r1 );
- r1 = ( y02 + ( ( r1 * FFT_C55 ) ) );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( ( ( r4 + r2 ) ) * FFT_C51 );
- r4 = ( t + ( r4 * FFT_C52 ) );
- r2 = ( t + ( r2 * FFT_C53 ) );
-
- x0 = im[s * 5];
- x1 = im[s * 1];
- x2 = im[s * 17];
- x3 = im[s * 13];
- x4 = im[s * 9];
-
- s1 = ( x1 + x4 );
- s4 = ( x1 - x4 );
- s3 = ( x2 + x3 );
- s2 = ( x2 - x3 );
- t = ( ( s1 - s3 ) * FFT_C54 );
- s1 = ( s1 + s3 );
- y03 = ( x0 + s1 );
- s1 = ( y03 + ( s1 * FFT_C55 ) );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( ( s4 + s2 ) * FFT_C51 );
- s4 = ( t + ( s4 * FFT_C52 ) );
- s2 = ( t + ( s2 * FFT_C53 ) );
-
- y10 = ( r1 + s2 );
- y34 = ( r1 - s2 );
- y18 = ( r3 - s4 );
- y26 = ( r3 + s4 );
-
- y11 = ( s1 - r2 );
- y35 = ( s1 + r2 );
- y19 = ( s3 + r4 );
- y27 = ( s3 - r4 );
-
- x0 = re[s * 10];
- x1 = re[s * 6];
- x2 = re[s * 2];
- x3 = re[s * 18];
- x4 = re[s * 14];
-
- r1 = ( x1 + x4 );
- r4 = ( x1 - x4 );
- r3 = ( x2 + x3 );
- r2 = ( x2 - x3 );
- t = ( ( r1 - r3 ) * FFT_C54 );
- r1 = ( r1 + r3 );
- y04 = ( x0 + r1 );
- r1 = ( y04 + ( ( r1 * FFT_C55 ) ) );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( ( ( r4 + r2 ) ) * FFT_C51 );
- r4 = ( t + ( r4 * FFT_C52 ) );
- r2 = ( t + ( r2 * FFT_C53 ) );
-
- x0 = im[s * 10];
- x1 = im[s * 6];
- x2 = im[s * 2];
- x3 = im[s * 18];
- x4 = im[s * 14];
-
- s1 = ( x1 + x4 );
- s4 = ( x1 - x4 );
- s3 = ( x2 + x3 );
- s2 = ( x2 - x3 );
- t = ( ( s1 - s3 ) * FFT_C54 );
- s1 = ( s1 + s3 );
- y05 = ( x0 + s1 );
- s1 = ( y05 + ( s1 * FFT_C55 ) );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( ( s4 + s2 ) * FFT_C51 );
- s4 = ( t + ( s4 * FFT_C52 ) );
- s2 = ( t + ( s2 * FFT_C53 ) );
-
- y12 = ( r1 + s2 );
- y36 = ( r1 - s2 );
- y20 = ( r3 - s4 );
- y28 = ( r3 + s4 );
-
- y13 = ( s1 - r2 );
- y37 = ( s1 + r2 );
- y21 = ( s3 + r4 );
- y29 = ( s3 - r4 );
-
- x0 = re[s * 15];
- x1 = re[s * 11];
- x2 = re[s * 7];
- x3 = re[s * 3];
- x4 = re[s * 19];
-
- r1 = ( x1 + x4 );
- r4 = ( x1 - x4 );
- r3 = ( x2 + x3 );
- r2 = ( x2 - x3 );
- t = ( ( r1 - r3 ) * FFT_C54 );
- r1 = ( r1 + r3 );
- y06 = ( x0 + r1 );
- r1 = ( y06 + ( ( r1 * FFT_C55 ) ) );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( ( ( r4 + r2 ) ) * FFT_C51 );
- r4 = ( t + ( r4 * FFT_C52 ) );
- r2 = ( t + ( r2 * FFT_C53 ) );
-
- x0 = im[s * 15];
- x1 = im[s * 11];
- x2 = im[s * 7];
- x3 = im[s * 3];
- x4 = im[s * 19];
-
- s1 = ( x1 + x4 );
- s4 = ( x1 - x4 );
- s3 = ( x2 + x3 );
- s2 = ( x2 - x3 );
- t = ( ( s1 - s3 ) * FFT_C54 );
- s1 = ( s1 + s3 );
- y07 = ( x0 + s1 );
- s1 = ( y07 + ( s1 * FFT_C55 ) );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( ( s4 + s2 ) * FFT_C51 );
- s4 = ( t + ( s4 * FFT_C52 ) );
- s2 = ( t + ( s2 * FFT_C53 ) );
-
- y14 = ( r1 + s2 );
- y38 = ( r1 - s2 );
- y22 = ( r3 - s4 );
- y30 = ( r3 + s4 );
-
- y15 = ( s1 - r2 );
- y39 = ( s1 + r2 );
- y23 = ( s3 + r4 );
- y31 = ( s3 - r4 );
-
- t0 = ( y00 + y04 );
- t2 = ( y00 - y04 );
- t1 = ( y01 + y05 );
- t3 = ( y01 - y05 );
- t4 = ( y02 + y06 );
- t7 = ( y02 - y06 );
- t5 = ( y07 + y03 );
- t6 = ( y07 - y03 );
-
- re[s * 0] = ( t0 + t4 );
- im[s * 0] = ( t1 + t5 );
- re[s * 5] = ( t2 - t6 );
- im[s * 5] = ( t3 - t7 );
- re[s * 10] = ( t0 - t4 );
- im[s * 10] = ( t1 - t5 );
- re[s * 15] = ( t2 + t6 );
- im[s * 15] = ( t3 + t7 );
-
- t0 = ( y08 + y12 );
- t2 = ( y08 - y12 );
- t1 = ( y09 + y13 );
- t3 = ( y09 - y13 );
- t4 = ( y10 + y14 );
- t7 = ( y10 - y14 );
- t5 = ( y15 + y11 );
- t6 = ( y15 - y11 );
-
- re[s * 4] = ( t0 + t4 );
- im[s * 4] = ( t1 + t5 );
- re[s * 9] = ( t2 - t6 );
- im[s * 9] = ( t3 - t7 );
- re[s * 14] = ( t0 - t4 );
- im[s * 14] = ( t1 - t5 );
- re[s * 19] = ( t2 + t6 );
- im[s * 19] = ( t3 + t7 );
-
- t0 = ( y16 + y20 );
- t2 = ( y16 - y20 );
- t1 = ( y17 + y21 );
- t3 = ( y17 - y21 );
- t4 = ( y18 + y22 );
- t7 = ( y18 - y22 );
- t5 = ( y23 + y19 );
- t6 = ( y23 - y19 );
-
- re[s * 8] = ( t0 + t4 );
- im[s * 8] = ( t1 + t5 );
- re[s * 13] = ( t2 - t6 );
- im[s * 13] = ( t3 - t7 );
- re[s * 18] = ( t0 - t4 );
- im[s * 18] = ( t1 - t5 );
- re[s * 3] = ( t2 + t6 );
- im[s * 3] = ( t3 + t7 );
-
- t0 = ( y24 + y28 );
- t2 = ( y24 - y28 );
- t1 = ( y25 + y29 );
- t3 = ( y25 - y29 );
- t4 = ( y26 + y30 );
- t7 = ( y26 - y30 );
- t5 = ( y31 + y27 );
- t6 = ( y31 - y27 );
-
- re[s * 12] = ( t0 + t4 );
- im[s * 12] = ( t1 + t5 );
- re[s * 17] = ( t2 - t6 );
- im[s * 17] = ( t3 - t7 );
- re[s * 2] = ( t0 - t4 );
- im[s * 2] = ( t1 - t5 );
- re[s * 7] = ( t2 + t6 );
- im[s * 7] = ( t3 + t7 );
-
- t0 = ( y32 + y36 );
- t2 = ( y32 - y36 );
- t1 = ( y33 + y37 );
- t3 = ( y33 - y37 );
- t4 = ( y34 + y38 );
- t7 = ( y34 - y38 );
- t5 = ( y39 + y35 );
- t6 = ( y39 - y35 );
-
- re[s * 16] = ( t0 + t4 );
- im[s * 16] = ( t1 + t5 );
- re[s * 1] = ( t2 - t6 );
- im[s * 1] = ( t3 - t7 );
- re[s * 6] = ( t0 - t4 );
- im[s * 6] = ( t1 - t5 );
- re[s * 11] = ( t2 + t6 );
- im[s * 11] = ( t3 + t7 );
-
- return;
-}
-
-static void fft_len30(
- float *re,
- float *im,
- const int16_t s )
-{
- float t;
- float r1, r2, r3, r4;
- float s1, s2, s3, s4;
- float x00, x01, x02, x03, x04, x05, x06, x07, x08, x09;
- float x10, x11, x12, x13, x14, x15, x16, x17, x18, x19;
- float x20, x21, x22, x23, x24, x25, x26, x27, x28, x29;
-
- float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09;
- float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19;
- float y20, y21, y22, y23, y24, y25, y26, y27, y28, y29;
-
- float z00, z01, z02, z03, z04, z05, z06, z07, z08, z09;
- float z10, z11, z12, z13, z14, z15, z16, z17, z18, z19;
- float z20, z21, z22, z23, z24, z25, z26, z27, z28, z29;
- float z30, z31, z32, z33, z34, z35, z36, z37, z38, z39;
- float z40, z41, z42, z43, z44, z45, z46, z47, z48, z49;
- float z50, z51, z52, z53, z54, z55, z56, z57, z58, z59;
-
- float *rel, *reh, *iml, *imh;
-
- rel = &re[s * 0];
- reh = &re[s * 15];
- iml = &im[s * 0];
- imh = &im[s * 15];
-
- x00 = re[s * 0];
- x01 = im[s * 0];
- x02 = re[s * 18];
- x03 = im[s * 18];
- x04 = re[s * 6];
- x05 = im[s * 6];
- x06 = re[s * 24];
- x07 = im[s * 24];
- x08 = re[s * 12];
- x09 = im[s * 12];
-
- x10 = re[s * 20];
- x11 = im[s * 20];
- x12 = re[s * 8];
- x13 = im[s * 8];
- x14 = re[s * 26];
- x15 = im[s * 26];
- x16 = re[s * 14];
- x17 = im[s * 14];
- x18 = re[s * 2];
- x19 = im[s * 2];
-
- x20 = re[s * 10];
- x21 = im[s * 10];
- x22 = re[s * 28];
- x23 = im[s * 28];
- x24 = re[s * 16];
- x25 = im[s * 16];
- x26 = re[s * 4];
- x27 = im[s * 4];
- x28 = re[s * 22];
- x29 = im[s * 22];
-
- r1 = ( x02 + x08 );
- r4 = ( x02 - x08 );
- r3 = ( x04 + x06 );
- r2 = ( x04 - x06 );
- t = ( ( r1 - r3 ) * FFT_C54 );
- r1 = ( r1 + r3 );
- y00 = ( x00 + r1 );
- r1 = ( y00 + ( ( r1 * FFT_C55 ) ) );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( ( ( r4 + r2 ) ) * FFT_C51 );
- r4 = ( t + ( r4 * FFT_C52 ) );
- r2 = ( t + ( r2 * FFT_C53 ) );
-
- s1 = ( x03 + x09 );
- s4 = ( x03 - x09 );
- s3 = ( x05 + x07 );
- s2 = ( x05 - x07 );
- t = ( ( s1 - s3 ) * FFT_C54 );
- s1 = ( s1 + s3 );
- y01 = ( x01 + s1 );
- s1 = ( y01 + ( s1 * FFT_C55 ) );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( ( s4 + s2 ) * FFT_C51 );
- s4 = ( t + ( s4 * FFT_C52 ) );
- s2 = ( t + ( s2 * FFT_C53 ) );
-
- y02 = ( r1 + s2 );
- y08 = ( r1 - s2 );
- y04 = ( r3 - s4 );
- y06 = ( r3 + s4 );
-
- y03 = ( s1 - r2 );
- y09 = ( s1 + r2 );
- y05 = ( s3 + r4 );
- y07 = ( s3 - r4 );
-
- r1 = ( x12 + x18 );
- r4 = ( x12 - x18 );
- r3 = ( x14 + x16 );
- r2 = ( x14 - x16 );
- t = ( ( r1 - r3 ) * FFT_C54 );
- r1 = ( r1 + r3 );
- y10 = ( x10 + r1 );
- r1 = ( y10 + ( ( r1 * FFT_C55 ) ) );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( ( ( r4 + r2 ) ) * FFT_C51 );
- r4 = ( t + ( r4 * FFT_C52 ) );
- r2 = ( t + ( r2 * FFT_C53 ) );
-
- s1 = ( x13 + x19 );
- s4 = ( x13 - x19 );
- s3 = ( x15 + x17 );
- s2 = ( x15 - x17 );
- t = ( ( s1 - s3 ) * FFT_C54 );
- s1 = ( s1 + s3 );
- y11 = ( x11 + s1 );
- s1 = ( y11 + ( s1 * FFT_C55 ) );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( ( s4 + s2 ) * FFT_C51 );
- s4 = ( t + ( s4 * FFT_C52 ) );
- s2 = ( t + ( s2 * FFT_C53 ) );
-
- y12 = ( r1 + s2 );
- y18 = ( r1 - s2 );
- y14 = ( r3 - s4 );
- y16 = ( r3 + s4 );
-
- y13 = ( s1 - r2 );
- y19 = ( s1 + r2 );
- y15 = ( s3 + r4 );
- y17 = ( s3 - r4 );
-
- r1 = ( x22 + x28 );
- r4 = ( x22 - x28 );
- r3 = ( x24 + x26 );
- r2 = ( x24 - x26 );
- t = ( ( r1 - r3 ) * FFT_C54 );
- r1 = ( r1 + r3 );
- y20 = ( x20 + r1 );
- r1 = ( y20 + ( ( r1 * FFT_C55 ) ) );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( ( ( r4 + r2 ) ) * FFT_C51 );
- r4 = ( t + ( r4 * FFT_C52 ) );
- r2 = ( t + ( r2 * FFT_C53 ) );
-
- s1 = ( x23 + x29 );
- s4 = ( x23 - x29 );
- s3 = ( x25 + x27 );
- s2 = ( x25 - x27 );
- t = ( ( s1 - s3 ) * FFT_C54 );
- s1 = ( s1 + s3 );
- y21 = ( x21 + s1 );
- s1 = ( y21 + ( s1 * FFT_C55 ) );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( ( s4 + s2 ) * FFT_C51 );
- s4 = ( t + ( s4 * FFT_C52 ) );
- s2 = ( t + ( s2 * FFT_C53 ) );
-
- y22 = ( r1 + s2 );
- y28 = ( r1 - s2 );
- y24 = ( r3 - s4 );
- y26 = ( r3 + s4 );
-
- y23 = ( s1 - r2 );
- y29 = ( s1 + r2 );
- y25 = ( s3 + r4 );
- y27 = ( s3 - r4 );
-
- r1 = ( y10 + y20 );
- r2 = ( ( y10 - y20 ) * FFT_C31 );
- z00 = ( y00 + r1 );
- r1 = ( y00 - r1 * 0.5f );
-
- s1 = ( y11 + y21 );
- s2 = ( ( y11 - y21 ) * FFT_C31 );
- z01 = ( y01 + s1 );
- s1 = ( y01 - s1 * 0.5f );
-
- z20 = ( r1 - s2 );
- z10 = ( r1 + s2 );
- z21 = ( s1 + r2 );
- z11 = ( s1 - r2 );
-
- r1 = ( y12 + y22 );
- r2 = ( ( y12 - y22 ) * FFT_C31 );
- z12 = ( y02 + r1 );
- r1 = ( y02 - r1 * 0.5f );
-
- s1 = ( y13 + y23 );
- s2 = ( ( y13 - y23 ) * FFT_C31 );
- z13 = ( y03 + s1 );
- s1 = ( y03 - s1 * 0.5f );
-
- z02 = ( r1 - s2 );
- z22 = ( r1 + s2 );
- z03 = ( s1 + r2 );
- z23 = ( s1 - r2 );
-
- r1 = ( y14 + y24 );
- r2 = ( ( y14 - y24 ) * FFT_C31 );
- z24 = ( y04 + r1 );
- r1 = ( y04 - r1 * 0.5f );
-
- s1 = ( y15 + y25 );
- s2 = ( ( y15 - y25 ) * FFT_C31 );
- z25 = ( y05 + s1 );
- s1 = ( y05 - s1 * 0.5f );
-
- z14 = ( r1 - s2 );
- z04 = ( r1 + s2 );
- z15 = ( s1 + r2 );
- z05 = ( s1 - r2 );
-
- r1 = ( y16 + y26 );
- r2 = ( ( y16 - y26 ) * FFT_C31 );
- z06 = ( y06 + r1 );
- r1 = ( y06 - r1 * 0.5f );
-
- s1 = ( y17 + y27 );
- s2 = ( ( y17 - y27 ) * FFT_C31 );
- z07 = ( y07 + s1 );
- s1 = ( y07 - s1 * 0.5f );
-
- z26 = ( r1 - s2 );
- z16 = ( r1 + s2 );
- z27 = ( s1 + r2 );
- z17 = ( s1 - r2 );
-
- r1 = ( y18 + y28 );
- r2 = ( ( y18 - y28 ) * FFT_C31 );
- z18 = ( y08 + r1 );
- r1 = ( y08 - r1 * 0.5f );
-
- s1 = ( y19 + y29 );
- s2 = ( ( y19 - y29 ) * FFT_C31 );
- z19 = ( y09 + s1 );
- s1 = ( y09 - s1 * 0.5f );
-
- z08 = ( r1 - s2 );
- z28 = ( r1 + s2 );
- z09 = ( s1 + r2 );
- z29 = ( s1 - r2 );
-
- x00 = re[s * 15];
- x01 = im[s * 15];
- x02 = re[s * 3];
- x03 = im[s * 3];
- x04 = re[s * 21];
- x05 = im[s * 21];
- x06 = re[s * 9];
- x07 = im[s * 9];
- x08 = re[s * 27];
- x09 = im[s * 27];
-
- x10 = re[s * 5];
- x11 = im[s * 5];
- x12 = re[s * 23];
- x13 = im[s * 23];
- x14 = re[s * 11];
- x15 = im[s * 11];
- x16 = re[s * 29];
- x17 = im[s * 29];
- x18 = re[s * 17];
- x19 = im[s * 17];
-
- x20 = re[s * 25];
- x21 = im[s * 25];
- x22 = re[s * 13];
- x23 = im[s * 13];
- x24 = re[s * 1];
- x25 = im[s * 1];
- x26 = re[s * 19];
- x27 = im[s * 19];
- x28 = re[s * 7];
- x29 = im[s * 7];
-
- r1 = ( x02 + x08 );
- r4 = ( x02 - x08 );
- r3 = ( x04 + x06 );
- r2 = ( x04 - x06 );
- t = ( ( r1 - r3 ) * FFT_C54 );
- r1 = ( r1 + r3 );
- y00 = ( x00 + r1 );
- r1 = ( y00 + ( ( r1 * FFT_C55 ) ) );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( ( ( r4 + r2 ) ) * FFT_C51 );
- r4 = ( t + ( r4 * FFT_C52 ) );
- r2 = ( t + ( r2 * FFT_C53 ) );
-
- s1 = ( x03 + x09 );
- s4 = ( x03 - x09 );
- s3 = ( x05 + x07 );
- s2 = ( x05 - x07 );
- t = ( ( s1 - s3 ) * FFT_C54 );
- s1 = ( s1 + s3 );
- y01 = ( x01 + s1 );
- s1 = ( y01 + ( s1 * FFT_C55 ) );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( ( s4 + s2 ) * FFT_C51 );
- s4 = ( t + ( s4 * FFT_C52 ) );
- s2 = ( t + ( s2 * FFT_C53 ) );
-
- y02 = ( r1 + s2 );
- y08 = ( r1 - s2 );
- y04 = ( r3 - s4 );
- y06 = ( r3 + s4 );
-
- y03 = ( s1 - r2 );
- y09 = ( s1 + r2 );
- y05 = ( s3 + r4 );
- y07 = ( s3 - r4 );
-
- r1 = ( x12 + x18 );
- r4 = ( x12 - x18 );
- r3 = ( x14 + x16 );
- r2 = ( x14 - x16 );
- t = ( ( r1 - r3 ) * FFT_C54 );
- r1 = ( r1 + r3 );
- y10 = ( x10 + r1 );
- r1 = ( y10 + ( ( r1 * FFT_C55 ) ) );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( ( ( r4 + r2 ) ) * FFT_C51 );
- r4 = ( t + ( r4 * FFT_C52 ) );
- r2 = ( t + ( r2 * FFT_C53 ) );
-
- s1 = ( x13 + x19 );
- s4 = ( x13 - x19 );
- s3 = ( x15 + x17 );
- s2 = ( x15 - x17 );
- t = ( ( s1 - s3 ) * FFT_C54 );
- s1 = ( s1 + s3 );
- y11 = ( x11 + s1 );
- s1 = ( y11 + ( s1 * FFT_C55 ) );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( ( s4 + s2 ) * FFT_C51 );
- s4 = ( t + ( s4 * FFT_C52 ) );
- s2 = ( t + ( s2 * FFT_C53 ) );
-
- y12 = ( r1 + s2 );
- y18 = ( r1 - s2 );
- y14 = ( r3 - s4 );
- y16 = ( r3 + s4 );
-
- y13 = ( s1 - r2 );
- y19 = ( s1 + r2 );
- y15 = ( s3 + r4 );
- y17 = ( s3 - r4 );
-
- r1 = ( x22 + x28 );
- r4 = ( x22 - x28 );
- r3 = ( x24 + x26 );
- r2 = ( x24 - x26 );
- t = ( ( r1 - r3 ) * FFT_C54 );
- r1 = ( r1 + r3 );
- y20 = ( x20 + r1 );
- r1 = ( y20 + ( ( r1 * FFT_C55 ) ) );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( ( ( r4 + r2 ) ) * FFT_C51 );
- r4 = ( t + ( r4 * FFT_C52 ) );
- r2 = ( t + ( r2 * FFT_C53 ) );
-
- s1 = ( x23 + x29 );
- s4 = ( x23 - x29 );
- s3 = ( x25 + x27 );
- s2 = ( x25 - x27 );
- t = ( ( s1 - s3 ) * FFT_C54 );
- s1 = ( s1 + s3 );
- y21 = ( x21 + s1 );
- s1 = ( y21 + ( s1 * FFT_C55 ) );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( ( s4 + s2 ) * FFT_C51 );
- s4 = ( t + ( s4 * FFT_C52 ) );
- s2 = ( t + ( s2 * FFT_C53 ) );
-
- y22 = ( r1 + s2 );
- y28 = ( r1 - s2 );
- y24 = ( r3 - s4 );
- y26 = ( r3 + s4 );
-
- y23 = ( s1 - r2 );
- y29 = ( s1 + r2 );
- y25 = ( s3 + r4 );
- y27 = ( s3 - r4 );
-
- r1 = ( y10 + y20 );
- r2 = ( ( y10 - y20 ) * FFT_C31 );
- z30 = ( y00 + r1 );
- r1 = ( y00 - r1 * 0.5f );
-
- s1 = ( y11 + y21 );
- s2 = ( ( y11 - y21 ) * FFT_C31 );
- z31 = ( y01 + s1 );
- s1 = ( y01 - s1 * 0.5f );
-
- z50 = ( r1 - s2 );
- z40 = ( r1 + s2 );
- z51 = ( s1 + r2 );
- z41 = ( s1 - r2 );
-
- r1 = ( y12 + y22 );
- r2 = ( ( y12 - y22 ) * FFT_C31 );
- z42 = ( y02 + r1 );
- r1 = ( y02 - r1 * 0.5f );
-
- s1 = ( y13 + y23 );
- s2 = ( ( y13 - y23 ) * FFT_C31 );
- z43 = ( y03 + s1 );
- s1 = ( y03 - s1 * 0.5f );
-
- z32 = ( r1 - s2 );
- z52 = ( r1 + s2 );
- z33 = ( s1 + r2 );
- z53 = ( s1 - r2 );
-
- r1 = ( y14 + y24 );
- r2 = ( ( y14 - y24 ) * FFT_C31 );
- z54 = ( y04 + r1 );
- r1 = ( y04 - r1 * 0.5f );
-
- s1 = ( y15 + y25 );
- s2 = ( ( y15 - y25 ) * FFT_C31 );
- z55 = ( y05 + s1 );
- s1 = ( y05 - s1 * 0.5f );
-
- z44 = ( r1 - s2 );
- z34 = ( r1 + s2 );
- z45 = ( s1 + r2 );
- z35 = ( s1 - r2 );
-
- r1 = ( y16 + y26 );
- r2 = ( ( y16 - y26 ) * FFT_C31 );
- z36 = ( y06 + r1 );
- r1 = ( y06 - r1 * 0.5f );
-
- s1 = ( y17 + y27 );
- s2 = ( ( y17 - y27 ) * FFT_C31 );
- z37 = ( y07 + s1 );
- s1 = ( y07 - s1 * 0.5f );
-
- z56 = ( r1 - s2 );
- z46 = ( r1 + s2 );
- z57 = ( s1 + r2 );
- z47 = ( s1 - r2 );
-
- r1 = ( y18 + y28 );
- r2 = ( ( y18 - y28 ) * FFT_C31 );
- z48 = ( y08 + r1 );
- r1 = ( y08 - r1 * 0.5f );
-
- s1 = ( y19 + y29 );
- s2 = ( ( y19 - y29 ) * FFT_C31 );
- z49 = ( y09 + s1 );
- s1 = ( y09 - s1 * 0.5f );
-
- z38 = ( r1 - s2 );
- z58 = ( r1 + s2 );
- z39 = ( s1 + r2 );
- z59 = ( s1 - r2 );
-
- r1 = z00;
- r2 = z30;
- r3 = z01;
- r4 = z31;
- *rel = ( r1 + r2 );
- *reh = ( r1 - r2 );
- *iml = ( r3 + r4 );
- *imh = ( r3 - r4 );
- rel += s, reh += s, iml += s;
- imh += s;
-
- r1 = z16;
- r2 = z46;
- r3 = z17;
- r4 = z47;
- *reh = ( r1 + r2 );
- *rel = ( r1 - r2 );
- *imh = ( r3 + r4 );
- *iml = ( r3 - r4 );
- rel += s, reh += s, iml += s;
- imh += s;
-
- r1 = z02;
- r2 = z32;
- r3 = z03;
- r4 = z33;
- *rel = ( r1 + r2 );
- *reh = ( r1 - r2 );
- *iml = ( r3 + r4 );
- *imh = ( r3 - r4 );
- rel += s, reh += s, iml += s;
- imh += s;
-
- r1 = z18;
- r2 = z48;
- r3 = z19;
- r4 = z49;
- *reh = ( r1 + r2 );
- *rel = ( r1 - r2 );
- *imh = ( r3 + r4 );
- *iml = ( r3 - r4 );
- rel += s, reh += s, iml += s;
- imh += s;
-
- r1 = z04;
- r2 = z34;
- r3 = z05;
- r4 = z35;
- *rel = ( r1 + r2 );
- *reh = ( r1 - r2 );
- *iml = ( r3 + r4 );
- *imh = ( r3 - r4 );
- rel += s, reh += s, iml += s;
- imh += s;
-
- r1 = z20;
- r2 = z50;
- r3 = z21;
- r4 = z51;
- *reh = ( r1 + r2 );
- *rel = ( r1 - r2 );
- *imh = ( r3 + r4 );
- *iml = ( r3 - r4 );
- rel += s, reh += s, iml += s;
- imh += s;
-
- r1 = z06;
- r2 = z36;
- r3 = z07;
- r4 = z37;
- *rel = ( r1 + r2 );
- *reh = ( r1 - r2 );
- *iml = ( r3 + r4 );
- *imh = ( r3 - r4 );
- rel += s, reh += s, iml += s;
- imh += s;
-
- r1 = z22;
- r2 = z52;
- r3 = z23;
- r4 = z53;
- *reh = ( r1 + r2 );
- *rel = ( r1 - r2 );
- *imh = ( r3 + r4 );
- *iml = ( r3 - r4 );
- rel += s, reh += s, iml += s;
- imh += s;
-
- r1 = z08;
- r2 = z38;
- r3 = z09;
- r4 = z39;
- *rel = ( r1 + r2 );
- *reh = ( r1 - r2 );
- *iml = ( r3 + r4 );
- *imh = ( r3 - r4 );
- rel += s, reh += s, iml += s;
- imh += s;
-
- r1 = z24;
- r2 = z54;
- r3 = z25;
- r4 = z55;
- *reh = ( r1 + r2 );
- *rel = ( r1 - r2 );
- *imh = ( r3 + r4 );
- *iml = ( r3 - r4 );
- rel += s, reh += s, iml += s;
- imh += s;
-
- r1 = z10;
- r2 = z40;
- r3 = z11;
- r4 = z41;
- *rel = ( r1 + r2 );
- *reh = ( r1 - r2 );
- *iml = ( r3 + r4 );
- *imh = ( r3 - r4 );
- rel += s, reh += s, iml += s;
- imh += s;
-
- r1 = z26;
- r2 = z56;
- r3 = z27;
- r4 = z57;
- *reh = ( r1 + r2 );
- *rel = ( r1 - r2 );
- *imh = ( r3 + r4 );
- *iml = ( r3 - r4 );
- rel += s, reh += s, iml += s;
- imh += s;
-
- r1 = z12;
- r2 = z42;
- r3 = z13;
- r4 = z43;
- *rel = ( r1 + r2 );
- *reh = ( r1 - r2 );
- *iml = ( r3 + r4 );
- *imh = ( r3 - r4 );
- rel += s, reh += s, iml += s;
- imh += s;
-
- r1 = z28;
- r2 = z58;
- r3 = z29;
- r4 = z59;
- *reh = ( r1 + r2 );
- *rel = ( r1 - r2 );
- *imh = ( r3 + r4 );
- *iml = ( r3 - r4 );
- rel += s, reh += s, iml += s;
- imh += s;
-
- r1 = z14;
- r2 = z44;
- r3 = z15;
- r4 = z45;
- *rel = ( r1 + r2 );
- *reh = ( r1 - r2 );
- *iml = ( r3 + r4 );
- *imh = ( r3 - r4 );
- rel += s, reh += s, iml += s;
- imh += s;
-
- return;
-}
-
-static void fft_len32(
- float *re,
- float *im,
- const int16_t s )
-{
- float as, bs;
- float x00, x01, x02, x03, x04, x05, x06, x07;
- float x08, x09, x10, x11, x12, x13, x14, x15;
- float t00, t01, t02, t03, t04, t05, t06, t07;
- float t08, t09, t10, t11, t12, t13, t14, t15;
- float s00, s01, s02, s03, s04, s05, s06, s07;
- float s08, s09, s10, s11, s12, s13, s14, s15;
-
- float y00, y01, y02, y03, y04, y05, y06, y07;
- float y08, y09, y10, y11, y12, y13, y14, y15;
- float y16, y17, y18, y19, y20, y21, y22, y23;
- float y24, y25, y26, y27, y28, y29, y30, y31;
- float y32, y33, y34, y35, y36, y37, y38, y39;
- float y40, y41, y42, y43, y44, y45, y46, y47;
- float y48, y49, y50, y51, y52, y53, y54, y55;
- float y56, y57, y58, y59, y60, y61, y62, y63;
-
- x00 = re[s * 0];
- x01 = im[s * 0];
- x02 = re[s * 4];
- x03 = im[s * 4];
- x04 = re[s * 8];
- x05 = im[s * 8];
- x06 = re[s * 12];
- x07 = im[s * 12];
- x08 = re[s * 16];
- x09 = im[s * 16];
- x10 = re[s * 20];
- x11 = im[s * 20];
- x12 = re[s * 24];
- x13 = im[s * 24];
- x14 = re[s * 28];
- x15 = im[s * 28];
-
- t00 = ( x00 + x08 );
- t02 = ( x00 - x08 );
- t01 = ( x01 + x09 );
- t03 = ( x01 - x09 );
- t04 = ( x02 + x10 );
- t06 = ( x02 - x10 );
- t05 = ( x03 + x11 );
- t07 = ( x03 - x11 );
- t08 = ( x04 + x12 );
- t10 = ( x04 - x12 );
- t09 = ( x05 + x13 );
- t11 = ( x05 - x13 );
- t12 = ( x06 + x14 );
- t14 = ( x06 - x14 );
- t13 = ( x07 + x15 );
- t15 = ( x07 - x15 );
-
- s00 = ( t00 + t08 );
- s04 = ( t00 - t08 );
- s01 = ( t01 + t09 );
- s05 = ( t01 - t09 );
- s08 = ( t02 - t11 );
- s10 = ( t02 + t11 );
- s09 = ( t03 + t10 );
- s11 = ( t03 - t10 );
- s02 = ( t04 + t12 );
- s07 = ( t04 - t12 );
- s03 = ( t05 + t13 );
- s06 = ( t13 - t05 );
- t01 = ( t06 + t14 );
- t02 = ( t06 - t14 );
- t00 = ( t07 + t15 );
- t03 = ( t07 - t15 );
-
- {
- s12 = ( ( t00 + t02 ) * FFT_C81 );
- s14 = ( ( t00 - t02 ) * FFT_C81 );
- s13 = ( ( t03 - t01 ) * FFT_C81 );
- s15 = ( ( t01 + t03 ) * FFT_C82 );
- };
-
- y00 = ( s00 + s02 );
- y08 = ( s00 - s02 );
- y01 = ( s01 + s03 );
- y09 = ( s01 - s03 );
- y04 = ( s04 - s06 );
- y12 = ( s04 + s06 );
- y05 = ( s05 - s07 );
- y13 = ( s05 + s07 );
- y06 = ( s08 + s14 );
- y14 = ( s08 - s14 );
- y07 = ( s09 + s15 );
- y15 = ( s09 - s15 );
- y02 = ( s10 + s12 );
- y10 = ( s10 - s12 );
- y03 = ( s11 + s13 );
- y11 = ( s11 - s13 );
-
- x00 = re[s * 1];
- x01 = im[s * 1];
- x02 = re[s * 5];
- x03 = im[s * 5];
- x04 = re[s * 9];
- x05 = im[s * 9];
- x06 = re[s * 13];
- x07 = im[s * 13];
- x08 = re[s * 17];
- x09 = im[s * 17];
- x10 = re[s * 21];
- x11 = im[s * 21];
- x12 = re[s * 25];
- x13 = im[s * 25];
- x14 = re[s * 29];
- x15 = im[s * 29];
-
- t00 = ( x00 + x08 );
- t02 = ( x00 - x08 );
- t01 = ( x01 + x09 );
- t03 = ( x01 - x09 );
- t04 = ( x02 + x10 );
- t06 = ( x02 - x10 );
- t05 = ( x03 + x11 );
- t07 = ( x03 - x11 );
- t08 = ( x04 + x12 );
- t10 = ( x04 - x12 );
- t09 = ( x05 + x13 );
- t11 = ( x05 - x13 );
- t12 = ( x06 + x14 );
- t14 = ( x06 - x14 );
- t13 = ( x07 + x15 );
- t15 = ( x07 - x15 );
-
- s00 = ( t00 + t08 );
- s04 = ( t00 - t08 );
- s01 = ( t01 + t09 );
- s05 = ( t01 - t09 );
- s08 = ( t02 - t11 );
- s10 = ( t02 + t11 );
- s09 = ( t03 + t10 );
- s11 = ( t03 - t10 );
- s02 = ( t04 + t12 );
- s07 = ( t04 - t12 );
- s03 = ( t05 + t13 );
- s06 = ( t13 - t05 );
- t01 = ( t06 + t14 );
- t02 = ( t06 - t14 );
- t00 = ( t07 + t15 );
- t03 = ( t07 - t15 );
-
- {
- s12 = ( ( t00 + t02 ) * FFT_C81 );
- s14 = ( ( t00 - t02 ) * FFT_C81 );
- s13 = ( ( t03 - t01 ) * FFT_C81 );
- s15 = ( ( t01 + t03 ) * FFT_C82 );
- };
-
- y16 = ( s00 + s02 );
- y24 = ( s00 - s02 );
- y17 = ( s01 + s03 );
- y25 = ( s01 - s03 );
- y20 = ( s04 - s06 );
- y28 = ( s04 + s06 );
- y21 = ( s05 - s07 );
- y29 = ( s05 + s07 );
- y22 = ( s08 + s14 );
- y30 = ( s08 - s14 );
- y23 = ( s09 + s15 );
- y31 = ( s09 - s15 );
- y18 = ( s10 + s12 );
- y26 = ( s10 - s12 );
- y19 = ( s11 + s13 );
- y27 = ( s11 - s13 );
-
- x00 = re[s * 2];
- x01 = im[s * 2];
- x02 = re[s * 6];
- x03 = im[s * 6];
- x04 = re[s * 10];
- x05 = im[s * 10];
- x06 = re[s * 14];
- x07 = im[s * 14];
- x08 = re[s * 18];
- x09 = im[s * 18];
- x10 = re[s * 22];
- x11 = im[s * 22];
- x12 = re[s * 26];
- x13 = im[s * 26];
- x14 = re[s * 30];
- x15 = im[s * 30];
-
- t00 = ( x00 + x08 );
- t02 = ( x00 - x08 );
- t01 = ( x01 + x09 );
- t03 = ( x01 - x09 );
- t04 = ( x02 + x10 );
- t06 = ( x02 - x10 );
- t05 = ( x03 + x11 );
- t07 = ( x03 - x11 );
- t08 = ( x04 + x12 );
- t10 = ( x04 - x12 );
- t09 = ( x05 + x13 );
- t11 = ( x05 - x13 );
- t12 = ( x06 + x14 );
- t14 = ( x06 - x14 );
- t13 = ( x07 + x15 );
- t15 = ( x07 - x15 );
-
- s00 = ( t00 + t08 );
- s04 = ( t00 - t08 );
- s01 = ( t01 + t09 );
- s05 = ( t01 - t09 );
- s08 = ( t02 - t11 );
- s10 = ( t02 + t11 );
- s09 = ( t03 + t10 );
- s11 = ( t03 - t10 );
- s02 = ( t04 + t12 );
- s07 = ( t04 - t12 );
- s03 = ( t05 + t13 );
- s06 = ( t13 - t05 );
- t01 = ( t06 + t14 );
- t02 = ( t06 - t14 );
- t00 = ( t07 + t15 );
- t03 = ( t07 - t15 );
-
- {
- s12 = ( ( t00 + t02 ) * FFT_C81 );
- s14 = ( ( t00 - t02 ) * FFT_C81 );
- s13 = ( ( t03 - t01 ) * FFT_C81 );
- s15 = ( ( t01 + t03 ) * FFT_C82 );
- };
-
- y32 = ( s00 + s02 );
- y40 = ( s00 - s02 );
- y33 = ( s01 + s03 );
- y41 = ( s01 - s03 );
- y36 = ( s04 - s06 );
- y44 = ( s04 + s06 );
- y37 = ( s05 - s07 );
- y45 = ( s05 + s07 );
- y38 = ( s08 + s14 );
- y46 = ( s08 - s14 );
- y39 = ( s09 + s15 );
- y47 = ( s09 - s15 );
- y34 = ( s10 + s12 );
- y42 = ( s10 - s12 );
- y35 = ( s11 + s13 );
- y43 = ( s11 - s13 );
-
- x00 = re[s * 3];
- x01 = im[s * 3];
- x02 = re[s * 7];
- x03 = im[s * 7];
- x04 = re[s * 11];
- x05 = im[s * 11];
- x06 = re[s * 15];
- x07 = im[s * 15];
- x08 = re[s * 19];
- x09 = im[s * 19];
- x10 = re[s * 23];
- x11 = im[s * 23];
- x12 = re[s * 27];
- x13 = im[s * 27];
- x14 = re[s * 31];
- x15 = im[s * 31];
-
- t00 = ( x00 + x08 );
- t02 = ( x00 - x08 );
- t01 = ( x01 + x09 );
- t03 = ( x01 - x09 );
- t04 = ( x02 + x10 );
- t06 = ( x02 - x10 );
- t05 = ( x03 + x11 );
- t07 = ( x03 - x11 );
- t08 = ( x04 + x12 );
- t10 = ( x04 - x12 );
- t09 = ( x05 + x13 );
- t11 = ( x05 - x13 );
- t12 = ( x06 + x14 );
- t14 = ( x06 - x14 );
- t13 = ( x07 + x15 );
- t15 = ( x07 - x15 );
-
- s00 = ( t00 + t08 );
- s04 = ( t00 - t08 );
- s01 = ( t01 + t09 );
- s05 = ( t01 - t09 );
- s08 = ( t02 - t11 );
- s10 = ( t02 + t11 );
- s09 = ( t03 + t10 );
- s11 = ( t03 - t10 );
- s02 = ( t04 + t12 );
- s07 = ( t04 - t12 );
- s03 = ( t05 + t13 );
- s06 = ( t13 - t05 );
- t01 = ( t06 + t14 );
- t02 = ( t06 - t14 );
- t00 = ( t07 + t15 );
- t03 = ( t07 - t15 );
-
- {
- s12 = ( ( t00 + t02 ) * FFT_C81 );
- s14 = ( ( t00 - t02 ) * FFT_C81 );
- s13 = ( ( t03 - t01 ) * FFT_C81 );
- s15 = ( ( t01 + t03 ) * FFT_C82 );
- };
-
- y48 = ( s00 + s02 );
- y56 = ( s00 - s02 );
- y49 = ( s01 + s03 );
- y57 = ( s01 - s03 );
- y52 = ( s04 - s06 );
- y60 = ( s04 + s06 );
- y53 = ( s05 - s07 );
- y61 = ( s05 + s07 );
- y54 = ( s08 + s14 );
- y62 = ( s08 - s14 );
- y55 = ( s09 + s15 );
- y63 = ( s09 - s15 );
- y50 = ( s10 + s12 );
- y58 = ( s10 - s12 );
- y51 = ( s11 + s13 );
- y59 = ( s11 - s13 );
-
-
- {
- as = y18;
- bs = y19;
- y18 = ( ( as * FFT_RotVector_32[2 * 0 + 0] ) - ( bs * FFT_RotVector_32[2 * 0 + 1] ) );
- y19 = ( ( as * FFT_RotVector_32[2 * 0 + 1] ) + ( bs * FFT_RotVector_32[2 * 0 + 0] ) );
- };
- {
- as = y20;
- bs = y21;
- y20 = ( ( as * FFT_RotVector_32[2 * 1 + 0] ) - ( bs * FFT_RotVector_32[2 * 1 + 1] ) );
- y21 = ( ( as * FFT_RotVector_32[2 * 1 + 1] ) + ( bs * FFT_RotVector_32[2 * 1 + 0] ) );
- };
- {
- as = y22;
- bs = y23;
- y22 = ( ( as * FFT_RotVector_32[2 * 2 + 0] ) - ( bs * FFT_RotVector_32[2 * 2 + 1] ) );
- y23 = ( ( as * FFT_RotVector_32[2 * 2 + 1] ) + ( bs * FFT_RotVector_32[2 * 2 + 0] ) );
- };
- {
- as = y24;
- bs = y25;
- y24 = ( ( as * FFT_RotVector_32[2 * 3 + 0] ) - ( bs * FFT_RotVector_32[2 * 3 + 1] ) );
- y25 = ( ( as * FFT_RotVector_32[2 * 3 + 1] ) + ( bs * FFT_RotVector_32[2 * 3 + 0] ) );
- };
- {
- as = y26;
- bs = y27;
- y26 = ( ( as * FFT_RotVector_32[2 * 4 + 0] ) - ( bs * FFT_RotVector_32[2 * 4 + 1] ) );
- y27 = ( ( as * FFT_RotVector_32[2 * 4 + 1] ) + ( bs * FFT_RotVector_32[2 * 4 + 0] ) );
- };
- {
- as = y28;
- bs = y29;
- y28 = ( ( as * FFT_RotVector_32[2 * 5 + 0] ) - ( bs * FFT_RotVector_32[2 * 5 + 1] ) );
- y29 = ( ( as * FFT_RotVector_32[2 * 5 + 1] ) + ( bs * FFT_RotVector_32[2 * 5 + 0] ) );
- };
- {
- as = y30;
- bs = y31;
- y30 = ( ( as * FFT_RotVector_32[2 * 6 + 0] ) - ( bs * FFT_RotVector_32[2 * 6 + 1] ) );
- y31 = ( ( as * FFT_RotVector_32[2 * 6 + 1] ) + ( bs * FFT_RotVector_32[2 * 6 + 0] ) );
- };
- {
- as = y34;
- bs = y35;
- y34 = ( ( as * FFT_RotVector_32[2 * 7 + 0] ) - ( bs * FFT_RotVector_32[2 * 7 + 1] ) );
- y35 = ( ( as * FFT_RotVector_32[2 * 7 + 1] ) + ( bs * FFT_RotVector_32[2 * 7 + 0] ) );
- };
- {
- as = y36;
- bs = y37;
- y36 = ( ( as * FFT_RotVector_32[2 * 8 + 0] ) - ( bs * FFT_RotVector_32[2 * 8 + 1] ) );
- y37 = ( ( as * FFT_RotVector_32[2 * 8 + 1] ) + ( bs * FFT_RotVector_32[2 * 8 + 0] ) );
- };
- {
- as = y38;
- bs = y39;
- y38 = ( ( as * FFT_RotVector_32[2 * 9 + 0] ) - ( bs * FFT_RotVector_32[2 * 9 + 1] ) );
- y39 = ( ( as * FFT_RotVector_32[2 * 9 + 1] ) + ( bs * FFT_RotVector_32[2 * 9 + 0] ) );
- };
- {
- as = y42;
- bs = y43;
- y42 = ( ( as * FFT_RotVector_32[2 * 10 + 0] ) - ( bs * FFT_RotVector_32[2 * 10 + 1] ) );
- y43 = ( ( as * FFT_RotVector_32[2 * 10 + 1] ) + ( bs * FFT_RotVector_32[2 * 10 + 0] ) );
- };
- {
- as = y44;
- bs = y45;
- y44 = ( ( as * FFT_RotVector_32[2 * 11 + 0] ) - ( bs * FFT_RotVector_32[2 * 11 + 1] ) );
- y45 = ( ( as * FFT_RotVector_32[2 * 11 + 1] ) + ( bs * FFT_RotVector_32[2 * 11 + 0] ) );
- };
- {
- as = y46;
- bs = y47;
- y46 = ( ( as * FFT_RotVector_32[2 * 12 + 0] ) - ( bs * FFT_RotVector_32[2 * 12 + 1] ) );
- y47 = ( ( as * FFT_RotVector_32[2 * 12 + 1] ) + ( bs * FFT_RotVector_32[2 * 12 + 0] ) );
- };
- {
- as = y50;
- bs = y51;
- y50 = ( ( as * FFT_RotVector_32[2 * 13 + 0] ) - ( bs * FFT_RotVector_32[2 * 13 + 1] ) );
- y51 = ( ( as * FFT_RotVector_32[2 * 13 + 1] ) + ( bs * FFT_RotVector_32[2 * 13 + 0] ) );
- };
- {
- as = y52;
- bs = y53;
- y52 = ( ( as * FFT_RotVector_32[2 * 14 + 0] ) - ( bs * FFT_RotVector_32[2 * 14 + 1] ) );
- y53 = ( ( as * FFT_RotVector_32[2 * 14 + 1] ) + ( bs * FFT_RotVector_32[2 * 14 + 0] ) );
- };
- {
- as = y54;
- bs = y55;
- y54 = ( ( as * FFT_RotVector_32[2 * 15 + 0] ) - ( bs * FFT_RotVector_32[2 * 15 + 1] ) );
- y55 = ( ( as * FFT_RotVector_32[2 * 15 + 1] ) + ( bs * FFT_RotVector_32[2 * 15 + 0] ) );
- };
- {
- as = y56;
- bs = y57;
- y56 = ( ( as * FFT_RotVector_32[2 * 16 + 0] ) - ( bs * FFT_RotVector_32[2 * 16 + 1] ) );
- y57 = ( ( as * FFT_RotVector_32[2 * 16 + 1] ) + ( bs * FFT_RotVector_32[2 * 16 + 0] ) );
- };
- {
- as = y58;
- bs = y59;
- y58 = ( ( as * FFT_RotVector_32[2 * 17 + 0] ) - ( bs * FFT_RotVector_32[2 * 17 + 1] ) );
- y59 = ( ( as * FFT_RotVector_32[2 * 17 + 1] ) + ( bs * FFT_RotVector_32[2 * 17 + 0] ) );
- };
- {
- as = y60;
- bs = y61;
- y60 = ( ( as * FFT_RotVector_32[2 * 18 + 0] ) - ( bs * FFT_RotVector_32[2 * 18 + 1] ) );
- y61 = ( ( as * FFT_RotVector_32[2 * 18 + 1] ) + ( bs * FFT_RotVector_32[2 * 18 + 0] ) );
- };
- {
- as = y62;
- bs = y63;
- y62 = ( ( as * FFT_RotVector_32[2 * 19 + 0] ) - ( bs * FFT_RotVector_32[2 * 19 + 1] ) );
- y63 = ( ( as * FFT_RotVector_32[2 * 19 + 1] ) + ( bs * FFT_RotVector_32[2 * 19 + 0] ) );
- };
-
- t00 = ( y00 + y32 );
- t02 = ( y00 - y32 );
- t01 = ( y01 + y33 );
- t03 = ( y01 - y33 );
- t04 = ( y16 + y48 );
- t07 = ( y16 - y48 );
- t05 = ( y49 + y17 );
- t06 = ( y49 - y17 );
-
- re[s * 0] = ( t00 + t04 );
- im[s * 0] = ( t01 + t05 );
- re[s * 8] = ( t02 - t06 );
- im[s * 8] = ( t03 - t07 );
- re[s * 16] = ( t00 - t04 );
- im[s * 16] = ( t01 - t05 );
- re[s * 24] = ( t02 + t06 );
- im[s * 24] = ( t03 + t07 );
-
- t00 = ( y02 + y34 );
- t02 = ( y02 - y34 );
- t01 = ( y03 + y35 );
- t03 = ( y03 - y35 );
- t04 = ( y18 + y50 );
- t07 = ( y18 - y50 );
- t05 = ( y51 + y19 );
- t06 = ( y51 - y19 );
-
- re[s * 1] = ( t00 + t04 );
- im[s * 1] = ( t01 + t05 );
- re[s * 9] = ( t02 - t06 );
- im[s * 9] = ( t03 - t07 );
- re[s * 17] = ( t00 - t04 );
- im[s * 17] = ( t01 - t05 );
- re[s * 25] = ( t02 + t06 );
- im[s * 25] = ( t03 + t07 );
-
- t00 = ( y04 + y36 );
- t02 = ( y04 - y36 );
- t01 = ( y05 + y37 );
- t03 = ( y05 - y37 );
- t04 = ( y20 + y52 );
- t07 = ( y20 - y52 );
- t05 = ( y53 + y21 );
- t06 = ( y53 - y21 );
-
- re[s * 2] = ( t00 + t04 );
- im[s * 2] = ( t01 + t05 );
- re[s * 10] = ( t02 - t06 );
- im[s * 10] = ( t03 - t07 );
- re[s * 18] = ( t00 - t04 );
- im[s * 18] = ( t01 - t05 );
- re[s * 26] = ( t02 + t06 );
- im[s * 26] = ( t03 + t07 );
-
- t00 = ( y06 + y38 );
- t02 = ( y06 - y38 );
- t01 = ( y07 + y39 );
- t03 = ( y07 - y39 );
- t04 = ( y22 + y54 );
- t07 = ( y22 - y54 );
- t05 = ( y55 + y23 );
- t06 = ( y55 - y23 );
-
- re[s * 3] = ( t00 + t04 );
- im[s * 3] = ( t01 + t05 );
- re[s * 11] = ( t02 - t06 );
- im[s * 11] = ( t03 - t07 );
- re[s * 19] = ( t00 - t04 );
- im[s * 19] = ( t01 - t05 );
- re[s * 27] = ( t02 + t06 );
- im[s * 27] = ( t03 + t07 );
-
- t00 = ( y08 + y41 );
- t02 = ( y08 - y41 );
- t01 = ( y09 - y40 );
- t03 = ( y09 + y40 );
- t04 = ( y24 + y56 );
- t07 = ( y24 - y56 );
- t05 = ( y57 + y25 );
- t06 = ( y57 - y25 );
-
- re[s * 4] = ( t00 + t04 );
- im[s * 4] = ( t01 + t05 );
- re[s * 12] = ( t02 - t06 );
- im[s * 12] = ( t03 - t07 );
- re[s * 20] = ( t00 - t04 );
- im[s * 20] = ( t01 - t05 );
- re[s * 28] = ( t02 + t06 );
- im[s * 28] = ( t03 + t07 );
-
- t00 = ( y10 + y42 );
- t02 = ( y10 - y42 );
- t01 = ( y11 + y43 );
- t03 = ( y11 - y43 );
- t04 = ( y26 + y58 );
- t07 = ( y26 - y58 );
- t05 = ( y59 + y27 );
- t06 = ( y59 - y27 );
-
- re[s * 5] = ( t00 + t04 );
- im[s * 5] = ( t01 + t05 );
- re[s * 13] = ( t02 - t06 );
- im[s * 13] = ( t03 - t07 );
- re[s * 21] = ( t00 - t04 );
- im[s * 21] = ( t01 - t05 );
- re[s * 29] = ( t02 + t06 );
- im[s * 29] = ( t03 + t07 );
-
- t00 = ( y12 + y44 );
- t02 = ( y12 - y44 );
- t01 = ( y13 + y45 );
- t03 = ( y13 - y45 );
- t04 = ( y28 + y60 );
- t07 = ( y28 - y60 );
- t05 = ( y61 + y29 );
- t06 = ( y61 - y29 );
-
- re[s * 6] = ( t00 + t04 );
- im[s * 6] = ( t01 + t05 );
- re[s * 14] = ( t02 - t06 );
- im[s * 14] = ( t03 - t07 );
- re[s * 22] = ( t00 - t04 );
- im[s * 22] = ( t01 - t05 );
- re[s * 30] = ( t02 + t06 );
- im[s * 30] = ( t03 + t07 );
-
- t00 = ( y14 + y46 );
- t02 = ( y14 - y46 );
- t01 = ( y15 + y47 );
- t03 = ( y15 - y47 );
- t04 = ( y30 + y62 );
- t07 = ( y30 - y62 );
- t05 = ( y63 + y31 );
- t06 = ( y63 - y31 );
-
- re[s * 7] = ( t00 + t04 );
- im[s * 7] = ( t01 + t05 );
- re[s * 15] = ( t02 - t06 );
- im[s * 15] = ( t03 - t07 );
- re[s * 23] = ( t00 - t04 );
- im[s * 23] = ( t01 - t05 );
- re[s * 31] = ( t02 + t06 );
- im[s * 31] = ( t03 + t07 );
-
- return;
-}
-
-static void fft_lenN(
- float *re,
- float *im,
- const float *W,
- const int16_t len,
- const int16_t dim1,
- const int16_t dim2,
- const int16_t sx,
- const int16_t sc,
- const int16_t Woff )
-{
- int16_t i, j;
- float x[L_FRAME_MAX * 2];
-
- for ( i = 0; i < dim2; i++ )
- {
- for ( j = 0; j < dim1; j++ )
- {
- x[2 * i * dim1 + 2 * j] = re[sx * i + sx * j * dim2];
- x[2 * i * dim1 + 2 * j + 1] = im[sx * i + sx * j * dim2];
- }
- }
-
- switch ( dim1 )
- {
- case 5:
- for ( i = 0; i < dim2; i++ )
- {
- fft_len5( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
- }
- break;
-
- case 8:
- for ( i = 0; i < dim2; i++ )
- {
- fft_len8( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
- }
- break;
-
- case 10:
- for ( i = 0; i < dim2; i++ )
- {
- fft_len10( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
- }
- break;
-
- case 15:
- for ( i = 0; i < dim2; i++ )
- {
- fft_len15( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
- }
- break;
-
- case 16:
- for ( i = 0; i < dim2; i++ )
- {
- fft_len16( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
- }
- break;
-
- case 20:
- for ( i = 0; i < dim2; i++ )
- {
- fft_len20( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
- }
- break;
-
- case 30:
- for ( i = 0; i < dim2; i++ )
- {
- fft_len30( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
- }
- break;
-
- case 32:
- for ( i = 0; i < dim2; i++ )
- {
- fft_len32( &x[i * 2 * dim1], &x[i * 2 * dim1 + 1], 2 );
- }
- break;
- }
-
- switch ( dim2 )
- {
-
- case 8:
- {
- float x00, x01, x02, x03, x04, x05, x06, x07, x08, x09, x10, x11, x12, x13, x14, x15;
- float t00, t01, t02, t03, t04, t05, t06, t07, t08, t09, t10, t11, t12, t13, t14, t15;
- float s00, s01, s02, s03, s04, s05, s06, s07, s08, s09, s10, s11, s12, s13, s14, s15;
-
- if ( dim1 == 30 || dim1 == 20 || dim1 == 15 || dim1 == 10 || dim1 == 5 )
- {
- for ( i = 0; i < dim1; i++ )
- {
- {
- x00 = x[2 * i + 2 * 0 * dim1];
- x01 = x[2 * i + 2 * 0 * dim1 + 1];
- };
- if ( i == 0 )
- {
- {
- x02 = x[2 * i + 2 * 1 * dim1];
- x03 = x[2 * i + 2 * 1 * dim1 + 1];
- };
- {
- x04 = x[2 * i + 2 * 2 * dim1];
- x05 = x[2 * i + 2 * 2 * dim1 + 1];
- };
- {
- x06 = x[2 * i + 2 * 3 * dim1];
- x07 = x[2 * i + 2 * 3 * dim1 + 1];
- };
- {
- x08 = x[2 * i + 2 * 4 * dim1];
- x09 = x[2 * i + 2 * 4 * dim1 + 1];
- };
- {
- x10 = x[2 * i + 2 * 5 * dim1];
- x11 = x[2 * i + 2 * 5 * dim1 + 1];
- };
- {
- x12 = x[2 * i + 2 * 6 * dim1];
- x13 = x[2 * i + 2 * 6 * dim1 + 1];
- };
- {
- x14 = x[2 * i + 2 * 7 * dim1];
- x15 = x[2 * i + 2 * 7 * dim1 + 1];
- };
- }
- else
- {
- {
- x02 = ( x[2 * i + 2 * 1 * dim1] * W[sc * i + sc * 1 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 1 * dim1 + 1] * W[sc * i + sc * 1 * dim1 * 2 + 1 - Woff] );
- x03 = ( x[2 * i + 2 * 1 * dim1] * W[sc * i + sc * 1 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 1 * dim1 + 1] * W[sc * i + sc * 1 * dim1 * 2 - Woff] );
- };
- {
- x04 = ( x[2 * i + 2 * 2 * dim1] * W[sc * i + sc * 2 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 2 * dim1 + 1] * W[sc * i + sc * 2 * dim1 * 2 + 1 - Woff] );
- x05 = ( x[2 * i + 2 * 2 * dim1] * W[sc * i + sc * 2 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 2 * dim1 + 1] * W[sc * i + sc * 2 * dim1 * 2 - Woff] );
- };
- {
- x06 = ( x[2 * i + 2 * 3 * dim1] * W[sc * i + sc * 3 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 3 * dim1 + 1] * W[sc * i + sc * 3 * dim1 * 2 + 1 - Woff] );
- x07 = ( x[2 * i + 2 * 3 * dim1] * W[sc * i + sc * 3 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 3 * dim1 + 1] * W[sc * i + sc * 3 * dim1 * 2 - Woff] );
- };
- {
- x08 = ( x[2 * i + 2 * 4 * dim1] * W[sc * i + sc * 4 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 4 * dim1 + 1] * W[sc * i + sc * 4 * dim1 * 2 + 1 - Woff] );
- x09 = ( x[2 * i + 2 * 4 * dim1] * W[sc * i + sc * 4 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 4 * dim1 + 1] * W[sc * i + sc * 4 * dim1 * 2 - Woff] );
- };
- {
- x10 = ( x[2 * i + 2 * 5 * dim1] * W[sc * i + sc * 5 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 5 * dim1 + 1] * W[sc * i + sc * 5 * dim1 * 2 + 1 - Woff] );
- x11 = ( x[2 * i + 2 * 5 * dim1] * W[sc * i + sc * 5 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 5 * dim1 + 1] * W[sc * i + sc * 5 * dim1 * 2 - Woff] );
- };
- {
- x12 = ( x[2 * i + 2 * 6 * dim1] * W[sc * i + sc * 6 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 6 * dim1 + 1] * W[sc * i + sc * 6 * dim1 * 2 + 1 - Woff] );
- x13 = ( x[2 * i + 2 * 6 * dim1] * W[sc * i + sc * 6 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 6 * dim1 + 1] * W[sc * i + sc * 6 * dim1 * 2 - Woff] );
- };
- {
- x14 = ( x[2 * i + 2 * 7 * dim1] * W[sc * i + sc * 7 * dim1 * 2 - Woff] ) - ( x[2 * i + 2 * 7 * dim1 + 1] * W[sc * i + sc * 7 * dim1 * 2 + 1 - Woff] );
- x15 = ( x[2 * i + 2 * 7 * dim1] * W[sc * i + sc * 7 * dim1 * 2 + 1 - Woff] ) + ( x[2 * i + 2 * 7 * dim1 + 1] * W[sc * i + sc * 7 * dim1 * 2 - Woff] );
- };
- }
-
- t00 = ( x00 + x08 );
- t02 = ( x00 - x08 );
- t01 = ( x01 + x09 );
- t03 = ( x01 - x09 );
- t04 = ( x02 + x10 );
- t06 = ( x02 - x10 );
- t05 = ( x03 + x11 );
- t07 = ( x03 - x11 );
- t08 = ( x04 + x12 );
- t10 = ( x04 - x12 );
- t09 = ( x05 + x13 );
- t11 = ( x05 - x13 );
- t12 = ( x06 + x14 );
- t14 = ( x06 - x14 );
- t13 = ( x07 + x15 );
- t15 = ( x07 - x15 );
-
- s00 = ( t00 + t08 );
- s04 = ( t00 - t08 );
- s01 = ( t01 + t09 );
- s05 = ( t01 - t09 );
- s08 = ( t02 - t11 );
- s10 = ( t02 + t11 );
- s09 = ( t03 + t10 );
- s11 = ( t03 - t10 );
- s02 = ( t04 + t12 );
- s07 = ( t04 - t12 );
- s03 = ( t05 + t13 );
- s06 = ( t13 - t05 );
-
- t01 = ( t06 + t14 );
- t02 = ( t06 - t14 );
- t00 = ( t07 + t15 );
- t03 = ( t07 - t15 );
-
- s12 = ( ( t00 + t02 ) * FFT_C81 );
- s14 = ( ( t00 - t02 ) * FFT_C81 );
- s13 = ( ( t03 - t01 ) * FFT_C81 );
- s15 = ( ( t01 + t03 ) * FFT_C82 );
-
- re[sx * i + sx * 0 * dim1] = ( s00 + s02 );
- im[sx * i + sx * 0 * dim1] = ( s01 + s03 );
- re[sx * i + sx * 1 * dim1] = ( s10 + s12 );
- im[sx * i + sx * 1 * dim1] = ( s11 + s13 );
- re[sx * i + sx * 2 * dim1] = ( s04 - s06 );
- im[sx * i + sx * 2 * dim1] = ( s05 - s07 );
- re[sx * i + sx * 3 * dim1] = ( s08 + s14 );
- im[sx * i + sx * 3 * dim1] = ( s09 + s15 );
- re[sx * i + sx * 4 * dim1] = ( s00 - s02 );
- im[sx * i + sx * 4 * dim1] = ( s01 - s03 );
- re[sx * i + sx * 5 * dim1] = ( s10 - s12 );
- im[sx * i + sx * 5 * dim1] = ( s11 - s13 );
- re[sx * i + sx * 6 * dim1] = ( s04 + s06 );
- im[sx * i + sx * 6 * dim1] = ( s05 + s07 );
- re[sx * i + sx * 7 * dim1] = ( s08 - s14 );
- im[sx * i + sx * 7 * dim1] = ( s09 - s15 );
- }
- }
- else
- {
- for ( i = 0; i < dim1; i++ )
- {
- {
- x00 = x[2 * i + 2 * 0 * dim1];
- x01 = x[2 * i + 2 * 0 * dim1 + 1];
- };
- if ( i == 0 )
- {
- {
- x02 = x[2 * i + 2 * 1 * dim1];
- x03 = x[2 * i + 2 * 1 * dim1 + 1];
- };
- {
- x04 = x[2 * i + 2 * 2 * dim1];
- x05 = x[2 * i + 2 * 2 * dim1 + 1];
- };
- {
- x06 = x[2 * i + 2 * 3 * dim1];
- x07 = x[2 * i + 2 * 3 * dim1 + 1];
- };
- {
- x08 = x[2 * i + 2 * 4 * dim1];
- x09 = x[2 * i + 2 * 4 * dim1 + 1];
- };
- {
- x10 = x[2 * i + 2 * 5 * dim1];
- x11 = x[2 * i + 2 * 5 * dim1 + 1];
- };
- {
- x12 = x[2 * i + 2 * 6 * dim1];
- x13 = x[2 * i + 2 * 6 * dim1 + 1];
- };
- {
- x14 = x[2 * i + 2 * 7 * dim1];
- x15 = x[2 * i + 2 * 7 * dim1 + 1];
- };
- }
- else
- {
- {
- x02 = ( x[2 * i + 2 * 1 * dim1] * W[sc * i + sc * 1 * dim1 - Woff] ) - ( x[2 * i + 2 * 1 * dim1 + 1] * W[sc * i + sc * 1 * dim1 + 1 - Woff] );
- x03 = ( x[2 * i + 2 * 1 * dim1] * W[sc * i + sc * 1 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 1 * dim1 + 1] * W[sc * i + sc * 1 * dim1 - Woff] );
- };
- {
- x04 = ( x[2 * i + 2 * 2 * dim1] * W[sc * i + sc * 2 * dim1 - Woff] ) - ( x[2 * i + 2 * 2 * dim1 + 1] * W[sc * i + sc * 2 * dim1 + 1 - Woff] );
- x05 = ( x[2 * i + 2 * 2 * dim1] * W[sc * i + sc * 2 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 2 * dim1 + 1] * W[sc * i + sc * 2 * dim1 - Woff] );
- };
- {
- x06 = ( x[2 * i + 2 * 3 * dim1] * W[sc * i + sc * 3 * dim1 - Woff] ) - ( x[2 * i + 2 * 3 * dim1 + 1] * W[sc * i + sc * 3 * dim1 + 1 - Woff] );
- x07 = ( x[2 * i + 2 * 3 * dim1] * W[sc * i + sc * 3 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 3 * dim1 + 1] * W[sc * i + sc * 3 * dim1 - Woff] );
- };
- {
- x08 = ( x[2 * i + 2 * 4 * dim1] * W[sc * i + sc * 4 * dim1 - Woff] ) - ( x[2 * i + 2 * 4 * dim1 + 1] * W[sc * i + sc * 4 * dim1 + 1 - Woff] );
- x09 = ( x[2 * i + 2 * 4 * dim1] * W[sc * i + sc * 4 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 4 * dim1 + 1] * W[sc * i + sc * 4 * dim1 - Woff] );
- };
- {
- x10 = ( x[2 * i + 2 * 5 * dim1] * W[sc * i + sc * 5 * dim1 - Woff] ) - ( x[2 * i + 2 * 5 * dim1 + 1] * W[sc * i + sc * 5 * dim1 + 1 - Woff] );
- x11 = ( x[2 * i + 2 * 5 * dim1] * W[sc * i + sc * 5 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 5 * dim1 + 1] * W[sc * i + sc * 5 * dim1 - Woff] );
- };
- {
- x12 = ( x[2 * i + 2 * 6 * dim1] * W[sc * i + sc * 6 * dim1 - Woff] ) - ( x[2 * i + 2 * 6 * dim1 + 1] * W[sc * i + sc * 6 * dim1 + 1 - Woff] );
- x13 = ( x[2 * i + 2 * 6 * dim1] * W[sc * i + sc * 6 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 6 * dim1 + 1] * W[sc * i + sc * 6 * dim1 - Woff] );
- };
- {
- x14 = ( x[2 * i + 2 * 7 * dim1] * W[sc * i + sc * 7 * dim1 - Woff] ) - ( x[2 * i + 2 * 7 * dim1 + 1] * W[sc * i + sc * 7 * dim1 + 1 - Woff] );
- x15 = ( x[2 * i + 2 * 7 * dim1] * W[sc * i + sc * 7 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * 7 * dim1 + 1] * W[sc * i + sc * 7 * dim1 - Woff] );
- };
- }
-
- t00 = ( x00 + x08 );
- t02 = ( x00 - x08 );
- t01 = ( x01 + x09 );
- t03 = ( x01 - x09 );
- t04 = ( x02 + x10 );
- t06 = ( x02 - x10 );
- t05 = ( x03 + x11 );
- t07 = ( x03 - x11 );
- t08 = ( x04 + x12 );
- t10 = ( x04 - x12 );
- t09 = ( x05 + x13 );
- t11 = ( x05 - x13 );
- t12 = ( x06 + x14 );
- t14 = ( x06 - x14 );
- t13 = ( x07 + x15 );
- t15 = ( x07 - x15 );
-
- s00 = ( t00 + t08 );
- s04 = ( t00 - t08 );
- s01 = ( t01 + t09 );
- s05 = ( t01 - t09 );
- s08 = ( t02 - t11 );
- s10 = ( t02 + t11 );
- s09 = ( t03 + t10 );
- s11 = ( t03 - t10 );
- s02 = ( t04 + t12 );
- s07 = ( t04 - t12 );
- s03 = ( t05 + t13 );
- s06 = ( t13 - t05 );
-
- t01 = ( t06 + t14 );
- t02 = ( t06 - t14 );
- t00 = ( t07 + t15 );
- t03 = ( t07 - t15 );
-
- s12 = ( ( t00 + t02 ) * FFT_C81 );
- s14 = ( ( t00 - t02 ) * FFT_C81 );
- s13 = ( ( t03 - t01 ) * FFT_C81 );
- s15 = ( ( t01 + t03 ) * FFT_C82 );
-
- re[sx * i + sx * 0 * dim1] = ( s00 + s02 );
- im[sx * i + sx * 0 * dim1] = ( s01 + s03 );
- re[sx * i + sx * 1 * dim1] = ( s10 + s12 );
- im[sx * i + sx * 1 * dim1] = ( s11 + s13 );
- re[sx * i + sx * 2 * dim1] = ( s04 - s06 );
- im[sx * i + sx * 2 * dim1] = ( s05 - s07 );
- re[sx * i + sx * 3 * dim1] = ( s08 + s14 );
- im[sx * i + sx * 3 * dim1] = ( s09 + s15 );
- re[sx * i + sx * 4 * dim1] = ( s00 - s02 );
- im[sx * i + sx * 4 * dim1] = ( s01 - s03 );
- re[sx * i + sx * 5 * dim1] = ( s10 - s12 );
- im[sx * i + sx * 5 * dim1] = ( s11 - s13 );
- re[sx * i + sx * 6 * dim1] = ( s04 + s06 );
- im[sx * i + sx * 6 * dim1] = ( s05 + s07 );
- re[sx * i + sx * 7 * dim1] = ( s08 - s14 );
- im[sx * i + sx * 7 * dim1] = ( s09 - s15 );
- }
- }
- break;
- }
-
- case 10:
- {
- float y[2 * 10];
- for ( j = 0; j < dim2; j++ )
- {
- {
- y[2 * j] = x[2 * 0 + 2 * j * dim1];
- y[2 * j + 1] = x[2 * 0 + 2 * j * dim1 + 1];
- };
- }
- fft_len10( &y[0], &y[1], 2 );
- for ( j = 0; j < dim2; j++ )
- {
- re[sx * 0 + sx * j * dim1] = y[2 * j];
- im[sx * 0 + sx * j * dim1] = y[2 * j + 1];
- }
-
- for ( i = 1; i < dim1; i++ )
- {
- {
- y[2 * ( 0 + 0 )] = x[2 * i + 2 * ( 0 + 0 ) * dim1];
- y[2 * ( 0 + 0 ) + 1] = x[2 * i + 2 * ( 0 + 0 ) * dim1 + 1];
- }
-
- for ( j = 1; j < dim2; j++ )
- {
- {
- y[2 * ( j + 0 )] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + sc * j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + sc * j * dim1 + 1 - Woff] );
- y[2 * ( j + 0 ) + 1] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + sc * j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + sc * j * dim1 - Woff] );
- }
- }
- fft_len10( &y[0], &y[1], 2 );
- for ( j = 0; j < dim2; j++ )
- {
- re[sx * i + sx * j * dim1] = y[2 * j];
- im[sx * i + sx * j * dim1] = y[2 * j + 1];
- }
- }
- break;
- }
-
- case 16:
- {
- float y[2 * 16];
- for ( j = 0; j < dim2; j++ )
- {
- {
- y[2 * j] = x[2 * 0 + 2 * j * dim1];
- y[2 * j + 1] = x[2 * 0 + 2 * j * dim1 + 1];
- };
- }
- fft_len16( &y[0], &y[1], 2 );
- for ( j = 0; j < dim2; j++ )
- {
- re[sx * 0 + sx * j * dim1] = y[2 * j];
- im[sx * 0 + sx * j * dim1] = y[2 * j + 1];
- }
-
- for ( i = 1; i < dim1; i++ )
- {
- {
- y[2 * ( 0 + 0 )] = x[2 * i + 2 * ( 0 + 0 ) * dim1];
- y[2 * ( 0 + 0 ) + 1] = x[2 * i + 2 * ( 0 + 0 ) * dim1 + 1];
- }
-
- for ( j = 1; j < dim2; j++ )
- {
- {
- y[2 * ( j + 0 )] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + sc * j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + sc * j * dim1 + 1 - Woff] );
- y[2 * ( j + 0 ) + 1] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + sc * j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + sc * j * dim1 - Woff] );
- }
- }
- fft_len16( &y[0], &y[1], 2 );
- for ( j = 0; j < dim2; j++ )
- {
- re[sx * i + sx * j * dim1] = y[2 * j];
- im[sx * i + sx * j * dim1] = y[2 * j + 1];
- }
- }
- break;
- }
-
- case 20:
- {
- float y[2 * 20];
- for ( j = 0; j < dim2; j++ )
- {
- {
- y[2 * j] = x[2 * 0 + 2 * j * dim1];
- y[2 * j + 1] = x[2 * 0 + 2 * j * dim1 + 1];
- };
- }
- fft_len20( &y[0], &y[1], 2 );
- for ( j = 0; j < dim2; j++ )
- {
- re[sx * 0 + sx * j * dim1] = y[2 * j];
- im[sx * 0 + sx * j * dim1] = y[2 * j + 1];
- }
-
- for ( i = 1; i < dim1; i++ )
- {
- {
- y[2 * ( 0 + 0 )] = x[2 * i + 2 * ( 0 + 0 ) * dim1];
- y[2 * ( 0 + 0 ) + 1] = x[2 * i + 2 * ( 0 + 0 ) * dim1 + 1];
- }
- {
- y[2 * ( 0 + 1 )] = ( x[2 * i + 2 * ( 0 + 1 ) * dim1] * W[len + sc * i + 0 * dim1 - Woff] ) - ( x[2 * i + 2 * ( 0 + 1 ) * dim1 + 1] * W[len + sc * i + 0 * dim1 + 1 - Woff] );
- y[2 * ( 0 + 1 ) + 1] = ( x[2 * i + 2 * ( 0 + 1 ) * dim1] * W[len + sc * i + 0 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( 0 + 1 ) * dim1 + 1] * W[len + sc * i + 0 * dim1 - Woff] );
- }
-
- for ( j = 2; j < dim2; j = j + 2 )
- {
- {
- y[2 * ( j + 0 )] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + j * dim1 + 1 - Woff] );
- y[2 * ( j + 0 ) + 1] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + j * dim1 - Woff] );
- }
- {
- y[2 * ( j + 1 )] = ( x[2 * i + 2 * ( j + 1 ) * dim1] * W[len + sc * i + j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 1 ) * dim1 + 1] * W[len + sc * i + j * dim1 + 1 - Woff] );
- y[2 * ( j + 1 ) + 1] = ( x[2 * i + 2 * ( j + 1 ) * dim1] * W[len + sc * i + j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 1 ) * dim1 + 1] * W[len + sc * i + j * dim1 - Woff] );
- }
- }
- fft_len20( &y[0], &y[1], 2 );
- for ( j = 0; j < dim2; j++ )
- {
- re[sx * i + sx * j * dim1] = y[2 * j];
- im[sx * i + sx * j * dim1] = y[2 * j + 1];
- }
- }
- break;
- }
-
- case 32:
- {
- float y[2 * 32];
- for ( j = 0; j < dim2; j++ )
- {
- {
- y[2 * j] = x[2 * 0 + 2 * j * dim1];
- y[2 * j + 1] = x[2 * 0 + 2 * j * dim1 + 1];
- };
- }
- fft_len32( &y[0], &y[1], 2 );
- for ( j = 0; j < dim2; j++ )
- {
- re[sx * 0 + sx * j * dim1] = y[2 * j];
- im[sx * 0 + sx * j * dim1] = y[2 * j + 1];
- }
-
- for ( i = 1; i < dim1; i++ )
- {
- {
- y[2 * ( 0 + 0 )] = x[2 * i + 2 * ( 0 + 0 ) * dim1];
- y[2 * ( 0 + 0 ) + 1] = x[2 * i + 2 * ( 0 + 0 ) * dim1 + 1];
- }
- {
- y[2 * ( 0 + 1 )] = ( x[2 * i + 2 * ( 0 + 1 ) * dim1] * W[len + sc * i + 0 * dim1 - Woff] ) - ( x[2 * i + 2 * ( 0 + 1 ) * dim1 + 1] * W[len + sc * i + 0 * dim1 + 1 - Woff] );
- y[2 * ( 0 + 1 ) + 1] = ( x[2 * i + 2 * ( 0 + 1 ) * dim1] * W[len + sc * i + 0 * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( 0 + 1 ) * dim1 + 1] * W[len + sc * i + 0 * dim1 - Woff] );
- }
-
- for ( j = 2; j < dim2; j = j + 2 )
- {
- {
- y[2 * ( j + 0 )] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + j * dim1 + 1 - Woff] );
- y[2 * ( j + 0 ) + 1] = ( x[2 * i + 2 * ( j + 0 ) * dim1] * W[sc * i + j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 0 ) * dim1 + 1] * W[sc * i + j * dim1 - Woff] );
- }
- {
- y[2 * ( j + 1 )] = ( x[2 * i + 2 * ( j + 1 ) * dim1] * W[len + sc * i + j * dim1 - Woff] ) - ( x[2 * i + 2 * ( j + 1 ) * dim1 + 1] * W[len + sc * i + j * dim1 + 1 - Woff] );
- y[2 * ( j + 1 ) + 1] = ( x[2 * i + 2 * ( j + 1 ) * dim1] * W[len + sc * i + j * dim1 + 1 - Woff] ) + ( x[2 * i + 2 * ( j + 1 ) * dim1 + 1] * W[len + sc * i + j * dim1 - Woff] );
- }
- }
- fft_len32( &y[0], &y[1], 2 );
- for ( j = 0; j < dim2; j++ )
- {
- re[sx * i + sx * j * dim1] = y[2 * j];
- im[sx * i + sx * j * dim1] = y[2 * j + 1];
- }
- }
- break;
- }
- }
-
- return;
-}
-
-
-/*-----------------------------------------------------------------*
- * fft()
- *
- * Complex-value FFT
- *-----------------------------------------------------------------*/
-
-void fft(
- float *re, /* i/o: real part */
- float *im, /* i/o: imag part */
- const int16_t length, /* i : length of fft */
- const int16_t s /* i : sign */
-)
-{
- switch ( length )
- {
- case 20:
- fft_len20( re, im, s );
- break;
- case 40:
- fft_lenN( re, im, FFT_RotVector_640, 640, 5, 8, s, 8, 40 );
- break;
- case 64:
- fft_lenN( re, im, FFT_RotVector_256, 256, 8, 8, s, 8, 64 );
- break;
- case 80:
- fft_lenN( re, im, FFT_RotVector_640, 640, 10, 8, s, 4, 40 );
- break;
- case 100:
- fft_lenN( re, im, FFT_RotVector_400, 400, 10, 10, s, 4, 40 );
- break;
- case 120:
- fft_lenN( re, im, FFT_RotVector_960, 960, 15, 8, s, 4, 60 );
- break;
- case 128:
- fft_lenN( re, im, FFT_RotVector_256, 256, 16, 8, s, 4, 64 );
- break;
- case 160:
- fft_lenN( re, im, FFT_RotVector_640, 640, 20, 8, s, 2, 40 );
- break;
- case 200:
- fft_lenN( re, im, FFT_RotVector_400, 400, 20, 10, s, 2, 40 );
- break;
- case 240:
- fft_lenN( re, im, FFT_RotVector_960, 960, 30, 8, s, 2, 60 );
- break;
- case 256:
- fft_lenN( re, im, FFT_RotVector_256, 256, 32, 8, s, 2, 64 );
- break;
- case 320:
- fft_lenN( re, im, FFT_RotVector_640, 640, 20, 16, s, 2, 40 );
- break;
- case 400:
- fft_lenN( re, im, FFT_RotVector_400, 400, 20, 20, s, 2, 40 );
- break;
- case 480:
- fft_lenN( re, im, FFT_RotVector_960, 960, 30, 16, s, 2, 60 );
- break;
- case 600:
- fft_lenN( re, im, FFT_RotVector_600, 600, 30, 20, s, 2, 60 );
- break;
- case 640:
- fft_lenN( re, im, FFT_RotVector_640, 640, 20, 32, s, 2, 40 );
- break;
- case 960:
- fft_lenN( re, im, FFT_RotVector_960, 960, 30, 32, s, 2, 60 );
- break;
- default:
- assert( !"fft length is not supported!" );
- }
-
- return;
-}
-
-
-/*-----------------------------------------------------------------*
- * rfft()
- *
- * Real-value FFT
+ * Low-complexity implementation of FFT
*-----------------------------------------------------------------*/
-void rfft(
- float *x, /* i/o: values */
- const float *w, /* i : window */
- const int16_t length, /* i : length of fft */
- const int16_t isign /* i : sign */
-)
-{
- int16_t i, sizeOfFft2, sizeOfFft4;
- float tmp, t1, t2, t3, t4, s1, s2;
-
- sizeOfFft2 = length >> 1;
- sizeOfFft4 = length >> 2;
- s1 = 1.f / (float) sizeOfFft2;
- s2 = -1.f / (float) sizeOfFft2;
-
- switch ( isign )
- {
-
- case -1:
-
- fft( x, x + 1, sizeOfFft2, 2 );
-
- tmp = x[0] + x[1];
- x[1] = x[0] - x[1];
- x[0] = tmp;
-
- for ( i = 1; i <= sizeOfFft4; i++ )
- {
- t1 = x[2 * i] - x[length - 2 * i];
- t2 = x[2 * i + 1] + x[length - 2 * i + 1];
- t3 = w[i] * t1 - w[i + sizeOfFft4] * t2;
- t4 = w[i + sizeOfFft4] * t1 + w[i] * t2;
- t1 = x[2 * i] + x[length - 2 * i];
- t2 = x[2 * i + 1] - x[length - 2 * i + 1];
-
- x[2 * i] = ( t1 - t3 ) * 0.5f;
- x[2 * i + 1] = ( t2 - t4 ) * 0.5f;
- x[length - 2 * i] = ( t1 + t3 ) * 0.5f;
- x[length - 2 * i + 1] = -( t2 + t4 ) * 0.5f;
- }
-
- break;
-
- case +1:
-
- tmp = ( x[0] + x[1] ) * 0.5f;
- x[1] = ( x[1] - x[0] ) * 0.5f;
- x[0] = tmp;
-
- for ( i = 1; i <= sizeOfFft4; i++ )
- {
- t1 = x[2 * i] - x[length - 2 * i];
- t2 = x[2 * i + 1] + x[length - 2 * i + 1];
- t3 = w[i] * t1 + w[i + sizeOfFft4] * t2;
- t4 = -w[i + sizeOfFft4] * t1 + w[i] * t2;
- t1 = x[2 * i] + x[length - 2 * i];
- t2 = x[2 * i + 1] - x[length - 2 * i + 1];
-
- x[2 * i] = ( t1 - t3 ) * 0.5f;
- x[2 * i + 1] = ( t4 - t2 ) * 0.5f;
- x[length - 2 * i] = ( t1 + t3 ) * 0.5f;
- x[length - 2 * i + 1] = ( t2 + t4 ) * 0.5f;
- }
-
- fft( x, x + 1, sizeOfFft2, 2 );
-
- for ( i = 0; i < length; i += 2 )
- {
- x[i] *= s1;
- x[i + 1] *= s2;
- }
-
- break;
- }
-
- return;
-}
-
#define WMC_TOOL_SKIP
#define SHC( x ) ( (Word16) x )
diff --git a/lib_com/fft_cldfb.c b/lib_com/fft_cldfb.c
deleted file mode 100644
index 44e19eabc1f32a0b0d556bd1d27e59232aa62932..0000000000000000000000000000000000000000
--- a/lib_com/fft_cldfb.c
+++ /dev/null
@@ -1,1223 +0,0 @@
-/******************************************************************************************************
-
- (C) 2022-2024 IVAS codec Public Collaboration with portions copyright Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository. All Rights Reserved.
-
- This software is protected by copyright law and by international treaties.
- The IVAS codec Public Collaboration consisting of Dolby International AB, Ericsson AB,
- Fraunhofer-Gesellschaft zur Foerderung der angewandten Forschung e.V., Huawei Technologies Co. LTD.,
- Koninklijke Philips N.V., Nippon Telegraph and Telephone Corporation, Nokia Technologies Oy, Orange,
- Panasonic Holdings Corporation, Qualcomm Technologies, Inc., VoiceAge Corporation, and other
- contributors to this repository retain full ownership rights in their respective contributions in
- the software. This notice grants no license of any kind, including but not limited to patent
- license, nor is any license granted by implication, estoppel or otherwise.
-
- Contributors are required to enter into the IVAS codec Public Collaboration agreement before making
- contributions.
-
- This software is provided "AS IS", without any express or implied warranties. The software is in the
- development stage. It is intended exclusively for experts who have experience with such software and
- solely for the purpose of inspection. All implied warranties of non-infringement, merchantability
- and fitness for a particular purpose are hereby disclaimed and excluded.
-
- Any dispute, controversy or claim arising under or in relation to providing this software shall be
- submitted to and settled by the final, binding jurisdiction of the courts of Munich, Germany in
- accordance with the laws of the Federal Republic of Germany excluding its conflict of law rules and
- the United Nations Convention on Contracts on the International Sales of Goods.
-
-*******************************************************************************************************/
-
-/*====================================================================================
- EVS Codec 3GPP TS26.443 Nov 04, 2021. Version 12.14.0 / 13.10.0 / 14.6.0 / 15.4.0 / 16.3.0
- ====================================================================================*/
-
-#include
-#include "options.h"
-#include
-#include "prot.h"
-#include "ivas_cnst.h"
-#include "wmc_auto.h"
-
-#if __STDC_VERSION__ >= 199901L
-#if defined __ICL
-#define restrict __restrict
-#endif
-#else
-#define restrict
-#endif
-
-
-static void fft8( float *vec );
-static void fft10( float *vec );
-static void fft16_ivas( float *vec );
-static void fft20( float *vec );
-static void fft30( float *vec );
-static void fft5s( float *x, const int16_t stride );
-
-
-#define COS_PI_DIV8 9.238795325112867e-1f
-#define COS_3PI_DIV8 3.826834323650898e-1f
-#define SQRT2PLUS1 2.414213562373095f
-#define SQRT2MINUS1 4.142135623730952e-1f
-
-
-/*******************************************************************************
- Functionname: fft8
- *******************************************************************************
-
- Description: 8-point FFT. Complex-valued input takes 52 real additions
- and 4 real multiplications.
-
- Arguments: vec - pointer to data (interleaved real / imaginary parts)
-
- Return: none
-
-*******************************************************************************/
-static void fft8( float *restrict vec )
-{
- float temp1[16];
- float temp2[16];
-
-
- /* Pre-additions */
- temp1[0] = vec[0] + vec[8];
- temp1[2] = vec[0] - vec[8];
- temp1[1] = vec[1] + vec[9];
- temp1[3] = vec[1] - vec[9];
- temp1[4] = vec[2] + vec[10];
- temp1[6] = vec[2] - vec[10];
- temp1[5] = vec[3] + vec[11];
- temp1[7] = vec[3] - vec[11];
- temp1[8] = vec[4] + vec[12];
- temp1[10] = vec[4] - vec[12];
- temp1[9] = vec[5] + vec[13];
- temp1[11] = vec[5] - vec[13];
- temp1[12] = vec[6] + vec[14];
- temp1[14] = vec[6] - vec[14];
- temp1[13] = vec[7] + vec[15];
- temp1[15] = vec[7] - vec[15];
-
- /* Pre-additions and core multiplications */
- temp2[0] = temp1[0] + temp1[8];
- temp2[4] = temp1[0] - temp1[8];
- temp2[1] = temp1[1] + temp1[9];
- temp2[5] = temp1[1] - temp1[9];
- temp2[8] = temp1[2] - temp1[11];
- temp2[10] = temp1[2] + temp1[11];
- temp2[9] = temp1[3] + temp1[10];
- temp2[11] = temp1[3] - temp1[10];
- temp2[2] = temp1[4] + temp1[12];
- temp2[7] = temp1[4] - temp1[12];
- temp2[3] = temp1[5] + temp1[13];
- temp2[6] = temp1[13] - temp1[5];
-
- temp1[1] = temp1[6] + temp1[14];
- temp1[2] = temp1[6] - temp1[14];
- temp1[0] = temp1[7] + temp1[15];
- temp1[3] = temp1[7] - temp1[15];
-
- temp2[12] = ( temp1[0] + temp1[2] ) * INV_SQRT2;
- temp2[14] = ( temp1[0] - temp1[2] ) * INV_SQRT2;
- temp2[13] = ( temp1[3] - temp1[1] ) * INV_SQRT2;
- temp2[15] = ( temp1[1] + temp1[3] ) * -INV_SQRT2;
-
- /* Post-additions */
- vec[0] = temp2[0] + temp2[2];
- vec[8] = temp2[0] - temp2[2];
- vec[1] = temp2[1] + temp2[3];
- vec[9] = temp2[1] - temp2[3];
- vec[4] = temp2[4] - temp2[6];
- vec[12] = temp2[4] + temp2[6];
- vec[5] = temp2[5] - temp2[7];
- vec[13] = temp2[5] + temp2[7];
- vec[6] = temp2[8] + temp2[14];
- vec[14] = temp2[8] - temp2[14];
- vec[7] = temp2[9] + temp2[15];
- vec[15] = temp2[9] - temp2[15];
- vec[2] = temp2[10] + temp2[12];
- vec[10] = temp2[10] - temp2[12];
- vec[3] = temp2[11] + temp2[13];
- vec[11] = temp2[11] - temp2[13];
-
- return;
-}
-
-
-/*******************************************************************************
- Functionname: fft16_ivas
- *******************************************************************************
-
- Description: 16-point FFT. Complex-valued input takes 144 real additions and
- 24 real multiplications.
-
- Arguments: vec - pointer to data (interleaved real / imaginary parts)
-
- Return: none
-
-*******************************************************************************/
-/* fast implementation, completely unrolled and inlined */
-static void fft16_ivas( float *restrict vec )
-{
- float temp10, temp11, temp12, temp13, temp14, temp15, temp16, temp17,
- temp18, temp19, temp110, temp111, temp112, temp113, temp114, temp115;
- float temp20, temp21, temp22, temp23, temp24, temp25, temp26, temp27,
- temp28, temp29, temp210, temp211, temp212, temp213, temp214, temp215;
- float vec0, vec1, vec2, vec3, vec4, vec5, vec6, vec7,
- vec8, vec9, vec10, vec11, vec12, vec13, vec14, vec15;
-
-
- /* even */
- vec0 = vec[0] + vec[16];
- vec1 = vec[1] + vec[17];
- vec2 = vec[2] + vec[18];
- vec3 = vec[3] + vec[19];
- vec4 = vec[4] + vec[20];
- vec5 = vec[5] + vec[21];
- vec6 = vec[6] + vec[22];
- vec7 = vec[7] + vec[23];
- vec8 = vec[8] + vec[24];
- vec9 = vec[9] + vec[25];
- vec10 = vec[10] + vec[26];
- vec11 = vec[11] + vec[27];
- vec12 = vec[12] + vec[28];
- vec13 = vec[13] + vec[29];
- vec14 = vec[14] + vec[30];
- vec15 = vec[15] + vec[31];
-
- /* Pre-additions */
- temp10 = vec0 + vec8;
- temp12 = vec0 - vec8;
- temp11 = vec1 + vec9;
- temp13 = vec1 - vec9;
- temp14 = vec2 + vec10;
- temp16 = vec2 - vec10;
- temp15 = vec3 + vec11;
- temp17 = vec3 - vec11;
- temp18 = vec4 + vec12;
- temp110 = vec4 - vec12;
- temp19 = vec5 + vec13;
- temp111 = vec5 - vec13;
- temp112 = vec6 + vec14;
- temp114 = vec6 - vec14;
- temp113 = vec7 + vec15;
- temp115 = vec7 - vec15;
-
- /* Pre-additions and core multiplications */
- temp20 = temp10 + temp18;
- temp24 = temp10 - temp18;
- temp21 = temp11 + temp19;
- temp25 = temp11 - temp19;
- temp28 = temp12 - temp111;
- temp210 = temp12 + temp111;
- temp29 = temp13 + temp110;
- temp211 = temp13 - temp110;
- temp22 = temp14 + temp112;
- temp27 = temp14 - temp112;
- temp23 = temp15 + temp113;
- temp26 = temp113 - temp15;
-
- temp11 = temp16 + temp114;
- temp12 = temp16 - temp114;
- temp10 = temp17 + temp115;
- temp13 = temp17 - temp115;
-
- temp212 = ( temp10 + temp12 ) * INV_SQRT2;
- temp214 = ( temp10 - temp12 ) * INV_SQRT2;
- temp213 = ( temp13 - temp11 ) * INV_SQRT2;
- temp215 = ( temp11 + temp13 ) * -INV_SQRT2;
-
-
- /* odd */
- vec0 = vec[0] - vec[16];
- vec1 = vec[1] - vec[17];
- vec2 = vec[2] - vec[18];
- vec3 = vec[3] - vec[19];
- vec4 = vec[4] - vec[20];
- vec5 = vec[5] - vec[21];
- vec6 = vec[6] - vec[22];
- vec7 = vec[7] - vec[23];
- vec8 = vec[8] - vec[24];
- vec9 = vec[9] - vec[25];
- vec10 = vec[10] - vec[26];
- vec11 = vec[11] - vec[27];
- vec12 = vec[12] - vec[28];
- vec13 = vec[13] - vec[29];
- vec14 = vec[14] - vec[30];
- vec15 = vec[15] - vec[31];
-
- /* Pre-additions and core multiplications */
- temp19 = ( vec2 + vec14 ) * -COS_3PI_DIV8;
- temp110 = ( vec2 - vec14 ) * COS_PI_DIV8;
- temp18 = ( vec3 + vec15 ) * COS_3PI_DIV8;
- temp111 = ( vec3 - vec15 ) * COS_PI_DIV8;
- temp15 = ( vec4 + vec12 ) * -INV_SQRT2;
- temp16 = ( vec4 - vec12 ) * INV_SQRT2;
- temp14 = ( vec5 + vec13 ) * INV_SQRT2;
- temp17 = ( vec5 - vec13 ) * INV_SQRT2;
- temp113 = ( vec6 + vec10 ) * -COS_PI_DIV8;
- temp114 = ( vec6 - vec10 ) * COS_3PI_DIV8;
- temp112 = ( vec7 + vec11 ) * COS_PI_DIV8;
- temp115 = ( vec7 - vec11 ) * COS_3PI_DIV8;
-
- /* Core multiplications */
- vec2 = temp18 * SQRT2PLUS1 - temp112 * SQRT2MINUS1;
- vec3 = temp19 * SQRT2PLUS1 - temp113 * SQRT2MINUS1;
- vec4 = temp110 * SQRT2MINUS1 - temp114 * SQRT2PLUS1;
- vec5 = temp111 * SQRT2MINUS1 - temp115 * SQRT2PLUS1;
-
- /* Post-additions */
- temp18 += temp112;
- temp19 += temp113;
- temp110 += temp114;
- temp111 += temp115;
-
- vec6 = vec0 + temp14;
- vec10 = vec0 - temp14;
- vec7 = vec1 + temp15;
- vec11 = vec1 - temp15;
-
- vec12 = temp16 - vec9;
- vec14 = temp16 + vec9;
- vec13 = vec8 + temp17;
- vec15 = vec8 - temp17;
-
- temp10 = vec6 - vec14;
- temp12 = vec6 + vec14;
- temp11 = vec7 + vec15;
- temp13 = vec7 - vec15;
- temp14 = vec10 + vec12;
- temp16 = vec10 - vec12;
- temp15 = vec11 + vec13;
- temp17 = vec11 - vec13;
-
- vec10 = temp18 + temp110;
- temp110 = temp18 - temp110;
- vec11 = temp19 + temp111;
- temp111 = temp19 - temp111;
-
- temp112 = vec2 + vec4;
- temp114 = vec2 - vec4;
- temp113 = vec3 + vec5;
- temp115 = vec3 - vec5;
-
-
- /* Post-additions */
- *vec++ = temp20 + temp22;
- *vec++ = temp21 + temp23;
- *vec++ = temp12 + vec10;
- *vec++ = temp13 + vec11;
- *vec++ = temp210 + temp212;
- *vec++ = temp211 + temp213;
- *vec++ = temp10 + temp112;
- *vec++ = temp11 + temp113;
- *vec++ = temp24 - temp26;
- *vec++ = temp25 - temp27;
- *vec++ = temp16 + temp114;
- *vec++ = temp17 + temp115;
- *vec++ = temp28 + temp214;
- *vec++ = temp29 + temp215;
- *vec++ = temp14 + temp110;
- *vec++ = temp15 + temp111;
- *vec++ = temp20 - temp22;
- *vec++ = temp21 - temp23;
- *vec++ = temp12 - vec10;
- *vec++ = temp13 - vec11;
- *vec++ = temp210 - temp212;
- *vec++ = temp211 - temp213;
- *vec++ = temp10 - temp112;
- *vec++ = temp11 - temp113;
- *vec++ = temp24 + temp26;
- *vec++ = temp25 + temp27;
- *vec++ = temp16 - temp114;
- *vec++ = temp17 - temp115;
- *vec++ = temp28 - temp214;
- *vec++ = temp29 - temp215;
- *vec++ = temp14 - temp110;
- *vec++ = temp15 - temp111;
-
- return;
-}
-
-
-/*******************************************************************************
- Functionname: fft15
- *******************************************************************************
-
- Description: 15-point FFT. Complex-valued input takes 176 real additions
- and 34 real multiplications.
-
- Arguments: vec - pointer to data (interleaved real / imaginary parts)
-
- Return: none
-
-*******************************************************************************/
-static void fft15( float *restrict vec )
-{
-
- float r0, r1, r2, r3, r4, r5, r6, r7, r8, r9, r10, r11, r12, r13, r14, r15, r16, r17;
- float i0, i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12, i13, i14, i15, i16, i17;
- float tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9,
- tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17, tmp18, tmp19,
- tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27, tmp28, tmp29;
-
-
- /* Pre-additions real part */
- r1 = vec[2] + vec[8];
- r2 = vec[2] - vec[8];
- r3 = vec[4] + vec[16];
- r4 = vec[4] - vec[16];
- r5 = vec[6] + vec[24];
- r6 = vec[6] - vec[24];
- r7 = vec[10] + vec[20];
- r8 = vec[10] - vec[20];
- r9 = vec[12] + vec[18];
- r10 = vec[12] - vec[18];
- r11 = vec[14] + vec[26];
- r12 = vec[14] - vec[26];
- r13 = vec[22] + vec[28];
- r14 = vec[22] - vec[28];
-
- tmp2 = r1 + r3;
- tmp4 = r1 - r3;
- tmp6 = r2 + r14;
- tmp8 = r2 - r14;
- tmp10 = r4 + r12;
- tmp12 = r4 - r12;
- tmp14 = r5 + r9;
- tmp16 = r5 - r9;
- tmp18 = r11 + r13;
- tmp20 = r11 - r13;
-
- /* Pre-additions imaginary part */
- i1 = vec[3] + vec[9];
- i2 = vec[3] - vec[9];
- i3 = vec[5] + vec[17];
- i4 = vec[5] - vec[17];
- i5 = vec[7] + vec[25];
- i6 = vec[7] - vec[25];
- i7 = vec[11] + vec[21];
- i8 = vec[11] - vec[21];
- i9 = vec[13] + vec[19];
- i10 = vec[13] - vec[19];
- i11 = vec[15] + vec[27];
- i12 = vec[15] - vec[27];
- i13 = vec[23] + vec[29];
- i14 = vec[23] - vec[29];
-
- tmp3 = i1 + i3;
- tmp5 = i1 - i3;
- tmp7 = i2 + i14;
- tmp9 = i2 - i14;
- tmp11 = i4 + i12;
- tmp13 = i4 - i12;
- tmp15 = i5 + i9;
- tmp17 = i5 - i9;
- tmp19 = i11 + i13;
- tmp21 = i11 - i13;
-
-
- /* Pre-additions and core multiplications */
- tmp28 = tmp4 + tmp20;
- tmp29 = tmp5 + tmp21;
- r4 = tmp2 + tmp18;
- i4 = tmp3 + tmp19;
- r3 = ( r4 + tmp14 ) * -1.25f;
- i3 = ( i4 + tmp15 ) * -1.25f;
- r2 = ( tmp29 - i8 ) * -8.660254037844387e-1f;
- i2 = ( tmp28 - r8 ) * 8.660254037844387e-1f;
- r1 = r4 + r7;
- i1 = i4 + i7;
- r0 = r1 + vec[0] + tmp14;
- i0 = i1 + vec[1] + tmp15;
- r7 = tmp4 - tmp20;
- i7 = tmp5 - tmp21;
- r8 = ( tmp3 - tmp19 ) * -4.841229182759272e-1f;
- i8 = ( tmp2 - tmp18 ) * 4.841229182759272e-1f;
- tmp0 = tmp6 + r10;
- tmp1 = tmp7 + i10;
- tmp2 = r6 - tmp10;
- tmp3 = i6 - tmp11;
- r10 = tmp7 * -2.308262652881440f;
- i10 = tmp6 * 2.308262652881440f;
- r11 = tmp8 * 1.332676064001459f;
- i11 = tmp9 * 1.332676064001459f;
- r6 = ( r7 - tmp16 ) * 5.590169943749475e-1f;
- i6 = ( i7 - tmp17 ) * 5.590169943749475e-1f;
- r12 = ( tmp1 + tmp3 ) * 5.877852522924733e-1f;
- i12 = ( tmp0 + tmp2 ) * -5.877852522924733e-1f;
- r13 = ( tmp7 - tmp11 ) * -8.816778784387098e-1f;
- i13 = ( tmp6 - tmp10 ) * 8.816778784387098e-1f;
- r14 = ( tmp8 + tmp12 ) * 5.090369604551274e-1f;
- i14 = ( tmp9 + tmp13 ) * 5.090369604551274e-1f;
- r16 = tmp11 * 5.449068960040204e-1f;
- i16 = tmp10 * -5.449068960040204e-1f;
- r17 = tmp12 * 3.146021430912046e-1f;
- i17 = tmp13 * 3.146021430912046e-1f;
-
- r4 *= 1.875f;
- i4 *= 1.875f;
- r1 *= -1.5f;
- i1 *= -1.5f;
- r7 *= -8.385254915624212e-1f;
- i7 *= -8.385254915624212e-1f;
- r5 = tmp29 * 1.082531754730548f;
- i5 = tmp28 * -1.082531754730548f;
- r9 = tmp1 * 1.538841768587627f;
- i9 = tmp0 * -1.538841768587627f;
- r15 = tmp3 * 3.632712640026803e-1f;
- i15 = tmp2 * -3.632712640026803e-1f;
-
-
- /* Post-additions real part */
- tmp2 = r0 + r1;
- tmp4 = r3 + r6;
- tmp6 = r3 - r6;
- tmp8 = r4 + r5;
- tmp10 = r4 - r5;
- tmp12 = r7 + r8;
- tmp14 = r7 - r8;
- tmp16 = r13 + r16;
- tmp18 = r14 + r17;
- tmp20 = r10 - r13;
- tmp22 = r11 - r14;
- tmp24 = r12 + r15;
- tmp26 = r12 - r9;
-
- r1 = tmp2 + r2;
- r2 = tmp2 - r2;
- r3 = tmp4 + tmp26;
- r4 = tmp4 - tmp26;
- r5 = tmp6 + tmp24;
- r6 = tmp6 - tmp24;
- r7 = tmp16 + tmp18;
- r8 = tmp16 - tmp18;
- r9 = tmp20 - tmp22;
- r10 = tmp20 + tmp22;
- r11 = r1 + tmp8;
- r12 = r2 + tmp10;
- r13 = r11 - tmp12;
- r14 = r12 - tmp14;
- r15 = r12 + tmp14;
- r16 = r11 + tmp12;
-
- /* Post-additions imaginary part */
- tmp3 = i0 + i1;
- tmp5 = i3 + i6;
- tmp7 = i3 - i6;
- tmp9 = i4 + i5;
- tmp11 = i4 - i5;
- tmp13 = i7 + i8;
- tmp15 = i7 - i8;
- tmp17 = i13 + i16;
- tmp19 = i14 + i17;
- tmp21 = i10 - i13;
- tmp23 = i11 - i14;
- tmp25 = i12 + i15;
- tmp27 = i12 - i9;
-
- i1 = tmp3 + i2;
- i2 = tmp3 - i2;
- i3 = tmp5 + tmp27;
- i4 = tmp5 - tmp27;
- i5 = tmp7 + tmp25;
- i6 = tmp7 - tmp25;
- i7 = tmp17 + tmp19;
- i8 = tmp17 - tmp19;
- i9 = tmp21 - tmp23;
- i10 = tmp21 + tmp23;
- i11 = i1 + tmp9;
- i12 = i2 + tmp11;
- i13 = i11 - tmp13;
- i14 = i12 - tmp15;
- i15 = i12 + tmp15;
- i16 = i11 + tmp13;
-
- *vec++ = r0;
- *vec++ = i0;
- *vec++ = r13 + r5 + r7;
- *vec++ = i13 + i5 + i7;
- *vec++ = r15 + r3 - r9;
- *vec++ = i15 + i3 - i9;
- *vec++ = r0 + r4;
- *vec++ = i0 + i4;
- *vec++ = r13 + r6 - r7;
- *vec++ = i13 + i6 - i7;
- *vec++ = r2;
- *vec++ = i2;
- *vec++ = r0 + r5;
- *vec++ = i0 + i5;
- *vec++ = r16 + r3 - r10;
- *vec++ = i16 + i3 - i10;
- *vec++ = r15 + r4 + r9;
- *vec++ = i15 + i4 + i9;
- *vec++ = r0 + r6;
- *vec++ = i0 + i6;
- *vec++ = r1;
- *vec++ = i1;
- *vec++ = r14 + r5 + r8;
- *vec++ = i14 + i5 + i8;
- *vec++ = r0 + r3;
- *vec++ = i0 + i3;
- *vec++ = r16 + r4 + r10;
- *vec++ = i16 + i4 + i10;
- *vec++ = r14 + r6 - r8;
- *vec++ = i14 + i6 - i8;
-
- return;
-}
-
-/*******************************************************************************
- Functionname: fft5s
- *******************************************************************************
-
- Description: 5-point FFT.
-
- Arguments: x - pointer to input data (interleaved real / imaginary parts)
- stride - stride for input data
-
- Return: none
-
-*******************************************************************************/
-static const float C51 = 0.9510565162951535f;
-static const float C52 = -1.5388417685876270f;
-static const float C53 = -0.3632712640026803f;
-static const float C54 = 0.5590169943749475f;
-static const float C55 = -1.25f;
-
-static void fft5s( float *x, const int16_t stride )
-{
- float r1, r2, r3, r4;
- float s1, s2, s3, s4;
- float t;
- /* real part */
- r1 = x[1 * stride] + x[4 * stride];
- r4 = x[1 * stride] - x[4 * stride];
- r3 = x[2 * stride] + x[3 * stride];
- r2 = x[2 * stride] - x[3 * stride];
- t = ( r1 - r3 ) * C54;
- r1 = r1 + r3;
- x[0] = x[0] + r1;
- r1 = x[0] + ( r1 * C55 );
- r3 = r1 - t;
- r1 = r1 + t;
- t = ( r4 + r2 ) * C51;
- r4 = t + ( r4 * C52 );
- r2 = t + ( r2 * C53 );
-
- /* imaginary part */
- s1 = x[1 * stride + 1] + x[4 * stride + 1];
- s4 = x[1 * stride + 1] - x[4 * stride + 1];
- s3 = x[2 * stride + 1] + x[3 * stride + 1];
- s2 = x[2 * stride + 1] - x[3 * stride + 1];
- t = ( s1 - s3 ) * C54;
- s1 = s1 + s3;
- x[1] = x[1] + s1;
- s1 = x[1] + ( s1 * C55 );
- s3 = s1 - t;
- s1 = s1 + t;
- t = ( s4 + s2 ) * C51;
- s4 = t + ( s4 * C52 );
- s2 = t + ( s2 * C53 );
-
- /* combination */
- x[1 * stride] = r1 + s2;
- x[4 * stride] = r1 - s2;
- x[2 * stride] = r3 - s4;
- x[3 * stride] = r3 + s4;
-
- x[1 * stride + 1] = s1 - r2;
- x[4 * stride + 1] = s1 + r2;
- x[2 * stride + 1] = s3 + r4;
- x[3 * stride + 1] = s3 - r4;
-}
-
-
-/**
- * \brief Function performs a complex 10-point FFT
- * The FFT is performed inplace. The result of the FFT
- * is scaled by SCALEFACTOR10 bits.
- *
- * WOPS FLC version: 1093 cycles
- * WOPS with 32x16 bit multiplications: 196 cycles
- *
- * \param [i/o] re real input / output
- * \param [i/o] im imag input / output
- * \param [i ] s stride real and imag input / output
- *
- * \return void
- */
-static void fft10( float *restrict vec )
-{
- float t;
- float r1, r2, r3, r4;
- float s1, s2, s3, s4;
- float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09;
- float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19;
-
- /* 2 fft5 stages */
-
- /* real part */
- r1 = vec[12] + vec[8];
- r4 = vec[12] - vec[8];
- r3 = vec[4] + vec[16];
- r2 = vec[4] - vec[16];
- t = ( r1 - r3 ) * C54;
- r1 = r1 + r3;
- y00 = vec[0] + r1;
- r1 = y00 + ( r1 * C55 );
- r3 = r1 - t;
- r1 = r1 + t;
- t = ( r4 + r2 ) * C51;
- r4 = t + ( r4 * C52 );
- r2 = t + ( r2 * C53 );
-
- /* imaginary part */
- s1 = vec[13] + vec[9];
- s4 = vec[13] - vec[9];
- s3 = vec[5] + vec[17];
- s2 = vec[5] - vec[17];
- t = ( s1 - s3 ) * C54;
- s1 = s1 + s3;
- y01 = vec[1] + s1;
- s1 = y01 + ( s1 * C55 );
- s3 = s1 - t;
- s1 = s1 + t;
- t = ( s4 + s2 ) * C51;
- s4 = t + ( s4 * C52 );
- s2 = t + ( s2 * C53 );
-
- /* combination */
- y04 = r1 + s2;
- y16 = r1 - s2;
- y08 = r3 - s4;
- y12 = r3 + s4;
- y05 = s1 - r2;
- y17 = s1 + r2;
- y09 = s3 + r4;
- y13 = s3 - r4;
-
- /* real part */
- r1 = vec[2] + vec[18];
- r4 = vec[2] - vec[18];
- r3 = vec[14] + vec[6];
- r2 = vec[14] - vec[6];
- t = ( r1 - r3 ) * C54;
- r1 = r1 + r3;
- y02 = vec[10] + r1;
- r1 = y02 + ( r1 * C55 );
- r3 = r1 - t;
- r1 = r1 + t;
- t = ( r4 + r2 ) * C51;
- r4 = t + ( r4 * C52 );
- r2 = t + ( r2 * C53 );
-
- /* imaginary part */
- s1 = vec[3] + vec[19];
- s4 = vec[3] - vec[19];
- s3 = vec[15] + vec[7];
- s2 = vec[15] - vec[7];
- t = ( s1 - s3 ) * C54;
- s1 = s1 + s3;
- y03 = vec[11] + s1;
- s1 = y03 + ( s1 * C55 );
- s3 = s1 - t;
- s1 = s1 + t;
- t = ( s4 + s2 ) * C51;
- s4 = t + ( s4 * C52 );
- s2 = t + ( s2 * C53 );
-
- /* combination */
- y06 = r1 + s2;
- y18 = r1 - s2;
- y10 = r3 - s4;
- y14 = r3 + s4;
- y07 = s1 - r2;
- y19 = s1 + r2;
- y11 = s3 + r4;
- y15 = s3 - r4;
-
- /* 5 fft2 stages */
- vec[0] = y00 + y02;
- vec[1] = y01 + y03;
- vec[2] = y12 - y14;
- vec[3] = y13 - y15;
- vec[4] = y04 + y06;
- vec[5] = y05 + y07;
- vec[6] = y16 - y18;
- vec[7] = y17 - y19;
- vec[8] = y08 + y10;
- vec[9] = y09 + y11;
- vec[10] = y00 - y02;
- vec[11] = y01 - y03;
- vec[12] = y12 + y14;
- vec[13] = y13 + y15;
- vec[14] = y04 - y06;
- vec[15] = y05 - y07;
- vec[16] = y16 + y18;
- vec[17] = y17 + y19;
- vec[18] = y08 - y10;
- vec[19] = y09 - y11;
-
- return;
-}
-
-/**
- * \brief Function performs a complex 20-point FFT
- * The FFT is performed inplace. The result of the FFT
- * is scaled by SCALEFACTOR20 bits.
- *
- * WOPS FLC version: 1509 cycles
- * WOPS with 32x16 bit multiplications: 432 cycles
- *
- * \param [i/o] re real input / output
- * \param [i/o] im imag input / output
- * \param [i ] s stride real and imag input / output
- *
- * \return void
- */
-static void fft20( float *signal )
-{
- const int16_t s = 2;
- float *re = signal, *im = signal + 1;
- float r1, r2, r3, r4;
- float s1, s2, s3, s4;
- float x0, x1, x2, x3, x4;
- float t, t0, t1, t2, t3, t4, t5, t6, t7;
- float y00, y01, y02, y03, y04, y05, y06, y07, y08, y09;
- float y10, y11, y12, y13, y14, y15, y16, y17, y18, y19;
- float y20, y21, y22, y23, y24, y25, y26, y27, y28, y29;
- float y30, y31, y32, y33, y34, y35, y36, y37, y38, y39;
-
- /* 1. FFT5 stage */
-
- /* real part */
- x0 = re[s * 0];
- x1 = re[s * 16];
- x2 = re[s * 12];
- x3 = re[s * 8];
- x4 = re[s * 4];
- r1 = x1 + x4;
- r4 = x1 - x4;
- r3 = x2 + x3;
- r2 = x2 - x3;
- t = ( r1 - r3 ) * C54;
- r1 = r1 + r3;
- y00 = x0 + r1;
- r1 = y00 + ( r1 * C55 );
- r3 = r1 - t;
- r1 = r1 + t;
- t = ( r4 + r2 ) * C51;
- r4 = t + ( r4 * C52 );
- r2 = t + ( r2 * C53 );
-
- /* imaginary part */
- x0 = im[s * 0];
- x1 = im[s * 16];
- x2 = im[s * 12];
- x3 = im[s * 8];
- x4 = im[s * 4];
- s1 = x1 + x4;
- s4 = x1 - x4;
- s3 = x2 + x3;
- s2 = x2 - x3;
- t = ( s1 - s3 ) * C54;
- s1 = ( s1 + s3 );
- y01 = ( x0 + s1 );
- s1 = y01 + ( s1 * C55 );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( s4 + s2 ) * C51;
- s4 = t + ( s4 * C52 );
- s2 = t + ( s2 * C53 );
-
- /* combination */
- y08 = ( r1 + s2 );
- y32 = ( r1 - s2 );
- y16 = ( r3 - s4 );
- y24 = ( r3 + s4 );
-
- y09 = ( s1 - r2 );
- y33 = ( s1 + r2 );
- y17 = ( s3 + r4 );
- y25 = ( s3 - r4 );
-
- /* 2. FFT5 stage */
-
- /* real part */
- x0 = re[s * 5];
- x1 = re[s * 1];
- x2 = re[s * 17];
- x3 = re[s * 13];
- x4 = re[s * 9];
- r1 = ( x1 + x4 );
- r4 = ( x1 - x4 );
- r3 = ( x2 + x3 );
- r2 = ( x2 - x3 );
- t = ( r1 - r3 ) * C54;
- r1 = ( r1 + r3 );
- y02 = ( x0 + r1 );
- r1 = y02 + ( r1 * C55 );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( r4 + r2 ) * C51;
- r4 = t + ( r4 * C52 );
- r2 = t + ( r2 * C53 );
-
- /* imaginary part */
- x0 = im[s * 5];
- x1 = im[s * 1];
- x2 = im[s * 17];
- x3 = im[s * 13];
- x4 = im[s * 9];
- s1 = ( x1 + x4 );
- s4 = ( x1 - x4 );
- s3 = ( x2 + x3 );
- s2 = ( x2 - x3 );
- t = ( s1 - s3 ) * C54;
- s1 = ( s1 + s3 );
- y03 = ( x0 + s1 );
- s1 = y03 + ( s1 * C55 );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( s4 + s2 ) * C51;
- s4 = t + ( s4 * C52 );
- s2 = t + ( s2 * C53 );
-
- /* combination */
- y10 = ( r1 + s2 );
- y34 = ( r1 - s2 );
- y18 = ( r3 - s4 );
- y26 = ( r3 + s4 );
-
- y11 = ( s1 - r2 );
- y35 = ( s1 + r2 );
- y19 = ( s3 + r4 );
- y27 = ( s3 - r4 );
-
- /* 3. FFT5 stage */
-
- /* real part */
- x0 = re[s * 10];
- x1 = re[s * 6];
- x2 = re[s * 2];
- x3 = re[s * 18];
- x4 = re[s * 14];
- r1 = ( x1 + x4 );
- r4 = ( x1 - x4 );
- r3 = ( x2 + x3 );
- r2 = ( x2 - x3 );
- t = ( r1 - r3 ) * C54;
- r1 = ( r1 + r3 );
- y04 = ( x0 + r1 );
- r1 = y04 + ( r1 * C55 );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( r4 + r2 ) * C51;
- r4 = t + ( r4 * C52 );
- r2 = t + ( r2 * C53 );
-
- /* imaginary part */
- x0 = im[s * 10];
- x1 = im[s * 6];
- x2 = im[s * 2];
- x3 = im[s * 18];
- x4 = im[s * 14];
- s1 = ( x1 + x4 );
- s4 = ( x1 - x4 );
- s3 = ( x2 + x3 );
- s2 = ( x2 - x3 );
- t = ( s1 - s3 ) * C54;
- s1 = ( s1 + s3 );
- y05 = ( x0 + s1 );
- s1 = y05 + ( s1 * C55 );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( s4 + s2 ) * C51;
- s4 = t + ( s4 * C52 );
- s2 = t + ( s2 * C53 );
-
- /* combination */
- y12 = ( r1 + s2 );
- y36 = ( r1 - s2 );
- y20 = ( r3 - s4 );
- y28 = ( r3 + s4 );
-
- y13 = ( s1 - r2 );
- y37 = ( s1 + r2 );
- y21 = ( s3 + r4 );
- y29 = ( s3 - r4 );
-
- /* 4. FFT5 stage */
-
- /* real part */
- x0 = re[s * 15];
- x1 = re[s * 11];
- x2 = re[s * 7];
- x3 = re[s * 3];
- x4 = re[s * 19];
- r1 = ( x1 + x4 );
- r4 = ( x1 - x4 );
- r3 = ( x2 + x3 );
- r2 = ( x2 - x3 );
- t = ( r1 - r3 ) * C54;
- r1 = ( r1 + r3 );
- y06 = ( x0 + r1 );
- r1 = y06 + ( r1 * C55 );
- r3 = ( r1 - t );
- r1 = ( r1 + t );
- t = ( r4 + r2 ) * C51;
- r4 = t + ( r4 * C52 );
- r2 = t + ( r2 * C53 );
-
- /* imaginary part */
- x0 = im[s * 15];
- x1 = im[s * 11];
- x2 = im[s * 7];
- x3 = im[s * 3];
- x4 = im[s * 19];
- s1 = ( x1 + x4 );
- s4 = ( x1 - x4 );
- s3 = ( x2 + x3 );
- s2 = ( x2 - x3 );
- t = ( s1 - s3 ) * C54;
- s1 = ( s1 + s3 );
- y07 = ( x0 + s1 );
- s1 = y07 + ( s1 * C55 );
- s3 = ( s1 - t );
- s1 = ( s1 + t );
- t = ( s4 + s2 ) * C51;
- s4 = t + ( s4 * C52 );
- s2 = t + ( s2 * C53 );
-
- /* combination */
- y14 = ( r1 + s2 );
- y38 = ( r1 - s2 );
- y22 = ( r3 - s4 );
- y30 = ( r3 + s4 );
-
- y15 = ( s1 - r2 );
- y39 = ( s1 + r2 );
- y23 = ( s3 + r4 );
- y31 = ( s3 - r4 );
-
-
- /* 1. FFT4 stage */
-
- /* Pre-additions */
- t0 = ( y00 + y04 );
- t2 = ( y00 - y04 );
- t1 = ( y01 + y05 );
- t3 = ( y01 - y05 );
- t4 = ( y02 + y06 );
- t7 = ( y02 - y06 );
- t5 = ( y07 + y03 );
- t6 = ( y07 - y03 );
-
- /* Post-additions */
- re[s * 0] = ( t0 + t4 );
- im[s * 0] = ( t1 + t5 );
- re[s * 5] = ( t2 - t6 );
- im[s * 5] = ( t3 - t7 );
- re[s * 10] = ( t0 - t4 );
- im[s * 10] = ( t1 - t5 );
- re[s * 15] = ( t2 + t6 );
- im[s * 15] = ( t3 + t7 );
-
- /* 2. FFT4 stage */
-
- /* Pre-additions */
- t0 = ( y08 + y12 );
- t2 = ( y08 - y12 );
- t1 = ( y09 + y13 );
- t3 = ( y09 - y13 );
- t4 = ( y10 + y14 );
- t7 = ( y10 - y14 );
- t5 = ( y15 + y11 );
- t6 = ( y15 - y11 );
-
- /* Post-additions */
- re[s * 4] = ( t0 + t4 );
- im[s * 4] = ( t1 + t5 );
- re[s * 9] = ( t2 - t6 );
- im[s * 9] = ( t3 - t7 );
- re[s * 14] = ( t0 - t4 );
- im[s * 14] = ( t1 - t5 );
- re[s * 19] = ( t2 + t6 );
- im[s * 19] = ( t3 + t7 );
-
-
- /* 3. FFT4 stage */
-
- /* Pre-additions */
- t0 = ( y16 + y20 );
- t2 = ( y16 - y20 );
- t1 = ( y17 + y21 );
- t3 = ( y17 - y21 );
- t4 = ( y18 + y22 );
- t7 = ( y18 - y22 );
- t5 = ( y23 + y19 );
- t6 = ( y23 - y19 );
-
- /* Post-additions */
- re[s * 8] = ( t0 + t4 );
- im[s * 8] = ( t1 + t5 );
- re[s * 13] = ( t2 - t6 );
- im[s * 13] = ( t3 - t7 );
- re[s * 18] = ( t0 - t4 );
- im[s * 18] = ( t1 - t5 );
- re[s * 3] = ( t2 + t6 );
- im[s * 3] = ( t3 + t7 );
-
- /* 4. FFT4 stage */
-
- /* Pre-additions */
- t0 = ( y24 + y28 );
- t2 = ( y24 - y28 );
- t1 = ( y25 + y29 );
- t3 = ( y25 - y29 );
- t4 = ( y26 + y30 );
- t7 = ( y26 - y30 );
- t5 = ( y31 + y27 );
- t6 = ( y31 - y27 );
-
- /* Post-additions */
- re[s * 12] = ( t0 + t4 );
- im[s * 12] = ( t1 + t5 );
- re[s * 17] = ( t2 - t6 );
- im[s * 17] = ( t3 - t7 );
- re[s * 2] = ( t0 - t4 );
- im[s * 2] = ( t1 - t5 );
- re[s * 7] = ( t2 + t6 );
- im[s * 7] = ( t3 + t7 );
-
- /* 5. FFT4 stage */
-
- /* Pre-additions */
- t0 = ( y32 + y36 );
- t2 = ( y32 - y36 );
- t1 = ( y33 + y37 );
- t3 = ( y33 - y37 );
- t4 = ( y34 + y38 );
- t7 = ( y34 - y38 );
- t5 = ( y39 + y35 );
- t6 = ( y39 - y35 );
-
- /* Post-additions */
- re[s * 16] = ( t0 + t4 );
- im[s * 16] = ( t1 + t5 );
- re[s * 1] = ( t2 - t6 );
- im[s * 1] = ( t3 - t7 );
- re[s * 6] = ( t0 - t4 );
- im[s * 6] = ( t1 - t5 );
- re[s * 11] = ( t2 + t6 );
- im[s * 11] = ( t3 + t7 );
-
- return;
-}
-
-/*******************************************************************************
- Functionname: fft30
- *******************************************************************************
-
- Description: 30-point FFT.
-
- Arguments: in - pointer to data (interleaved real / imaginary parts)
-
- Return: none
-
-*******************************************************************************/
-
-static void fft30( float *restrict in )
-{
- int16_t i;
- float temp[60];
- float *temp_l = temp;
- float *temp_lu = temp + 2 * 8;
- float *temp_h = temp + 2 * 15;
- float *temp_hu = temp + 2 * 15 + 2 * 8;
- float *in_l = in + 2 * 0;
- float *in_h = in + 2 * 15;
- for ( i = 0; i < 7; i++ )
- {
- *temp_l++ = *in_l++;
- *temp_l++ = *in_l++;
- *temp_h++ = *in_h++;
- *temp_h++ = *in_h++;
- *temp_l++ = *in_h++;
- *temp_l++ = *in_h++;
- *temp_h++ = *in_l++;
- *temp_h++ = *in_l++;
- }
- *temp_l++ = *in_l++;
- *temp_l++ = *in_l++;
- *temp_h++ = *in_h++;
- *temp_h++ = *in_h++;
- temp_l = temp;
- temp_h = temp + 30;
- fft15( temp_l );
- fft15( temp_h );
-
- in_l = in + 2 * 0;
- in_h = in + 2 * 15;
- for ( i = 0; i < 7; i++ )
- {
- *in_l++ = *temp_l + *temp_h;
- *in_h++ = *temp_l++ - *temp_h++;
- *in_l++ = *temp_l + *temp_h;
- *in_h++ = *temp_l++ - *temp_h++;
-
- *in_h++ = *temp_lu + *temp_hu;
- *in_l++ = *temp_lu++ - *temp_hu++;
- *in_h++ = *temp_lu + *temp_hu;
- *in_l++ = *temp_lu++ - *temp_hu++;
- }
- *in_l++ = *temp_l + *temp_h;
- *in_h++ = *temp_l++ - *temp_h++;
- *in_l++ = *temp_l + *temp_h;
- *in_h++ = *temp_l++ - *temp_h++;
-
- return;
-}
-
-/*-------------------------------------------------------------------*
- * fft_cldfb()
- *
- * Interface functions FFT subroutines
- *--------------------------------------------------------------------*/
-void fft_cldfb(
- float *data, /* i/o: input/output vector */
- const int16_t size /* size of fft operation */
-)
-{
-
- switch ( size )
- {
- case 5:
- fft5s( data, 2 );
- break;
- case 8:
- fft8( data );
- break;
- case 10:
- fft10( data );
- break;
- case 16:
- fft16_ivas( data );
- break;
- case 20:
- fft20( data );
- break;
- case 30:
- fft30( data );
- break;
-
- default:
- assert( 0 );
- break;
- }
-
- return;
-}
diff --git a/lib_com/ifft_rel.c b/lib_com/ifft_rel.c
index a54cbb3504b575037bc537c676b19d03c78add3c..40383cf3c0e76a55f6772d507367959c2c033138 100644
--- a/lib_com/ifft_rel.c
+++ b/lib_com/ifft_rel.c
@@ -60,233 +60,6 @@
* Re[0], Re[1], .. Re[n/2], Im[n/2-1], .. Im[1]
*---------------------------------------------------------------------*/
-void ifft_rel(
- float io[], /* i/o: input/output vector */
- const int16_t n, /* i : vector length */
- const int16_t m /* i : log2 of vector length */
-)
-{
- int16_t i, j, k;
- int16_t step;
- int16_t n2, n4, n8, i0;
- int16_t is, id;
- float *x, *xi0, *xi1, *xi2, *xi3, *xi4, *xup1, *xdn6, *xup3, *xdn8;
- float xt;
- float r1;
- float t1, t2, t3, t4, t5;
- float cc1, cc3, ss1, ss3;
- const float *s, *s3, *c, *c3;
- const int16_t *idx;
- float temp[512];
- float n_inv;
-
- n_inv = 1.0f / n;
-
- /*-----------------------------------------------------------------*
- * IFFT
- *-----------------------------------------------------------------*/
-
- x = &io[-1];
- n2 = 2 * n;
- for ( k = 1; k < m; k++ )
- {
- is = 0;
- id = n2;
- n2 = n2 >> 1;
- n4 = n2 >> 2;
- n8 = n4 >> 1;
- while ( is < n - 1 )
- {
- xi1 = x + is + 1;
- xi2 = xi1 + n4;
- xi3 = xi2 + n4;
- xi4 = xi3 + n4;
-
- for ( i = is; i < n; i += id )
- {
- t1 = *xi1 - *xi3;
- *xi1 += *xi3;
- *xi2 = 2.0f * *xi2;
- *xi3 = t1 - 2.0f * *xi4;
- *xi4 = t1 + 2.0f * *xi4;
- if ( n4 != 1 )
- {
- t1 = ( *( xi2 + n8 ) - *( xi1 + n8 ) ) * INV_SQRT_2;
- t2 = ( *( xi4 + n8 ) + *( xi3 + n8 ) ) * INV_SQRT_2;
-
- *( xi1 + n8 ) += *( xi2 + n8 );
- *( xi2 + n8 ) = *( xi4 + n8 ) - *( xi3 + n8 );
- *( xi3 + n8 ) = (float) ( 2.0f * ( -t2 - t1 ) );
- *( xi4 + n8 ) = (float) ( 2.0f * ( -t2 + t1 ) );
- }
- xi1 += id;
- xi2 += id;
- xi3 += id;
- xi4 += id;
- }
- is = 2 * id - n2;
- id = 4 * id;
- }
- step = N_MAX_FFT / n2;
-
- s = sincos_t_ext + step;
- c = s + N_MAX_FFT / 4;
- s3 = sincos_t_ext + 3 * step;
- c3 = s3 + N_MAX_FFT / 4;
- for ( j = 2; j <= n8; j++ )
- {
- cc1 = *c;
- ss1 = *s;
- cc3 = *c3;
- ss3 = *s3;
-
- is = 0;
- id = 2 * n2;
-
- c += step;
- s += step;
-
- c3 += 3 * step;
- s3 += 3 * step;
- while ( is < n - 1 )
- {
- xup1 = x + j + is;
- xup3 = xup1 + 2 * n4;
- xdn6 = xup3 - 2 * j + 2;
- xdn8 = xdn6 + 2 * n4;
-
- for ( i = is; i < n; i += id )
- {
- t1 = *xup1 - *xdn6;
- *xup1 = *xup1 + *xdn6;
- xup1 += n4;
- xdn6 -= n4;
-
- t2 = *xdn6 - *xup1;
- *xdn6 = *xup1 + *xdn6;
-
- xdn6 += n4;
- t3 = *xdn8 + *xup3;
- *xdn6 = *xdn8 - *xup3;
-
- xup3 += n4;
- xdn8 -= n4;
-
- t4 = *xup3 + *xdn8;
- *xup1 = *xup3 - *xdn8;
-
- t5 = t1 - t4;
- t1 = t1 + t4;
- t4 = t2 - t3;
- t2 = t2 + t3;
- *xup3 = t1 * cc3 - t2 * ss3;
- xup3 -= n4;
- *xup3 = t5 * cc1 + t4 * ss1;
- *xdn8 = -t4 * cc1 + t5 * ss1;
-
- xdn8 += n4;
- *xdn8 = t2 * cc3 + t1 * ss3;
-
- xup1 -= n4;
- xup1 += id;
- xup3 += id;
- xdn6 += id;
- xdn8 += id;
- }
- is = 2 * id - n2;
- id = 4 * id;
- }
- }
- }
-
- /*-----------------------------------------------------------------*
- * Length two butterflies
- *-----------------------------------------------------------------*/
-
- is = 1;
- id = 4;
- while ( is < n )
- {
- xi0 = x + is;
- xi1 = xi0 + 1;
-
- for ( i0 = is; i0 <= n; i0 += id )
- {
- r1 = *xi0;
- *xi0 = r1 + *xi1;
- *xi1 = r1 - *xi1;
- xi0 += id;
- xi1 += id;
- }
- is = 2 * id - 1;
- id = 4 * id;
- }
-
- /*-----------------------------------------------------------------*
- * Digit reverse counter
- *-----------------------------------------------------------------*/
-
- idx = fft256_read_indexes;
- xi0 = &temp[0] - 1;
- if ( n == 128 )
- {
- for ( i = 0; i < n; i++ )
- {
- j = *idx++;
- temp[i] = x[1 + ( j >> 1 )];
- }
- }
- else if ( n == 256 )
- {
- for ( i = 0; i < n; i++ )
- {
- j = *idx++;
- temp[i] = x[1 + j];
- }
- }
- else if ( n == 512 )
- {
- for ( i = 0; i < 256; i++ )
- {
- j = *idx++;
- temp[i] = x[1 + 2 * j];
- temp[i + 256] = x[2 + 2 * j];
- }
- }
- else
- {
- xi0 = x;
- j = 1;
- for ( i = 1; i < n; i++ )
- {
- if ( i < j )
- {
- xt = x[j];
- x[j] = x[i];
- x[i] = xt;
- }
- k = n >> 1;
- while ( k < j )
- {
- j = j - k;
- k = k >> 1;
- }
- j = j + k;
- }
- }
-
- /*-----------------------------------------------------------------*
- * Normalization
- *-----------------------------------------------------------------*/
-
- for ( i = 1; i <= n; i++ )
- {
- x[i] = xi0[i] * n_inv;
- }
-
- return;
-}
-
void ifft_rel_fx(
Word16 io[], /* Qx i/o: input/output vector */
const Word16 n, /* Q0 i : vector length */
diff --git a/lib_com/ivas_prot_fx.h b/lib_com/ivas_prot_fx.h
index 516e11467dca29ea6c8ac66c8e1a6f5406895941..ecebf22dc7b5f75df4dd33c9a31aa81736311484 100644
--- a/lib_com/ivas_prot_fx.h
+++ b/lib_com/ivas_prot_fx.h
@@ -2989,7 +2989,8 @@ void encod_gen_2sbfr(
Word16 *bwe_exc, /* o : excitation for SWB TBE */
const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */
const Word16 tdm_Pri_pitch_buf[], /* i : pitch values for primary channel */
- Word16 Q_new );
+ Word16 Q_new,
+ Word16 shift );
void acelp_fast_fx(
BSTR_ENC_HANDLE hBstr, /* i/o: encoder bitstream handle */
@@ -3169,8 +3170,8 @@ void ivas_param_ism_stereo_dmx_fx(
void ivas_param_ism_enc_fx(
Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */
Word32 *data[MAX_NUM_OBJECTS], /* i : input signal q_pcm_in */
- const Word16 input_frame, /* i : input frame length per channel */
- const Word16 q_pcm_in );
+ const Word16 input_frame /* i : input frame length per channel */
+);
ISM_MODE ivas_ism_mode_select(
const Word16 nchan_inp, /* i : number of input objects */
diff --git a/lib_enc/acelp_core_enc.c b/lib_enc/acelp_core_enc.c
index ed5af451d074c712f513c790232811a1cba1fac8..48f1e417f07330c9fb1dde0dd9e83f6d3b8a75c1 100644
--- a/lib_enc/acelp_core_enc.c
+++ b/lib_enc/acelp_core_enc.c
@@ -681,7 +681,7 @@ ivas_error acelp_core_enc(
}
ELSE /* GENERIC */
{
- encod_gen_2sbfr( st, inp, Aw, Aq, res_fx, syn_fx, exc_fx, exc2_fx, pitch_buf, voice_factors_fx, bwe_exc_fx, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf_fx, Q_new );
+ encod_gen_2sbfr( st, inp, Aw, Aq, res_fx, syn_fx, exc_fx, exc2_fx, pitch_buf, voice_factors_fx, bwe_exc_fx, tdm_Pitch_reuse_flag, tdm_Pri_pitch_buf_fx, Q_new, 0 );
}
}
ELSE IF( nelp_mode )
diff --git a/lib_enc/fd_cng_enc_fx.c b/lib_enc/fd_cng_enc_fx.c
index 07a5e2a9c5e8f2d4f6842bbd14e0bdf71e1397a2..34b67b2ff575ffc52bfd6e7505d1a74921c26d89 100644
--- a/lib_enc/fd_cng_enc_fx.c
+++ b/lib_enc/fd_cng_enc_fx.c
@@ -2220,26 +2220,26 @@ Word16 cng_energy_ivas_fx(
{
FOR( i = 0; i < 128; i++ )
{
- tmp16 = shl( *pt_res, scale );
+ tmp16 = shl( *pt_res, sub( scale, 4 ) ); // Q_new + scale - 4
L_tmp = L_mult0( tmp16, tmp16 );
pt_res++;
- tmp16 = shl( *pt_res, scale );
- L_tmp = L_mac0( L_tmp, tmp16, tmp16 ); /* 2*(Q_new+scale) */
+ tmp16 = shl( *pt_res, sub( scale, 4 ) ); // Q_new + scale - 4
+ L_tmp = L_mac0( L_tmp, tmp16, tmp16 ); /* 2*(Q_new+scale) + 7 */
pt_res++;
- L_ener = L_add( L_ener, L_shr( L_tmp, 7 ) ); /* 2*(Q_new+scale)+1, divide by L_frame done here */
+ L_ener = L_add( L_ener, L_tmp ); /* 2*(Q_new+scale)+1, divide by L_frame done here */
}
}
ELSE /* L_FRAME16k */
{
FOR( i = 0; i < 160; i++ )
{
- tmp16 = shl( *pt_res, scale );
- L_tmp = L_mult0( tmp16, tmp16 );
+ tmp16 = shl( *pt_res, sub( scale, 4 ) ); // Q_new + scale - 4
+ L_tmp = L_mult( tmp16, tmp16 );
pt_res++;
- tmp16 = shl( *pt_res, scale );
- L_tmp = L_mac0( L_tmp, tmp16, tmp16 ); /* 2*(Q_new+scale) */
+ tmp16 = shl( *pt_res, sub( scale, 4 ) ); // Q_new + scale - 4
+ L_tmp = L_mac( L_tmp, tmp16, tmp16 ); /* 2*(Q_new+scale) - 7 */
pt_res++;
- L_ener = L_add( L_ener, L_shr( Mult_32_16( L_tmp, 26214 /* 256/320, Q15 */ ), 7 ) ); /* 2*(Q_new+scale)+15+1-16+1, divide by L_frame done here */
+ L_ener = L_add( L_ener, Mult_32_16( L_tmp, 26214 /* 256/320, Q15 */ ) ); /* 2*(Q_new+scale)+15+1-16+1, divide by L_frame done here */
}
}
diff --git a/lib_enc/ivas_core_pre_proc.c b/lib_enc/ivas_core_pre_proc.c
index aaa9789bfe84527d7358a064213c6b094471d636..5bbd635cbe1bc994844b5a1327e837be509183e8 100644
--- a/lib_enc/ivas_core_pre_proc.c
+++ b/lib_enc/ivas_core_pre_proc.c
@@ -1022,7 +1022,7 @@ ivas_error ivas_compute_core_buffers_fx(
shift = s_max( shift, 0 );
shift = s_min( shift, Q_MAX );
minimum_fx( st->Q_max_16k, L_Q_MEM, &Q_min );
- *Q_new = s_min( 1, s_min( shift, Q_min ) );
+ *Q_new = s_min( shift, Q_min );
move16();
IF( inp_max == 0 )
{
diff --git a/lib_enc/ivas_cpe_enc.c b/lib_enc/ivas_cpe_enc.c
index 83a6d0e4b9c7642420e4d2ba4cfa564ae2ffad1e..e5f7d481ce53279d4af8fbad1efa786aac6bad2f 100644
--- a/lib_enc/ivas_cpe_enc.c
+++ b/lib_enc/ivas_cpe_enc.c
@@ -584,7 +584,7 @@ ivas_error ivas_cpe_enc_fx(
sts[1]->q_inp = add( sts[1]->q_inp, shift );
move16();
Scale_sig( sts[1]->input_fx, input_frame, sub( s_min( sts[1]->q_inp, sts[1]->q_old_inp ), sts[1]->q_inp ) );
- Scale_sig( sts[1]->old_input_signal_fx, input_frame, sub( s_min( sts[1]->q_old_inp, sts[1]->q_old_inp ), sts[1]->q_old_inp ) );
+ Scale_sig( sts[1]->old_input_signal_fx, input_frame, sub( s_min( sts[1]->q_old_inp, sts[1]->q_inp ), sts[1]->q_old_inp ) );
sts[1]->q_inp = s_min( sts[1]->q_inp, sts[1]->q_old_inp );
move16();
sts[1]->q_old_inp = sts[1]->q_inp;
@@ -599,7 +599,7 @@ ivas_error ivas_cpe_enc_fx(
sts[0]->q_inp = add( sts[0]->q_inp, shift );
move16();
Scale_sig( sts[0]->input_fx, input_frame, sub( s_min( sts[0]->q_inp, sts[0]->q_old_inp ), sts[0]->q_inp ) );
- Scale_sig( sts[0]->old_input_signal_fx, input_frame, sub( s_min( sts[0]->q_old_inp, sts[0]->q_old_inp ), sts[0]->q_old_inp ) );
+ Scale_sig( sts[0]->old_input_signal_fx, input_frame, sub( s_min( sts[0]->q_old_inp, sts[0]->q_inp ), sts[0]->q_old_inp ) );
sts[0]->q_inp = s_min( sts[0]->q_inp, sts[0]->q_old_inp );
move16();
sts[0]->q_old_inp = sts[0]->q_inp;
@@ -692,7 +692,7 @@ ivas_error ivas_cpe_enc_fx(
sts[1]->q_inp = add( sts[1]->q_inp, shift );
move16();
Scale_sig( sts[1]->input_fx, input_frame, sub( s_min( sts[1]->q_inp, sts[1]->q_old_inp ), sts[1]->q_inp ) );
- Scale_sig( sts[1]->old_input_signal_fx, input_frame, sub( s_min( sts[1]->q_old_inp, sts[1]->q_old_inp ), sts[1]->q_old_inp ) );
+ Scale_sig( sts[1]->old_input_signal_fx, input_frame, sub( s_min( sts[1]->q_old_inp, sts[1]->q_inp ), sts[1]->q_old_inp ) );
sts[1]->q_inp = s_min( sts[1]->q_inp, sts[1]->q_old_inp );
move16();
sts[1]->q_old_inp = sts[1]->q_inp;
@@ -708,7 +708,7 @@ ivas_error ivas_cpe_enc_fx(
move16();
move16();
Scale_sig( sts[0]->input_fx, input_frame, sub( s_min( sts[0]->q_inp, sts[0]->q_old_inp ), sts[0]->q_inp ) );
- Scale_sig( sts[0]->old_input_signal_fx, input_frame, sub( s_min( sts[0]->q_old_inp, sts[0]->q_old_inp ), sts[0]->q_old_inp ) );
+ Scale_sig( sts[0]->old_input_signal_fx, input_frame, sub( s_min( sts[0]->q_old_inp, sts[0]->q_inp ), sts[0]->q_old_inp ) );
sts[0]->q_inp = s_min( sts[0]->q_inp, sts[0]->q_old_inp );
move16();
sts[0]->q_old_inp = sts[0]->q_inp;
diff --git a/lib_enc/ivas_enc.c b/lib_enc/ivas_enc.c
index 9e2d975fc36017eaf3333fa17e119b476eb73792..bf9cc3c34c520d2452eccdb2d31f5fd5c9b0dff2 100644
--- a/lib_enc/ivas_enc.c
+++ b/lib_enc/ivas_enc.c
@@ -194,24 +194,11 @@ ivas_error ivas_enc_fx(
IF( EQ_32( st_ivas->ism_mode, ISM_MODE_PARAM ) )
{
- FOR( i = 0; i < st_ivas->hEncoderConfig->nchan_ism; i++ )
- {
- scale_sig32( data_fx[i], input_frame, sub( Q14, st_ivas->q_data_fx ) ); // Q11 -> Q14
- scale_sig32( st_ivas->hParamIsm->hFbMixer->ppFilterbank_prior_input_fx[i], st_ivas->hParamIsm->hFbMixer->fb_cfg->prior_input_length, sub( Q14, st_ivas->hParamIsm->hFbMixer->q_ppFilterbank_prior_input_fx[i] ) );
- st_ivas->hParamIsm->hFbMixer->q_ppFilterbank_prior_input_fx[i] = Q14;
- move16();
- }
-
- ivas_param_ism_enc_fx( st_ivas, data_fx, input_frame, Q14 );
+ ivas_param_ism_enc_fx( st_ivas, data_fx, input_frame );
/* Stereo DMX generation */
ivas_param_ism_stereo_dmx_fx( st_ivas, data_fx, input_frame );
- FOR( i = 0; i < st_ivas->hEncoderConfig->nchan_ism; i++ )
- {
- scale_sig32( data_fx[i], input_frame, sub( st_ivas->q_data_fx, Q14 ) ); // Q14 -> Q11
- }
-
/* Core coding of Stereo DMX */
IF( NE_32( ( error = ivas_ism_enc_fx( st_ivas, data_fx, st_ivas->q_data_fx, input_frame, nb_bits_metadata, 0 ) ), IVAS_ERR_OK ) )
{
diff --git a/lib_enc/ivas_ism_param_enc.c b/lib_enc/ivas_ism_param_enc.c
index 0935aae7111b1dc86c8b8f2a746587b58bdee3b8..171b229b4bcd8d47533f0b9c98ba640b7e387970 100644
--- a/lib_enc/ivas_ism_param_enc.c
+++ b/lib_enc/ivas_ism_param_enc.c
@@ -534,8 +534,8 @@ void ivas_param_ism_enc_close(
void ivas_param_ism_enc_fx(
Encoder_Struct *st_ivas, /* i/o: IVAS encoder structure */
Word32 *data[MAX_NUM_OBJECTS], /* i : input signal q_pcm_in */
- const Word16 input_frame, /* i : input frame length per channel */
- const Word16 q_pcm_in )
+ const Word16 input_frame /* i : input frame length per channel */
+)
{
Word16 i, j, ts, l_ts;
Word16 nchan_ism;
@@ -570,7 +570,7 @@ void ivas_param_ism_enc_fx(
}
Word16 gb = find_guarded_bits_fx( l_ts );
- q_p_fb_Buffer = sub( q_pcm_in, gb );
+ q_p_fb_Buffer = sub( st_ivas->q_data_fx, gb );
FOR( ts = 0; ts < num_time_slots; ts++ )
{
diff --git a/lib_enc/ivas_omasa_enc.c b/lib_enc/ivas_omasa_enc.c
index aae7e058e686c05ec5311aa6235b179fa32b2f68..750db361656d286e532e28ff776d6362bbae1646 100644
--- a/lib_enc/ivas_omasa_enc.c
+++ b/lib_enc/ivas_omasa_enc.c
@@ -1347,6 +1347,9 @@ static void ivas_omasa_energy_and_ratio_est_fx(
{
q_cldfb = q_data;
move16();
+ scale_sig32( hOMasa->cldfbAnaEnc[i]->cldfb_state_fx, hOMasa->cldfbAnaEnc[i]->cldfb_state_length, sub( q_cldfb, hOMasa->cldfbAnaEnc[i]->Q_cldfb_state ) );
+ hOMasa->cldfbAnaEnc[i]->Q_cldfb_state = q_cldfb;
+ move16();
cldfbAnalysis_ts_fx_fixed_q( &( data_fx[i][l_ts * ts] ), Chnl_RealBuffer_fx[i], Chnl_ImagBuffer_fx[i], l_ts, hOMasa->cldfbAnaEnc[i], &q_cldfb );
norm_Chnl = s_min( norm_Chnl, L_norm_arr( Chnl_ImagBuffer_fx[i], 60 ) );
norm_Chnl = s_min( norm_Chnl, L_norm_arr( Chnl_RealBuffer_fx[i], 60 ) );
diff --git a/lib_enc/ivas_td_low_rate_enc.c b/lib_enc/ivas_td_low_rate_enc.c
index 9a63a1525c6e2e4706a30f1f8ad8e259ea203439..22ce9b6e9d0f2b825bf0ccf7dc42f4d48833c4b2 100644
--- a/lib_enc/ivas_td_low_rate_enc.c
+++ b/lib_enc/ivas_td_low_rate_enc.c
@@ -190,12 +190,14 @@ void encod_gen_2sbfr(
Word16 *bwe_exc, /* o : excitation for SWB TBE Q_new */
const Word16 tdm_Pitch_reuse_flag, /* i : primary channel pitch reuse flag */
const Word16 tdm_Pri_pitch_buf[], /* i : pitch values for primary channel Q4 */
- Word16 Q_new )
+ Word16 Q_new,
+ Word16 shift )
{
Word16 xn[2 * L_SUBFR]; /* Target vector for pitch search */
Word16 xn2[2 * L_SUBFR]; /* Target vector for codebook search */
Word16 cn[2 * L_SUBFR]; /* Target vector in residual domain */
Word16 h1[2 * L_SUBFR + ( M + 1 )]; /* Impulse response vector */
+ Word16 h2[2 * L_SUBFR + ( M + 1 )]; /* Impulse response vector */
Word16 code[2 * L_SUBFR]; /* Fixed codebook excitation */
Word16 y1[2 * L_SUBFR]; /* Filtered adaptive excitation */
Word16 y2[2 * L_SUBFR]; /* Filtered algebraic excitation */
@@ -217,7 +219,6 @@ void encod_gen_2sbfr(
Word32 norm_gain_code;
Word16 pitch_limit_flag;
Word16 error;
- Word16 shift;
LPD_state_HANDLE hLPDmem = st->hLPDmem;
@@ -246,9 +247,6 @@ void encod_gen_2sbfr(
p_Aq = Aq;
pt_pitch = pitch_buf;
- shift = 0;
- move16();
-
/*------------------------------------------------------------------*
* ACELP subframe loop
*------------------------------------------------------------------*/
@@ -269,6 +267,10 @@ void encod_gen_2sbfr(
find_targets_fx( speech, hLPDmem->mem_syn, i_subfr, &hLPDmem->mem_w0, p_Aq, res, 2 * L_SUBFR, p_Aw, st->preemph_fac, xn, cn, h1 );
+ /*Scale_sig(h1, L_SUBFR, shift); */ /*Q14-shift */
+ Copy_Scale_sig( h1, h2, 2 * L_SUBFR, -2 );
+ Scale_sig( h1, 2 * L_SUBFR, add( 1, shift ) ); /* set h1[] in Q14 with scaling for convolution */
+
/*------------------------------------------------------------------------*
* Close-loop pitch search on the 1st and 3rd subfr only and quantization
* Adaptive exc. construction
@@ -304,7 +306,7 @@ void encod_gen_2sbfr(
* Innovation encoding
*-----------------------------------------------------------------*/
- inov_encode_ivas_fx( st, st->core_brate, 0, L_frame, st->last_L_frame, coder_type, st->bwidth, st->sharpFlag, i_subfr, -1, p_Aq, gain_pit, cn, exc, h1, hLPDmem->tilt_code, *pt_pitch, xn2, code, y2, &i, 2 * L_SUBFR, 0, Q_new );
+ inov_encode_ivas_fx( st, st->core_brate, 0, L_frame, st->last_L_frame, coder_type, st->bwidth, st->sharpFlag, i_subfr, -1, p_Aq, gain_pit, cn, exc, h2, hLPDmem->tilt_code, *pt_pitch, xn2, code, y2, &i, 2 * L_SUBFR, shift, Q_new );
/*-----------------------------------------------------------------*
* Gain encoding
diff --git a/lib_enc/pitch_ol_fx.c b/lib_enc/pitch_ol_fx.c
index 0a7d20c6a2bcdcfde02050f231380c69b7f103b2..82b00ead0b1b92e3a5ec90ed7fbc5389dc8eab07 100644
--- a/lib_enc/pitch_ol_fx.c
+++ b/lib_enc/pitch_ol_fx.c
@@ -2327,7 +2327,7 @@ static void pitch_neighbour_fx(
fac = mult( negate( thres1[j] ), 20479 / DELTA_COH );
fac = add( i_mult2( fac, delta ), mult( 20479, thres1[j] ) );
}
- corr[i][k] = add( corr[i][k], mult( fac, corr[i][k] ) );
+ corr[i][k] = add_sat( corr[i][k], mult( fac, corr[i][k] ) );
move16();
}
}
@@ -2370,7 +2370,7 @@ static void pitch_neighbour_fx(
/* operands are Q15, except corr[i][NSECT+k] which is Q12 */
fac = mult( negate( thres1[j + NHFR] ), MAX_16 / DELTA_COH );
fac = add( extract_l( L_shr( L_mult( fac, delta ), 1 ) ), thres1[j + NHFR] );
- corr[i][NSECT + k] = add( corr[i][NSECT + k], mult( fac, corr[i][NSECT + k] ) );
+ corr[i][NSECT + k] = add_sat( corr[i][NSECT + k], mult( fac, corr[i][NSECT + k] ) );
move16();
}
ELSE
diff --git a/lib_enc/swb_tbe_enc_fx.c b/lib_enc/swb_tbe_enc_fx.c
index d9a3d5ab8618b8051cf0ac7ee4aedeaef7a36cfb..23c4ccda8732aac1e65afee7c5012c3e2ac4c860 100644
--- a/lib_enc/swb_tbe_enc_fx.c
+++ b/lib_enc/swb_tbe_enc_fx.c
@@ -3723,30 +3723,32 @@ void swb_tbe_enc_ivas_fx(
}
ELSE
{
+ Word64 prev_pow_64fx, curr_pow_64fx;
+ Word16 w_shift;
tmp = sub( shl( Q_bwe_exc, 1 ), 31 );
- prev_pow_fx = L_shl( 21475l /*0.00001f Q31*/, tmp ); /* 2*(Q_bwe_exc) */
- curr_pow_fx = L_shl( 21475l /*0.00001f Q31*/, tmp ); /* 2*(Q_bwe_exc) */
+ prev_pow_64fx = W_shl( 21475ll /*0.00001f Q31*/, tmp ); /* 2*(Q_bwe_exc) */
+ curr_pow_64fx = W_shl( 21475ll /*0.00001f Q31*/, tmp ); /* 2*(Q_bwe_exc) */
FOR( i = 0; i < L_SHB_LAHEAD + 10; i++ )
{
-#ifdef BASOP_NOGLOB
- prev_pow_fx = L_mac0_o( prev_pow_fx, shaped_shb_excitation_fx[i], shaped_shb_excitation_fx[i], &Overflow ); /* 2*Q_bwe_exc */
- curr_pow_fx = L_mac0_o( curr_pow_fx, shaped_shb_excitation_fx[i + L_SHB_LAHEAD + 10], shaped_shb_excitation_fx[i + L_SHB_LAHEAD + 10], &Overflow ); /* 2*Q_bwe_exc */
-#else
- prev_pow_fx = L_mac0( prev_pow_fx, shaped_shb_excitation_fx[i], shaped_shb_excitation_fx[i] ); /* 2*Q_bwe_exc */
- curr_pow_fx = L_mac0( curr_pow_fx, shaped_shb_excitation_fx[i + L_SHB_LAHEAD + 10], shaped_shb_excitation_fx[i + L_SHB_LAHEAD + 10] ); /* 2*Q_bwe_exc */
-#endif
+ prev_pow_64fx = W_mac0_16_16( prev_pow_64fx, shaped_shb_excitation_fx[i], shaped_shb_excitation_fx[i] ); /* 2*Q_bwe_exc */
+ curr_pow_64fx = W_mac0_16_16( curr_pow_64fx, shaped_shb_excitation_fx[i + L_SHB_LAHEAD + 10], shaped_shb_excitation_fx[i + L_SHB_LAHEAD + 10] ); /* 2*Q_bwe_exc */
}
if ( GT_16( voice_factors_fx[0], 24576 /*0.75f Q15*/ ) )
{
/*curr_pow_fx = Mult_32_16( curr_pow_fx, 8192);*/ /* Q(2*Q_bwe_exc) */
- curr_pow_fx = L_shr( curr_pow_fx, 2 ); /* scale by 0.25 */
+ curr_pow_64fx = W_shr( curr_pow_64fx, 2 ); /* scale by 0.25 */
}
+ w_shift = s_min( W_norm( prev_pow_64fx ), W_norm( curr_pow_64fx ) );
+ prev_pow_fx = W_extract_h( W_shl( prev_pow_64fx, w_shift ) ); // 2*(Q_bwe_exc)+w_shift-32
+ curr_pow_fx = W_extract_h( W_shl( curr_pow_64fx, w_shift ) ); // 2*(Q_bwe_exc)+w_shift-32
+ w_shift = sub( add( shl( Q_bwe_exc, 1 ), w_shift ), 32 );
+
Lscale = root_a_over_b_fx( curr_pow_fx,
- shl( Q_bwe_exc, 1 ),
+ w_shift,
prev_pow_fx,
- shl( Q_bwe_exc, 1 ),
+ w_shift,
&exp );
}
@@ -3756,7 +3758,7 @@ void swb_tbe_enc_ivas_fx(
#ifdef BASOP_NOGLOB
shaped_shb_excitation_fx[i] = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /* Q_bwe_exc */
#else
- shaped_shb_excitation_fx[i] = round_fx( L_shl( L_tmp, exp ) ); /* Q_bwe_exc */
+ shaped_shb_excitation_fx[i] = round_fx( L_shl( L_tmp, exp ) ); /* Q_bwe_exc */
#endif
move16();
}
@@ -3772,8 +3774,8 @@ void swb_tbe_enc_ivas_fx(
tmp = i_mult_o( sub( i, 19 ), 3277 /*0.1f Q15*/, &Overflow ); /* Q15 */
L_tmp1 = Mult_32_16( L_shl_o( 1, sub( 31, exp ), &Overflow ), tmp ); /* Q31-exp */
#else
- tmp = i_mult( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */
- L_tmp1 = Mult_32_16( L_shl( 1, sub( 31, exp ) ), tmp ); /* Q31-exp */
+ tmp = i_mult( sub( i, 19 ), 3277 /*0.1f Q15*/ ); /* Q15 */
+ L_tmp1 = Mult_32_16( L_shl( 1, sub( 31, exp ) ), tmp ); /* Q31-exp */
#endif
tmp = sub( 32767 /*1.0f Q15*/, tmp );
Lscale = L_add( Mult_32_16( Lscale, tmp ), L_tmp1 );
@@ -3781,7 +3783,7 @@ void swb_tbe_enc_ivas_fx(
#ifdef BASOP_NOGLOB
shaped_shb_excitation_fx[i] = round_fx_o( L_shl_o( L_tmp, exp, &Overflow ), &Overflow ); /* Q_bwe_exc */
#else
- shaped_shb_excitation_fx[i] = round_fx( L_shl( L_tmp, exp ) ); /* Q_bwe_exc */
+ shaped_shb_excitation_fx[i] = round_fx( L_shl( L_tmp, exp ) ); /* Q_bwe_exc */
#endif
move16();
}
@@ -4290,7 +4292,7 @@ void swb_tbe_enc_ivas_fx(
#ifdef BASOP_NOGLOB
tmp = round_fx_o( L_shl_o( L_tmp, 31 - ( 7 - exp ), &Overflow ), &Overflow ); /* Q15 */
#else
- tmp = round_fx( L_shl( L_tmp, 31 - ( 7 - exp ) ) ); /* Q15 */
+ tmp = round_fx( L_shl( L_tmp, 31 - ( 7 - exp ) ) ); /* Q15 */
#endif
}
tmp = s_min( tmp, 32767 /*1.0f Q15*/ );
@@ -4566,10 +4568,10 @@ static void EstimateSHBFrameGain_fx(
sig = round_fx_o( Mult_32_16( mod_syn[i], win_shb[i] ), &Overflow ); /*Q_synSHB */
synNrg = L_mac0_o( synNrg, sig, sig, &Overflow ); /* 2*Q_synSHB */
#else
- sig = mult_r( oriSHB[i], win_shb[i] ); /* Q_oriSHB */
- oriNrg = L_mac0( oriNrg, sig, sig ); /* 2*Q_orisHB*/
- sig = round_fx( Mult_32_16( mod_syn[i], win_shb[i] ) ); /*Q_synSHB */
- synNrg = L_mac0( synNrg, sig, sig ); /* 2*Q_synSHB */
+ sig = mult_r( oriSHB[i], win_shb[i] ); /* Q_oriSHB */
+ oriNrg = L_mac0( oriNrg, sig, sig ); /* 2*Q_orisHB*/
+ sig = round_fx( Mult_32_16( mod_syn[i], win_shb[i] ) ); /*Q_synSHB */
+ synNrg = L_mac0( synNrg, sig, sig ); /* 2*Q_synSHB */
#endif
}
@@ -4580,9 +4582,9 @@ static void EstimateSHBFrameGain_fx(
sig = round_fx_o( mod_syn[i], &Overflow ); /* Q_oriSHB */
synNrg = L_mac0_o( synNrg, sig, sig, &Overflow ); /* 2*Q_oriSHB */
#else
- oriNrg = L_mac0( oriNrg, oriSHB[i], oriSHB[i] ); /* 2*Q_oriSHB */
- sig = round_fx( mod_syn[i] ); /* Q_oriSHB */
- synNrg = L_mac0( synNrg, sig, sig ); /* 2*Q_oriSHB */
+ oriNrg = L_mac0( oriNrg, oriSHB[i], oriSHB[i] ); /* 2*Q_oriSHB */
+ sig = round_fx( mod_syn[i] ); /* Q_oriSHB */
+ synNrg = L_mac0( synNrg, sig, sig ); /* 2*Q_oriSHB */
#endif
}
@@ -4596,8 +4598,8 @@ static void EstimateSHBFrameGain_fx(
sig = round_fx_o( Mult_32_16( mod_syn[i], win_shb[l_frame + l_shb_lahead - 1 - i] ), &Overflow ); /* Q_oriSHB */
synNrg = L_mac0_o( synNrg, sig, sig, &Overflow ); /* 2*Q_oriSHB */
#else
- sig = mult_r( oriSHB[i], win_shb[l_frame + l_shb_lahead - 1 - i] ); /* Q_oriSHB */
- oriNrg = L_mac0( oriNrg, sig, sig ); /* 2*Q_oriSHB */
+ sig = mult_r( oriSHB[i], win_shb[l_frame + l_shb_lahead - 1 - i] ); /* Q_oriSHB */
+ oriNrg = L_mac0( oriNrg, sig, sig ); /* 2*Q_oriSHB */
sig = round_fx( Mult_32_16( mod_syn[i], win_shb[l_frame + l_shb_lahead - 1 - i] ) ); /* Q_oriSHB */
synNrg = L_mac0( synNrg, sig, sig ); /* 2*Q_oriSHB */