package fouriertransform;

/**
 * Discrete Fourier Transform
 * @author Winston Prakash
 */
public class DiscreteFourierTransform {
    public static double[] transform(int nData, double[] data, boolean inverse){
        double[] trData = new double[2 * nData];
        double omega = 2. * Math.PI / nData;
        if (inverse){
            omega = -omega;
        }
        for (int i = 0; i < nData; i++ ){
            for (int j = 0; j < nData; j++ ){
                trData[2 * i] += data[2* j] * Math.cos(omega * i * j) +  data[2* j + 1] * Math.sin(omega * i * j);
                trData[2 * i + 1] += data[2* j] * Math.cos(omega * i * j) -  data[2* j + 1] * Math.sin(omega * i * j);
            }
        }
        if (!inverse){
            for (int i = 0; i < nData; i++ ){
                trData[2 * i] /= (double)nData;
                trData[2 * i + 1] /= (double)nData;
            }
        }
        return trData;
    }
    
}