public static void FFT1(Complex[] data, int exponent, FFTMode mode) { //count; if exponent = 12 -> c = 2^12 = 4096 int c = (int)Math.Pow(2, exponent); //binary inversion Inverse(data, c); int j0, j1, j2 = 1; float n0, n1, tr, ti, m; float v0 = -1, v1 = 0; //move to outer scope to optimize performance int j, i; for (int l = 0; l < exponent; l++) { n0 = 1; n1 = 0; j1 = j2; j2 <<= 1; //j2 * 2 for (j = 0; j < j1; j++) { for (i = j; i < c; i += j2) { j0 = i + j1; //-- tr = n0 * data[j0].Real - n1 * data[j0].Imaginary; ti = n0 * data[j0].Imaginary + n1 * data[j0].Real; //-- data[j0].Real = data[i].Real - tr; data[j0].Imaginary = data[i].Imaginary - ti; //add data[i].Real += tr; data[i].Imaginary += ti; } //calc coeff m = v0 * n0 - v1 * n1; n1 = v1 * n0 + v0 * n1; n0 = m; } if (mode == FFTMode.Forward) { v1 = (float)Math.Sqrt((1f - v0) / 2f); } else { v1 = (float)-Math.Sqrt((1f - v0) / 2f); } v0 = (float)Math.Sqrt((1f + v0) / 2f); } if (mode == FFTMode.Forward) { Forward(data, c); } }