如何读取这个复杂图表的周期数?

计算科学 算法 Python 麻木的
2021-12-17 18:47:15

我有两个准周期性的数据集。它们具有相同的时期,并且可以用肉眼清楚地看到。例如当x(100,200),它们都有大约 32 个周期。

在此处输入图像描述

下面是数据的放大图:

在此处输入图像描述

您可以看到这两个数据集具有完全不同的性质。

问题是,我怎样才能通过计算机计算确切的周期数(就像我们用肉眼计算的那样)?算法/程序最好能同时处理这两个不同行为的数据集。我最常使用python或c。如果可用,首选这两种语言的代码。

数据在这里大约是 15mb。

2个回答

您应该使用傅立叶变换来计算信号的功率谱。峰值对应于主要频率分量。例如,请参见此处的单面幅度谱图:http: //www.mathworks.com/help/matlab/ref/fft.html

编辑:
看来我误读了你的问题。如果您只想要数据集中出现的周期数,则相关频率在功率谱中清晰可见。您可能对与存在的最低频率相对应的峰值感兴趣(也存在该频率的许多整数倍,甚至可能具有更大的幅度)。您可以使用某个阈值提取该频率以检测它并乘以数据的总持续时间以获得数据中的周期数。

一般来说,数据完全重复自身的总频率等于所有频率的最大公因数。请查看下面获得的频率,最低频率峰值是您正在寻找的。

在此处输入图像描述

在此处输入图像描述

您似乎有不同的“类型”周期,以及不同类型的最大值和最小值。尝试的一个想法是仅计算局部极值集。调用极值序列vj在地点xj.

您可以通过查看最小值和两个相邻最大值之间的高度差异来区分不同类型的最大值和最小值,|vjvj1|+|vjvj+1|,以及查看关联到最小的“盆地”的大小,xj+1xj1. 当数据从顶部跳到底部时,高度的差异会非常大,并且底部和顶部的“次要”最大值的差异也会小得多。如果差异可以忽略不计,这也有助于消除噪音。

计算周期数就像计算正确类型的最大值的数量一样简单,或者可能将它们之间的距离计算为xj+2xj. 如有必要,这还允许您分别区分高振幅和低振幅振荡。

我想起了科学可视化中关于使用 Morse-Smale 复合体从 3d 标量场中提取特征的文献(例如http://dx.doi.org/10.1109/TVCG.2007.70552),但这在这里有点过分了,因为 1d 案例是真的很简单。