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.