c++ - 英特尔 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;
}
那么,解决方案是什么?不可能吗?我是否总是必须处理非原位实数到复数的转换并为复数输出单独分配内存?
解决方案
推荐阅读
- python - 如果数据框中的行以关键字开头,则将其与上面的行连接
- python - 以函数为值的枚举
- spring-boot - Spring Security 中的身份验证管理器构建器
- angular - @nrwl/workspace:run-commands:尝试通过自定义目标运行 node_module 脚本时权限被拒绝
- html - 通过提供带有查询参数的凭据来访问“Hetzner Storage Box”中的文件
- node.js - 如何处理模块导出函数返回值
- javascript - 我想知道哪些用户在线,哪些不是实时的
- jestjs - 在 Jest 中进行测试时,如何将依赖项替换为其模拟版本?
- javascript - 如何让按钮执行 HTTP POST 请求并触发 HTML 元素?
- excel - Excel VBA - 无法取消隐藏工作表