Python 负功率谱

Python 负功率谱,python,fft,spectrum,Python,Fft,Spectrum,我得到了一组65年来780个月的温度异常,我想对它进行分析,找出导致异常的频率。我使用了spectrum软件包来实现这一点,我在分析之前和之后加入了该系列的图片 from spectrum import * p = Periodogram(anomalies, sampling=1/12) p.run() plt.title('Power Spectrum of Monthly Temperature Anomalies') p.plot(marker='.') plt.show() 由此产

我得到了一组65年来780个月的温度异常,我想对它进行分析,找出导致异常的频率。我使用了spectrum软件包来实现这一点,我在分析之前和之后加入了该系列的图片

from spectrum import *

p = Periodogram(anomalies, sampling=1/12)
p.run()
plt.title('Power Spectrum of Monthly Temperature Anomalies')
p.plot(marker='.')
plt.show()
由此产生的光谱有几个明显的负尖峰。现在我明白了,Db中的负值实际上并不是一个负的绝对值,但为什么会发生这种情况呢?这是否意味着我的数据中缺少某些特定的频率?因为一个正的尖峰意味着一个存在

另外,为什么大多数频率显示为负值?Db放大的参考值是多少

我的一部分人认为我应该取这个光谱的绝对值,但我想知道为什么如果是这样的话。另外,我把采样值设为1/12,因为数据点是每月的,所以希望频率标度是每年的

非常感谢,这是我在这里的第一篇帖子,所以如果我需要更清楚地了解任何事情,请告诉我

负能量

正在分析的系列


如图所示,y轴上的单位为dB(分贝,)。所以我们看到的不是原始数据(在频域中),而是类似于10*log10(数据)。这解释了负值的存在,这是完全正常的

这里有正值和负值,但通常情况下,您将标准化数据(按最大值),以便所有值都为负值,最高值设置为0。这可以通过以下方式实现:

p.plot(norm=True)
您可以绘制原始数据(不使用log函数),但需要使用原始数据(在频域中)。例如,要再现p.plot函数的行为,可以使用:

from pylab import plot
plot(p.frequencies(), 10*log10(p.psd/p.psd.max())
因此,如果您不想使用分贝单位,请使用:

from pylab import plot
plot(p.frequencies(), p.psd)
免责声明:我是Spectrum()的主要作者