Я пытаюсь научиться использовать 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;
}
Итак, что такое решение? Разве это не возможно? Всегда ли мне приходится иметь дело с не имеющими места преобразованиями типа реального к сложному и выделять память отдельно для сложного вывода?