FFTW



  • Hallo,

    hat jemand von Euch schon mal die FFTW-Bibliothek genutzt?

    Ich habe das gerade probiert und die Anweisungen im Tutorial befolgt. Aber irgendwie kommt da kein brauchbares Ergebnis raus.

    Hat jemand ein Beispiel, wie man die FFTW für eine eindimensionale RealToComplex-Transformation anwendet?

    Wenn sich jemand damit auskennt, kann ich auch gern mal meinen Code posten...

    Gruß,
    Amalthea



  • Ich hab die mal benutzt. Ist zwar schon länger her, aber zeig ruhig mal einen kurzes Beispiel, vielleicht kann ich ja etwas entdecken.



  • Hallo,

    also mein Code sieht so aus:

    // Input-Array
    double *in = new double[ ( dN_max - 1 + t_ulNSamples ) ];
    
    //intitialisieren von input array
       for( unsigned long w = 0;
            w < ( dN_max - 1 + t_ulNSamples );
            ++w )
       {
          in[ w ] = 0.0;
       }
    
    //Werte an bestimmte stellen in input-array schreiben
       for( unsigned short z = 0;
           z < val_R.size();
           ++z )
       {
          if( 0.0 != val_R[z] )
          {
             unsigned short n   = static_cast< unsigned short >( round( (*itMap).m_dTau * t_dFS ) );
             in[n+1] = in[n+1] + val_R[z];
             ++itMap;
          }
       }
    
    //output-array erstellen
    fftw_complex *out = new fftw_complex[ ( dN_max - 1 + t_ulNSamples ) ];
    
    //fftw-Plan erstellen
    fftw_plan p;
    
    //real to complex
    p =  fftw_plan_dft_r2c_1d(( dN_max - 1 + t_ulNSamples ), in, out,
                                        -1 );
    //fftw ausführen
    fftw_execute(p);
    
    //.... hier erfolgt die Ausgabe der Daten
    
    //Plan zerstören
    fftw_destroy_plan(p);
    
    //Freigeben der Resourcen
    fftw_free( in );
    fftw_free( out );
    

    Stimmt das so? Wie groß muss denn das Input-Array sein? Muss das die gleiche Größe wie das Output-Array haben? Was muss ich den als vierten Parameter bei fftw_plan_dft_r2c_1d übergeben? Kann ich aus der FFTW-Dokumentation nicht wirklich herauslesen...

    Danke und Gruß,
    Amalthea



  • Also mittlerweile kommt bei der real2complex Transformation ein brauchbares Ergebnis raus.

    Kann mir jemand erklären, was der vierte Übergabeparameter für die Funktionen fftw_plan_dft_c2r_1d und fftw_plan_dft_r2c_1d bedeutet? In der Doku, find ich, ist das nicht so doll erklärt.

    Ich hab jetzt halt mal rumprobiert und bei letzterer Funktion kommt mit Übergabeparameter -1 ein gutes Ergebnis raus.
    Bei der Rücktransformation kommt ein brauchbares Ergebnis raus, wenn ich 1 verwende. Das Ergebnis ist aber genau um die Hälfte zu kurz. Sieht so aus, wie wenn es eben um die Hälfte gestaucht wurde....
    Liegt das an dem vierten Übergabeparameter? Weiß das jemand?

    Gruß,
    Amalthea.



  • Du solltest aber wissen, daß eine Real2Complex-Transformation unterschiedliche Vektorlängen hat... ich erinnere mich jetzt nicht exakt, aber meines Wissens war die Vektorlänge Real 2N für einen komplexen Eingangsvektor der Länge N.

    Also wäre "halb so lang" ja gar nicht so falsch.

    Der 4.te Parameter müßte was mit der Art und Weise zu tun haben, wie von Komplex nach Real vorgegangen wird, ich habe aber die Formeln für Umwandlungen von FFT nach DCT usw nicht mehr im Kopf.



  • Ach ja, als Testfall solltest Du immer daran denken:

    original = fft-1(fft(original))

    Wenn Du also transformierst und wieder zurücktransformierst, muß der gleiche Vektor herauskommen (abgesehen von Rundungsfehlern). Insbesondere solltest Du das mal mit einem Nullvektor und mit einem Singleton-Vektor testen, sowie mit Zufallszahlen.



  • Bei der FFTW steht in der Doku aber drin, daß keine Normierung durchgeführt würde, und man das dann selber machen müsse.



  • Muss es FFTW sein?

    Ich würd' einfach FFTReal nehmen, falls es möglich ist. Kann nicht viel, ist aber sehr einfch einzusetzen.


Anmelden zum Antworten