編譯且移植FFTW3到Android手機上(1) 轉

本文主要對如何將FFTW3編譯且移植到Android App上進行介紹,同時對各FFTW提供的一些快速傅里葉變換的方法在手機進行性能測試,總結出使用FFTW3進行小規模傅里葉變換的最佳方式。

文章重點內容有:FFTW configure;編譯so庫;ARM NEON優化;float加速;多線程

第1部分爲快速入門版,如想查看更詳細的使用說明,請查看第2部分 : http://he-kai.com/?p=38 內容

 

準備工作:

  • FFTW 3:Version 3.3.3 http://fftw.org/fftw-3.3.3.tar.gz
  • Android App:我編寫的示例程序 https://github.com/hekai/fftw_android 使用git或直接去github上下載此項目
  • Linux:我使用的是Ubuntu 12.04 64-bit
  • NDK:android-ndk-r9c  64-bit 32-bit 點擊合適版本下載
  • Eclipse:我使用的版本是3.7,版本不同關係不大,關鍵是安裝好ADT插件,並在Eclipse中配置好SDK目錄和NDK目錄

快速入門:

1. 下載好fftw-3.3.3.tar.gzfftw_android項目後,將目錄結構按如下方式放置

—->parent folder

—->fftw-3.3.3

—->fftw_android

2. Eclipse中導入,選擇已有項目,將fftw_android項目導入。運行爲Android Application,在手機上查看運行效果。

若出現錯誤,請檢查錯誤輸出,主要檢查Eclipse中NDK路徑是否配置好,以及在項目上嘗試右鍵Android Tool-> Fix Project Properties 和Add Native Support。若還是有報錯,選擇錯誤的視圖,將所有的錯誤選中,刪除,再運行看是否能正常編譯運行通過。

3. 若想要觀察各傅里葉變換方法的性能,打開Logcat,增加過濾器,將Application欄填爲com.hekai.fftw_android,從而將此程序的所有LOG輸出過濾顯示出來。

下表爲我的測試結果

測試數據:160 x 160 實數二維矩陣

測試手機:Google Nexus 4( Qualcomm APQ8064 1.5GHz x 4)

方法 Avg(ms)(10 times)
ffwt_plan_dft_2d 58.013794
ffwt_plan_dft_r2c_2d 25.4669923
ffwtf_plan__dft_r2c_2d 19.3967774
ffwtf_plan__dft_r2c_2d(neon) 9.5950195
ffwtf_plan__dft_r2c_2d(threads=4) 30.2916016
ffwtf_plan__dft_r2c_2d(threads=4)(neon) 18.9395753

總結:

  • 對於實數二維矩陣在Android手機上做快速傅里葉變換,使用帶有r2c的方法,它會對純實數矩陣的運算有加速效果。
  • 不要開啓多線程,小規模數據時,多線程反而會增加額外時間。
  • 編譯FFTW時啓用neon優化能明顯提高在arm芯片上的運行效率,如上表中10次平均每次是9.6ms,實際數據是第一次花費了50多ms,後面每次都是4ms左右
  • 在無高精度要求的前提下,使用float作爲輸入,不使用double,減少數據量,提高運算效率

 參考文獻:

  1. Compiling open source libraries with Android NDK: Part 2
  2. 一個FFTW NDK的例子 https://github.com/jimjh/fftw-ndk-example
  3. FFTW官方文檔 http://fftw.org/fftw3_doc/

另外,還有一篇帖子: 編譯且移植FFTW3 https://blog.csdn.net/flfihpv259/article/details/80819084

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章