windows下使用fftw進行傅裡葉變換及其編程執行個體

來源:互聯網
上載者:User

標籤:傅裡葉變換   fftw   

       傅裡葉變換應該是上大二的時候《訊號與系統》課上學過,上研後在《數字訊號處理》課上又學了一遍。當初一直在想傅裡葉變換到底有什麼用呢?什麼時候能用上呢?時間如梭,沒想到畢業四年後,一個小項目要用到傅裡葉變換,喜大普奔啊,當初晦澀的概念、眼暈的公式,終於沒白學。是的,其實任何知識都不是白學的,即使工作中一直用不到傅裡葉變換,至少思維得到了鍛煉,都是有益的。在應用傅裡葉變換過程中,可以按照公式自己編程實現,也可以使用已有的開源傅裡葉變換函數庫。經過查閱資料,本人選用fftw函數庫來進行傅裡葉變換,因為fftw官網上提到說該函數庫效能非常出眾,甚至可以和同類型的商業軟體相競爭。fftw官網地址為:http://www.fftw.org/。       一、fftw下載       由於本人是在windows平台開發,於是到下面連結:http://www.fftw.org/install/windows.html下載已編譯版本。如所示,該圖資訊量很大,既有32/64兩個版本的下載連結,同時還有產生lib檔案命令。即32位系統命令為: lib /def:libfftw3-3.def,而64位系統為: lib /machine:x64 /def:libfftw3-3.def。                           
       下載解壓後,會發現只有dll和標頭檔,在沒有lib檔案時,使用fftw庫時會比較繁瑣。於是在應用fftw編程前還是動手先產生lib檔案。方法很簡單,首先開啟VS命令提示工具。本人使用的開發工具為VS2005,如所示:                                                         
開啟後,cd到已下載的fftw檔案目錄,然後執行前面提到的lib產生命令,如所示:                                   
命令執行完畢後,即可在目前的目錄內看到新產生的lib檔案,我這邊分別產生了double、float、long double三個版本,實際使用時可根據項目需要,選擇相應精度的版本。產生的lib庫檔案如所示:                                                             



       二、簡單編程執行個體       有了標頭檔、lib/dll檔案,那就什麼都有了。建立一個工程,馬上用起來吧。下面為一個非常簡單的編程執行個體,主要完成實數傅裡葉變換,輸入為正弦曲線,輸出為傅裡葉變換的幅度譜。
#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <math.h>#include "include/fftw3.h"#pragma comment(lib, "libfftw3-3.lib") // double版本// #pragma comment(lib, "libfftw3f-3.lib")// float版本// #pragma comment(lib, "libfftw3l-3.lib")// long double版本#define PI 3.1415926int main(){int len = 8;double *in = NULL;// 如果要使用float版本,需先引用float版本的lib庫,然後在fftw後面加上f尾碼即可.fftw_complex *out = NULL;// fftwf_complex --> 即為float版本fftw_plan p;in  = (double *)fftw_malloc(sizeof(double) * len);out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * len);double dx = 1.0 / len;// 輸入純實數for (int i = 0; i < len; i++){in[i] = sin(2*PI * dx*i) + sin(4*PI * dx*i);printf("%.2f ", in[i]);}printf("\n\n");// 傅裡葉變換p = fftw_plan_dft_r2c_1d(len, in, out, FFTW_ESTIMATE);fftw_execute(p);// 輸出幅度譜for (int i = 0; i < len; i++){float len = sqrt(out[i][0]*out[i][0] + out[i][1]*out[i][1]);printf("%.2f ", len);}printf("\n");// 釋放資源fftw_destroy_plan(p);fftw_free(in);fftw_free(out);system("pause");return 0;}
       運行結果如所示,從結果來看,在頻率為1及2兩個位置有幅度輸出,這與輸入的頻率為1及2的兩個疊加正弦波吻合,結果正確。                                                  


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.