private static void FourierTransform(double[] data, int nn, int isign)
{
const double twoPi = Math.PI*2;
isign = Math.Sign(isign);
int n = nn << 1;
int j = 1;
for (int i = 1; i < n; i += 2)
{
if (j > 1)
{
double wtemp = data[i];
data[i] = data[j];
data[j] = wtemp;
wtemp = data[i + 1];
data[i + 1] = data[j + 1];
data[j + 1] = wtemp;
}
int m = n >> 1;
while (m >= 2 && j > m)
{
j -= m;
m >>= 1;
}
j += m;
}
n = nn << 1;
int mmax = 2;
while (n > mmax)
{
int istep = mmax << 1;
double theta = isign*(twoPi/mmax);
double wtemp = Math.Sin(0.5*theta);
double wpr = -2.0*wtemp*wtemp;
double wpi = Math.Sin(theta);
double wr = 1.0;
double wi = 0.0;
for (int m = 1; m < mmax; m += 2)
{
for (int i = m; i <= n; i += istep)
{
j = i + mmax;
double tempr = wr*data[j] - wi*data[j + 1];
double tempi = wr*data[j + 1] + wi*data[j];
data[j] = data[i] - tempr;
data[j + 1] = data[i + 1] - tempi;
data[i] += tempr;
data[i + 1] += tempi;
}
wr = (wtemp = wr)*wpr - wi*wpi + wr;
wi = wi*wpr + wtemp*wpi + wi;
}
mmax = istep;
}
}