我有一个非常基本的问题。什么是Android加速度计的低通滤波器和高通滤波器?
当我看到加速度传感器的输出时,我会查看是否没有使用任何过滤器(例如:我将手机空闲在桌子上),我得到的是z轴+ve值。现在,如果我考虑使用基础物理,它给出了精确的值(9.8Approx),小g,即由于重力引起的加速度。
为了得到线性加速度,如果我给手机添加任何力,它会改变加速度计的值,但它将是我应用的g + a。所以要得到a,为什么不能直接从加速度计得到的值中减去呢?
这有什么用呢?
我对低通的基本定义是:允许低值,高通:允许高值。
发布于 2014-06-09 20:31:56
如果您查看文档,您将看到SensorEvent返回了一个数组,该数组表示所有力的向量。http://developer.android.com/reference/android/hardware/SensorEvent.html#values这是加速度分量分解为每个轴的方式:
values[0] //acceleration on x axis
values[1] //acceleration on y axis
values[2] //acceleration on z axis你需要找出重力在哪个方向上运行,然后把它分解成它的组成部分。重力的大小将始终是9.8,但方向以及它如何分解为组成部分将发生变化。假设我们可以获得重力的值,并将该向量存储在像gravity[3]这样的数组中
gravity[0] //gravity x axis
gravity[1] //gravity y axis
gravity[2] //gravity z axis手机上的总加速度T是T = g + a。为了只获取a,我们需要a = T - g
linear_acceleration[0] = event.values[0] - gravity[0];
linear_acceleration[1] = event.values[1] - gravity[1];
linear_acceleration[2] = event.values[2] - gravity[2];请注意,这是如何逐个元素计算所有内容的,因为这是一个向量运算。
棘手的部分是寻找gravity,因为手机中只有一个加速计,可以同时测量重力和其他力。我们有两个不同的力,我们想从一个传感器中找到它们。如果我们只能在一个孤立的时间点上观察这些力,我们就无法提取信息。然而,我们确实在一段时间内获得了样本,通过观察力如何随时间变化,我们可以提取信息。
这意味着我们需要根据这些力量变化的速度过滤掉来自某个来源的结果。由于重力引起的加速度的大小不会很快改变,因为它根本不会改变。重力是一种恒定的力。然而,其他的力量会随着时间的推移而改变。如果我们使用高通滤波器过滤掉重力等缓慢变化的力,那么剩下的力就是变化快的力,比如施加在手机上的力。这就是使用高通滤波器的原因。
发布于 2014-06-09 19:56:31
低通滤波器:通过低频信号并降低频率高于阈值频率的信号的幅度
高通滤波器:通过高频信号,降低频率低于阈值频率的信号幅度
如果你看看documentation,它说:“为了测量设备的实际加速度,必须消除重力的影响。这可以通过应用高通滤波器来实现。相反,可以使用低通滤波器来隔离重力。”
你可以看看这个关于低通滤波的教程:
阅读http://developer.android.com/reference/android/hardware/SensorEvent.html#values上的文档,您可以看到可以通过执行以下操作访问所有x,y,z轴上的a值:
values[0] - a on x axis
values[1] - a on y axis
values[2] - a on z axis发布于 2016-06-19 11:16:37
如果直接从包含噪声的这些值中减去,则加速度计的输出将包含噪声。为了消除噪声,需要实现高通和低通滤波器。
https://stackoverflow.com/questions/24119672
复制相似问题