android – TYPE_ACCELEROMETER删除重力,t /(t dT)的含义

Android开发者示例:

public void onSensorChanged(SensorEvent event)
{
      // alpha is calculated as t / (t + dT)
      // with t, the low-pass filter's time-constant
      // and dT, the event delivery rate

      final float alpha = 0.8;

      gravity[0] = alpha * gravity[0] + (1 - alpha) * event.values[0];
      gravity[1] = alpha * gravity[1] + (1 - alpha) * event.values[1];
      gravity[2] = alpha * gravity[2] + (1 - alpha) * event.values[2];

      linear_acceleration[0] = event.values[0] - gravity[0];
      linear_acceleration[1] = event.values[1] - gravity[1];
      linear_acceleration[2] = event.values[2] - gravity[2];
}

alpha = 0.8计算出什么样的数值?
我想询问t和dT的具体值.

最佳答案 为了回答你的问题,我将不得不深入研究低通滤波器,因为alpha几乎是我们得到的最后一个值.

低通滤波器通常按以下顺序构建:

>你想切割的赫兹cutoff Frequency fc(这里重力是继续的,所以值应该在1Hz左右)
>Time-constantτ(tau)τ= 1 /(2 *π* fc)
>时间Δt以秒为单位. Δt= t2-t1
>平滑因子α,在这种情况下α=τ/(τΔt)
>以前的输出和新输入以获得新输出.

alpha的功能是对值进行或多或少的重要性.为了工作,过滤器需要一个介于0和1之间的alpha.在这种情况下,先前的输出(重力)权重为80%的新输出和新的输入(event.values)权重为20%=>新引力= 80%旧引力20%加速度.

Δt由传感器的实现给出.通常对于SENSOR_DELAY_NORMAL来说它是0.2秒.

τ由α= 0.8和Δt= 0.2s计算

从α中提取τ将给出:

τ = (∆t * α) / (1 - α)

并且使用之前的值,您会发现

τ  = 0.2 * 0.8 / (1 - 0.8) = 0.8

使用τ,您可以计算fc:

fc = 1 / (2 * π * τ) = 1/( 2 * 3.14 * 0.8) = 0.2Hz.
点赞