如何在我的代码中应用此低通滤波器功能:

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,因为它不可能在其他任何地方使用。让人想尝试翻译他们不太了解的算法。

10-02 13:46