本文主要对如何将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
来源:oschina
链接:https://my.oschina.net/u/2963604/blog/2963954