7

所以我从 Android GPS 记录了一些数据,我试图找到这些图表的峰值,但我找不到任何具体的东西,也许是因为我不太确定我在看什么为了。我找到了一些 MatLab 函数,但找不到执行此操作的实际算法。我需要在 Java 中执行此操作,但我应该能够翻译其他语言的代码。

替代文字

如您所见,有很多“小山峰”,但我只想要主要的山峰。

4

5 回答 5

2

您的解决方案取决于您要对数据执行的操作。如果您想做非常严肃的事情,那么您很可能应该使用 (Fast) Fourier Transforms,并从中提取相位和频率输出。但这是非常计算密集型的,并且需要很长时间来编程。如果您只想做一些不需要大量计算资源的简单事情,那么这里有一个建议:

对于那个确切的问题,我在几个小时前实现了以下算法。我自己发明了这个算法,所以我不知道它是否已经有了名字,但它在非常嘈杂的数据上工作得很好。

您需要确定平均峰间距离并将其称为 PtP。做任何你喜欢的测量。从您的案例中的图表来看,它似乎约为 35。在我的代码中,我发明了另一种算法来自动执行此操作。

然后在图表上选择一个随机的起始索引。从那时起轮询每个新数据点,并等待图表从起始指数水平上升或下降大约 PtP 的 70%。如果是跌倒,那就是大跌眼镜。如果它是一个上升,那么这是一个滴答声。将该级别存储为最后一个刻度或刻度高度。在该索引处产生一个“tick”或“tock”事件。

在数据中继续前进。在刻度之后,如果数据在该点之后继续上升,则将该水平存储为新的“刻度高度”,但不会产生新的刻度事件。在 tocks 之后,如果数据在该点之后继续下降,则将该级别存储为新的“depth-of-tock”,但不会产生新的 tock 事件。

如果最后一个事件是一个滴答声,那么等待一个滴答声,如果最后一个事件是一个滴答声,那么等待一个滴答声。

每次你检测到一个滴答声,那应该是一个峰值!祝你好运。

于 2013-12-16T17:41:18.577 回答
1

我认为你想要做的是通过某种低通滤波器运行它。根据你想从这个数据集中得到什么,一个简单的“box car”过滤器可能就足够了:在每个点,取以该点为中心的 N 个样本的平均值,并将平均值作为过滤值。N 越大,过滤后的数据就越积极地平滑。

于 2011-01-18T22:55:25.127 回答
0

对于特别讨厌和嘈杂的数据,我通常使用平滑。平滑的最简单示例是移动平均线。然后你可以在移动平均线上找到峰值。然后,您只需返回原始数据并取最接近移动平均线的峰值即可。

于 2012-10-25T14:12:54.207 回答
0

我猜你有很多点......计算它们的平均值,从所有点的值中减去它,并从每个点具有相同符号的范围中获得最高点值(负或正),直到它们改变它。我希望我清楚...

于 2011-01-18T22:52:26.063 回答
-1

我已经对峰值检测进行了一些研究,我可以告诉您,如果您的数据不正常,它可能会弄乱您的算法。在我的脑海中,您可以尝试:选择一个阈值,即阈值 = 250。如果数据高于阈值,则找到该时间段的最大值。这是假设您拥有的数据的平均值约为 230。不确定您想要获得多花哨的数据。希望有帮助。

于 2011-01-18T22:51:58.527 回答