Czasami zdarza się nam, iż musimy w naszych programach dodać implementację algorytmu
Szybkiej Transformaty Fouriera. Niestety to co można znaleźć w sieci często woła o pomstę do nieba . Poradnik ten przyda się wszystkim studentom, inżynierom czy po prostu pasjonatom programowania.
W poradniku tym pokażę jak w Windows, poprzez środowisko programistyczne Visual Studio i w języku C/C++ dodać szybką transformatę Fouriera FFT . Wykorzystam ku temu darmowy projekt o nazwie FFTW.
Co nam będzie ku temu potrzebne, oczywiście sama biblioteka FFTW. Znajdziesz ją pod adresem:
http://fftw.org/install/windows.html
Wybierając plik do ściągnięcia sprawdź dla jakiego systemu go potrzebujesz . Od razu dodam, że wersja 32 bit doskonale działa na systemie 64 bit. Czy warto szukać zewnętrznych implementacji? Raczej nie, większość z nich ma wiele niedociągnięć i co najważniejsze nie działają dla zmiennej ilości próbek . Niestety ale większość z nich działa dla liczby współczynników określonych poprzez potęgę liczby 2.
W ściągniętej bibliotece znajdziemy kilka ważnych plików. Są nimi:
libfftw3-3.def
libfftw3f-3.def
libfftw3l-3.def
libfftw3-3.dll
libfftw3f-3.dll
libfftw3l-3.dll
Jednak, aby Visual linkował wszystko bez błędów potrzeba bibliotek statycznych lib. Trzeba sobie je zatem samemu stworzyć. Przyda się tutaj narzędzie Visuala lib.exe
Ale niestety nie działa ono ze zwykłego wiersza poleceń. Potrzeba wykorzystać wiersz poleceń Visuala. W tym celu w
Menu Start->Wszystkie Programy odnajdź folder Visuala i w nim
Visual Studio Tools->Visual Studio 20xx Command Prompt.
Teraz musimy odnaleźć folder, gdzie wypakowaliśmy pliki FFTW i tam wydać kolejno polecenia:
link -lib /def:libfftw3-3.def /out:libfftw3-3.lib
link -lib /def:libfftw3f-3.def /out:libfftw3f-3.lib
link -lib /def:libfftw3l-3.def /out:libfftw3l-3.lib
Wynikiem tej operacji będą nowe pliki:
libfftw3-3.lib
libfftw3f-3.lib
libfftw3l-3.lib
To je oraz fftw3.h musimy teraz zaimportować do naszego projektu. A zatem w oknie
Solution Explorer klikamy na
Source prawym przyciskiem i z menu podręcznego wybieramy
Add->Existing Item...
Co dalej? Ano już jesteśmy w domu. A zatem zaczynamy pisać właściwy kod. Na początek standardowo, czyli oprócz dajmy na to stdio.h dodajemy plik nagłówkowy fftw:
#include "fftw3.h"
W tej chwili nasza biblioteka FFTW powinna już działać, a zatem zróbmy przykład wykonujący szybką transformatę Fouriera, po czym na danych wynikowych wykonana zostanie transformata odwrotna. Prawidłowo działające operację dadzą w wyniku to co było na wejściu.
Na koniec pokażmy przykład funkcji wykonaj_fft(), która zrealizuje to zadanie. Kod jest opatrzony komentarzem, więc wszystko powinno być zrozumiałe.
void wykonaj_fft(){
int i;
double *in; //dane wejściowe dla FFT
double *in2;//dane wyjściowe dla IFFT
int n;//liczba współczynników
fftw_complex *out;//wyjście FFT
fftw_plan plan_backward;//dla wykonania IFFT
fftw_plan plan_forward;//dla wykonania FFT
//Należy alokować pamięć dla wszystkich danych
in = (double *) malloc ( sizeof ( double ) * 10 );
out = (fftw_complex *) malloc ( sizeof ( fftw_complex ) * 10 );
in2 = (double *) malloc ( sizeof ( double ) * 10 );
//Liczba danych
n=10;
//Inicjacja danych
for (i=0; i<10; i++)
in[i] =(i+1)/3;
//rozpoczynamy FFT
plan_forward = fftw_plan_dft_r2c_1d ( n, in, out, FFTW_ESTIMATE );
fftw_execute ( plan_forward );
//Ile współczynników bez symetrii (FFT jest symetryczna)? Jest ich ( n / 2 ) + 1
//Wypiszmy przykładowy wynik FFT
//(tablica jest dwukolumnowa, w pierwszej części jest część rzeczywista,
// a w drugiej urojona)
printf ("%f %f\n", out[0][0], out[1][1] );
//Wykonajmy odwrotną FFT
plan_backward = fftw_plan_dft_c2r_1d ( n, out, in2, FFTW_ESTIMATE );
fftw_execute ( plan_backward );
//Sprawdzamy wynik
for (i=0; i<10; i++)
printf("%f\n" in2[i] / ( double ) ( n ));
} |
I to w zasadzie wszystko. Gdybyś miał/miała jakieś problemy, zapraszam na nasze
FORUM, a z chęcią pomożemy.