1.下载FFTW代码:http://fftw.org
2.下载NDK环境:http://developer.android.com/tools/sdk/ndk/index.html
如果上外网连接不好,建议使用百度浏览器或者翻墙软解搞定。
本人开发环境如下
Build平台:ubuntu linux 64位
Host平台:规格是arm cortex-A7 单核 1.2GHz
Host系统:android
FFTW版本为:fftw3.3.4
NDK版本为: android-ndk-r10d-linux-x86_64.bin
开发流程:
Step 1:先在NDK环境下编译FFTW库,编译出静态链接库。
Step 2:再调用该库编译成可执行文件或者动态链接库。
Step 3:测试结果
Step1:
1> 文件目录:
——android-ndk-r10d
——fftw3.3.4
——fftw_install
2> 配置系统变量:
NDK_DIR="/home/zhouxiaoyong/android-ndk-r9c"
INSTALL_DIR="`pwd`/fftw3"
SRC_DIR="`pwd`/../fftw-3.3.4"
cd $SRC_DIR
export PATH="$NDK_DIR/toolchains/arm-linux-androideabi-4.8/prebuilt/linux-x86_64/bin/:$PATH"
export SYS_ROOT="$NDK_DIR/platforms/android-8/arch-arm/"
export CC="arm-linux-androideabi-gcc--sysroot=$SYS_ROOT -march=armv7-a -mfloat-abi=softfp"
export LD="arm-linux-androideabi-ld"
export AR="arm-linux-androideabi-ar"
export RANLIB="arm-linux-androideabi-ranlib"
export STRIP="arm-linux-androideabi-strip"
export CFLAGS="-mfpu=neon-mfloat-abi=softfp -O3 -fPIC -ldl"
mkdir -p $INSTALL_DIR
3> 配置编译配置
./configure --host=arm-eabi \
--prefix=$INSTALL_DIR \
LIBS="-lc -lgcc" \
--enable-single \
--enable-float \
--enable-shared=yes \ 尽管配置了,还是没有产生动态库
--enable-neon \
--enable-maintainer-mode \
--disable-fortran \
4> make -j16 && make install
Step 2:
1> 编写 android.mk:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_C_INCLUDES:= $(LOCAL_PATH)/fftw3/include
LOCAL_SRC_FILES:= test.c
LOCAL_LDFLAGS +=-Wl,--no-warn-shared-textrel
LOCAL_MODULE := test_android
LOCAL_SHARED_LIBRARIES:= libcutils \
libutils \
Liblog
# LOCAL_STATIC_LIBRARIES:=fftw3f/lib/libfftw3f
LOCAL_LDFLAGS += $(LOCAL_PATH)/fftw3/lib/libfftw3f.a
LOCAL_MODULE_TAGS := optional
include $(BUILD_EXECUTABLE)
2> 测试代码:
此文件中包含FFTW编译出来的库,可下载直接在Android开发工程下编译运行。
http://download.youkuaiyun.com/detail/opentld/8510837
Step 3:测试结果
1> 正确性测试:
使用MATLAB生成一个矩阵magic(8), 使用 fft2() 和ifft2()先后进行前向傅里叶变换和后向傅里叶变换。结果与ARM端的结果相对比。
结论:正向变换结果完全一致。反向结果相差一个常量系数。Matlab的ifft2()可以得到原矩阵。而测试代码中需要对每个元素除以矩阵size大小之后才可以得到原矩阵。
2> 性能测试:
测试结果案例:
root@android:/test # ./test_android160
./test_android 160
width = 160 height = 160
timeEnd = 317963971 timeStart =317958426 time consumption = 5
timeEnd = 317977398 timeStart = 317971659 time consumption = 5
timeEnd = 317987181 timeStart =317981557 time consumption = 5
timeEnd = 318000068 timeStart =317991381 time consumption = 8
timeEnd = 318010155 timeStart =318004281 time consumption = 5
timeEnd = 318019852 timeStart =318014198 time consumption = 5
timeEnd = 318029777 timeStart =318024043 time consumption = 5
timeEnd = 318042624 timeStart =318036796 time consumption = 5
timeEnd = 318052469 timeStart = 318046719 time consumption = 5
timeEnd = 318062412 timeStart =318056525 time consumption = 5
Destroy is OK *****
root@android:/test #
注意时间单位是微妙,最后取舍时间单位为毫秒
本人测试的时间要比参考资料中(2)时间要小30%~ 40%(而单核CPU计算能力应该是不如对方的),不知道对方是否开启 –O3优化。
192
timeconsumption= 14
timeconsumption= 10
timeconsumption= 10
timeconsumption= 10
timeconsumption= 10
timeconsumption= 10
timeconsumption= 10
timeconsumption= 13
timeconsumption= 10
timeconsumption= 13
128
timeconsumption= 7
timeconsumption= 3
timeconsumption= 3
timeconsumption= 4
timeconsumption= 3
timeconsumption= 4
timeconsumption= 4
timeconsumption= 3
timeconsumption= 4
timeconsumption= 4
64
imeStart = 0
timeconsumption= 0
timeconsumption= 0
timeconsumption= 0
timeconsumption= 0
timeconsumption= 0
timeconsumption= 0
timeconsumption= 0
timeconsumption= 0
timeconsumption= 0
0.6到0.8毫秒之间
资料参考:
(1).http://fftw.org/
(2).http://he-kai.com/2014/01/16/编译且移植fftw3到android手机上1/
(3).http://he-kai.com/2014/01/16/编译且移植fftw3到android手机上2/