Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy.fft的两个数据集之间有什么区别_Python_Numpy_Signals_Fft - Fatal编程技术网

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

Python numpy.fft的两个数据集之间有什么区别,python,numpy,signals,fft,Python,Numpy,Signals,Fft,我试图找到sin曲线的周期,并能找到sint的正确周期。 然而,对于sink*t,频率会发生偏移。我不知道它是如何转变的。 只有当我知道数据集是sin0.6*t时,我才能调整下面interd的值以获得正确的信号 为什么我能得到正确的sint结果? 任何人都可以根据我的代码检测到正确的信号?还是仅仅是一点零钱 下图是sin0.6*t的功率谱密度。 数据集如下所示: 1,sin(1*0.6) 2,sin(2*0.6) 3,sin(3*0.6) ......... 2000,sin(2000*0.6)

我试图找到sin曲线的周期,并能找到sint的正确周期。 然而,对于sink*t,频率会发生偏移。我不知道它是如何转变的。 只有当我知道数据集是sin0.6*t时,我才能调整下面interd的值以获得正确的信号

为什么我能得到正确的sint结果? 任何人都可以根据我的代码检测到正确的信号?还是仅仅是一点零钱

下图是sin0.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])

我觉得你把事情弄得太复杂了。如果你认为时间点是秒,那么中间值是时间点值之间的1差值。这对我来说很好:

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.sqrtsp.imag**2+sp.real**2,这就是np.abs的用途:

如果采样不足,则频率高于采样率,即2*pi/interd<0.5*k,则fft无法知道丢失了多少数据,因此它假定您没有丢失任何数据。你不能指望它知道先验知识。这是您提供给它的数据:


这对sin0.6*t很有效。但是如果使用默认的d=1,则存在两个问题。频率范围限制为[-0.5,0.5]。对于sin6*t,你可能会得到错误的峰值。对于高频,这不是fft的问题。。。首先画出你的信号,你会发现如果你取np.sin6*t,其中t=np.arange112001,你看不到频率为6的信号。fft只能告诉你你给了它什么。如果您确实知道信号采样不足,您可以对此进行纠正,但如果不知道,则无法确定我认为您要求的是什么。不客气:有关更多信息,请参阅。简而言之,您无法检测任何超过采样频率一半的频率,而是检测其他频率。这里,采样频率f=1 Hz或w=2πrad/sec,因此可以检测到的最快频率是πrad/sec,它低于sin6*t的输入频率。或者更具体地说,如果k始终是整数,那么sin6*k=sin6-2*pi*k,而6-2*pi约为-0.2832,因此这将是您看到的频率,即,采样序列是-sin0.2832*k.Hm中的一个,我必须使用它来绘制第二个图,但我没有使用它来查找频率,因为间距是1。从技术上讲,我应该使用fftfreqlentensitity,d=timesteps[1]-timesteps[0]。但在这种情况下,差值为1,这是默认值。