1. 程式人生 > >編譯且移植FFTW3到Android手機上(1)

編譯且移植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