2010年9月2日 星期四

Code Blocks 環境使用 FFTW


FFTW(Fastest Fourier Transform in the West), 這是一個計算DFT(Discrete Fourier Transform, 離散傅立葉轉換)的C語言函式庫,而且是目前世界公認執行速度最快的傅立葉轉換軟體。FFTW是由當時為MIT博士班的兩位學生Matteo FrigoSteven G. Johnson 在1997年所發明,並在1999年獲得Wilkinson數值軟體獎(J. H. Wilkinson Prize for Numerical Software)。
使用方法:
1.先到 FFTW官網 Download FFTW檔案(Windows 系統可到這下載)選擇電腦的位元數。
1
2.將下載完的檔案解壓縮,將檔案 libfftw3-3.dll、libfftw3f-3.dll、libfftw3l-3.dll 複製到你想要放置的位置(我是放在C:\WINDOWS\system32)。
2
3.將檔案 fftw3.h 複製到 Code Blocks 裡的 include 資料夾,(例如:C:\Program Files\CodeBlocks\MinGW\include)。
3
4.這些動作完成後開啟 CodeBlocks 程式,點選 Settings/Compiler and debugger...
4
5.點選 Linker settings/Link libraries:/add
5
6.選擇 libfftw3-3.dll、libfftw3f-3.dll、libfftw3l-3.dll 檔案
6
7.大功告成~~馬上使用下列程式來做測試
#include <iostream>
#include <fftw3.h>

using namespace std;
int main()
{
  //資料宣告
  int N = 256;
  fftw_complex *in, *out;
  fftw_plan p;
  //空間配置 
  in = (fftw_complex*) fftw_malloc(sizeof (fftw_complex) * N);
  out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
  //製作輸入資料
  for(int i=0; i<N; i++)
  {
    in[i][0] = i;
    in[i][1] = i+1;
  }
  //產生最佳化的程式碼
  p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
  //執行這個最佳化的程式碼
  fftw_execute(p); /* repeat as needed */
  //釋放空間
  //fftw_destroy_plan(p);
  //fftw_free(in); fftw_free(out);

  for(int i=0; i<N; i++)
  {
    if(out[i][1]>=0)
      cout << "Resutl[" << i << "]=" << out[i][0] << "+" << out[i][1] << "j\n";
    else
      cout << "Resutl[" << i << "]=" << out[i][0] << out[i][1] << "j\n";
  }
  return 0;
}

p.s.另外補充一下
fftw_plan p; 
宣告 p 為 fftw 運算

fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
一維 fftw 運算(N點資料(整數),輸入資料,輸出資料,
運算種類(FFTW_FORWARD 為 FFT 運算; 
         FFTW_BACKWARD 為 IFFT 運算),

運算速度(FFTW_ESTIMATE 為 速度次佳化運算; 
         FFTW_MEASURE 為 速度最佳化運算))

fftw_plan_dft_2d(height, width, in, out, FFTW_FORWARD,
FFTW_ESTIMATE);




複數的資料型態:
fftw_complex ComplexNum;
ComplexNum[0] = 10.1;  //實部
ComplexNum[1] = 20.5;  //虛部




多維 DFT:
將fftw_plan_dft_1d改為:
fftw_plan_dft_2d
fftw_plan_dft_3d

"注意"IFFT 運算:
此版本IFFT運算沒有做normalize所以要自己寫迴圈除以N

沒有留言: