Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 英特尔MKL就地实到实转换不可能?_C++_Fft_Intel Mkl - Fatal编程技术网

C++ 英特尔MKL就地实到实转换不可能?

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

我试图学习如何使用英特尔的数学内核库(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, 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中是不可能的?