FFT - faq

From
Ilia Kantor (2:5020/175.2)
To
Nick Poroshin
Date
2002-12-14T02:47:33Z
Area
RU.ALGORITHMS
From: "Ilia Kantor" <ilia@manual.ru>

Tue Dec 10 2002 20:40, Nick Poroshin wrote to All:

 NP> Пpедлагаю подпpавленный ваpиант-ляпы подпpавлены и сделано, чтобы массивы
 NP> начинались с 0(а не 1)-так имо удобнее.

А я чуток закомментарю его.. Конструктивной критикой, дабы стал лучше.
Только самое необходимое.

 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
Такой точности пи хватит разве что для float. 
 #define pi 3.141592653589793238462643383

 NP> cos_ = cos(arg);
 NP> sin_ = sin(arg);
Тормознутые функции.. Лучше брать значения из предварительно созданной
таблицы.

 NP>     u3=u1*cos_-u2*sin_;
 NP>     u2=u2*cos_+u1*sin_;
Эта рекуррентная последовательность для тригонометрии приводит к быстрому
росту ошибки. Лучше хранить не сам корень из -1 в виде (cos, sin), а пару
(1-cos, sin). Соответственно, меняется формула.

 NP>  for(i=0;i<n;i++) {
 NP>     x1[i]=x1[i]/n;
 NP>     y1[i]=y1[i]/n;
 NP>  }

Косметическое исправление: лучше сначала вычислить inv=1/n, а потом домножать
на него.

Конечно, ничего этого не нужно, если точек 256, а потеря точности типа 1e-5 не
волнует.

--- ifmail v.2.15dev5
 * Origin: FidoNet Online - http://www.fido-online.com (2:5020/175.2)