/* From: "A SURVEY OF COMPUTATIONAL PHYSICS" by RH Landau, MJ Paez, and CC BORDEIANU Copyright Princeton University Press, Princeton, 2008. Electronic Materials copyright: R Landau, Oregon State Univ, 2008; MJ Paez, Univ Antioquia, 2008; and CC BORDEIANU, Univ Bucharest, 2008. Support by National Science Foundation */ /* FFT.java: FFT for complex numbers dtr[][] data1[i][0], data1[i][1] = Re, Im parts of point [i]. When done, Re, Im Fourier Transforms placed in same array Required max = 2^m < 1024 dtr[][] placed in array data[]: */ import java.util.*; import java.io.*; public class FFT { public static int max = 2100; // Global variables public static int points = 1026; // Can be increased public static double data[] = new double[max]; public static double dtr[][] = new double[points][2]; public static void main(String[] argv) { int isign, i, nn = 16; // Power of 2 isign = -1; // -1 transform, +1 inverse transform for ( i=0; i0 ); j = j+m; } // Print data and data to see reorder System.out.println(" Bit-reversed data "); for (i=1; i<=n; i=i+2) System.out.println (" i " + i + " data[i] "+data[i]); mmax = 2; while( (mmax-n)<0 ) { // Begin transform istep = 2*mmax; theta = 6.2831853/(float)(isign*mmax); sinth = Math.sin(theta/2.0); wstpr = -2.0*sinth*sinth; wstpi = Math.sin(theta); wr = 1.0; wi = 0.0; for (m=1; m <= mmax; m=m+2) { for(i=m; i<=n; i=i+istep) { j = i+mmax; tempr = wr*data[j]-wi*data[j+1]; tempi = wr*data[j+1]+wi*data[j]; data[j] = data[i]-tempr; data[j+1] = data[i+1]-tempi; data[i] = data[i]+tempr; data[i+1] = data[i+1]+tempi; } // For i tempr = wr; wr = wr*wstpr-wi*wstpi+wr; wi = wi*wstpr+tempr*wstpi+wi; } // For m mmax = istep; } // While for(i=0; i