Имя: Пароль:
IT
 
Дискретное преобразование Фурье
,
0 batmansoft
 
09.02.16
17:44
Добрый день. На C# реализовал алгоритм дискретного преобразования Фурье и обратно, согласно формулам вот этим:
https://yadi.sk/i/YRo7h5XRoZLKp.
Начал тестировать и почему то при обратно преобразовании результат даже близко не валяется с тем, что было на входе первого преобразования. По формулам вроде бы все правильно в алгоритме сделал. Использовал стандартные 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;
        }
    }
1 Garykom
 
гуру
09.02.16
17:58
(0) А может не умничать и сказать нафуя?
2 Garykom
 
гуру
09.02.16
17:59
3 batmansoft
 
09.02.16
18:08
(1) Магистерскую диссертацию пишу на тему "Компьютерное зрение". Проблема: как получить инвариантный дескриптор контура. Решил посмотреть в сторону преобразования Фурье. (2) Кажется, разорался, оказывается, количество коэффициентов должно равняться количеству точек, а не так как в классическом преобразовании, где чем больше коэффициентов, тем точнее. Но за ссылку все равно спасибо.
4 Рэйв
 
09.02.16
18:16
подумаешь Фурье...Вот теорему Ферма бы реализовал - это было бы и почет и нобелевская премия:-)
5 Рэйв
 
09.02.16
18:17
а то аоследнии изыски которые засчитали - не внушают доверия
6 Garykom
 
гуру
09.02.16
18:18
(3) >получить инвариантный дескриптор контура
для этой цели обычно векторизацию юзают, а не гармоники
хотя если взять некую точку в центре контура и далее как в полярных координатах пройтись по окружности...гм
7 batmansoft
 
09.02.16
18:18
(4) А реализацию искусственного интеллекта (или хотя бы его части, напр., компьютерное зрение) - это разве не достойная задача?
8 batmansoft
 
09.02.16
18:21
(6) Дык в планах есть и векторизацию рассмотреть. Но с гармониками вот что удобно: можно сравнивать и приближенные контуры. Например, если хороший четкий контур, который надо сравнить с кривым и расплывчатым, который получиться в ходе анализа  какого-то изображения, и сказать, насколько они похожи. Вот как сравнивать?
9 Garykom
 
гуру
09.02.16
18:30
а может все таки не свой лисапед с 0, а взять OpenCV ?
https://habrahabr.ru/post/208090/
https://habrahabr.ru/post/172651/
10 rsv
 
09.02.16
19:54
(0) Это где то  из области радиолокации ?
AdBlock убивает бесплатный контент. 1Сергей