Python 倍频程周期图/Matlab与Scipy
我正在使用scipy将一些matlab代码移植到python中,并被以下代码所困扰: Matlab/倍频程代码Python 倍频程周期图/Matlab与Scipy,python,matlab,scipy,octave,Python,Matlab,Scipy,Octave,我正在使用scipy将一些matlab代码移植到python中,并被以下代码所困扰: Matlab/倍频程代码 [Pxx,f]=周期图(x,[],512,5) Python代码 f,Pxx=信号周期图(x,5,nfft=512) 问题是我在相同的数据上得到不同的输出。更具体地说,Pxx向量是不同的。我为signal.periogram尝试了不同的窗口,但没有成功(而且似乎默认的scypy的boxcar窗口与默认的matlab的矩形窗口相同)。另一个奇怪的行为是,在python中,无论输入什么
[Pxx,f]=周期图(x,[],512,5)
Python代码
f,Pxx=信号周期图(x,5,nfft=512)
问题是我在相同的数据上得到不同的输出。更具体地说,Pxx向量是不同的。我为signal.periogram尝试了不同的窗口,但没有成功(而且似乎默认的scypy的boxcar窗口与默认的matlab的矩形窗口相同)。另一个奇怪的行为是,在python中,无论输入什么数据,Pxx的第一个元素总是0
我错过什么了吗?任何建议都将不胜感激
带有实际数据的简单Matlab/倍频程代码:
带有实际数据的简单Python+scipy代码:您看到结果了吗
这两个结果之间的细微差异可能来自优化/默认窗口/实现/任何其他方面。在研究octave和scipy的周期图源代码后,我发现他们使用不同的算法来计算功率谱密度估计。倍频程(和MATLAB),而scipy的周期图使用 正如@geogesl所提到的,输出看起来非常相似,但仍然不同。出于移植的原因,这是至关重要的。最后,我简单地编写了一个小函数,使用
FFT
计算PSD估计,现在输出是相同的。根据timeit
测试,它的工作速度快了约50%(1.9006s比2.9176s在一个循环中有10.000次迭代)。我认为这是因为在scipy的实现中FFT比Welch更快,也就是更快
感谢所有表现出兴趣的人。我遇到了同样的问题,但后来我看到了
如您所见,detrend='constant'是默认参数。这意味着python会自动从每个点减去输入数据的平均值。(). 而Matlab/Octave没有做这样的事情。我认为这就是产出不同的原因。尝试指定detrend=False,在调用scipy的周期图时,应获得与Matlab相同的输出。阅读Matlab和scipy文档后,不同值的另一个原因可能是它们使用不同的默认窗口函数。Matlab使用汉明窗口,Scipy使用汉宁窗口。这两个窗口函数相似但不完全相同。绘图将非常有用。差异太大,不能归因于简单的优化/舍入错误。有些山峰甚至是相对的。