static void FFT(ref Complex[] data, FFTDirection direction)
        {
            int n = data.Length;
            int i, j, istep;
            int m, mmax;
            double r, r1, theta, w_r, w_i, temp_r, temp_i;

            r = Math.PI;

            if(FFTDirection.Forward == direction) { r = -r; }
            j = 0;
            for(i = 0; i < n; i++)
            {
                if(i < j)
                {
                     temp_r = data[j].Re;
                     temp_i = data[j].Im;
                     data[j].Re = data[i].Re;
                     data[j].Im = data[i].Im;
                     data[i].Re = temp_r;
                     data[i].Im = temp_i;
                }
                m = n >> 1;
                while(j >= m)
                {
                    j -= m;
                    m = (m + 1) / 2;
                }
                j += m;
            }
            mmax = 1;
            while(mmax < n)
            {
                istep = mmax << 1;
                r1 = r / (double)mmax;
                for(m = 0; m < mmax; m++)
                {
                    theta = r1 * m;
                    w_r = Math.Cos(theta);
                    w_i = Math.Sin(theta);
                    for(i = m; i < n; i += istep)
                    {
                        j = i + mmax;
                        temp_r = w_r * data[j].Re - w_i * data[j].Im;
                        temp_i = w_r * data[j].Im + w_i * data[j].Re;
                        data[j].Re = data[i].Re - temp_r;
                        data[j].Im = data[i].Im - temp_i;
                        data[i].Re += temp_r;
                        data[i].Im += temp_i;
                    }
                }
                mmax = istep;
            }
            if(FFTDirection.Reverse == direction)
            for(i = 0; i < n; i++)
            {
                data[i].Re /= (double)n;
                data[i].Im /= (double)n;
            }
        }
        public static Complex[,] GetPictureFFT(Complex[,] image, int dim, FFTDirection direction)
        {
            Complex[] data = new Complex[dim];

            for (int i = 0; i < dim; i++)
            {
                for (int j = 0; j < dim; j++)
                {
                    data[j] = image[j, i];
                }
                FFT(ref data, direction);
                for (int j = 0; j < dim; j++)
                {
                     image[j, i] = data[j];
                }
            }
            data = new Complex[dim];
            for (int i = 0; i < dim; i++)
            {
                for (int j = 0; j < dim; j++)
                {
                    data[j] = image[i, j];
                }
                FFT(ref data, direction);
                for (int j = 0; j < dim; j++)
                {
                    image[i, j] = data[j];
                }
            }

            Complex[,] spectrum = new Complex[dim, dim];

            for (int i = 0; i < dim / 2; i++)
            {
                for (int j = 0; j < dim/2; j++)
                {
                    spectrum[i, j] = image[i + dim / 2, j + dim / 2];
                    spectrum[i + dim / 2, j + dim / 2] = image[i, j];
                    spectrum[i + dim / 2, j] = image[i, j + dim / 2];
                    spectrum[i, j + dim / 2] = image[i + dim / 2, j];
                }
            }

            return spectrum;
        }