Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 倍频程周期图/Matlab与Scipy_Python_Matlab_Scipy_Octave - Fatal编程技术网

Python 倍频程周期图/Matlab与Scipy

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中,无论输入什么

我正在使用scipy将一些matlab代码移植到python中,并被以下代码所困扰:

Matlab/倍频程代码

[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使用汉宁窗口。这两个窗口函数相似但不完全相同。

绘图将非常有用。差异太大,不能归因于简单的优化/舍入错误。有些山峰甚至是相对的。