交叉编译FFTW3
下载地址
官网下载地址:(http://www.fftw.org)
编译环境
ubuntu 18.04 + aarch64-none-linux-gnu-gcc
编译过程
-
先将下载好的tar.gz文件解压
-
进入解压后的目录,在编译前确认你的交叉编译链已生效。
-
执行命令:
./configure --prefix=/opt/fftw3 --host=arm-linux --enable-shared=yes CC=/opt/aarch64-linux-tisdk/usr/bin/aarch64-none-linux-gnu-gcc
其中:–prefix:指定编译好存放的目录
–host:指定编译的类型
–enable-shared:生成共享库
CC:指定交叉编译器的绝对路径,这里需要替换为自己的 -
然后 make
-
make install
编译好之后进入目录中的lib下,cd /opt/fftw3/lib 应该是这样
要是还不放心可以用file命令查看一下.so文件的类型是否为ARM -
将libfftw3.so.3.6.10拷进开发板的/usr/lib目录下,并赋予可执行权限。就可以使用了。
FFTW3的简单使用
首先需要包含头文件fftw3.h 以及要指定库文件的路径
我一般喜欢把库文件拷出来放在工程下面,这样指定起来比较方便,不同平台放不同的库,include里面就是fftw3.h(在刚才编译指定路径的include下)
这样我只需要在pro文件中添加库就可以
INCLUDEPATH += $$PWD/include
win32{
LIBS += $$PWD/winlib/libfftw3-3.lib \
$$PWD/winlib/libfftw3f-3.lib \
$$PWD/winlib/libfftw3l-3.lib
}
unix{
LIBS += $$PWD/linuxlib/libfftw3.so.3.6.10
}
言归正传,开始使用FFTW3这个库,首先认识几组常用的函数
fftw plan fftw plan dft 1d(int n, fftw_complex *in, fftw_complex *out, int sign,unsigned int flags)
其中 n 是数据长度
in 和out是两个fftw_complex 类型的指针,这个类型可以理解为一个复数
sign 一般用到FFTW_FORWARD(正变换)和FFTW_BACKWORD(逆变换)
flags 一般填FFTW_ESTIMATE
这个函数要求填入的in为复数类型,如果源数据不是复数,需要进行一下转换。
fftw_plan fftw_plan_dft_r2c_1d(int n, double *in, fftw_complex *out, unsigned flags);`
fftw_plan fftw_plan_dft_c2r_1d(int n, fftw_complex *in, double *out, unsigned flags);
这两个函数是可以直接传入double *类型数据的,r2c是正变换,c2r是逆变换
接下来是正式使用,如果使用1的话,需要做转换,使用2的话直接替换函数即可
fftw_complex *in = NULL;
fftw_complex *out = NULL;
fftw_plan p;
//分配内存空间
in = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * len);
out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * len);
// 创建句柄
p = fftw_plan_dft_1d(len, in, out, FFTW_FORWARD, FFTW_ESTIMATE);//正变换
//p = fftw_plan_dft_1d(len, in, out, FFTW_BACKWORD, FFTW_ESTIMATE);//逆变换
// 输入
for (int i=0; i<len; i++)
{
in[i][0] = Source[i];
in[i][1] = 0;
}
//执行
fftw_execute(p);
// 输出
for (int i=0; i<len; i++)
{
Source[i]= sqrt((out[i][0])*(out[i][0])+(out[i][1])*(out[i][1]));
}
fftw_destroy_plan(p);
fftw_free(in);
fftw_free(out);