Дискретное преобразование Фурье - 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();
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д