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.