#if !defined(___MYFFT)
    #define ___MYFFT


#include <stdio.h>
#include <ctype.h>

#include <math.h>

#define NALL 2210
#define PI   3.1415926536


void myfft(int m,double datar[],double datai[],int isign);
void shaffle(int m,double datar[],double datai[]);
int pwr2(int n);




void myfft(int m,double datar[],double datai[],int isign){
  int n,i,j,k,k1;
  int nrep,nbtf;
  double arg0,arg,twf,c,s,dr,di;
  
  shaffle(m,datar,datai);
  
  n=pwr2(m);
  nrep=1;
  arg0=(float)isign*2.0*PI;
  
  for(i=1;i<=m;i++){
    nbtf=nrep;
    nrep*=2;
    arg=arg0/(float)nrep;
    
    for(j=0;j<nbtf;j++){
      twf=arg*(float)j;
      c=cos(twf);
      s=sin(twf);
      
      for(k=j;k<n;k+=nrep){
	k1=k+nbtf;
	dr=datar[k1]*c-datai[k1]*s;
	di=datar[k1]*s+datai[k1]*c;
	datar[k1]=datar[k]-dr;
	datai[k1]=datai[k]-di;
	datar[k]=datar[k]+dr;
	datai[k]=datai[k]+di;
      }
    }
  }
}

void shaffle(int m,double datar[],double datai[]){
  static int irvs[NALL];
  int i,j;
  int n;
  int p2f,p2r;
  double dd;
  
  n=pwr2(m);
  
  irvs[0]=0;
  for(i=1;i<=m;i++){
    p2r=pwr2(m-i);
    p2f=pwr2(i-1);
    for(j=0;j<p2f;j++)
      irvs[p2f+j]=p2r+irvs[j];
  }
  
  for(i=0;i<n;i++){
    j=irvs[i];
    if(j>i){
      dd=datar[i];
      datar[i]=datar[j];
      datar[j]=dd;
      dd=datai[i];
      datai[i]=datai[j];
      datai[j]=dd;
    }
  }
}

int pwr2(int n){
  int i,j;
  j=1;
  if(n>0){
    for(i=1;i<=n;i++)
      j*=2;
  }
  return(j);
}



#endif