我使用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
答案 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)
你看结果了吗?
两个结果之间的细微差别可能来自优化/默认窗口/实现/等等。