From 8f3ff0d0feaac9e5807065ed122508f043bcdf6f Mon Sep 17 00:00:00 2001 From: Sandesh Venkatesh Date: Mon, 9 Dec 2024 14:03:31 +0530 Subject: [PATCH] High MLD issue fixes and float code clean up in encoder --- Workspace_msvc/lib_com.vcxproj | 1 - Workspace_msvc/lib_com.vcxproj.filters | 1 - lib_com/fft.c | 6340 +----------------------- lib_com/fft_cldfb.c | 1223 ----- lib_com/ifft_rel.c | 227 - lib_com/ivas_prot_fx.h | 7 +- lib_enc/acelp_core_enc.c | 2 +- lib_enc/fd_cng_enc_fx.c | 18 +- lib_enc/ivas_core_pre_proc.c | 2 +- lib_enc/ivas_cpe_enc.c | 8 +- lib_enc/ivas_enc.c | 15 +- lib_enc/ivas_ism_param_enc.c | 6 +- lib_enc/ivas_omasa_enc.c | 3 + lib_enc/ivas_td_low_rate_enc.c | 14 +- lib_enc/pitch_ol_fx.c | 4 +- lib_enc/swb_tbe_enc_fx.c | 54 +- 16 files changed, 65 insertions(+), 7860 deletions(-) delete mode 100644 lib_com/fft_cldfb.c diff --git a/Workspace_msvc/lib_com.vcxproj b/Workspace_msvc/lib_com.vcxproj index 7109c9ebc..99b025e52 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 c8445d0f3..14f722f69 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 7ae89b7d5..be42d29cb 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 44e19eabc..000000000 --- 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 a54cbb350..40383cf3c 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 516e11467..ecebf22dc 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 ed5af451d..48f1e417f 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 07a5e2a9c..34b67b2ff 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 aaa9789bf..5bbd635cb 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 83a6d0e4b..e5f7d481c 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 9e2d975fc..bf9cc3c34 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 0935aae71..171b229b4 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 aae7e058e..750db3616 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 9a63a1525..22ce9b6e9 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 0a7d20c6a..82b00ead0 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 d9a3d5ab8..23c4ccda8 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 */ -- GitLab