2016-02-04 4 views
4

Android-разработчик Пример:TYPE_ACCELEROMETER Удалите тяжести, значение т/(Т + дт)

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]; 
} 

альфа = 0,8, какой числовой вычисленное? Я хочу задать конкретные значения t и dT.

ответ

1

Чтобы ответить на ваш вопрос, мне придется немного проскочить в фильтр нижних частот, поскольку альфа-это почти последнее значение, которое мы получаем.

низкочастотным фильтр обычно строят в следующем порядке:

  1. cutoff Frequency Ь в герцах, что вы хотите, чтобы сократить (здесь гравитация продолжаться, так что значение должно быть около 1Гц)
  2. Time-constant τ (tau) τ = 1/(2 * π * fc)
  3. Дельта времени Δt во втором. ∆t = t2 - t1
  4. Сглаживание фактор α, в этом случае α = τ/(τ + ∆t)
  5. предыдущий выходной и новый входной для того, чтобы получить новый выход.

Функция alpha должна придавать значение значение более или менее. Для работы фильтр нуждается в альфа-диапазоне от 0 до 1. В этом случае весы предыдущего вывода (силы тяжести) для 80% нового выхода, а новый вход (event.values) весит 20% =>new gravity = 80% old gravity + 20% acceleration.

∆t предоставляется при внедрении вашего датчика. Обычно для SENSOR_DELAY_NORMAL это 0.2s.

τ рассчитывается от а = 0,8 и DT = 0,2сек

Extract τ от а даст:

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

И с предыдущим значением, вы найдете

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

И с τ, вы можете вычислить fc:

fc = 1/(2 * π * τ) = 1/(2 * 3.14 * 0.8) = 0.2Hz. 
+0

Благодарю, я знаю, что t дается при внедрении датчика. α = 0,8, как получается? fc, что делать? –

+0

@ 嘚 嘚 9468 Альфа получается из частоты среза (fc). Низкий фильтр сохранит значение ускорения, которое имеет частоту ниже fc, но уменьшит значение ускорения, которое имеет частоту, превосходящую fc. Здесь вы хотите сохранить гравитацию (постоянное ускорение 9,8 м/с²) и отказаться от ускорения, вызванного движением телефона. Поэтому вам нужно будет выбрать очень маленький fc, например, 0,2 Гц, чтобы поддерживать ускорение силы тяжести. После того, как вы выбрали fc, вы можете вычислить альфа. – xiaomi

+0

Я должен пойти в учебник по математике, эти вещи выходят, спасибо! –

Смежные вопросы