编译且移植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/

5 thoughts to “编译且移植FFTW3到Android手机上(1)”

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注