Octave / Matlab与Scipy的周期图

时间:2013-06-16 06:28:18

标签: python matlab scipy octave

我使用scipy将一些matlab代码移植到python并遇到以下问题:

Matlab / Octave代码

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

Python代码

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

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

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


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

4 个答案:

答案 0 :(得分:5)

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

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

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

答案 1 :(得分:2)

我遇到了同样的问题但后来我遇到了scipy's periodogram

的文档

正如您所看到的那样,趋势='常数'是默认参数。这意味着python会自动从每个点中减去输入数据的平均值。 (Read here)。虽然Matlab / Octave没有这样的事情。我认为这就是产出不同的原因。尝试指定detrend = False,在调用scipy的周期图时,你应该得到与Matlab相同的输出。

答案 2 :(得分:2)

在阅读了Matlab和Scipy文档之后,对不同值的另一个贡献可能是它们使用不同的默认窗口函数。 Matlab使用Hamming窗口,Scipy使用Hanning。两个窗口功能相似但不相同。

答案 3 :(得分:0)

你看结果了吗?

Outputs

两个结果之间的细微差别可能来自优化/默认窗口/实现/等等。