2012-03-09 94 views
4

我有一个模拟程序产生的信号。由于该程序中的求解器具有可变的时间步长,因此我有一个信号间隔不均匀的数据。我有两个列表,一个带有信号值的列表,另一个列出每个值发生的时间。数据可能是这样的频率分析与Python中的不均匀间隔数据

npts = 500 
t=logspace(0,1,npts) 
f1 = 0.5 
f2 = 0.6 
sig=(1+sin(2*pi*f1*t))+(1+sin(2*pi*f2*t)) 

我想能够使用python执行此信号的频率分析。看来我不能在numpy中使用fft函数,因为这需要均匀间隔的数据。有没有什么标准功能可以帮助我找到这个信号中包含的频率?

回答

6

解决此类问题的最常用算法称为频率的Least-Squares Spectral analysis。看起来这将在scipy.signals package的未来版本中。也许有一个当前的版本,但我似乎无法找到它...此外,有一些代码可从Astropython,我不会复制它的全部,但它本质上创建一个Lomb类,您可以使用下面的代码来得到一些价值出来..你需要做的是:

import numpy 
import lomb 
x = numpy.arange(10) 
y = numpy.sin(x) 
fx,fy, nout, jmax, prob = lomb.fasper(x,y, 6., 6.) 
+1

在lomb类中似乎确实存在一些缩进问题,但除此之外,它正如我所希望的那样工作! – Katt 2012-03-09 16:01:59

+0

固定缩进的要点链接:https://gist.github.com/louismullie/1cb1cae74ef76513827a – user2398029 2015-01-05 01:42:21

2

很简单,只是仰望公式傅立叶变换,并执行它作为您的数据值离散总和:

给定的一组值f(x)通过一些组x,则对于每个频率k

F(k) = sum_x (exp(+/-i * k *x)) 

选择您的k的范围从02*pi/min separation in x

,并可以使用2 * pi/max(x)作为增量大小

为测试条件下,使用的东西,你知道正确的答案,C.F.,对于一些k'一个cos(k' * x),或高斯。

+1

请考虑回答一个示例输出,因为它会帮助很多用户如何找到这个问题。 – 2015-05-05 15:54:43

+0

这只是该功能的原理图。 F(k)在你选择的任何一组k值上将是复数值。 – DrM 2015-05-05 17:52:49

+0

还有一点评论,这种方法将自变量的输入集作为一组delta函数来处理,这与FFT中隐含的相同。 – DrM 2015-05-05 18:51:45