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.
aaahhh ray ist ray. Gut gemacht! –
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 ... –
@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