我正在使用 scipy 将一些 matlab 代码移植到 python 中,但遇到了以下行:
Matlab/倍频程代码
[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
在研究了 Octave 和 scipy 的周期图源代码后,我发现它们使用不同的算法来计算功率谱密度估计。 Octave(和 MATLAB)use FFT,而 scipy 的周期图使用韦尔奇方法.
正如@georgesl 所提到的,输出看起来非常相似,但仍然有所不同。出于移植原因,这一点至关重要。最后,我简单地编写了一个小函数来计算 PSD 估计,使用FFT
,现在输出是相同的。根据timeit
经过测试,它的工作速度快了约 50%(在 10.000 次迭代的循环中,速度为 1.9006 秒 vs 2.9176 秒)。我认为这是因为 FFT 在 scipy 的实现中比 Welch 更快,只是更快。
感谢所有表现出兴趣的人。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)