- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我需要找出加速度计值流达到最大值的次数。我绘制了从 iPhone 获得的加速度计值随时间变化的图,使用 CoreMotion 方法获取 DeviceMotionUpdates。记录数据时,我摇了手机 9 次(每个肢体都是加速度最高点之一)。
我在图上的红框中标出了加速度达到最大值的 18(即 9*2)次。
但是,如您所见,有一些我不想考虑的局部最大值。有人可以指导我找到一个想法,帮助我实现只检测对我最重要的最大值吗?
编辑:我想我必须使用低通滤波器。但是,我如何在 Swift 中实现它呢?如何选择截止频率?
编辑 2: 我实现了一个低通滤波器并通过它传递原始运动数据并获得如下图所示的图表。这样好多了。我仍然需要一种方法来避免可以观察到的微不足道的最大值。我将深入研究过滤器并可能修复它。
最佳答案
我不会尝试寻找最大值,而是尝试寻找周期。特别是,我们注意到(主要)最小值似乎比最大值更一致。
我不熟悉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/
我想计算正在行驶的车辆的加速度。到目前为止,我能够使用以下公式获得沿航向矢量的加速度 a = (velocity(now)-velocity(previous))/time m/s^2 示例:一辆汽车
网站上修改后的滚动行为是如何制作的?正如您在示例中看到的那样,我想完成加速滚动行为。所以你以一定的速度滚动,当你放手之后,页面会自行滚动一点,减速并停止。 不幸的是,我绝对没有根据为您提供代码,希望您
我想使用标准操作(CCMoveBy 和 e.t.c)创建一个具有轨迹的可见对象,类似于: x = sin(y) 我的代码: CCMoveBy *moveAction1 = [CCMoveBy acti
问题是我的鼠标速度和加速度太高,系统设置(Ubuntu)完全没用,所以我需要一个外部工具/技巧来调整它。 那么,如何在不手动执行命令的情况下在启动时绝对减慢鼠标速度? xinput list 的输出是
我是一名优秀的程序员,十分优秀!