gpt4 book ai didi

c++ - 有没有关于如何使用英特尔 MKL FFT 的简单 C++ 示例?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:21:11 25 4
gpt4 key购买 nike

我需要执行 FFT 和逆 FFT 转换。输入将是 double vector 和矩阵。理想情况下,输出应该是一个 std::complex 数组,但我可以接受 double _Complex。

我还没有找到任何简单的例子,所有的英特尔例子都在没有足够的注释的情况下同时做很多事情。

我只想要一个 C++ 中的简单示例,将 double 的 vector (或矩阵)作为输入并输出 FFT 转换后的结果(最好使用 std::complex)。

最佳答案

我最终测试了几件事,最终得到了这三个函数,它们可以执行我想要的操作并且我考虑了简单的示例。

我针对一些输入对其进行了测试,并获得了良好的结果。我还没有做过广泛的测试。

//Note after each operation status should be 0 on success 

std::vector<std::complex<float>> fft_complex(std::vector<std::complex<float>>& in){
std::vector<std::complex<float>> out(in.size());

DFTI_DESCRIPTOR_HANDLE descriptor;
MKL_LONG status;

status = DftiCreateDescriptor(&descriptor, DFTI_SINGLE, DFTI_COMPLEX, 1, in.size()); //Specify size and precision
status = DftiSetValue(descriptor, DFTI_PLACEMENT, DFTI_NOT_INPLACE); //Out of place FFT
status = DftiCommitDescriptor(descriptor); //Finalize the descriptor
status = DftiComputeForward(descriptor, in.data(), out.data()); //Compute the Forward FFT
status = DftiFreeDescriptor(&descriptor); //Free the descriptor

return out;
}

std::vector<std::complex<float>> fft_real(std::vector<float>& in_real){
std::vector<std::complex<float>> in(in_real.size());

std::copy(in_real.begin(), in_real.end(), in.begin());

return fft_complex(in);
}

std::vector<float> ifft(std::vector<std::complex<float>>& in){
std::vector<std::complex<float>> out(in.size());

DFTI_DESCRIPTOR_HANDLE descriptor;
MKL_LONG status;

status = DftiCreateDescriptor(&descriptor, DFTI_SINGLE, DFTI_COMPLEX, 1, in.size()); //Specify size and precision
status = DftiSetValue(descriptor, DFTI_PLACEMENT, DFTI_NOT_INPLACE); //Out of place FFT
status = DftiSetValue(descriptor, DFTI_BACKWARD_SCALE, 1.0f / in.size()); //Scale down the output
status = DftiCommitDescriptor(descriptor); //Finalize the descriptor
status = DftiComputeBackward(descriptor, in.data(), out.data()); //Compute the Forward FFT
status = DftiFreeDescriptor(&descriptor); //Free the descriptor

std::vector<float> output(out.size());

for(std::size_t i = 0; i < out.size(); ++i){
output[i] = out[i].real();
}

return output;
}

关于c++ - 有没有关于如何使用英特尔 MKL FFT 的简单 C++ 示例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29805767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com