1:当然是下载库。从网址http://www.fftw.org/install/windows.html上获得FFTW的windows dll预编译版本
2:解压缩文件,打开VS2008的命令行窗口,如下图所示。再切换到FFTW的解包目录下。
3:生成引导库文件(.lib)。在调用动态库编译工程时,需要引导库lib文件,可以通过lib.exe(VS环境中已经附带该工具无需下载)将.def文件生成相应的lib文件。
lib /machine:x64 /def:libfftw3-3.deflib /machine:x64 /def:libfftw3l-3.deflib /machine:x64 /def:libfftw3f-3.def
执行完毕后,即可生成3个lib文件:libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib。由于是编译64位版本,在命令行中添加/machine:x64。由于是编译64位版本,在命令行中添加/machine:x64,若是漏掉该参数,将导致编译失败,这里应特别注意。如果是32bit版本的话,则不需要该参数。
调整文件组成:
新建文件如下,将编译生成的lib和源文件中的dll重新整理。
bin文件中放*dll
lib文件中放*lib和*def
include文件夹中放*.h
4:设置VS2008编译器
若是此时直接用测试代码直接测试。系统提示出错!统错误提示解决办法直接将目录中原有的 libfftw3l-3.dll , libfftw3f-3.dll , libfftw3-3.dll 文 件复制到C:\Windows\System32中。这一步是为了你以后都不用在你的可执行文件所在的文件夹中查找,因为系统直接会去system32中找。
测试代码如下:
#include "fftw3.h"
#include <stdio.h>
#pragma comment(lib, "libfftw3-3.lib")
#pragma comment(lib, "libfftw3f-3.lib")
#pragma comment(lib, "libfftw3l-3.lib")
#define N 8
int main()
{
int i;
fftw_complex *din,*out;
fftw_plan p;
din = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
if((din==NULL)||(out==NULL))
{
printf("Error:insufficient available memory\n");
}
else
{
for(i=0; i<N; i++)/*测试数据*/
{
din[i][0] = i+1;
din[i][1] = 0;
}
}
p = fftw_plan_dft_1d(N, din, 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",din[i][0],din[i][1]);
}
printf("\n");
for(i=0;i<N;i++)/*OUTPUT*/
{
printf("%f,%fi\n",out[i][0],out[i][1]);
}
if(din!=NULL) fftw_free(din);
if(out!=NULL) fftw_free(out);
getchar();
return 0;
}
运行结果图:
计算N[1,2,3,4,5,6,7,8]的FFT变换。通过对比matlab的结果,可以发现结果是一致的。