CSMSL.Chemistry.IsotopicDistribution.FourierTransform C# (CSharp) Method

FourierTransform() private static method

private static FourierTransform ( double data, int nn, int isign ) : void
data double
nn int
isign int
return void
        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;
            }
        }