首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >numpy.fft.fft的功率谱

numpy.fft.fft的功率谱
EN

Stack Overflow用户
提问于 2013-11-19 23:02:41
回答 3查看 19.2K关注 0票数 9

无论我如何改变数据,我通过下面的代码绘制的图形都只是零附近的一个峰值。我的数据只是一列,它记录了某种信号的每个定时点。time_step是否是我应该根据数据中两个邻近点的间隔来定义的值?

代码语言:javascript
复制
data=np.loadtxt("timesequence",delimiter=",",usecols=(0,),unpack=True)

ps = np.abs(np.fft.fft(data))**2
time_step = 1

freqs = np.fft.fftfreq(data.size, time_step)
idx   = np.argsort(freqs)

pl.plot(freqs[idx], ps[idx])
pl.show()
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-20 01:45:20

正如其他人所暗示的那样,你的信号必须有一个很大的非零分量。0 (DC)处的峰值表示信号的平均值。这是从傅立叶变换本身导出的。这个余弦函数cos(0)*ps(0)表示信号平均值的度量。其他傅立叶变换分量是振幅不同的余弦波,它们在这些值上显示频率内容。

请注意,平稳信号不会有大的DC分量,因为它们已经是零均值信号。如果你不想要一个大的直流分量,那么你应该计算信号的平均值,并从中减去值。无论你的数据是0,...,999还是1,...,1000,甚至是1000,...,2000,你都会在0 0Hz得到一个峰值。唯一的区别是峰值的大小,因为它测量的是平均值。

代码语言:javascript
复制
data1 = arange(1000)
data2 = arange(1000)+1000
dataTransformed3 = data - mean(data)
data4 = numpy.zeros(1000)
data4[::10] = 1 #simulate a photon counter where a 1 indicates a photon came in at time indexed by array. 
# we could assume that the sample rate was 10 Hz for example
ps1 = np.abs(np.fft.fft(data))**2
ps2 = np.abs(np.fft.fft(data))**2
ps3 = np.abs(np.fft.fft(dataTransformed))**2

figure()
plot(ps1) #shows the peak at 0 Hz
figure()
plot(ps2) #shows the peak at 0 Hz
figure()
plot(ps3) #shows the peak at 1 Hz this is because we removed the mean value but since
#the function is a step function the next largest component is the 1 Hz cosine wave.
#notice the order of magnitude difference in the two plots.
票数 5
EN

Stack Overflow用户

发布于 2013-11-19 23:20:50

下面是一个简单的示例,它显示了输入和输出的峰值,正如您所预期的:

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

time   = np.linspace(0,10,2000)
signal = np.cos(5*np.pi*time)

W = fftfreq(signal.size, d=time[1]-time[0])
f_signal = rfft(signal)

import pylab as plt
plt.subplot(121)
plt.plot(time,signal)
plt.subplot(122)
plt.plot(W,f_signal)
plt.xlim(0,10)
plt.show()

我使用rfft,因为您的输入信号很可能来自物理数据源,因此是真实的。

票数 2
EN

Stack Overflow用户

发布于 2013-11-19 23:30:00

如果你的数据都是正数:

代码语言:javascript
复制
ps = np.abs(np.fft.fft(data))**2
time_step = 1

然后,你很可能会创建一个很大的'DC',或者0 Hz分量。因此,如果您的实际数据与该分量相比振幅很小,那么通过自动缩放功能,它将从绘图中消失。

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

https://stackoverflow.com/questions/20074930

复制
相关文章

相似问题

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