2016-05-04 13 views
0

Ich habe immer die Funktion "fft (x)" in Matlab verwendet, wo "x" ein Vektor komplexer Zahlen ist. Ich suche nach einer einfach zu benutzenden Funktion in C++, die komplexe Zahlen zurückgeben würde. http://paulbourke.net/miscellaneous/dft/Ist diese C++ - FFT-Funktion äquivalent zur "fft" -Matlab-Funktion?

Wenn es gleichwertig ist, wie kann ich es verwenden:

ich diesen Code haben herausgefunden? Vielen Dank für Ihre Zeit !

/* 
    This computes an in-place complex-to-complex FFT 
    x and y are the real and imaginary arrays of 2^m points. 
    dir = 1 gives forward transform 
    dir = -1 gives reverse transform 
*/ 
short FFT(short int dir,long m,double *x,double *y) 
{ 
    long n,i,i1,j,k,i2,l,l1,l2; 
    double c1,c2,tx,ty,t1,t2,u1,u2,z; 

    /* Calculate the number of points */ 
    n = 1; 
    for (i=0;i<m;i++) 
     n *= 2; 

    /* Do the bit reversal */ 
    i2 = n >> 1; 
    j = 0; 
    for (i=0;i<n-1;i++) { 
     if (i < j) { 
     tx = x[i]; 
     ty = y[i]; 
     x[i] = x[j]; 
     y[i] = y[j]; 
     x[j] = tx; 
     y[j] = ty; 
     } 
     k = i2; 
     while (k <= j) { 
     j -= k; 
     k >>= 1; 
     } 
     j += k; 
    } 

    /* Compute the FFT */ 
    c1 = -1.0; 
    c2 = 0.0; 
    l2 = 1; 
    for (l=0;l<m;l++) { 
     l1 = l2; 
     l2 <<= 1; 
     u1 = 1.0; 
     u2 = 0.0; 
     for (j=0;j<l1;j++) { 
     for (i=j;i<n;i+=l2) { 
      i1 = i + l1; 
      t1 = u1 * x[i1] - u2 * y[i1]; 
      t2 = u1 * y[i1] + u2 * x[i1]; 
      x[i1] = x[i] - t1; 
      y[i1] = y[i] - t2; 
      x[i] += t1; 
      y[i] += t2; 
     } 
     z = u1 * c1 - u2 * c2; 
     u2 = u1 * c2 + u2 * c1; 
     u1 = z; 
     } 
     c2 = sqrt((1.0 - c1)/2.0); 
     if (dir == 1) 
     c2 = -c2; 
     c1 = sqrt((1.0 + c1)/2.0); 
    } 

    /* Scaling for forward transform */ 
    if (dir == 1) { 
     for (i=0;i<n;i++) { 
     x[i] /= n; 
     y[i] /= n; 
     } 
    } 

    return(TRUE); 
} 
+2

Hallo und willkommen in SO. Zwei mögliche Ansätze: Versuchen Sie, den Code zu verstehen und zu sehen, ob er ähnliche Berechnungsschritte durchführt. Zweiter Ansatz: Versuchen Sie numerische äquivalente Tests. I.e. Testdaten einspeisen und die Ausgänge vergleichen. –

+2

Wenn Sie wissen, wie man C++ Funktionen aufruft, wissen Sie bereits, wie man es benutzt. Die Kommentare an der Spitze sagen Ihnen, welche Eingaben erwartet werden. Auch für Ihre Frage nach "Äquivalent" wären sie zahlenmäßig äquivalent, aber der Prozess der Berechnung der FFT ist nicht derselbe. 'fft' verwendet FFTW, das die Radix-Dekomposition verwendet, um schnellere Laufzeiten zu erzielen. – rayryeng

+0

Ein Standard wäre die [fftw library] (http://www.fftw.org). Bei Ihren Suchen hilft es, getestete, dokumentierte und weit verbreitete Bibliotheken zu favorisieren. –

Antwort

0

Alternative Vorschlag:

Ich hatte dasselbe Problem. Ich habe die fft-Bibliothek von fftw benutzt. http://www.fftw.org/download.html Seine Leistung ist vergleichbar mit Matlab.

+0

Danke. Ich habe das gesehen, aber welchen sollte ich benutzen? Ich gebe zu, ich war ein wenig verloren, als ich all diese Dateien sah. – LaGabriella

+0

libfftw3-3, libfftw3f-3, libfftw3l-3 diese Bibliotheksdateien (.lib) Erweiterung. –

+0

Sie benötigen auch fftw3.h Header-Datei. 3 Exportdefinitionsdateien (.def), 3 Exportbibliotheksdateien (.exp); Diese Datei hat denselben Namen wie LIB-Dateien. –

0

Der Code sieht auf den ersten Blick gut aus. Die ursprüngliche FFT ist nicht viel Code.

Ein Merkmal der FFT ist, dass es sich um einen inplace Betrieb handelt. Viele höherstufige Bindungen verbergen diese Tatsache effektiv.

Sie setzen also Ihre realen und imaginären Teile in die X- und Y-Arrays. Nach dem Ausführen der Funktion lesen Sie dieselben Arrays für Ihr Ergebnis.

Diese besonders einfache Implementierung funktioniert nur mit Potenzen von 2 als die ursprüngliche FFT. Wenn Sie andere Längen als Potenzen von 2 eingegeben haben, könnten Sie Ihr Signal auf Null stellen.

Google das Buch Numerical Recipes und fft (ältere Versionen sind frei verfügbar), wenn Sie auf dem Hintergrund der FFT lesen möchten. Die Version in diesem Buch unterscheidet sich von anderen Implementierungen darin, dass Sie die Real- und Imaginärteile verschachtelt einspeisen müssen.

Was ich an der Implementierung, die Sie angeben, fehlt, ist die Verwendung von Pi oder trigonometrischen Funktionen. Sie müssen es ausprobieren, um es mit Matlab zu vergleichen.