在没有root权限linux下安装FFTW3.3.9
author: Tao Sun
date: 7 May 2022.
1.环境准备
1.1 确保g++可用
本次编译是基于 GNU C++ 环境的,因此务必确定g++编译器可用,使用如下命令验证:
命令:g++ --version
出现类似如下输出则表明编译器可用:
1.2 下载FFTW3.3.9 源码包
到FFTW官网(http://www.fftw.org/download.html)下载压缩文件,FFTW最新最稳定版本是FFTW 3.3.10,可以之间下载下图中的fftw-3.3.10.tar.gz压缩文件。若要下载之前版本,点击下图browse可以下载之前版本。
这里以FFTW 3.3.9为例,下载下图中fftw-3.3.9.tar.gz压缩文件。
下载之后上传到集群对应用户对应目录下。
1.3 解压FFTW3.3.9 源码包
终端进入到fftw-3.3.9.tar.gz压缩文件存放目录,直接使用Centos 下的解压缩命令即可:
命令:tar -xvf fftw-3.3.9.tar.gz
解压后终端进入fftw-3.3.9文件夹,
命令: cd fftw-3.3.9
2.编译安装
安装可以简单的通过以下命令安装:
命令:
./configure
make
make install
这样安装在执行make install时通常需要root权限,要想不适应root权限可以通过使用configure中–prefix参数指定一个不同的安装目录,具体命令如下:
命令:
./configure --prefix=path --enable-threads
其中
- path为 ’/home/uesr/’ ,是指定软件的安装路径(绝对路径),下面用到的path都为此路径;
- ’–enable-threads’是’–enable-threads=yes’的缩写,选择一个线程库,在Installing GCC: Configuration - GNU Project中有详细介绍,此选项可以更改库 ABI。)
make
make install
注:如果在配置或编译过程中遇到问题,您可能需要在重试之前运行“make distclean”;确保没有以前编译尝试留下的任何陈旧文件。
3.运行测试
3.1 使用make check
3.2 使用自己准备的例子
将自己准备的cpp文件命名为fft_demo.cpp,通过以下命令编译成可执行文件。
命令:
g++ fft_demo.cpp -o fftw_test.exe -lfftw3 -Lpath+/lib -Ipath+/include
-L和-I后为我们指定软件的安装路径的lib文件夹和include文件夹
会生成fftw_test.exe可执行程序
通过命令(./fftw_test.exe)执行测试例子
附录:
/*
* fft_demo.cpp
*/
#include<fftw3.h>
#include<stdio.h>
int main()
{
int N = 8;
fftw_complex *out = NULL, *in = NULL ,*in2;
fftw_plan p,p1;
in = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
out = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
in2 = (fftw_complex*)fftw_malloc(sizeof(fftw_complex) * N);
printf("original signal: ");
for(int i = 0;i<N;i++)
{
in[i][0] = 2*i - 1;
in[i][1] = 0;
printf("%f ",in[i][0]);
}
p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD,FFTW_ESTIMATE);
fftw_execute(p);
printf("\nbefore fourier: ");
for(int i =0;i<N;i++)
{
printf("%.2f +j %.3f ",out[i][0],out[i][1]);
}
p1 = fftw_plan_dft_1d(N,out,in2,FFTW_BACKWARD,FFTW_ESTIMATE);
fftw_execute(p1);
printf("\nbefore ifourier: ");
for(int i = 0;i<N;i++)
{
in2[i][0] = in2[i][0] / N ;
printf("%.2f ",in2[i][0]);
}
printf("\n");
fftw_destroy_plan(p);
fftw_free(in);
fftw_free(out);
fftw_free(in2);
return 0;
}