2015-04-22 13 views
5

Ich muss FFT und Inverse-FFT Transformationen durchführen. Die Eingabe wäre Vektor und Doppelmatrizen. Idealerweise sollte die Ausgabe ein Array von std :: complex sein, aber ich kann mit doppeltem _Complex leben.Gibt es ein einfaches C++ - Beispiel zur Verwendung von Intel MKL FFT?

Ich habe kein einfaches Beispiel gefunden, alle Intel-Beispiele machen eine Menge Dinge auf einmal ohne genügend Kommentare.

Ich möchte nur ein einfaches Beispiel in C++, das einen Vektor (oder eine Matrix) von double als Eingabe nimmt und das FFT-transformierte Ergebnis ausgibt (idealerweise mit std :: complex).

+0

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

+0

@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. –

+0

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 –

Antwort

5

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; 
} 
Verwandte Themen