如何在我的代码中应用此低通滤波器功能:
static final float alpha = 0.05f;
public float[] lowPass(float[] output, float[] input)
{
output[0] = output[0] + alpha * (input[0] - output[0]);
output[1] = output[1] + alpha * (input[1] - output[1]);
output[2] = output[2] + alpha * (input[2] - output[2]);
return output;
}
读取加速度计并检测事故
我希望用低通滤波器过滤后,mLastX,mLastY和mLastZ保存加速度计读数
public void onSensorChanged(int sensor, float[] values)
{
if (sensor != SensorManager.SENSOR_ACCELEROMETER) return;
long now = System.currentTimeMillis();
if ((now - mLastForce) > SHAKE_TIMEOUT) {
mShakeCount = 0;
}
if ((now - mLastTime) > TIME_THRESHOLD) {
long diff = now - mLastTime;
float speed = Math.abs(values[SensorManager.DATA_X] + values[SensorManager.DATA_Y] + values[SensorManager.DATA_Z] - mLastX - mLastY - mLastZ) / diff * 10000;
if (speed > FORCE_THRESHOLD) {
if ((++mShakeCount >= SHAKE_COUNT) && (now - mLastShake > SHAKE_DURATION)) {
mLastShake = now;
mShakeCount = 0;
if (mShakeListener != null) {
mShakeListener.onShake();
}
}
mLastForce = now;
}
mLastTime = now;
mLastX = values[SensorManager.DATA_X];
mLastY = values[SensorManager.DATA_Y];
mLastZ = values[SensorManager.DATA_Z];
最佳答案
调用它时,第一个参数最初是数组[mlastx,mlastY,mlastz],第二个参数是传感器的当前值。调用后,第一个数组的值将更改,并应变为mlastX,mlastY和mlastZ。如果仅将它们保留为数组而不是将其保存在单独的变量中,则实际上实际上更容易编码。
现在,这将完成您想要的另一个问题。该函数的数学原理有些奇怪,而有些则完全是错误的。例如,您要对加速度求和,然后除以时间以获得“速度”。不,这让你很蠢。速度要求您乘以时间。为了获得真实的矢量幅度,您应该为每个组件而不是绝对值加上速度差的平方。 10K乘法毫无意义,只需将阈值除以10K,因为它不可能在其他任何地方使用。让人想尝试翻译他们不太了解的算法。