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% => new gravity = 80% 旧重力 + 20% 加速度
。
Δt
由传感器的实现给出。通常为 SENSOR_DELAY_NORMAL
是0.2s。
τ 由 α = 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.
关于android - TYPE_ACCELEROMETER 去掉重力,t/(t+dT)的意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35190839/