|
|
ru.algorithms- RU.ALGORITHMS ---------------------------------------------------------------- From : Evgeny Sharandin 2:5020/755.12 18 Dec 2002 02:35:00 To : Ilia Kantor Subject : FFT - faq -------------------------------------------------------------------------------- Привет Ilia! 14 декабря 2002 года (а было тогда 02:47) Ilia Kantor в своем письме к Nick Poroshin писал: IK> А я чуток закомментарю его.. Конструктивной критикой, дабы стал лучше. IK> Только самое необходимое. NP>> #include <math.h> NP>> #include <stdio.h> NP>> void fft(double *x1,double *y1,int n,int m,int dir) NP>> { NP>> #define pi 3.14159265 IK> Такой точности пи хватит разве что для float. IK> #define pi 3.141592653589793238462643383 Основная причина громадной погрешности зарыта именно здесь ;) NP>> cos_ = cos(arg); NP>> sin_ = sin(arg); IK> Тормознутые функции.. В современных процесорах кеш-промах обходится дороже. IK> Лучше брать значения из предварительно созданной IK> таблицы. Уже не факт, что лучше. Скорее фифти-фифти. NP>> u3=u1*cos_-u2*sin_; NP>> u2=u2*cos_+u1*sin_; IK> Эта рекуррентная последовательность для тригонометрии приводит к IK> быстрому росту ошибки. Лучше хранить не сам корень из -1 в виде (cos, IK> sin), а пару (1-cos, sin). Соответственно, меняется формула. NP>> for(i=0;i<n;i++) { NP>> x1[i]=x1[i]/n; NP>> y1[i]=y1[i]/n; NP>> } IK> Косметическое исправление: лучше сначала вычислить inv=1/n, а потом IK> домножать на него. В данном случае не принципиально. Во-первых, доля затрачиваемого времени на масштабирование мала. Во-вторых, нет необходимости делать масштабирование при каждом преобразовании. В-третьих, умный компилятор сам разбертся. С уважением, Evgeny 18 декабря 2002 года --- * Origin: LID (2:5020/755.12) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.algorithms/39153dffd2ae.html, оценка из 5, голосов 10
|