Windows下基于CMake的FFTW库配置和使用

最近工程需要找一个比较高效的快速傅里叶变换代码,很多人都推荐使用FFTW库,于是便下载之,经过调试已经可以使用。由于该库分为32bit和64bit版本,开始使用时由于一个失误,结果导致一直没有编译成功。这里记录下主要的使用步骤。开发环境:Win7-X64+CMake2.8.6+ VS2008SP1。

1、下载FFTW动态库文件。
链接为http://www.fftw.org/install/windows.html#fftw2,该库是一个跨平台的动态库,由于我们是在Windows下使用,因此只需要下载windows版本即可。该版本又可以分为32bit和64bit版本,使用过程基本类似。这里以64bit版本的使用为例进行说明。下载fftw-3.3.2-dll64.rar,解压后主要文件有:
fftw3.h
libfftw3-3.def
libfftw3f-3.def
libfftw3l-3.def
libfftw3-3.dll
libfftw3f-3.dll
libfftw3l-3.dll
这是我们需要的文件,其他可以不用管。

2、生成引导库文件(.lib)。在调用动态库编译工程时,需要引导库lib文件,可以通过lib.exe(VS环境中已经附带该工具无需下载)将.def文件生成相应的lib文件。打开程序->Microsoft Visual Studio 2008->Visual StudioTools->Visual Studio x64 Win64 Command Prompt命令行工具,分别键入命令:
lib /machine:x64 /def:libfftw3-3.def
lib /machine:x64 /def:libfftw3l-3.def
lib /machine:x64 /def:libfftw3f-3.def

执行完毕后,即可生成3个lib文件:libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib。由于是编译64位版本,在命令行中添加/machine:x64,在开始时由于漏掉了该参数,导致编译一直失败,这里应特别注意。如果是32bit版本的话,则不需要该参数。

3、
利用CMake配置工程。首先建立一个源码目录source,这里存放代码文件。在source目录下建立一个子目录FFT,用于存放FFTW的库文件。将第二步骤完成的FFTW库文件(fftw3.h libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib)拷贝至该目录下。在source目录下,建一个工程文件FFTWTest.cpp(可以暂时先不写代码)和CMakeLists.txt文件。 CMake利用CMakeLists.txt文件对工程进行配置,这里给出CMakeLists.txt主要内容。
Project ( FFTWTest )
cmake_minimum_required ( VERSION 2.6 )   
include_directories(${PROJECT_SOURCE_DIR}/FFT/)   
link_directories(${PROJECT_SOURCE_DIR}/FFT/)     
add_executable ( FFTWTest  FFTWTest.cpp )   

target_link_libraries( FFTWTest libfftw3-3 libfftw3f-3 libfftw3l-3

完成后保存文件,在source目录同级目录下,建立bin-X64目录用于存储工程文件。打开CMake,选择source为源文件目录,bin-X64为编译目标地址,配置完成后生成相应的工程。
4、编写工程文件代码,调用FFTW库完成快速傅里叶变换。在bin-X64目录下,打开生成的工程文件FFTWTest.sln,然后打开FFTWTest.cpp文件,添加代码如下:  

#include "fftw3.h" int main() { fftw_complex *in, *out; fftw_plan p; int N= 8; 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++) { in[i][0] = 1.0; in[i][1] = 0.0; printf("%6.2f ",in[i][0]); } printf("\n"); p=fftw_plan_dft_1d(N,in,out, FFTW_FORWARD, FFTW_ESTIMATE); fftw_execute(p); /* repeat as needed*/ for(int j = 0;j < N;j++) { printf("%6.2f ",out[j][0]); } printf("\n"); fftw_destroy_plan(p); fftw_free(in); fftw_free(out); return 0; }

完成后,编译无错后,即可运行。
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值