FFTW: Różnice pomiędzy wersjami
[wersja nieprzejrzana] | [wersja nieprzejrzana] |
Usunięta treść Dodana treść
wersja 1 |
mNie podano opisu zmian |
||
Linia 1:
'''FFTW''' (''Fastest Fourier Transform in the West'') to bardzo szybka [[biblioteka (informatyka)|biblioteka]] [[C]] [[Transformata 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>
|