C++ 英特尔MKL就地实到实转换不可能?
我试图学习如何使用英特尔的数学内核库(MKL)计算周期性真实数据的就地FFT。这里有一些非就地实-实转换的例子,我对就地实-实转换应该起什么作用的猜测没有再现正确的结果C++ 英特尔MKL就地实到实转换不可能?,c++,fft,intel-mkl,C++,Fft,Intel Mkl,我试图学习如何使用英特尔的数学内核库(MKL)计算周期性真实数据的就地FFT。这里有一些非就地实-实转换的例子,我对就地实-实转换应该起什么作用的猜测没有再现正确的结果 #include <cstdio> #include <cmath> #include <mkl.h> #define TwoPI 6.2831853071795864769 /* define a periodic function */ void initialize(float* d
#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, fft_size);
DftiSetValue(handle, 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;
}
#包括
#包括
#包括
#定义TwoPI 6.2831853071795864769
/*定义一个周期函数*/
无效初始化(浮点*数据、浮点*副本、常量长大小)
{
常数双k=TwoPI/cbrt(尺寸);
对于(int i=0;i
那么,解决方案是什么?不可能吗?我是否总是必须处理非就地实数到复数的变换,并为复数输出分别分配内存?我相信FFT在标准实现中是到位的。这是复杂的(双方)。实向量的FFT总是复杂的。输入只有输出的1/2个数字(所有虚部都设置为零)这一事实得到了补偿,因为输出的1/2数据与另一半完全对称(没有新信息)。@roadrunner66。必须分配两倍于基本内存的内存,这是对资源的浪费。那么,你是否确认我所寻求的在MKL中是不可能的?