public void RealFFT(double[] data)
{
FFT(data); // do packed FFT
int n = data.Length; // number of real input points, which is 1/2 the complex length
double temp;
double theta = 2 * Math.PI / n;
double wpr = Math.Cos(theta);
double wpi = Math.Sin(theta);
double wjr = wpr;
double wji = wpi;
for (int j = 1; j <= n / 4; ++j)
{
int k = n / 2 - j;
double tnr = data[2 * k];
double tni = data[2 * k + 1];
double tjr = data[2 * j];
double tji = data[2 * j + 1];
double e = (tjr + tnr);
double f = (tji - tni);
double a = (tjr - tnr) * wji;
double d = (tji + tni) * wji;
double b = (tji + tni) * wjr;
double c = (tjr - tnr) * wjr;
// compute entry y[j]
data[2 * j] = 0.5 * (e + (a + b));
data[2 * j + 1] = 0.5 * (f - (c - d));
// compute entry y[k]
data[2 * k] = 0.5 * (e - (a + b));
data[2 * k + 1] = 0.5 * ((-c + d) - f);
temp = wjr;
wjr = wjr * wpr - wji * wpi;
wji = temp * wpi + wji * wpr;
}
// compute final y0 and y_{N/2} ones, place into data[0] and data[1]
temp = data[0];
data[0] += data[1];
data[1] = temp - data[1];
}