主要步骤来自官方文档,本人做了一下小结。。。
FFT的五个步骤:
1、创建描述符: DftiCreateDescriptor or DftiCreateDescriptorDM
用来设置维度,尺寸,变换的数量,输入/输出数据的存储器布局以及缩放因子。 许多设置被分配了默认值,您可能需要在应用程序中对其进行修改。
status = DftiCreateDescriptor( desc_handle, precision, forward_domain, dimension, length )
desc_handle:FFT描述符
Precision:转换精度,DFTI_SINGLE或DFTI_DOUBLE。
forward_domain:(转换域)DFTI_COMPLEX或DFTI_REAL。
Dimension:变换的维数
length :如果Dimension=1,则是一维变换的变换长度。 不然则是多维变换 的每个维度的长度。
2、设置参数: DftiSetValue or DftiSetValueDM (请小心设置)。通常使用 DftiGetValue
or DftiGetValueDM来获得默认设置的参数
status = DftiSetValue( desc_handle, config_param, config_val )
3、确认描述符: DftiCommitDescriptor or DftiCommitDescriptorDM 使描述符为计算做好准备。一旦描述被确认,之前所设置的参数将不可修改!!
status = DftiCommitDescriptor( desc_handle )
4、开始计算:
DftiComputeForward/DftiComputeBackward or DftiComputeForwardDM/DftiComputeBackwardDM (可根据需要多次调用)。因为描述符是单独定义和提交的,所以计算函数所做的就是获取输入和输出数据并按照定义计算变换。要修改另一个调用计算函数的配置参数,请使用
DftiSetValue 后跟DftiCommitDescriptor (DftiSetValueDM 后跟DftiCommitDescriptorDM),或者创建并提交另一个描述符。
status = DftiComputeForward( desc_handle, x_inout )
status = DftiComputeForward( desc_handle, x_in, y_out )
status = DftiComputeForward( desc_handle, xre_inout, xim_inout )
status = DftiComputeForward( desc_handle, xre_in, xim_in, yre_out, yim_out )
5、释放描述符: DftiFreeDescriptor or DftiFreeDescriptorDM这将描述符内部使用的内存返回给操作系统。(释放内存)
status = DftiFreeDescriptor( desc_handle )
以上所有函数操作成功时,返回0。您可以借助DftiErrorClass或DftiErrorMessage函数来解释非零状态。
官方例程:
/* C99 example */
#include "mkl_dfti.h"
float _Complex x_in[32], x_out[32];
DFTI_DESCRIPTOR_HANDLE my_desc_handle;
MKL_LONG status;
//...put input data into x_in[j], 0 <= j < 32
status = DftiCreateDescriptor( &my_desc_handle, DFTI_SINGLE,DFTI_COMPLEX, 1, 32);
status = DftiSetValue( my_desc_handle, DFTI_PLACEMENT, DFTI_NOT_INPLACE);
status = DftiCommitDescriptor( my_desc_handle);
status = DftiComputeForward( my_desc_handle, x_in, x_out);
status = DftiFreeDescriptor(&my_desc_handle);
/* result is x_out[0], x_out[1], ..., x_out[31] */