在Octave/Matlab中的周期图与Scipy的比较

2024-05-29 05:16:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用scipy将一些matlab代码移植到python中,但遇到了以下问题:

Matlab/倍频程代码

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

Python代码

^{pr2}$

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

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


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


Tags: 数据代码comhttp信号scipy向量窗户
3条回答

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

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

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

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

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

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

相关问题 更多 >

    热门问题