FFTW使用指南

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 
#include 

如果没有包含上述头文件,则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);

你可能感兴趣的:(FFTW使用指南)