예제 #1
0
파일: Fourier.cs 프로젝트: NepeinAV/OOP
        public static void FFT(ref Complex[] polinomial, bool invert)
        {
            int l = polinomial.Length;

            if (l == 1)
            {
                return;
            }

            Complex[] p1 = new Complex[l / 2];
            Complex[] p2 = new Complex[l / 2];

            for (int i = 0; i < l / 2; i++)
            {
                p1[i] = polinomial[2 * i];
                p2[i] = polinomial[2 * i + 1];
            }

            Fourier.FFT(ref p1, invert);
            Fourier.FFT(ref p2, invert);

            double  angle = 2 * Math.PI / l * (invert ? -1 : 1);
            Complex w     = new Complex(1, 0);
            Complex wn    = new Complex(Math.Cos(angle), Math.Sin(angle));

            for (int i = 0; i < l / 2; i++)
            {
                polinomial[i]         = p1[i] + w * p2[i];
                polinomial[i + l / 2] = p1[i] - w * p2[i];
                if (invert)
                {
                    polinomial[i] /= 2; polinomial[i + l / 2] /= 2;
                }
                w *= wn;
            }
        }