numpy.fft的两个数据集之间有什么区别

时间:2013-12-08 17:30:13

标签: python numpy signals fft

我试图找到罪恶曲线的句号,并找到sin(t)的正确句号 但是对于sin(k*t),频率会发生变化。我不知道它是如何变化的 只有当我知道数据集为interd时,我才可以调整下面sin(0.6*t)的值来获取正确的信号。

为什么我能为sin(t)获得正确的结果? 任何人都可以根据我的代码检测到正确的信号?或者只是一个小小的变化?

下图是sin(0.6*t)的功率谱密度 数据集如:

1,sin(1*0.6)
2,sin(2*0.6)
3,sin(3*0.6)
.........
2000,sin(2000*0.6)

我的代码:

timepoints = np.loadtxt('dataset', usecols=(0,), unpack=True, delimiter=",")
intensity = np.loadtxt('dataset', usecols=(1,), unpack=True, delimiter=",")
binshu = 300
lastime = 2000
interd = 2000.0/300 
sp = np.fft.fft(intensity)
freq = np.fft.fftfreq(len(intensity),d=interd) 
freqnum = np.fft.fftfreq(len(intensity),d=interd).argsort()
pl.xlabel("frequency(Hz)")
pl.plot(freq[freqnum]*6.28, np.sqrt(sp.real**2+sp.imag**2)[freqnum])

fig

1 个答案:

答案 0 :(得分:0)

我认为你太复杂了。如果您认为timepoints位于,则interd1timepoints中的值之间的差异)。这对我来说很好:

import numpy as np
import matplotlib.pyplot as pl

# you can do this in one line, that's what 'unpack' is for:
timepoints, intensity = np.loadtxt('dataset', usecols=(0,1), unpack=True, delimiter=",")

interd = timepoints[1] - timepoints[0] # if this is 1, it can be ignored
sp = np.fft.fft(intensity)
freq = np.fft.fftfreq(len(intensity), d=interd)

pl.plot(np.fft.fftshift(freq), np.fft.fftshift(np.abs(sp)))
pl.xlabel("frequency(Hz)")
pl.show()

你还会注意到我没有对频率进行排序,这就是fftshift的用途。

此外,请勿执行np.sqrt(sp.imag**2 + sp.real**2),这是np.abs的用途:)

simpler

如果你没有足够的采样频率(频率高于你的采样率,即2*pi/interd < 0.5*k),那么fft就无法知道你丢失了多少数据,所以它假设你没有遗漏任何东西。你不能指望它知道先验。这是您提供的数据:

input waves