我看到了很多关于过滤加速度计值的例子,以抵消重力(高通滤波器)。
但是它们中的大多数是一阶的,据说很简单,但滞后而不是最好的(尽管我对过滤器或 DSP 一无所知)。
这里有人说在DSP中存在更好的解决方案来感知运动。遗憾的是,我什至无法想象它会是什么,因为我完全是这个领域的局外人。
我希望有人至少能说出在处理传感器时可以使用的过滤器类型。当然,即使是对具体算法的简单介绍也会很高兴:)
提前致谢。
我看到了很多关于过滤加速度计值的例子,以抵消重力(高通滤波器)。
但是它们中的大多数是一阶的,据说很简单,但滞后而不是最好的(尽管我对过滤器或 DSP 一无所知)。
这里有人说在DSP中存在更好的解决方案来感知运动。遗憾的是,我什至无法想象它会是什么,因为我完全是这个领域的局外人。
我希望有人至少能说出在处理传感器时可以使用的过滤器类型。当然,即使是对具体算法的简单介绍也会很高兴:)
提前致谢。
您可以尝试更高阶的 FIR 或 IIR 滤波器,它可以为您提供更清晰的频域转换。但更高级的方法是使用自适应卡尔曼滤波器。这是一篇关于加速度计和卡尔曼滤波器的文章。
DSP 指南正是您要找的。它给出了数字信号处理和作品背后的基本“理论”和数学。
http://www.dspguide.com/ch14.htm 这是一个很好的起点
看看这个。
从个人经验来看,一阶滤波器对于大多数简单的应用程序来说已经足够“好”了。虽然这完全取决于具体的应用
你想利用 Android 的SensorListener()
Class。例如,“The Schwartz Unsheathed”是托管在 Google Code 上的开源 Android 项目,看起来应该非常有用(由 Clark Scheff 编写)。
您可以通过 SVN http://code.google.com/p/the-schwartz-unsheathed/source/checkout查看它的源代码,或者只是在网络上浏览它。源被分解为一个 Activity ( TheSchwartz.java ) 和一个 View ( GraphView.java )。GraphView.java 包含SensorListener()
广告onSensorChanged()
类,这是加速度计处理发生的地方。第 284 和 285 行:
magnitude = (float)Math.sqrt(values[0]*values[0]+values[1]*values[1]+values[2]*values[2]);
magnitude = Math.abs(magnitude - SensorManager.GRAVITY_EARTH);
的值magnitude
是针对 Android 手机的不动、“撞击”或“摆动”进行评估的。我意识到这不会在信号处理意义上过滤数据,但它确实显示了一种对传感器数据进行分类的方法。希望能帮助到你。