(六)CMake与FFTW

一、FFTW是什么?

FFTW(The Fastest Fourier Transform in the West )是一个用于计算离散傅里叶变换的软件库,由麻省理工学院的Mattteo Frigo和Steven G.Johnson开发的。FFTW的名字意思是西方最快的傅里叶变换。它可以在O(nlogn)时间内计算任意大小和维数的实数和复数值数组的变换。[1]

二、如何配置?

我的配置方法是:在Ubuntu系统下,使用CMake工具,在VSCODE中完成程序编写和测试。

2.1 下载和解压

官网-下载-解压
FFTW官网地址: 点击这里。在系统中解压:
1

2.2 用CMake编译和安装FFTW源程序

进入解压后的目录,使用命令cmake .后,设置合适的权限并安装:sudo make install,这句话的意思就是编译,并且将头文件和编译后动态库等配置文件放在指定的目录里,其中就包含我们本次使用cmake配置相当重要的*.cmake文件。没有意外的话,你应该能够看到以下打印,它详细地展示了FFTW如何存放在我们的计算机中。
2
这里可以FFTW配置所需要:

  • 动态库路径位于:/usr/local/lib
  • 头文件放在:/usr/local/include
  • *.cmake文件(用于CMake自动化配置)在:/usr/local/lib/cmake/fftw3/
2.3 VSCODE进行配置

配置之前,需要查看一下FFTW3Config.cmake:

# defined since 2.8.3
if (CMAKE_VERSION VERSION_LESS 2.8.3)
  get_filename_component (CMAKE_CURRENT_LIST_DIR ${CMAKE_CURRENT_LIST_FILE} PATH)
endif ()

# Allows loading FFTW3 settings from another project
set (FFTW3_CONFIG_FILE "${CMAKE_CURRENT_LIST_FILE}")

set (FFTW3_LIBRARIES fftw3)
set (FFTW3_LIBRARY_DIRS /usr/local/lib)
set (FFTW3_INCLUDE_DIRS /usr/local/include)

include ("${CMAKE_CURRENT_LIST_DIR}/FFTW3LibraryDepends.cmake")

if (CMAKE_VERSION VERSION_LESS 2.8.3)
  set (CMAKE_CURRENT_LIST_DIR)
endif ()

前面几节我们已经知道,set命令用于设置变量名。这里就用到了FFTW就用了三个变量:FFTW3_LIBRARIES FFTW3_LIBRARY_DIRSFFTW3_INCLUDE_DIRS。使用find_package方法就可以完成配置了。

cmake_minimum_required(VERSION 3.16.3)
find_package(FFTW3)
add_executable(Demo main.cpp)
if(FFTW3_FOUND)
    include_directories(${FFTW3_INCLUDE_DIRS})
    link_directories(${FFTW3_LIBRARY_DIRS})
    target_link_libraries(Demo fftw3)
    #link_libraries(libfftw3.so)
else(FFTW3_FOUND)
    message(FATAL_ERROR "FFTW3 library not found")
endif(FFTW3_FOUND)


编译过程中提示一个warning

CMake Warning (dev) in CMakeLists.txt:
  No project() command is present.  The top-level CMakeLists.txt file must
  contain a literal, direct call to the project() command.  Add a line of
  code such as
  
    project(ProjectName)

加上就没有任何问题了。

project(Demo)
cmake_minimum_required(VERSION 3.16.3)
find_package(FFTW3)
add_executable(Demo main.cpp)
if(FFTW3_FOUND)
    include_directories(${FFTW3_INCLUDE_DIRS})
    link_directories(${FFTW3_LIBRARY_DIRS})
    target_link_libraries(Demo fftw3)
    #link_libraries(libfftw3.so)
else(FFTW3_FOUND)
    message(FATAL_ERROR "FFTW3 library not found")
endif(FFTW3_FOUND)

2.4 编写程序并测试

#include <iostream>
#include <cmath>
#include <complex>
#include <fstream>
#include <fftw3.h>

using namespace std;
const int N=100;

typedef double arr[2];

int main()
{
    ofstream of1("/home/junwu/Desktop/FFTWTest/in.txt");
    ofstream of2("/home/junwu/Desktop/FFTWTest/out.txt");

    of1.precision(6);
    of2.precision(6);

    fftw_complex *in, *out;
    fftw_plan p;
    
    in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
    out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);

    
    for(int i=0;i<N;i++)
    {
        //of1<<sin(i)+sin(10*i)+sin(100*i)<<","<<0.0<<endl;
        in[i][0]=sin(i)+sin(10*i)+sin(100*i);
        in[i][1]=0;

    }

    p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);

    fftw_execute(p); /* repeat as needed */

    for(int i=0;i<N;i++)
    {
        of1<<in[i][0]<<","<<in[i][1]<<endl;

        of2<<out[i][0]<<","<<out[i][1]<<endl;
    }
    fftw_destroy_plan(p);
    fftw_free(in); fftw_free(out);
}

小结:如果一个三方库有良好定义的cmake,调用过程就相当简单。只需要根据*.CMake文件内容链接头文件、库即可。

MESSAGE(消息类型 "xxxxxxx ");
可以是FATAL_ERROR,或者缺省,仅打印。

[1] https://en.wikipedia.org/wiki/FFTW

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值