Я пытаюсь разработать шагомер на основе акселерометра. Он работает нормально, но я читал, что многие люди добавляют фильтр низких частот к данным акселерометра. Я знаю формулу, но я не понимаю, как рассчитывается альфа-значение. Несмотря на это, условия не совсем ясны или противоречивы.
Я уже определил значение dt (частоты дискретизации), используя временную метку события датчика:
private static final float NS2S = 1.0f / 1000000000.0f;
private float dt;
public void onSensorChanged(SensorEvent sensorEvent) {
int type = sensorEvent.sensor.getType();
long timestamp = System.currentTimeMillis();
if (type == Sensor.TYPE_ACCELEROMETER) {
if(this.timestamp != 0) {
dt = (sensorEvent.timestamp - this.timestamp) * NS2S;
}
this.timestamp = sensorEvent.timestamp;
}
}
Реальное значение dt составляет 0,002 с для SENSOR_DELAY_FASTEST.
Для SENSOR_DELAY_NORMAL он имеет жесткий предел 0,2 с.
Реализованный ФНЧ:
/**
* Constructs a low pass filter with alpha as smoothing parameter.
* If alpha is 1.0 there is no smoothing.
* If alpha is 0.0 then the new value is completely filtered.
*
* @param alpha Smoothing parameter
*/
public LowPass(float alpha) {
this.alpha = alpha;
}
@Override
public void push(float value) {
if (this.last == null)
this.last = value;
else
this.last = this.last * (1.f - this.alpha) + value * this.alpha;
}
@Override
public float get() {
return this.last == null ? 0.f : this.last;
}
В литературе написано, что человек обычно ходит со скоростью 1,5 шага / с. Я проверяю это значение, и между каждым шагом средний интервал времени составляет 550 мс.
У меня есть эта формула:
тау = (альфа * дт) / (1-альфа) <=> альфа = тау / (тау + дт)
В нем говорится, что постоянная времени (тау) и частота дискретизации должны быть известны.
Частота дискретизации dt составляет 0,002 с => 5 Гц.
Но какова постоянная времени тау? Это частота ходьбы человека при 1,81 Гц (550 мс)?
Как рассчитать правильное значение альфа-канала на основе значений частоты ходьбы человека 1,8 Гц и задержек датчика (т. Е. 0,002 с и 0,2 с)?
Заранее спасибо.