#include #ifdef _MSC_VER #pragma warning(disable: 4244) #endif #define PI 3.14159265358979 ///////////////////////////////////////////////////////// // Sorensen in-place split-radix FFT for real values // data: array of floats: // re(0),re(1),re(2),...,re(size-1) // // output: // re(0),re(1),re(2),...,re(size/2),im(size/2-1),...,im(1) // normalized by array length // // Source: // Sorensen et al: Real-Valued Fast Fourier Transform Algorithms, // IEEE Trans. ASSP, ASSP-35, No. 6, June 1987 void realfft_split(float *data,int n) { int i,j,k,i5,i6,i7,i8,i0,id,i1,i2,i3,i4,n2,n4,n8; float t1,t2,t3,t4,t5,t6,a3,ss1,ss3,cc1,cc3,a,e,sqrt2; sqrt2=sqrt(2.0); n4=n-1; //data shuffling for (i=0,j=0,n2=n/2; i>=1; } j+=k; } /*----------------------*/ //length two butterflies i0=0; id=4; do{ for (; i02;k>>=1){ n2<<=1; n4=n2>>2; n8=n2>>3; e = 2*PI/(n2); i1=0; id=n2<<1; do{ for (; i12;k>>=1){ id=n2; n2>>=1; n4=n2>>2; n8=n2>>3; e = 2*PI/(n2); i1=0; do{ for (; i1>=1; } j+=k; } } #if 0 ///////////////////////////////////////////////////////// // Sorensen in-place radix-2 FFT for real values // data: array of floats: // re(0),re(1),re(2),...,re(size-1) // // output: // re(0),re(1),re(2),...,re(size/2),im(size/2-1),...,im(1) // normalized by array length // // Source: // Sorensen et al: Real-Valued Fast Fourier Transform Algorithms, // IEEE Trans. ASSP, ASSP-35, No. 6, June 1987 void realfft_radix2(float *data,int n){ float xt,a,e, t1, t2, cc, ss; int i, j, k, n1, n2, n3, n4, i1, i2, i3, i4; n4=n-1; //data shuffling for (i=0,j=0,n2=n/2; i>=1; } j+=k; } /* -------------------- */ for (i=0; i2;k>>=1){ n4 = n2; n2 = n4 << 1; n1 = n2 << 1; e = 2*PI/(n1); for (i=0; i