I was just wondering if there are other people with an interest in
developing an FFT class.

I have a simple Cooley-Tukey FFT implementation to start on, and
perhaps we could work on implementing other variations.

Now obviously this implementation is very crude, and needs many
improvements, but I believe that an FFT library could be a valuable
addition to the commons.  Please let me know what your opinions on
this are.

import org.apache.commons.math.complex.ComplexUtils;
import org.apache.commons.math.complex.Complex;

public class FFT {
   public static Complex[] fft(Complex[] input) {
       Complex[] output = new Complex[input.length];
       if (input.length == 1) {
           output[0] = input[0];
       } else {
           Complex[] even = new Complex[input.length/2];
           Complex[] odd = new Complex[input.length/2];
           for (int i = 0; i < input.length/2; i++) {
               even[i] = input[i*2];
               odd[i] = input[i*2 + 1];
           }
           Complex[] E = fft(even);
           Complex[] O = fft(odd);
           for (int i = 0; i < input.length; i++) {
               if (i < input.length/2) {
                   output[i] = E[i].add(ComplexUtils.exp(new Complex(0,
                           -2*Math.PI/input.length*i)).multiply(O[i]));
               } else {
                   output[i] = E[i - input.length/2].subtract(ComplexUtils.exp(
                           new Complex(0, -2*Math.PI/input.length*(i
                           - input.length/2))).multiply(O[i - input.length/2])
                           );
               }
           }
       }
       return output;
   }

   public static Complex[] ifft(Complex[] input) {
       Complex[] postInput = new Complex[input.length];
       for (int i = 0; i < input.length; i++) {
           postInput[i] = input[i].conjugate();
       }
       Complex[] output = fft(postInput);
       for (int i = 0; i < input.length; i++) {
           output[i] = output[i].conjugate().divide(new Complex(input.length,
                                                                0));
       }
       return output;
   }
}

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to