arm交叉编译FFTW3以及简单使用

交叉编译FFTW3

下载地址

官网下载地址:(http://www.fftw.org)

编译环境

ubuntu 18.04 + aarch64-none-linux-gnu-gcc

编译过程

  1. 先将下载好的tar.gz文件解压

  2. 进入解压后的目录,在编译前确认你的交叉编译链已生效。

  3. 执行命令:./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:指定交叉编译器的绝对路径,这里需要替换为自己的

  4. 然后 make

  5. make install
    编译好之后进入目录中的lib下,cd /opt/fftw3/lib 应该是这样
    /opt/fftw3/lib
    要是还不放心可以用file命令查看一下.so文件的类型是否为ARM

  6. 将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这个库,首先认识几组常用的函数

  1. 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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值