Logowanie
 Implementacja FFT (FFTW) w języku C/C++ w Visual Studio
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.
 Reklama

 Komentarze
#1 | puchuk dnia 29/06/2011 20:01
Bóg mi cię zesłał. Dziękuję za ten opis !
#2 | MW dnia 20/05/2016 21:22
A co z linkowaniem? Po wykonaniu krok po kroku przedstawionego tutaj manuala pojawiaja sie ciagle błędy Linkrea. Tam tez potrzebujemy cos odpowiednio ustawic?
 Dodaj komentarz
Dla wszystkich komentarzy wymagana jest ich akceptacja przez moderatora.

Nick:



AntyBOT (dla niezalogowanych): Napisz słowo hotfix wielkimi literami

/articles.php?article_id=359

 Artykuły
Polecany artykuł


Jak walczyć z pobieraczkiem? Jak odstąpić od umowy? O tym w artykule.
 Ostatnie komentarze
gryPrzez: Maciak Plock [dnia: Apr 03, 2020]
wynik jest wysoko w google, przy...
gryPrzez: MAMBA [dnia: Mar 24, 2020]
Warning: Only 61104 of 61105 MBy...
gryPrzez: Random32 [dnia: Mar 18, 2020]
Witam, u mnie na polskim Window...
gryPrzez: muffintodebil [dnia: Mar 04, 2020]
aha gosicu to niezly jestes zaaw...
gryPrzez: Maciek [dnia: Feb 20, 2020]
2 karty 512 kupione na allegro: ...
gryPrzez: xd [dnia: Feb 05, 2020]
zrobiłem sposób Vin/7 na dziesią...
gryPrzez: gtremik [dnia: Jan 25, 2020]
Dzięki seba86mu :) Działa
gryPrzez: Mirek [dnia: Jan 22, 2020]
A jest rozwiązanie dla Windowsa 10?
 Gry
Polecany artykuł


Quake

Klasyk FPS w wersji flash.
 Programy
Polecany artykuł


Tapin Radio Darmowa aplikacja służąca do słuchania i nagrywania radia internetowego
 Recenzje
Polecana recenzja


Sleeping Dogs
Policjant pod przykrywką rozpracowuje Triadę.
 Facebook