Подтвердить что ты не робот

Фильтр шума данных акселерометра

Как фильтровать шум данных акселерометра в Android? Я хотел бы создать фильтр высоких частот для моих выборочных данных, чтобы я мог исключить низкочастотные компоненты и сосредоточиться на высокочастотных компонентах. Я прочитал, что фильтр Калмана может быть лучшим кандидатом для этого, но как мне интегрировать или использовать этот метод в моем приложении, которое будет в основном написано на Android Java? или это можно сделать в первую очередь? или через Android NDK? Есть ли вероятность, что это можно сделать в режиме реального времени?

Любая идея будет высоко оценена. Спасибо!

4b9b3361

Ответ 1

Образцы из Apple SDK фактически реализуют фильтрацию еще более простым способом, который используется с помощью ramping:

//ramp-speed - play with this value until satisfied
const float kFilteringFactor = 0.1f;

//last result storage - keep definition outside of this function, eg. in wrapping object
float accel[3]; 

//acceleration.x,.y,.z is the input from the sensor

//result.x,.y,.z is the filtered result

//high-pass filter to eliminate gravity
accel[0] = acceleration.x * kFilteringFactor + accel[0] * (1.0f - kFilteringFactor);
accel[1] = acceleration.y * kFilteringFactor + accel[1] * (1.0f - kFilteringFactor);
accel[2] = acceleration.z * kFilteringFactor + accel[2] * (1.0f - kFilteringFactor);
result.x = acceleration.x - accel[0];
result.y = acceleration.y - accel[1];
result.z = acceleration.z - accel[2];

Ответ 2

Вот код для Android, адаптированный из примера адаптивного фильтра high pass. Просто подключите это и выполните onFilteredAccelerometerChanged()

private static final boolean ADAPTIVE_ACCEL_FILTER = true;
float lastAccel[] = new float[3];
float accelFilter[] = new float[3];

public void onAccelerometerChanged(float accelX, float accelY, float accelZ) {
    // high pass filter
    float updateFreq = 30; // match this to your update speed
    float cutOffFreq = 0.9f;
    float RC = 1.0f / cutOffFreq;
    float dt = 1.0f / updateFreq;
    float filterConstant = RC / (dt + RC);
    float alpha = filterConstant; 
    float kAccelerometerMinStep = 0.033f;
    float kAccelerometerNoiseAttenuation = 3.0f;

    if(ADAPTIVE_ACCEL_FILTER)
    {
        float d = clamp(Math.abs(norm(accelFilter[0], accelFilter[1], accelFilter[2]) - norm(accelX, accelY, accelZ)) / kAccelerometerMinStep - 1.0f, 0.0f, 1.0f);
        alpha = d * filterConstant / kAccelerometerNoiseAttenuation + (1.0f - d) * filterConstant;
    }

    accelFilter[0] = (float) (alpha * (accelFilter[0] + accelX - lastAccel[0]));
    accelFilter[1] = (float) (alpha * (accelFilter[1] + accelY - lastAccel[1]));
    accelFilter[2] = (float) (alpha * (accelFilter[2] + accelZ - lastAccel[2]));

    lastAccel[0] = accelX;
    lastAccel[1] = accelY;
    lastAccel[2] = accelZ;
    onFilteredAccelerometerChanged(accelFilter[0], accelFilter[1], accelFilter[2]);
}

Ответ 3

Для тех, кто задается вопросом, какие методы norm() и clamp() делают в ответе rbgrn, вы можете увидеть их здесь: http://developer.apple.com/library/IOS/samplecode/AccelerometerGraph/Listings/AccelerometerGraph_AccelerometerFilter_m.html

double norm(double x, double y, double z)
{
    return Math.sqrt(x * x + y * y + z * z);
}

double clamp(double v, double min, double max)
{
    if(v > max)
        return max;
    else if(v < min)
        return min;
    else
        return v;
}

Ответ 4

Кажется, я помню, что это было сделано в образце Apple для iPhone. Посмотрим...

Найдите AccelerometerFilter.h/.m в Google (или возьмите образец Apple AccelerometerGraph), и эта ссылка: http://en.wikipedia.org/wiki/High-pass_filter (что основано на коде Apple).

В Wiki также есть некоторый псевдокод. Но математику довольно просто перевести на код.

Ответ 5

IMO, создавая фильтр Kalman, поскольку ваша первая попытка чрезмерно усложняет, что, вероятно, довольно простая проблема. Я бы начал с простого фильтра FIR и попробовал только что-то более сложное, когда/если вы его протестировали, и с достаточной уверенностью обнаружите, что он не может предоставить то, что вы хотите. Я предполагаю, однако, что он сможет делать все, что вам нужно, и делать это гораздо легче и эффективнее.