編譯且移植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.gz和fftw_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,減少資料量,提高運算效率
參考文獻:
- Compiling open source libraries with Android NDK: Part 2
- 一個FFTW NDK的例子 https://github.com/jimjh/fftw-ndk-example
- FFTW官方文件 http://fftw.org/fftw3_doc/
另外,還有一篇帖子: 編譯且移植FFTW3 https://blog.csdn.net/flfihpv259/article/details/80819084