首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实测值在对数轴上的功率谱

实测值在对数轴上的功率谱
EN

Stack Overflow用户
提问于 2014-02-04 02:59:13
回答 1查看 6.9K关注 0票数 2

我已经读过许多关于这个主题的讨论(lomb与fft的比较绘制蟒蛇的功率谱Scipy/Numpy FFT频率分析和其他许多),但仍然无法处理,所以我需要一些提示。我有一个光子事件的列表(探测与时间),数据是可用的这里。列是timecountserrors,和计数在不同的能带(你可以忽略它们)。我知道来源有一个周期围绕8.9 days = 1.3*10^-6 Hz。我想绘制功率谱密度,显示在这个频率的峰值(在一个对数x轴上,可能)。如果我能避免一半的情节(对称的),那也是很好的。到目前为止,这是我的代码,但还是有些东西:

代码语言:javascript
复制
import numpy as np
from scipy.fftpack import fft, rfft, fftfreq
import pylab as plt

x,y = np.loadtxt('datafile.txt', usecols = (0,1), unpack=True)
y = y - y.mean() # Removes the large value at the 0 frequency that we don't care about

f_range = np.linspace(10**(-7), 10**(-5), 1000)
W = fftfreq(y.size, d=x[1]-x[0])

plt.subplot(2,1,1)
plt.plot(x,y)
plt.xlabel('Time (days)')

f_signal = fft(y)
plt.subplot(2,1,2)
plt.plot(W, abs(f_signal))
plt.xlabel('Frequency (Hz)')

在这里,(无用的)情节产生:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-04 08:04:57

下面是上面代码的一个改进版本:

代码语言:javascript
复制
import pyfits
import numpy as np
from scipy.fftpack import fft, rfft, fftfreq
import pylab as plt

x,y = np.loadtxt('data.txt', usecols = (0,1), unpack=True)
y = y - y.mean()

W = fftfreq(y.size, d=(x[1]-x[0])*86400)
plt.subplot(2,1,1)
plt.plot(x,y)
plt.xlabel('Time (days)')

f_signal = fft(y)
plt.subplot(2,1,2)
plt.plot(W, abs(f_signal)**2)
plt.xlabel('Frequency (Hz)')

plt.xscale('log')
plt.xlim(10**(-6), 10**(-5))
plt.show()

在这里,情节产生(正确):

最高的峰值是我试图复制的山峰。第二次高峰也是预期的,但电力不足(确实如此)。如果使用rfft而不是fft (和rfftfreq代替fftfreq),则复制相同的图(在这种情况下,频率值(而不是模块)可以使用numpy.fft.rfft)。

我不想阻止这个话题,所以我会在这里问:我怎样才能检索到峰值的频率?如果把频率画在峰旁就很好了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21542194

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档