nan bei fftw



  • hallo zusammen!

    möchte mit fftw eine r2r transformation durchführen (Als Eingang der FFT ist ein Sinus!). hab mir mal die doku dazu angesehen. hab mir folgenden code zusammenkopiert

    double *in, *out;
    double outPut[sinus_values_count];
    
    fftw_plan p;
    fftw_r2r_kind kind[1];
    int N = sinus_values_count;
    
    in = static_cast<double*>(fftw_malloc( sizeof( double) * N));
    
    	std::memcpy( sinus_values, in, sizeof(double) * N);
    
    out = (double*) fftw_malloc(sizeof(double) * N);
    p = fftw_plan_r2r_1d(N,in, out, *kind, FFTW_FORWARD);
    
    	fftw_execute(p);
    	double test = (*out);
    	qDebug() << (*(out+1)); // calls the message Handler
    
    	fftw_destroy_plan(p);
    	fftw_free( in);
    	fftw_free(out);
    
    }
    

    Das Programm lässts sich compilieren. die Variable: "double test" hat laut debugger folgenden Wert: "-nan(0xff7f7fff7f7f7)"



  • bitte irgendwer!!!

    hat noch nie wer diese funktion verwendet?

    möchte einfach nur, Spannungswerte einer FFT unterziehen und anschließend nach Frequenzen filtern

    bin für jeden Rat dankbar!



  • Du verwendest memcpy falsch. Sollte so aussehen std::memcpy(in, sinus_values, sizeof(double) * N);



  • vielen dank



  • funktioniert wunderbar.

    kann mir nun mit gnuplot das Ergebnis der FFT ansehen.
    wirklich sehr schön.

    möchte jetzt aus dem Spektrum, dass die FFT ausspuckt wieder auf mein Ausgangssignal zurückrechnen. spricht inverseFFT.

    Ich finde nur leider keien solche Funtktion. ich muss wohl blind sein ;).

    danke im voraus



  • ich vermute mal mit den funktionen r2c und c2r.

    nur wenn ich jetzt r2c durchführe, wie kann ich dann das ergebis in eine datei schreiben?

    welchen datentyp muss ich wählen für den output?

    danke im voraus



  • Datentyp? Du hast zur Zeit doubles. Die kannst du einfach binär in eine Datei packen. Kannst es aber auch Formatieren und als Text reinschreiben. Egal, so wie du es eben gerne hättest. 😕



  • vielen dank, das funktioniert mitlerweile!

    wie kann ich nun, das spektrum wieder zu meinem ausgangssingal rücktransformieren?





  • ich hab mir gedacht, ich brauche das kind objekt um die Dimension meiner FFT zu kennzeichnen. Wie müsste es den aussehen?



  • http://www.fftw.org/fftw3_doc/Real_002dto_002dReal-Transforms.html#Real_002dto_002dReal-Transforms

    kind, or kindx/kindy/kindz, or kind[rank], is the kind of r2r transform used for the corresponding dimension. The valid kind constants are described in Real-to-Real Transform Kinds. In a multi-dimensional transform, what is computed is the separable product formed by taking each transform kind along the corresponding dimension, one dimension after another.

    Ansosnten siehe Link aus letztem Post (da sind die gültigen Werte aufgeführt).



  • nagut danke, der link hat mich sehr viel weiter gebracht danke.

    ich bekomme jetzt bei der rücktransformation wieder mein aussangssignal als ausgabe, nur sind die amplituden viel größer als das eingangssignal.

    dividiere ich die Amplituden durch die die Anzahl meiner Messwerte sind die beiden Kurven genau deckungsgleich!

    kann es sein, dass die Transformation genau um die Anzahl der Messwerte verstärkt? und wenn ja, warum?



  • Du hast einen Faktor "1/N" vergessen.

    Lies mal http://www.baeckmann.de/pdf/DFT.pdf Seite 19, "Rücktransformationsgleichung".



  • danke, heißt das, dass ich den output meiner FFT immer durch die Anzahl der Messwerte dividieren muss?

    Ich frage deswegen, weil ich mit enorm vielen Messwerten zu kämpfen habe.


Log in to reply