Дискретное преобразование Фурье - C#

Узнай цену своей работы

Формулировка задачи:

Добрый день. На C# реализовал алгоритм дискретного преобразования Фурье и обратно, согласно формулам вот этим: Начал тестировать и почему то при обратно преобразовании результат даже близко не валяется с тем, что было на входе первого преобразования. По формулам вроде бы все правильно в алгоритме сделал. Использовал стандартные C#-аповские Compex. подскажите, пожалуйста, что тут может быть неправильно, что то мозги уже совсем плавятся от этих комплексных чисел. вот код:
/// <summary> 
    /// Преобразование Фурье 
    /// </summary> 
    public class FurieTrans 
    { 
        /// <summary> 
        /// Коэффициенты 
        /// </summary> 
        public List<Complex> koeffs; 
 
        /// <summary> 
        /// Количество точек, которые закодированы в данном ДПФ 
        /// </summary> 
        public double K; 
 
        public FurieTrans() 
        { 
            koeffs = new List<Complex>(); 
        } 
 
        /// <summary> 
        /// Выполнить дискретное преобразование Фурье 
        /// </summary> 
        /// <param name="points">Точки контура</param> 
        /// <param name="count">Количество коэффициентов</param> 
        public void dpf(List<Point> points, int count) 
        { 
            koeffs.Clear(); 
            K = points.Count; 
 
            //Цикл вычисления коэффициентов 
            for(int u=0; u<count; u++) 
            { 
                //цикл суммы 
                Complex summa = new Complex(); 
                for (int k = 0; k < K; k++) 
                { 
                    Complex S = new Complex(points[k].X, points[k].Y); 
                    double koeff = -2 * Math.PI * u * k / K; 
                    Complex e = new Complex(Math.Cos(koeff), Math.Sin(koeff)); 
                    summa += (S * e); 
                } 
                koeffs.Add(summa/K); 
            } 
        } 
 
        /// <summary> 
        /// Обратное преобразование Фурье 
        /// </summary> 
        /// <returns>Точки</returns> 
        public List<Complex> undpf() 
        { 
            List<Complex> res = new List<Complex>(); 
            for(int k=0; k<K-1; k++) 
            { 
                Complex summa = new Complex(); 
                for (int u = 0; u < koeffs.Count; u++ ) 
                { 
                    double koeff = 2 * Math.PI * u * k / K; 
                    Complex e = new Complex(Math.Cos(koeff), Math.Sin(koeff)); 
                    summa+=(koeffs[u]*e); 
                } 
                res.Add(summa); 
            } 
            return res; 
        } 
    }

Решение задачи: «Дискретное преобразование Фурье»

textual
Листинг программы
            var points = new List<Point>() { new Point(10, 0), new Point(2, 4), new Point(3, -3) };
 
            var f = new FurieTrans();
            f.dpf(points, points.Count);
 
            var points2 = f.undpf();
 
            foreach (var p in points2)
                Console.WriteLine("{0:n1}, {1:n1}", p.Real, p.Imaginary);
 
            Console.ReadLine();

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы