2013-06-16 7 views
8

ich einig MATLAB-Code ist Portierung mit scipy Python und wurde mit der folgenden Zeile fest:Periodogram in Octave/Matlab vs Scipy

Matlab/Octave Code

[Pxx, f] = periodogram(x, [], 512, 5) 

Python-Code

f, Pxx = signal.periodogram(x, 5, nfft=512) 

Das Problem ist, dass ich unterschiedliche Ausgabe auf den gleichen Daten bekomme. Genauer gesagt sind Pxx-Vektoren unterschiedlich. Ich habe versucht verschiedene Fenster für signal.periodogram, aber kein Glück (und es scheint, dass default scypy boxcar Fenster ist das gleiche wie standard matlab rechteckigen Fenster) Ein anderes seltsames Verhalten ist, dass in Python, erstes Element von Pxx ist immer 0, egal welche Daten Eingabe ist.

Fehle ich etwas? Jeder Rat würde sehr geschätzt werden!


Einfache Matlab/Octave Code mit aktuellen Daten: http://pastebin.com/czNeyUjs
Einfachen Python + scipy Code mit aktuellen Daten: http://pastebin.com/zPLGBTpn

+0

Eine Handlung wäre sehr hilfreich. –

Antwort

5

Nach der Erforschung Oktave und periodogram Quellcode scipy Ich fand, dass sie anderen Algorithmus zur Berechnung verwenden Leistungsspektraldichte Schätzung. Oktave (und MATLAB) use FFT, während scipy's Periodogramm die Welch method verwenden.

Wie @georgesl schon erwähnt hat, sieht die Ausgabe sehr ähnlich aus, aber es unterscheidet sich dennoch. Und aus Gründen der Portierung war es kritisch. Am Ende schrieb ich einfach eine kleine Funktion zur Berechnung der PSD-Schätzung unter Verwendung von FFT, und jetzt ist die Ausgabe gleich. Laut timeit Tests, es funktioniert ~ 50% schneller (1.9006s vs 2.9176s auf einer Schleife mit 10.000 Iterationen). Ich denke, es liegt daran, dass die FFT in scipys Implementierung schneller ist als Welch, einfach schneller zu sein.

Vielen Dank an alle, die Interesse gezeigt haben.

0

Sehen Sie die Ergebnisse an?

Outputs

Die geringen Unterschiede zwischen den beiden Ergebnisse können von Optimierungen kommt/Standard-Windows/Implementierungen/was auch immer usw.

1

ich das gleiche Problem konfrontiert, aber dann stieß ich auf die Dokumentation von scipy's periodogram

Wie Sie es, dass detrend sehen würde = ‚constant‘ ist das Standardargument. Dies bedeutet, dass Python automatisch den Mittelwert der Eingabedaten von jedem Punkt subtrahiert. (Read here). Während Matlab/Octave nichts dergleichen tun. Ich glaube, das ist der Grund, warum die Outputs unterschiedlich sind. Versuchen Sie, detrend = False anzugeben, während Sie scipys Periodogramm aufrufen, sollten Sie dieselbe Ausgabe wie Matlab erhalten.

2

Nach dem Lesen der Matlab und Scipy Dokumentation könnte ein weiterer Beitrag zu den verschiedenen Werten sein, dass sie verschiedene Standardfensterfunktion verwenden. Matlab verwendet ein Hamming-Fenster und Scipy verwendet ein Hanning. Die beiden Fensterfunktionen und ähnlich, aber nicht identisch.