FFTW3.3.2在VS2010下搭建方法
〇、前言
我需要使用一个快速傅里叶变换的编程库。在网上参考了一些方案,各个阶段的问题均有解,可惜不完整,零星散落。 现在整理如下。
约定:
路径1:解压编译好的dll包,生成lib文件,的位置。
路径2:VS2010程序路径。
一、概念
1.FFTW3.3.2
FFTW ( the Faster Fourier Transform in the West) 是一个快速计算离散傅里叶变换的标准C语言程序集,其由MIT的M.Frigo 和S. Johnson 开发。可计算一维或多维实和复数据以及任意规模的DFT。FFTW 还包含对共享和分布式存储系统的并行变换,它可自动适应你的机器, 缓存,存储器大小,寄存器个数。
FFTW 通常比目前其它开源Fourier变换程序都要快,最新版本为fftw-3.2.2。
2.VS2010
Visual Studio 2010 集成开发环境。
二、搭建
1.首先到FFTW download page - Windows下载最新的已编译好的dll包。
2.cmd定向到刚下好的dll包解压后的目录(记录为路径1)中,执行以下三组命令
lib /machine:ix86 /def:libfftw3-3.def
lib /machine:ix86 /def:libfftw3f-3.def
lib /machine:ix86 /def:libfftw3l-3.def
注意最后一个命令:是3L(小写)。
执行成功后,在路径1下生成三个.lib文件。这样,路径1下就拥有了:三个.dll文件,三个.lib文件,fftw3.h。
2.1 问题一
这期间可能会遇到这个问题:lib不能执行,即,所谓命令不存在。
解决:定向至vs2010安装目录下,获取……\vc\bin路径(……代表vs2010路径,记录为路径2),然后配置环境变量,将此路径添加至系统环境变量的path中。重启cmd,直接打入lib,若出现英文提示(类似于usage),则配置成功。
2.2 问题二
有人说 路径2\vc\bin下的lib默认是不能运行的,缺少几个文件,要把 路径2 \Common7\IDE 里面的(……代表vs2010路径)mspdb80.dll,mspdbcore.dll,mspdbsrv.exe,msobj80.dll复制到上面的bin文件夹里.
我没有探究是否正确,而是直接其按照要求添加,没有问题。不确定是否一定需要。
3.启动vs2010,建立win32控制台空项目。
Alt+F7
在Configuration Property->VC++ Directories下Include Directories和Library Directories下分别加入路径1。
再在Configuration Property->linker->Input中的Addtional Dependencies中加入
libfftw3-3.lib
libfftw3f-3.lib
libfftw3l-3.lib
注意每行一个。
至此,环境搭建成功。
三、测试
在空项目的Source Files下添加代码文件,main.cpp,帖入如下代码测试
#include "fftw3.h"
#include<stdio.h>
#define N 8
int main()
{
int i;
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);
if((in==NULL)||(out==NULL))
{
printf("Error:insufficient available memory\n");
}
else
{
for(i=0; i<N; i++)/*测试数据 */
{
in[i][0] = i+1;
in[i][1] = 0;
}
}
p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD,FFTW_ESTIMATE);
fftw_execute(p); /* repeat as needed */
fftw_destroy_plan(p);
fftw_cleanup();
for(i=0;i<N;i++)/*OUTPUT*/
{
printf("%f,%fi\n",in[i][0],in[i][1]);
}
printf("\n");
for(i=0;i<N;i++)/*OUTPUT*/
{
printf("%f,%fi\n",out[i][0],out[i][1]);
}
if(in!=NULL) fftw_free(in);
if(out!=NULL) fftw_free(out);
getchar();
return 0;
}
如果执行成功,它的输出是这样的:
1.000000,0.000000i
2.000000,0.000000i
3.000000,0.000000i
4.000000,0.000000i
5.000000,0.000000i
6.000000,0.000000i
7.000000,0.000000i
8.000000,0.000000i
36.000000,0.000000i
-4.000000,9.656854i
-4.000000,4.000000i
-4.000000,1.656854i
-4.000000,0.000000i
-4.000000,-1.656854i
-4.000000,-4.000000i
-4.000000,-9.656854i
over.