Android低通滤波器和高通滤波器

我有一个非常基本的问题。 安卓加速度计的情况下,低通滤波器和高通滤波器是什么?

当我看到加速计传感器的输出时,我看到如果我没有使用任何滤波器,(情况:我把手机闲置在桌子上),我得到z轴+ ve值。 现在,如果我认为使用基本的物理,它给我的确切的价值(9.8approx)为小g即加速度由于重力。

为了得到线性加速度,如果我给手机增加任何力量,它将改变加速度计值,但是它会是我应用的g + a 。 所以得到a为什么我不能直接从加速度计得到的值减去?

有什么用?
基本定义我理解为低通:允许低价值,高通:允许高价值。 请帮我理解它。 我对此感到困惑。

Solutions Collecting From Web of "Android低通滤波器和高通滤波器"

如果您查看文档,您将看到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 

您需要find重力在哪个方向运行,然后将其分解为其组成部分。 重力的大小总是9.8,但是方向,因此如何分解成零件,将会改变。 假设我们可以得到重力的值,并将这个向量存储在像gravity[3]这样的数组中gravity[3]

  gravity[0] //gravity x axis gravity[1] //gravity y axis gravity[2] //gravity z axis 

T上的总加速度TT = 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]; 

注意这是如何计算每个元素的元素,因为这是一个vector操作。

棘手的部分是findgravity因为手机中只有一个加速度计,它同时测量重力和其他力。 我们有两个不同的力量,我们想从一个传感器中find。 如果我们只能看到一个孤立点的力量,我们将无法提取信息。 然而,我们通过一系列时间获取样本,并通过观察这些力量如何随着时间的推移而变化,我们可以提取信息。

这意味着我们需要根据这些力量变化的速度来筛选出这个来源的结果。 由于重力加速度的大小不会很快改变,因为它根本不会改变。 重力是一个不变的力量。 然而其他力量会随着时间而改变。 如果我们通过使用高通滤波器滤除像引力这样的缓慢变化的力量,那么剩下的力量就像应用在手机上的力量一样快速变化。 这就是使用高通滤波器的原因。

低通滤波器 :传递低频信号,并降低频率高于阈值频率的信号幅度

高通滤波器 :通过高频信号,降低频率低于门限频率的信号幅度

如果你看一下文档 ,它说:“为了测量设备的真实加速度,必须消除重力的影响,这可以通过使用高通滤波器来实现,相反, 通过滤波器可以用来隔离重力。“

你可以看看这个低通滤波教程: http : //www.raweng.com/blog/2013/05/28/applying-low-pass-filter-to-android-sensors-readings/

阅读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 

加速度计的输出包括噪声,如果直接从包含噪声的这些值中减去。 为了消除噪声,需要实现高通和低通滤波器。

我通常使用这个公式来过滤来自线性传感器(如陀螺仪)数据的加速计传感器数据的数据。 如果您不确定是否有内置的陀螺仪传感器,请使用它。

 private float[] values; private float[] valuesN; private float[] prev; private float[] prevHF; private boolean doHPF = false; // ind - index of three dimensions (x, y, z) private void makeHPFf() { for (int ind = 0; ind < 3; ind++) { valuesN[ind] = values[ind] * 0.002f * 9.8f; if (doHPF) values[ind] = valuesN[ind] - prev[ind] + (prevHF[ind] * 0.8f); prev[ind] = valuesN[ind]; prevHF[ind] = values[ind]; } if (!doHPF) doHPF = true; }