Index: trunk/Ohana/src/opihi/lib.data/fft.c
===================================================================
--- trunk/Ohana/src/opihi/lib.data/fft.c	(revision 16094)
+++ trunk/Ohana/src/opihi/lib.data/fft.c	(revision 16099)
@@ -8,8 +8,9 @@
 }
 
-void fft (double *x, double *y, int n, int Nbit) {
+void fft (float *x, float *y, int n, int Nbit, int forward) {
 
   int i,j,k,n1,n2;
-  double c,s,e,a,t1,t2;        
+  float c,s,e,a,t1,t2;        
+  double factor;
          
   // bit-reverse
@@ -19,8 +20,8 @@
     n1 = n2;
     while ( j >= n1 ) {
-      j = j - n1;
-      n1 = n1/2;
+      j -= n1;
+      n1 /= 2;
     }
-    j = j + n1;
+    j += n1;
                
     if (i < j) {
@@ -33,13 +34,18 @@
     }
   }
-  
                                           
   n1 = 0; /* FFT */
   n2 = 1;
                                              
+  if (forward) {
+    factor = +2.0*M_PI;
+  } else {
+    factor = -2.0*M_PI;
+  }
+
   for (i=0; i < Nbit; i++) {
     n1 = n2;
     n2 = n2 + n2;
-    e = -6.283185307179586/n2;
+    e = factor/n2;
     a = 0.0;
                                              
@@ -60,21 +66,27 @@
   }
                                       
+  // re-normalize
+  for (i = 0; i < n; i++) {
+    x[i] /= n;
+    y[i] /= n;
+  }
+
   return;
 }                          
 
-int IsBinary (int N, int *nbin) {
+// check that a number is binary (2^Nbit).  returns int(log_2(N)) in Nbit
+int IsBinary (int N, int *Nbit) {
 
-  // check that a number is binary (2^nbit)
+  int i, Nset;
 
-  Nbit = 0;
+  *Nbit = 0;
   Nset = 0;
   for (i = 0; i < 8*sizeof(int); i++) {
     if (N & 0x01) {
       Nset ++;
-      Nbin = i;
+      *Nbit = i;
     }
     N >>= 1;
   }
-  *nbin = Nbit;
   if (Nset > 1) return (FALSE);
 }
@@ -92,6 +104,6 @@
 /* m: n = 2**m                                            */
 /*   input/output                                         */
-/* x: double array of length n with real part of data     */
-/* y: double array of length n with imag part of data     */
+/* x: float array of length n with real part of data     */
+/* y: float array of length n with imag part of data     */
 /*                                                        */
 /*   Permission to copy and use this program is granted   */
