Am Ende habe ich mehrere Dinge getestet, und schließlich habe ich mit diesen drei Funktionen, die tun, was ich will und die ich für einfache Beispiele hielt, Schluss gemacht.
Ich habe es gegen einige Eingaben getestet und ich hatte die guten Ergebnisse. Ich habe jedoch keine umfangreichen Tests durchgeführt.
//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;
}
Ich gehe davon würden Sie beziehen sich auf [diese Beispiele] (https://software.intel.com/en-us/node/471390), vielleicht genauer gesagt die „C-Schnittstelle“ sind. Wenn dies der Fall ist, lesen Sie unbedingt den zugehörigen Link [Fourier Transform Functions] (https://software.intel.com/en-us/node/470818#8EB0A29C-06D8-4C97-ACD0-C8A320501A6A) oben. – SleuthEye
@SleuthEye Ja, ich bezog mich auf sie. Ich persönlich finde diese aufgeblähten Beispiele nicht nützlich, aber es ist wahrscheinlich genug für andere. Ich würde gerne einfachere Beispiele finden. Es scheint, ich werde wahrscheinlich mit ihnen zu tun haben. –
Ich fuhr fort, die offiziellen Beispiele zu überprüfen, aber einige von ihnen nicht einmal kompilieren ... Es ist kein wirklich guter Weg, mit ... zu beginnen –