linux 和 Windows下FFTW库的安装
我整理了FFTW在windows和linux下安装的过程,我自己也在这两个系统中安装成功了,还是遇到不少问题的,我接下来把网上搜到的资料和自己遇到的问题一一告诉大家,让大家少走弯路。
windows 下安装:
转载于:http://www.cnblogs.com/zyx2007/archive/2012/02/28/2371780.html
参考这篇文章,然后在我的VS 2012上面安装成功了。。
1. 从网站http://www.fftw.org上下载最新的预编译文件:
32-bit version: fftw-3.2.2.pl1-dll32.zip (1.8MB)
64-bit version: fftw-3.2.2-dll64.zip (2.2MB)
2.安装lib.exe
其实这是VC自带的工具,在VC6.0和VS05中都有的,我机器上安装了VS2012, 则lib.exe的路径如下:
D:\soft setup\Visual studio 2012\VC\bin (VS2012的目录)
(不需要使用CMD 直接用鼠标点击)进入目录D:\soft setup\Visual studio 2012\VC\bin
把D:\soft setup\Visual studio 2012\Common7\IDE 里面的mspdb80.dll,mspdbcore.dll,mspdbsrv.exe,msobj80.dll 复制到上面的D:\soft setup\Visual studio 2012\VC\bin文件夹里,把你下载的fftw中的文件libfftw3-3.def,libfftw3f-3.def,libfftw3l-3.def也拷到bin下面。
然后输入lib.exe(即运行),会有如下提示:
这时候你的lib命令就可以使用了。
3.在cmd进入上面提到的bin目录,并运行
lib /machine:i386 /def:libfftw3-3.def
lib /machine:i386 /def:libfftw3f-3.def
lib /machine:i386 /def:libfftw3l-3.def
4.将libfftw3f-3.dll libfftw3-3.dll libfftw3l-3.dll放入windows/system32中,然后将生成的库文件libfftw3-3.lib libfftw3f-3.lib libfftw3l-3.lib放入vc中的lib文件夹,把fftw3.h放入include文件夹。
5.在你新建工程的时候,记得#include”fftw3.h“,然后设置参数:”项目“==>"项目属性"==>"配置属性"==>"链接器"==>"输入"==>"附加依赖项",将以下三项添加进去:
libfftw3-3.lib
libfftw3f-3.lib
libfftw3l-3.lib
6.完成。
7. 如果出现找不到那些dll,计算机无法运行的话,就有可能是你的系统是64位,你只要把上面四个dll文件再复制一份放到SysWoW64文件夹里面就好了。
8.如果不想VS2012那些讨厌的预编译头文件的话,直接在项目属性/ 的c/c++中预编译头中的第一个选择:预编译头,选择不使用编译头就OK了。
9.那些讨厌 stdafx.h等都可以删掉了。
10. 如果遇到第三步骤通不过,不能找到lib文件的错误,则可以试图找其它方式编译出来三个lib文件,然后继续步骤三以下的步骤,同样可以实现安装,有时候,换个笔记本电脑就可以得到lib。比如我的笔记本就可以编译出来,而师兄的就不行。
11.下面是从别的博客上找到的一个测试代码:
#include "fftw3.h"
int main()
{fftw_complex *in, *out;
fftw_plan p;
int N= 8;
int i;
int j;
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
for( 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(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;
}
结果如下:
linux下安装:
文章来自于:http://blog.csdn.net/wbgxx333/article/details/36625977
但是在安装中遇到了几个问题
1. 要在root权限下安装,不然/usr/bin下安装不通过
2.安装后搜不到fftw3.h头文件,其实安装在这个路径下面
/usr/local/fftw
所以你的编译命令这样写就可以通过:
或者makefile 写成这样:
INCLUDESLIB = -lfftw3
INCLUDESH = -I/usr/local/fftw/include
LIBS = -L/usr/local/fftw/lib
main: test_fftw.o
g++ -o test_fftw test_fftw.cpp $(INCLUDESH) $(INCLUDESLIB) $(LIBS)
test_fftw.o:
g++ -c test_fftw.cpp $(INCLUDESH)
clean:
rm -f *.o
.PHONY:clean
也是可以成功的。
最后附上文章:
FFTW(the Fastest Fourier Transform in the West)库是由MIT(Massachusetts Institute of Technology)的Matteo Frigo和Steven G. Johnson开发的,用于一维和多维实数或复数的离散傅里叶变换。
1. 下载 fftw-2_1_3_tar.gz (www.fftw.org, or www.rpmfind.net )
2. tar zxvf fftw-2_1_3_tar.gz 展开压缩文件
3. 在Linux中安装FFTW:
a. ./configure --enable-type-prefix --prefix=/usr/local/fftw --with-gcc --disable-fortran --enable-i386-hacks
其中,--enable-type-prefix 参数是为了同时使用single precision(单精度)和double precision(双精度),如果不使用它,最后只有以rfftw开头的文件被安装(real fftw);
--prefix= 参数是设定安装目录;
--with-gcc 使用gcc编译器;
--disable-fortran 参数为了不包含Fortran调用的机制;
--enable-i386-hacks 为Pentium和x86以后的CPU优化gcc的编译速度。
b.make 编译
c.make install 安装,这一次安装完后,在安装目录中存在以dfftw和drfftw开头文件,但没有sfftw开头的文件
d.make clean 还需要安装一次,先清除
e../configure --enable-float --enable-type-prefix --prefix=/usr/local/fftw --with-gcc --disable-fortran --enable-i386-hacks
其中,--enable-float 为了生成单精度计算的头文件和库文件,即以sfftw开头的文件。
f.make 重新编译
g.make install 再一次安装,安装完后,目录中便会同时存在sfftw和dfftw开头的文件(用于复数函数/complex function的FFT变换)和srfftw与drfftw开头的文件(用于实数函数的FFT变换)
例如,如果需要用到双精度的实数FFT变换/FFTs,那么在编译的链接命令中需要按如下顺序加入
-ldrfftw -ldfftw参数
下面的是如何使用的一个例子
#include <complex> #include <fftw3.h> #include <math.h> #include <iostream> #define N 10 using namespace std; int main(int argc, char * argv[]){ fftw_complex in[N], out[N]; fftw_plan p; p=fftw_plan_dft_1d(N,in,out,FFTW_FORWARD,FFTW_MEASURE); for(int i=0;i <N;i ++) { in[i][0]=i; in[i][1]=0.0; } fftw_execute(p); for(int i=0;i <N;i ++){ cout<<out[i][0]<<" "<<out[i][1]<<endl; } complex<double> temp = 0.0; for(int k =0; k < N; k ++){ double pi = 4*atan(1.0); temp += exp(complex<double>(0.0,-2.0*pi*3*k/N))*complex<double>(in[k][0],in[k][1]); } cout<<"out[3] is "<<temp<<endl; fftw_complex out1[N]; fftw_plan p1; p1=fftw_plan_dft_1d(N,out1,in,FFTW_BACKWARD,FFTW_MEASURE); for(int i=0;i <N;i ++){ out1[i][0]=out[i][0]; out1[i][1]=out[i][1]; } fftw_execute(p1); for(int i=0;i <N;i ++){ cout<<in[i][0]<<" "<<in[i][1]<<endl; } fftw_destroy_plan(p); fftw_destroy_plan(p1); return 1; }结果是:
更多推荐
所有评论(0)