//fft递归算法
class FFT
{
public static void calcFFT(double[] rein,double[] imin,double[] reout,double[] imout,int N){
double[] rehe = new double[N];
double[] reho = new double[N];
double[] reHE = new double[N];
double[] reHO = new double[N];
double[] imhe = new double[N];
double[] imho = new double[N];
double[] imHE = new double[N];
double[] imHO = new double[N];
double[] Wsin = new double[N];
double[] Wcos = new double[N];
if (N==1)
{
reout[0]=rein[0];
imout[0]=imin[0];
}
else{
for (int i=0; i<N/2; i++)
{
rehe[i] = rein[2*i];
reho[i] = rein[2*i+1];
imhe[i] = imin[2*i];
imho[i] = imin[2*i+1];
}
calcFFT(rehe, imhe, reHE, imHE, N/2);
calcFFT(reho, imho, reHO, imHO, N/2);
for (int k=0;k<N/2;k++ )
{
Wsin[k]=Math.sin(2*Math.PI*k/N);
Wcos[k]=Math.cos(2*Math.PI*k/N);
}
for (int k=0; k<N/2; k++)
{
reout[k]= reHE[k]+Wcos[k]*reHO[k]+Wsin[k]*imHO[k];
imout[k]= imHE[k]+Wcos[k]*imHO[k]-Wsin[k]*reHO[k];
reout[N/2+k] = reHE[k]-Wcos[k]*reHO[k]-Wsin[k]*imHO[k];
imout[N/2+k] = imHE[k]+Wsin[k]*reHO[k]-Wcos[k]*imHO[k];
}
}
}
}