2016-05-12 18 views
5

Ich habe einen Vektor mit komplexen Zahlen (kann here gefunden werden), sowohl in Python als auch in MATLAB. Ich Berechnung der ifft -transformation mitFFT in numpy vs FFT in MATLAB haben nicht die gleichen Ergebnisse

ifft(<vector>) 

in MATLAB und mit

np.fft.ifft(<vector>) 

in Python. Mein Problem ist, dass ich zwei völlig unterschiedliche Ergebnisse daraus erhalte, d. H. Während der Vektor in Python komplex ist, ist es nicht in MATLAB. Während einige Komponenten in MATLAB gleich Null sind, gibt es in Python keine. Warum das? Die fft -Version funktioniert wie vorgesehen. Die Minimalwerte liegen bei ungefähr 1e-10, d.h. nicht zu niedrig.

Antwort

7

Eigentlich sind sie gleich, aber Python zeigt den Imaginärteil mit extrem hoher Präzision. Die imaginären Komponenten werden mit Werten in der Größenordnung von 10^{-12} dargestellt.

Hier ist, was ich geschrieben habe Ihr Problem in MATLAB zu rekonstruieren:

format long g; 
data = importdata('data.txt'); 
out = ifft(data); 

format long g; ist eine Formatierungsoption, die Ihnen mehr Stellen zeigt, wo wir zeigen 15 signifikante Stellen einschließlich Dezimalstellen.

Als ich die ersten 10 Elemente der inversen FFT-Ausgabe zeigen, ist das, was ich bekommen:

>> out(1:10) 

ans = 

     -6.08077329443768 
     -5.90538963023573 
     -5.72145198564976 
     -5.53037208039314 
     -5.33360059559345 
     -5.13261402212083 
     -4.92890104744583 
     -4.72394865937531 
     -4.51922820694745 
     -4.31618153490126 

Für numpy, darauf hingewiesen, dass komplexe Zahlen werden mit dem j Brief lesen, nicht i. Wenn Sie also Ihren Text laden, müssen Sie alle i Zeichen in j umwandeln. Sobald Sie das tun, können Sie in den Daten als normal laden:

In [15]: import numpy as np 

In [16]: with open('data.txt', 'r') as f: 
    ....:  lines = map(lambda x: x.replace('i', 'j'), f) 
    ....:  data = np.loadtxt(lines, dtype=np.complex) 

Wenn Sie die Datei öffnen, würde der Aufruf von map somit den Inhalt der Datei nehmen und verwandeln jeden i Charakter in j und eine Rückkehr Liste der Zeichenfolgen, wobei jedes Element in dieser Liste eine komplexe Zahl in Ihrer Textdatei ist, wobei i durch j ersetzt wird. Wir würden dann numpy.loadtxt Funktion aufrufen, um diese Strings in ein Array komplexer Zahlen zu konvertieren.

Nun, wenn ich die IFFT nehmen und die ersten 10 Elemente des inversed Ergebnis anzeigen, wie wir mit der MATLAB-Version gesehen haben, erhalten wir:

In [20]: out = np.fft.ifft(data) 

In [21]: out[:10] 
Out[21]: 
array([-6.08077329 +0.00000000e+00j, -5.90538963 +8.25472974e-12j, 
     -5.72145199 +3.56159535e-12j, -5.53037208 -1.21875843e-11j, 
     -5.33360060 +1.77529105e-11j, -5.13261402 -1.58326676e-11j, 
     -4.92890105 -6.13731196e-12j, -4.72394866 +5.46673985e-12j, 
     -4.51922821 -2.59774424e-11j, -4.31618154 -1.77484689e-11j]) 

Wie Sie der Realteil die gleiche sehen kann, ist aber die Imaginärteil existiert noch. Beachten Sie jedoch, wie klein die imaginären Komponenten sind. MATLAB wählte in diesem Fall, die imaginären Komponenten nicht anzuzeigen, da ihre Größen sehr klein sind. Tatsächlich ist der Datentyp, der vom ifft-Aufruf in MATLAB zurückgegeben wird, echt, so dass wahrscheinlich eine Nachbearbeitung erfolgte, nachdem ifft aufgerufen wurde, diese imaginären Komponenten zu verwerfen. numpy macht übrigens nicht dasselbe, aber Sie können diese Komponenten auch als sehr klein und unbedeutend betrachten.


Alles in allem beide ifft Anrufe in Python und MATLAB sind im Wesentlichen die gleichen, aber die imaginären Komponenten sind unterschiedlich in dem Sinne, dass Python/numpy kehrt jene imaginären Komponenten, auch wenn sie unbedeutend sind, wo als ifft Anruf in MATLAB nicht. Beachten Sie außerdem, dass Sie sicherstellen müssen, dass die imaginäre Variable durch j ersetzt wird und Sie i nicht wie in der Originaltextdatei verwenden können, die Sie bereitgestellt haben. Wenn Sie für bestimmte wissen, dass der Ausgabetyp real sein sollte, können Sie auch die imaginären Komponenten löschen, indem Sie einen Anruf an numpy.real auf dem ifft Ergebnis geben, wenn Sie dies wünschen.

+1

aaahhh ray ist ray. Gut gemacht! –

+0

Hmm, das ist jetzt seltsam, weil die Daten der ifft-Funktionen bei der Ausführung in meinem Code völlig anders aussehen. Ich muss tiefer gehen ... –

+0

@arc_lupus Wie genau haben Sie die Daten in Python geladen? Sie müssen eine kleine Menge an Arbeit machen, um es zu bekommen, so dass die Daten, die in ein komplexes "numpy" Array eingelesen werden, erfolgreich sind, wenn Sie Ihre Daten verwenden ... im Grunde was ich oben getan habe, indem ich alle 'i' in' j' umwandelte. – rayryeng