我试图找到罪恶曲线的句号,并找到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])
答案 0 :(得分:0)
我认为你太复杂了。如果您认为timepoints
位于秒,则interd
为1
(timepoints
中的值之间的差异)。这对我来说很好:
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
的用途:)
如果你没有足够的采样频率(频率高于你的采样率,即2*pi/interd < 0.5*k
),那么fft
就无法知道你丢失了多少数据,所以它假设你没有遗漏任何东西。你不能指望它知道先验。这是您提供的数据: