FFTW使用指南
编译说明
- 引入fftw3.h头文件
- 在Unix系统中需要加上"-lfftw3 -lm"编译选项。
- 需要连接fftw3库文件。
复数的一维傅里叶变换
- 首先创建fftw_plan
fftw_plan fftw_plan_dft_1d(int n, fftw_complex *in,
fftw_complex *out, int sign,
unsigned flags);
参数说明:n为需要进行傅里叶变换的数据个数,in指向输入数据,out指向输出数据,sign(+1:逆傅里叶变换,-1:正傅里叶变换),flags只有两个值,FFTW_MEASURE:FFTW库花费一定的时间帮你设计最优计算时间的fftw_plan,如果程序对时间的消耗不是很敏感,可以设置次选项;FFTW_ESTIMATE:FFTW不进行任何的测试,直接创建fftw_plan,这个plan可能不是最优的,但是局部最优的。
NOTE:fftw_plan一次创建可以重复使用。
- fftw_plan创建完毕后进行傅里叶变换
void fftw_execute(const fftw_plan plan)
- 傅里叶变换后需要回收内存
fftw_malloc()
fftw_free()
不能使用
free()
delete()
NOTE: FFTW的傅里叶变换未进行归一化,对一组数据进行傅里叶变换后,再对其进行逆变换前需要将数据除以n进行归一化。
- 对fftw_complex的支持
需要在头文件中包含
#include <complex.h>
#include <fftw3.h>
如果没有包含上述头文件,则FFTW将采用默认支持的复数类型。
- 使用双精度进行计算
FFTW通过编译选项与前缀控制单双精度。
单精度 前缀 "-fftwf" 编译选项 "-lfftw3f"
双精度 前缀 "-fftwl" 编译选项 "-lfftw3l"
复数的多维离散傅里叶变换
- 创建fftw_plan
二维DFT变换:
fftw_plan fftw_plan_dft_2d(int n0, int n1, fftw_complex *in,
fftw_complex *out, int sign, unsigned flags);
表示对n0*n1的矩阵进行DFT,先对每一行进行DFT,然后对每一列进行DFT,这就是所谓的二维DFT。
三维维DFT变换:
fftw_plan fftw_plan_dft_3d(int n0, int n1, fftw_complex *in,
fftw_complex *out, int sign, unsigned flags);