使用Python进行不均匀间隔数据的频率分析

6

我有一个由仿真程序生成的信号。 由于该程序中的求解器具有可变时间步长,因此我有一组不均匀间隔数据的信号。 我有两个列表,一个包含信号值,另一个包含每个值发生的时间。 数据可能如下所示

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函数,因为它需要等距数据。是否有任何标准函数可以帮助我找到此信号中包含的频率?

3个回答

7
最常用的算法来解决这类问题被称为频率的最小二乘谱分析。看起来这将在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
修正缩进的Gist链接:https://gist.github.com/louismullie/1cb1cae74ef76513827a - user2398029

2
非常简单,只需要查找傅里叶变换的公式,并将其实现为对数据值的离散求和:
给定一组在某个集合x上的值f(x),那么对于每个频率k,可以使用以下公式进行傅里叶变换:
F(k) = sum_x ( exp( +/-i * k *x ) )

选择您的k,范围从02*pi / x的最小间隔

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

对于测试用例,请使用一些已知正确答案的内容,例如单个cos(k' * x)或高斯函数。


1
请考虑用示例输出回答,这将帮助许多找到这个问题的用户。 - Huá dé ní 華得尼
这只是该函数的示意图。F(k)将是复数值,无论您选择哪组k。 - DrM
再多说一句,这种方法将独立变量的输入集视为一组δ函数,与FFT中暗示的方式非常相似。 - DrM

0

一个简单的方法是对等间隔时间间隔进行插值


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接