C++ 有没有简单的C++;有关如何使用“英特尔MKL FFT”的示例?

C++ 有没有简单的C++;有关如何使用“英特尔MKL FFT”的示例?,c++,fft,intel-mkl,dft,C++,Fft,Intel Mkl,Dft,我需要执行FFT和FFT逆变换。输入将是向量和双精度矩阵。理想情况下,输出应该是std::complex数组,但我可以使用double\u complex 我还没有找到任何简单的例子,所有英特尔的例子都是在没有足够的注释的情况下同时做很多事情 < >我只想在C++中用一个向量(或者一个矩阵)作为输入,输出FFT变换结果(最好是用STD::复合体)。p> 我最后测试了几件事,最终得到了这三个函数,它们可以实现我想要的功能,我考虑了一些简单的例子 我对一些输入进行了测试,结果很好。我还没有做过广泛的

我需要执行FFT和FFT逆变换。输入将是向量和双精度矩阵。理想情况下,输出应该是std::complex数组,但我可以使用double\u complex

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


< >我只想在C++中用一个向量(或者一个矩阵)作为输入,输出FFT变换结果(最好是用STD::复合体)。p> 我最后测试了几件事,最终得到了这三个函数,它们可以实现我想要的功能,我考虑了一些简单的例子

我对一些输入进行了测试,结果很好。我还没有做过广泛的测试

//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;
}
//注意:每次操作成功后,状态应为0
std::vector fft_复数(std::vector&in){
std::vector out(in.size());
DFTI_描述符_句柄描述符;
MKL_LONG状态;
status=DftiCreateDescriptor(&descriptor,DFTI_SINGLE,DFTI_COMPLEX,1,in.size());//指定大小和精度
状态=DftiSetValue(描述符,DFTI_放置,DFTI_不在位置);//不在位置FFT
status=DftiCommitDescriptor(描述符);//完成描述符
status=DftiComputeForward(描述符,in.data(),out.data());//计算前向FFT
status=DftiFreeDescriptor(&descriptor);//释放描述符
返回;
}
标准::矢量fft_实数(标准::矢量和实数){
std::vector in(in_real.size());
std::copy(in_real.begin()、in_real.end()、in.begin());
返回fft_复数(in);
}
标准::向量ifft(标准::向量和输入){
std::vector out(in.size());
DFTI_描述符_句柄描述符;
MKL_LONG状态;
status=DftiCreateDescriptor(&descriptor,DFTI_SINGLE,DFTI_COMPLEX,1,in.size());//指定大小和精度
状态=DftiSetValue(描述符,DFTI_放置,DFTI_不在位置);//不在位置FFT
status=DftiSetValue(描述符,DFTI_BACKWARD_SCALE,1.0f/in.size());//缩小输出
status=DftiCommitDescriptor(描述符);//完成描述符
status=DftiComputeBackward(描述符,in.data(),out.data());//计算前向FFT
status=DftiFreeDescriptor(&descriptor);//释放描述符
向量输出(out.size());
对于(std::size_t i=0;i
我假设您指的是“C接口”,也许更具体地说是“C接口”。如果是这样的话,请务必阅读顶部附带的链接。@SleuthEye是的,我指的是他们。我个人并不认为这些臃肿的例子有用,但对其他人来说可能已经足够了。我想找一些更简单的例子。我继续检查官方的例子,但有些甚至没有编译。。。这不是一个真正好的开始。。。