我正在尝试学习如何使用英特尔的数学内核库(MKL)计算周期性真实数据的就地FFT。有一些不就地进行实数到复杂变换的示例,我对就地进行实数到实数变换应该起作用的猜测并不能再现正确的结果。
#include <cstdio>
#include <cmath>
#include <mkl.h>
#define TwoPI 6.2831853071795864769
/* define a periodic function */
void initialize(float* data,float* copy,const long size)
{
const double k = TwoPI/cbrt(size);
for (int i = 0; i < size; ++i)
{
data[i] = cos(k*i);
copy[i] = data[i];
}
}
int main()
{
const long fft_size = 1024;
const long num_fft = pow(fft_size,2);
const long size = pow(fft_size,3);
DFTI_DESCRIPTOR_HANDLE handle = nullptr;
/* configure a single-precision,real,1-dimensional FFT of desired size */
DftiCreateDescriptor(&handle,DFTI_SINGLE,DFTI_REAL,1,(MKL_LONG)fft_size);
DftiSetvalue(handle,DFTI_NUMber_OF_TRANSFORMS,num_fft);
DftiSetvalue(handle,DFTI_INPUT_DISTANCE,fft_size);
DftiSetvalue(handle,DFTI_OUTPUT_DISTANCE,DFTI_PLACEMENT,DFTI_INPLACE);
DftiCommitDescriptor(handle);
/* prepare the data */
float *data = (float*) mkl_malloc( sizeof(float)*size,32 );
float *copy = (float*) mkl_malloc( sizeof(float)*size,32 );
initialize(data,copy,size);
/* compute the forward transform */
DftiComputeForward(handle,data);
/* free resources */
DftiFreeDescriptor(&handle);
mkl_free(data);
mkl_free(copy);
return 0;
}
那么,解决方案是什么?不可能吗我是否总是需要处理就地到复杂的转换并为复杂的输出单独分配内存?