首页 > 解决方案 > 英特尔 MKL 就地实到实转换不可能?

问题描述

我正在尝试学习如何使用英特尔的数学内核库 (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;
}

那么,解决方案是什么?不可能吗?我是否总是必须处理非原位实数到复数的转换并为复数输出单独分配内存?

标签: c++fftintel-mkl

解决方案


推荐阅读