10

我正在使用 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

4

4 回答 4

5

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

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

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

于 2013-06-26T01:15:36.147 回答
3

我遇到了同样的问题,但后来我遇到了scipy 周期图的文档

如您所见, detrend='constant' 是默认参数。这意味着python会自动从每个点中减去输入数据的平均值。(在这里阅读)。而 Matlab/Octave 不做这样的事情。我相信这就是输出不同的原因。尝试指定 detrend=False,在调用 scipy 的周期图时,您应该得到与 Matlab 相同的输出。

于 2015-07-01T10:06:28.367 回答
2

阅读 Matlab 和 Scipy 文档后,对不同值的另一个贡献可能是它们使用不同的默认窗口函数。Matlab 使用汉明窗,Scipy 使用汉宁窗。这两个窗口函数和相似但不完全相同。

于 2016-09-01T20:24:54.217 回答
0

你看结果了吗?

输出

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

于 2013-06-21T13:55:00.857 回答