配置过程参考了http://www.tuicool.com/articles/JbmINj,但是按照该篇博客,在我的机子上并没有成功。
下面叙述我的配置过程,仅供参考!
[1]下载FFTW库
http://www.fftw.org/install/windows.html官方下载地址。
我电脑装的是win7 64位系统。
下载后,解压如图。
[2]使用Lib.exe生成相应的Lib文件
这一步注意路径是C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\lib.exe.
不注意路径可能出现下述错误。
在cmd将路径设置到amd64\路径下,将libfftw3-3.def,libfftw3l-3.def,libfftw3f-3.def拷贝到该路径下,执行Lib命令,
64位版本:
lib /machine:x64 /def:libfftw3f-3.def
lib /machine:x64 /def:libfftw3-3.def
lib /machine:x64 /def:libfftw3l-3.def
生成库文件libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib。注意:如果在cmd中输入命令后出现下图的错误,
请重新以管理员身份打开cmd,重复上面的配置命令,即可解决该问题.
[3]将生成的库文件libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib放入vc中的lib文件夹,可惜这么做没有成功,程序编译没有通过,试着将这些3个静态库放在了lib/amd64/路径下,编译通过了。
把fftw3.h放入vc中的include文件夹,放置dll文件时,这里需要注意64bit系统,依旧放在windows/system32文件中,我是这么做的,因为我在vs2010中按照正常的步骤创建了Win32控制台应用程序,试了一次,放在SysWOW64,程序编译通过了,但是程序在运行时提示缺少动态库。
[4]新建工程应用:
头文件:#include”fftw3.h“,
设置参数:”项目“==>"项目属性"==>"配置属性"==>"链接器"==>"输入"==>"附加依赖项",将以下三项添加进去:
libfftw3-3.lib
libfftw3f-3.lib
libfftw3l-3.lib
[5]程序运行,测例如下:
https://github.com/undees/fftw-example/blob/master/fftw_example.c
经过修改,8点fft,其结果和matlab fft结果验证一致,这里输出的是幅值,实部和虚部的模。
/* Start reading here */ #include "fftw3.h" #define NUM_POINTS 8 /* Never mind this bit */ #include <stdio.h> #include <math.h> #define REAL 0 #define IMAG 1 //#define M_PI 3.14159265358979323846 void acquire_from_somewhere(fftw_complex* signal) { /* Generate two sine waves of different frequencies and * amplitudes. */ int i; for (i = 0; i < NUM_POINTS; ++i) { // double theta = (double)i / (double)NUM_POINTS * M_PI; /*signal[i][REAL] = 1.0 * cos(10.0 * theta) + 0.5 * cos(25.0 * theta); signal[i][IMAG] = 1.0 * sin(10.0 * theta) + 0.5 * sin(25.0 * theta);*/ signal[i][REAL] = (double)i; printf("start:[%d]=%f\n",i,signal[i][REAL]); signal[i][IMAG] = (double)0.0; } } void do_something_with(fftw_complex* result) { int i; for (i = 0; i < NUM_POINTS; ++i) { double mag = sqrt(result[i][REAL] * result[i][REAL] + result[i][IMAG] * result[i][IMAG]); printf("%g\n", mag); } } /* Resume reading here */ int main() { fftw_complex signal[NUM_POINTS]; fftw_complex result[NUM_POINTS]; fftw_plan plan = fftw_plan_dft_1d(NUM_POINTS, signal, result, FFTW_FORWARD, FFTW_ESTIMATE); acquire_from_somewhere(signal); fftw_execute(plan); do_something_with(result); fftw_destroy_plan(plan); return 0; }