Octave/Matlab与Scipy的周期图

mFo*_*xRU 9 python matlab octave scipy

我正在使用scipy将一些matlab代码移植到python并且遇到以下行:

Matlab/Octave代码

[Pxx, f] = periodogram(x, [], 512, 5)
Run Code Online (Sandbox Code Playgroud)

Python代码

f, Pxx = signal.periodogram(x, 5, nfft=512)
Run Code Online (Sandbox Code Playgroud)

问题是我在相同的数据上得到不同的输出.更具体地说,Pxx向量是不同的.我为signal.periodogram尝试了不同的窗口,但没有运气(似乎默认的scypy的boxcar窗口与默认的matlab的矩形窗口相同)另一个奇怪的行为是在python中,Pxx的第一个元素总是0,无论是什么数据输入是.

我错过了什么吗?任何建议将不胜感激!


简单的Matlab/Octave代码与实际数据:http:
//pastebin.com/czNeyUjs简单的Python + scipy代码与实际数据:http://pastebin.com/zPLGBTpn

mFo*_*xRU 5

在研究octave和scipy的周期图源代码后,我发现他们使用不同的算法来计算功率谱密度估计.Octave(和MATLAB)使用FFT,而scipy的周期图使用Welch方法.

正如@georgesl所提到的,输出看起来非常相似,但它仍然不同.而且为了移植原因它至关重要.最后,我简单地写了一个小函数来计算PSD估计值FFT,现在输出是一样的.根据timeit测试,它的工作速度提高了约50%(1.9006s vs 2.9176s,循环次数为10.000次).我认为这是因为在scipy的实现中,FFT比Welch快,只是速度更快.

感谢所有表现出兴趣的人.