Skip to main content

FFTW3.3.2在VS2010下搭建方法

BigBookAbout 3 minBlogFFTW 3.3.2VS2010Visual Studio 2010C/C++

〇、前言

我需要使用一个快速傅里叶变换的编程库。在网上参考了一些方案,各个阶段的问题均有解,可惜不完整,零星散落。 现在整理如下。

约定:

路径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 - Windowsopen in new window下载最新的已编译好的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.

Last update:
Contributors: Xuling Chang