Intel MKL на месте преобразования реальных в реальные не возможно? - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь научиться использовать Math Kernel Library (MKL) от Intel для вычисления на месте БПФ периодических c реальных данных. Существуют примеры нереальных преобразований реального типа в сложное, и мое предположение о том, что должно работать для преобразования реальных в действительное место, не дает правильных результатов.

#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;
}

Итак, что такое решение? Разве это не возможно? Всегда ли мне приходится иметь дело с не имеющими места преобразованиями типа реального к сложному и выделять память отдельно для сложного вывода?

...