Octave / Matlab与Scipy中的周期图

发布于 2021-01-29 15:58:29

我正在使用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 /八度代码:http :
//pastebin.com/czNeyUjs具有实际数据的简单Python +
scipy代码:http
://pastebin.com/zPLGBTpn

关注者
0
被浏览
51
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    研究八度音阶和scipy的周期图源代码后,我发现它们使用不同的算法来计算功率谱密度估计。八度(和MATLAB)使用FFT,而scipy的周期图使用Welch方法

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

    感谢所有对此感兴趣的人。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看