FFTW: Różnice pomiędzy wersjami

[wersja nieprzejrzana][wersja nieprzejrzana]
Usunięta treść Dodana treść
wersja 1
 
Macar (dyskusja | edycje)
mNie podano opisu zmian
Linia 1:
'''FFTW''' (''Fastest Fourier Transform in the West'') to bardzo szybka [[biblioteka (informatyka)|biblioteka]] [[C]] [[Transformata Fouriera|Transformattransformat Fouriera|]].
 
 
 
'''FFTW''' jest rzeczywiście najszybszą niezależną od sprzętu biblioteką tego typu.
 
Inne biblioteki o porównywalnych osiagnięciach składają się z ręcznie optymalizowanego kodu assemblerowego.
 
Z FFTW jest inaczej - większość kodu FFTW jest [[generatory kodu|generowana]] z zapisu w języku [[Ocaml]],
 
ponadto FFTW w czasie rzeczywistym dostosowuje się do właściwości danej maszyny - nie tylko procesora ale również
 
wykorzystuje cechy [[cache|pamięci cache]] !
 
 
 
FFTW jest biblioteką [[C|języka C]], ale istnieją też wrappery dla [[Fortran|Fortrana]].
 
 
 
Istnieją wersje FFTW dla [[SMP]], a nawet dla obliczeń dystrybutowanych.
 
 
 
FFTW jest dostępna na licencji [[GPL]], co oznacza że tylko programy Open Source mogą z niej korzystać.
 
 
 
Programy używające FFTW to między innymi [[Octave]].
 
 
 
Informacje techniczne:
 
* najnowsza wersja (na maj 2002) to 2.1.3
 
* pakiety [[Debian|Debiana]]:
 
** Wersja normalna - <tt>fftw2</tt> i <tt>fftw-dev</tt>
 
** Wersja o pojedynczej precyzji - <tt>sfftw</tt> i <tt>sfftw-dev</tt>
 
** Wersja zoptymalizowana dla [[AMD K6-2]] - <tt>k6fftwgel</tt> i <tt>k6fftwgel-dev</tt>
 
** Wersja zoptymalizowana dla [[AMD K7]] - <tt>k7fftwgel</tt> i <tt>k7fftwgel-dev</tt>
 
** Wersja zoptymalizowana dla [[Pentium 4]] - <tt>p4fftwgel</tt> i <tt>p4fftwgel-dev</tt>
 
 
 
Strona domowa projektu: http://www.fftw.org/
 
 
 
Przykładowy [[kod na Wikipedii|kod]]:
 
<pre>
 
#include <fftw.h>
 
#include <math.h>
 
 
 
int main()
 
{
 
fftw_plan pl1,pl2;
 
fftw_complex in[128], mid[128], out[128];
 
int i;
 
 
 
for (i=0; i<128; i++)
 
{
 
in[i].re = sin (M_PI*i/16);
 
in[i].im = sin (M_PI*i/24);
 
}
 
 
 
pl1 = fftw_create_plan (128, FFTW_FORWARD, FFTW_ESTIMATE);
 
pl2 = fftw_create_plan (128, FFTW_BACKWARD, FFTW_ESTIMATE);
 
 
 
fftw_one (pl1, in, mid);
 
fftw_one (pl2, mid, out);
 
for (i=0; i<128; i++)
 
{
 
out[i].re /= 128;
 
out[i].im /= 128;
 
}
 
 
 
fftw_destroy_plan (pl2);
 
fftw_destroy_plan (pl1);
 
 
 
for (i=0; i<128; i++)
 
printf ("%d: in=(%f,%f), out=(%f,%f), d=(%f,%f)\n", i, in[i].re, in[i].im,
 
out[i].re, out[i].im, out[i].re - in[i].re, out[i].im - in[i].im);
 
return 0;
 
}
 
</pre>