gpt4 book ai didi

ios - 如何在从 iPhone 获得的加速度数据中找到所需的最大值?

转载 作者:可可西里 更新时间:2023-11-01 02:13:11 25 4
gpt4 key购买 nike

Plot of instantaneous accelerometer values against time

我需要找出加速度计值流达到最大值的次数。我绘制了从 iPhone 获得的加速度计值随时间变化的图,使用 CoreMotion 方法获取 DeviceMotionUpdates。记录数据时,我摇了手机 9 次(每个肢体都是加速度最高点之一)。

我在图上的红框中标出了加速度达到最大值的 18(即 9*2)次。

但是,如您所见,有一些我不想考虑的局部最大值。有人可以指导我找到一个想法,帮助我实现只检测对我最重要的最大值吗?

编辑:我想我必须使用低通滤波器。但是,我如何在 Swift 中实现它呢?如何选择截止频率?

编辑 2: Accelerometer data passed through a low pass filter我实现了一个低通滤波器并通过它传递原始运动数据并获得如下图所示的图表。这样好多了。我仍然需要一种方法来避免可以观察到的微不足道的最大值。我将深入研究过滤器并可能修复它。

最佳答案

我不会尝试寻找最大值,而是尝试寻找周期。特别是,我们注意到(主要)最小值似乎比最大值更一致。

我不熟悉swift,所以我会用伪代码来表达我的想法。假设我们的值在 v[i] 中,导数在 dv[i] = v[i] - v[i - 1] 中。如果您获得更好的结果,您可以使用任何其他微分方案。

我会尝试类似的东西

cycles = [] // list of pairs
cstart = -1
cend = -1
v_threshold = 1.8 // completely guessing these figures looking at the plot
dv_threshold = 0.01
for i in v:
if cstart < 0 and
v[i] > v_threshold and
dv[i] < dv_threshold then:
// cycle is starting here
cstart = i
else if cstart > 0 and
v[i] < v_threshold and
dv[i] < dv_threshold then:
// cycle ended
cend = i
cycles.add(pair(cstart, cend))
cstart = -1
cend = -1
end if

现在您在评论中注意到用户应该能够用不同的力量摇晃并且您应该能够识别该 Action 。我会从一个简单的“硬编码”案例开始,如上面的案例,看看您是否可以让它充分发挥作用。您可以尝试很多方法来获得可变阈值,但您始终需要一个。但是,根据您展示的数据,我强烈建议您至少将自己限制在查看最小值而不是最大值。

此外:我建议的代码是在假设您拥有完整数据集的情况下编写的,但是您会希望实时运行它。这不会有问题,算法仍然有效(也就是说,这个想法仍然有效,但您必须以不同的方式编写代码)。

关于ios - 如何在从 iPhone 获得的加速度数据中找到所需的最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40425193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com