编程语言
首页 > 编程语言> > python – 计算功率谱

python – 计算功率谱

作者:互联网

我想用Python3计算功率谱.从另一个关于这个主题的主题我得到了基本的成分.我认为应该是这样的:

ps = np.abs(np.fft.fft(x))**2
timeres = t[1]-t[0]
freqs = np.fft.fftfreq(x.size, timeres)
idx = np.argsort(freqs)
plt.plot(freqs[idx], ps[idx])
plt.show()

这里t是时间,x是光子数.我也尝试过:

W = fftfreq(x.size, timeres=t[1]-t[0])
f_x = rfft(x)
plt.plot(W,f_x)
plt.show()

但两者大多只是给我一个零左右的峰值(尽管它们不一样).我试图从这个计算功率谱:

data

哪个应该给我一个大约580Hz的信号.我在这做错了什么?

解决方法:

@kwinkunks的答案中有一些我觉得遗漏的东西:

>你提到看到一个大的零峰值.正如我在上面的评论中所说,如果您的输入信号具有非零均值,则可以预期这种情况.如果你想摆脱DC component那么你应该在采取DFT之前去掉你的信号,例如减去平均值.
>在进行DFT之前,应始终对信号应用window function以避免spectral leakage的问题.
>虽然采用DFT的模数平方可以粗略估计频谱密度,但这对信号中的任何噪声都非常敏感.针对噪声数据的更稳健的方法是计算信号的多个较小段的周期图,然后对这些段进行平均.这在频域中交换了一些分辨率以提高鲁棒性. Welch’s method使用这个原则.

就个人而言,我会使用scipy.signal.welch,它解决了我上面提到的所有问题:

from scipy.signal import welch

f, psd = welch(x,
               fs=1./(t[1]-t[0]),  # sample rate
               window='hanning',   # apply a Hanning window before taking the DFT
               nperseg=256,        # compute periodograms of 256-long segments of x
               detrend='constant') # detrend x by subtracting the mean

标签:python,numpy,fft,signal-processing,spectral-density
来源: https://codeday.me/bug/20191008/1874033.html