FFT mit C++ ?



  • Die Referenz ist wohl FFTW. Je nachdem, was du vor hast, könnte dich die Lizenz einschränken.


  • Mod

    Oder Intel Math Kernel Library. Oder AMD Core Math Library. Oder oder oder. Jede Numerikbibliothek bringt doch FFT mit. Und die sind alle zig mal schneller als was du bei deinem ersten Versuch hinbekommen wirst. Und so lange du dich auf standardkonformes C++ beschränkst, ist es auch aussichtslos, sich mit diesen Bibliotheken messen zu wollen, die oft low-level Optimierungen exakt auf die jeweilige Architektur zugeschnitten haben.



  • Also nochmal die Frage - ist eine FFT mit C++ in Echtzeit möglich? oder sollte ich für diese Art Berechnung auf (in meinem Fall) den MATLab-Clone "SciLab" zurückgreifen?



  • TiHm schrieb:

    Also nochmal die Frage - ist eine FFT mit C++ in Echtzeit möglich? oder sollte ich für diese Art Berechnung auf (in meinem Fall) den MATLab-Clone "SciLab" zurückgreifen?

    Wenn eine Echtzeitanalyse in Scilab möglich ist, dann ist sie auch in C++ möglich.



  • TiHm schrieb:

    Also nochmal die Frage - ist eine FFT mit C++ in Echtzeit möglich? oder sollte ich für diese Art Berechnung auf (in meinem Fall) den MATLab-Clone "SciLab" zurückgreifen?

    In was ist bitte schön SciLab programmiert? In Magic? O.o Meine Erfahrung ist, dass MatLAB langsam ist. SciLab dürfte da nicht besser sein.



  • TiHm schrieb:

    Also nochmal die Frage - ist eine FFT mit C++ in Echtzeit möglich?



  • Ja weiß ich und der Begriff ist dehnbar 😉

    Ich habe mich für erste Versuche für FFTW entschieden und versuche nun als "C++-Noob" eine FFT von eingelesene Messdaten zu machen.. brauch aber ein paar Ansätze

    Hier der Code

    #include <fftw3.h>
    
    int fft()
    {
    fftw_complex *in;	// Input-Array erstellen
    fftw_complex *out;	// Output-Array erstellen
    int N;
    
    // Zuweisen von In-/Output-Arrays
    in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);			
    out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
    
    // Erstellen eines "Entwurfs" - Objekt, welches alle notwendigen Daten für die FFT-Berechnung enthält
    fftw_plan fftw_plan_dft_1d(int n, fftw_complex *in, fftw_complex *out,int sign, unsigned flags);
    //p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
    
    // Erstellter Entwurf kann ausgeführt werden (Transformationen der In-/Output-Arrays)
    void fftw_execute(const fftw_plan plan);	
    
    // Zuweisung des Entwurfs beenden
    void fftw_destroy_plan(fftw_plan plan);
    
    fftw_free(in); fftw_free(out);
    }
    

    Wenn ich fft als Funktion nutze, wie bekomme ich meine Messdaten in den Input?
    Und wie kann ich mir sie dann nach der FFT ausgeben lassen?

    Vielen Dank für die Hilfe

    LG TiHm



  • lagalopex schrieb:

    TiHm schrieb:

    Also nochmal die Frage - ist eine FFT mit C++ in Echtzeit möglich?

    TiHm schrieb:

    Ja weiß ich und der Begriff ist dehnbar 😉

    Das war eine Feststellung, keine Frage. Und du hast es erneut bestätigt.

    Echtzeit heißt nur, dass ein richtiges Ergebnis nach einer vorher festgelegten Zeit vorliegt. Wenn diese Zeit 1 Jahr ist, ist es immernoch Echtzeit.

    Das was du wahrscheinlich meinst, ist dass die Daten mindestens so schnell verarbeitet werden, wie sie anfallen. Dazu müsste man aber wissen wie schnell die Daten anfallen.
    Außerdem: Was für Hardware? Welches Echtzeitbetriebssystem? (Geht auch ohne, aber dann ist es maximal noch weiche Echtzeit, sollte aber wahrscheinlich für dein Problem reichen.) 😉



  • erstmal nicht so wichtig mit Echtzeit - ich will einfach nur ne FFT von meinen Messdaten machen - Hilfe bitte 🙂


  • Mod

    Da du anscheinend nicht einmal die Syntax kennst, wie man Funktionen aufruft oder die einfachsten Techniken beim Benutzen von Variablen beachtest, sehe ich da im Moment schwarz. Der Code sieht aus, als hättest du heute oder gestern das erste Mal C++ gesehen und danach einfach ein paar Zeilen aus der Anleitung von FFTW zusammen kopiert. Liege ich mit dieser Vermutung nahe an der Wahrheit? Solange du eine Sprache nicht richtig sprichst, kannst du auch keine Bibliotheken für diese Sprache benutzen. Das ist einfach so. Insbesondere bei FFTW ist dies noch einmal verschärft, da es eine C-Bibliothek ist, die du in C++ benutzen willst, so dass du sowohl C als auch C++ sprechen können musst.

    Das wäre ja auch nicht weiter schlimm, jeder hat mal angefangen (wenn auch ein wenig dreist, dass du anscheinend erwartest, dass jemand anderes für dich alle Arbeit macht). Aber egal wie hilfsbereit jemand ist, dir kann man so lange nicht helfen, so lange du nicht wenigstens halbwegs in der Lage bist, die Antworten zu verstehen. Und das scheint im Moment nicht der Fall zu sein. In ein paar Wochen vielleicht, wenn du fleißig lernst.



  • Und Crossposten ist auch die gaaanz feine Art ...



  • @TiHm
    Wie gut sind deine Kenntnisse bezüglich der FFT? Und was willst du damit machen?

    Denn die FFT ist etwas was ich nicht ohne Hintergrundwissen anpacken würde.

    Beispiel:
    Berechne mal von Hand die FFT von f(t) = sin(2*pi*10*t). Taste hierzu die Funktion äquidistant und mit Hilfe des Abtastheorems ab. Wie sieht das Spektrum aus? Wie sieht das Spektrum bei Überabtastung bzw. Unterabtastung aus?

    Nun möchten wir im Frequenzbereich alle Frequenzen >= 5Hz herausfiltern und multipilzieren deswegen den Frequenzbereich mit einer abgetasteten Rechteckfunktion. Wie sieht das Ergebnis aus?

    Programme wie Scilab, Octave sind da eine große Hilfe!


Anmelden zum Antworten