void fftt(struct COMPLEX *a,int l)
{
const double pai=3.141592653589793;
struct COMPLEX u,w,t,tmp1;
unsigned n=1,nv2,nm1,k,le,lei,ip;
unsigned i,j,m;
double tmp;
n<<=l;
nv2=n>>1;
nm1=n-1;
j=0;
for(i=0;i<nm1;i++)
{
if(i<j)
{
t.re=a[j].re;
t.im=a[j].im;
a[j].re=a[i].re;
a[j].im=a[i].im;
a[i].re=t.re;
a[i].im=t.im;
}
k=nv2;
while(k<=j)
{
j-=k;
k>>=1;
}
j+=k;
}
le=1;
for(m=1;m<=l;m++)
{
lei=le;
le<<=1;
u.re=1.0;
u.im=0.0;
tmp=pai/lei;
w.re=cos(tmp);
w.im=-sin(tmp);
for(j=0;j<lei;j++)
{
for(i=j;i<n;i+=le)
{
ip=i+lei;
mul(a[ip],u,&tmp1);
t.re=tmp1.re;
t.im=tmp1.im;
sub(a[i],t,&tmp1);
a[ip].re=tmp1.re;
a[ip].im=tmp1.im;
add(a[i],t,&tmp1);
a[i].re=tmp1.re;
a[i].im=tmp1.im;
}
mul(u,w,&tmp1);
u.re=tmp1.re;
u.im=tmp1.im;
}
}
}
{
const double pai=3.141592653589793;
struct COMPLEX u,w,t,tmp1;
unsigned n=1,nv2,nm1,k,le,lei,ip;
unsigned i,j,m;
double tmp;
n<<=l;
nv2=n>>1;
nm1=n-1;
j=0;
for(i=0;i<nm1;i++)
{
if(i<j)
{
t.re=a[j].re;
t.im=a[j].im;
a[j].re=a[i].re;
a[j].im=a[i].im;
a[i].re=t.re;
a[i].im=t.im;
}
k=nv2;
while(k<=j)
{
j-=k;
k>>=1;
}
j+=k;
}
le=1;
for(m=1;m<=l;m++)
{
lei=le;
le<<=1;
u.re=1.0;
u.im=0.0;
tmp=pai/lei;
w.re=cos(tmp);
w.im=-sin(tmp);
for(j=0;j<lei;j++)
{
for(i=j;i<n;i+=le)
{
ip=i+lei;
mul(a[ip],u,&tmp1);
t.re=tmp1.re;
t.im=tmp1.im;
sub(a[i],t,&tmp1);
a[ip].re=tmp1.re;
a[ip].im=tmp1.im;
add(a[i],t,&tmp1);
a[i].re=tmp1.re;
a[i].im=tmp1.im;
}
mul(u,w,&tmp1);
u.re=tmp1.re;
u.im=tmp1.im;
}
}
}