Ejemplo n.º 1
0
        /// <summary>
        /// Calcul dune FFT sur un tableau de 1024 points Selon l'algorithme de  Cooley–Tukey
        /// </summary>
        /// <param name="Y">  Y[] : array of 1024 (decimal) values on which FFT has to be performed </param>
        /// <returns>  Tc[] array of 1024 (complex) values of FFT </returns>
        public static Complex[] FFT1024(decimal[] Y)
        {
            //calcul de la FFT surle tableau entrant Y[]
            //resultant sortant dans le tableau Tc[]

            int N = Y.Length;

            if (N != 1024)
            {
                Console.WriteLine("nombre de points doit etre = 1024");
                Console.WriteLine("FFT sera calculé sur 1024 points seulement avec FFT1024() ");
                System.Environment.Exit(1);
            }

            Complex[] Tc = new Complex[1024]; // résultat de la FFT
            Complex[] Ec = new Complex[512];  // Even (pair)
            Complex[] Oc = new Complex[512];  // Od (impair)

            decimal[] E = new decimal[512];
            decimal[] O = new decimal[512];
            double    Re, Im;

            for (int k = 0; k < 512; k++)
            {
                E[k] = Y[2 * k];
                O[k] = Y[(2 * k) + 1];
            }
            Ec = DFT.DFTv2(E);    // Ec ( Even - pair) DFT of Even indexed pat of signal
            Oc = DFT.DFTv2(O);    // Odd ( Odd - impair) DFT of Odd indexed pat of signal

            for (int k = 0; k < 512; k++)
            {
                Complex temp = new Complex(0, 0);
                Re    = Math.Cos((double)-2 * Math.PI * ((double)k / (double)1024));
                Im    = Math.Sin((double)-2 * Math.PI * ((double)k / (double)1024));
                temp  = new Complex(Re, Im);
                Oc[k] = Oc[k] * temp;
            }

            for (int k = 0; k < 512; k++)
            {
                Tc[k]           = Ec[k] + Oc[k];  // Tc[k] = Ec[k] + exp(-2.i.pi.k/N).Oc[k]
                Tc[k + (N / 2)] = Ec[k] - Oc[k];  // Tc[k+N/2] = Ec[k] - exp(-2.i.pi.k/N).Oc[k]
            }

            return(Tc);
        }
Ejemplo n.º 2
0
        /// <summary>
        /// Calcul dune FFT sur un tableau de N points Selon l'algorithme de  Cooley–Tukey
        /// </summary>
        /// <param name="Y">  y[] : array of (decimal) values on which FFT has to be performed </param>
        /// <returns>  Tc[] array of (complex) values of FFT </returns>
        public static Complex[] FFTN(decimal[] Y)
        {
            //calcul de la FFT surle tableau entrant y[]
            //resultant sortant dans le tableau Tc[]

            int N = Y.Length;

            Complex[] Tc = new Complex[N];     // résultat de la FFT
            Complex[] Ec = new Complex[N / 2]; // Even (pair)
            Complex[] Oc = new Complex[N / 2]; // Od (impair)

            decimal[] E = new decimal[N / 2];
            decimal[] O = new decimal[N / 2];
            double    Re, Im;

            for (int k = 0; k < N / 2; k++)
            {
                E[k] = Y[2 * k];
                O[k] = Y[(2 * k) + 1];
            }
            Ec = DFT.DFTv2(E);    // Ec ( Even - pair) DFT of Even indexed pat of signal
            Oc = DFT.DFTv2(O);    // Odd ( Odd - impair) DFT of Odd indexed pat of signal
            //Ec = FFT.FFTN(E);    // Ec ( Even - pair) DFT of Even indexed pat of signal
            //Oc = FFT.FFTN(O);    // Odd ( Odd - impair) DFT of Odd indexed pat of signal

            for (int k = 0; k < N / 2; k++)
            {
                Complex temp = new Complex(0, 0);
                Re    = Math.Cos((double)-2 * Math.PI * ((double)k / (double)N));
                Im    = Math.Sin((double)-2 * Math.PI * ((double)k / (double)N));
                temp  = new Complex(Re, Im);
                Oc[k] = Oc[k] * temp;
            }

            for (int k = 0; k < N / 2; k++)
            {
                Tc[k]           = Ec[k] + Oc[k];  // Tc[k] = Ec[k] + exp(-2.i.pi.k/N).Oc[k]
                Tc[k + (N / 2)] = Ec[k] - Oc[k];  // Tc[k+N/2] = Ec[k] - exp(-2.i.pi.k/N).Oc[k]
            }

            return(Tc);
        }