Filtrování hluku akcelerometr dat

hlasů
23

Jak filtrovat hluk z dat akcelerometru v Androidu? Chtěl bych vytvořit high-pass filtr pro mé ukázkových dat, takže jsem mohl odstranit nízkofrekvenční složky a zaměřit se na vysokofrekvenčních složek. Četl jsem, že Kalmanův filtr může být nejlepším kandidátem pro tuto, ale jak mohu integrovat nebo používat tuto metodu v mé žádosti, které budou většinou napsané v Javě Android? nebo to může být provedeno na prvním místě? nebo přes Android NDK? Je tam náhodou, že to lze provést v reálném čase?

Napadá vás bude velmi ceněn. Děkuji!

Položena 28/10/2009 v 18:39
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
1

Vzpomínám si, to se děje ve společnosti Apple ukázkový kód pro iPhone. Uvidíme...

Podívejte se na AccelerometerFilter.h / .m na Googlu (nebo chytit Apple vzorek AccelerometerGraph) a tento odkaz: http://en.wikipedia.org/wiki/High-pass_filter (to je to, co Apple kód je založen na).

Tam je nějaký pseudo-code ve Wiki, taky. Ale matematika je poměrně jednoduché přeložit do kódu.

Odpovězeno 28/10/2009 v 18:52
zdroj uživatelem

hlasů
0

IMO, navrhování Kalmanova filtru jako první pokus je nadměrně komplikuje to, co je pravděpodobně poměrně jednoduchý problém. Já bych začít s jednoduchým FIR filtr, a pokusit se něco složitější, když / pokud jste testovány, aby našel a s dostatečnou jistotou, že nemůže poskytnout to, co chcete. Můj odhad, však je, že to bude moci dělat vše, co potřebujete, a to mnohem snadněji a efektivněji.

Odpovězeno 28/10/2009 v 18:56
zdroj uživatelem

hlasů
24

Vzorky od společnosti Apple SDK ve skutečnosti provádět filtrování v ještě jednodušším způsobem, který je pomocí stupňovat:

// ramp-speed - hrát si s touto hodnotou, dokud spokojen
const float kFilteringFactor = 0.1f;

// poslední ukládání výsledků - zachovat definici mimo tuto funkci, např. v balícím objektu
float Accel [3]; 

//acceleration.x,.y,.z je vstup ze snímače

//result.x,.y,.z je filtrovaný výsledek

// vysokofrekvenční filtr k odstranění gravitace
zrychlení [0] = acceleration.x * kFilteringFactor + zrychlení [0] * (1.0f - kFilteringFactor);
zrychlení [1] = acceleration.y * kFilteringFactor + zrychlení [1] * (1.0f - kFilteringFactor);
zrychlení [2] = acceleration.z * kFilteringFactor + zrychlení [2] * (1.0f - kFilteringFactor);
result.x = acceleration.x - zrychlení [0];
result.y = acceleration.y - zrychlení [1];
result.z = acceleration.z - zrychlení [2];
Odpovězeno 15/11/2009 v 06:00
zdroj uživatelem

hlasů
12

Zde je kód pro Android, adaptovaný od apple adaptivní horní propust například filtru. Stačí připojit na tuto a implementovat 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]);
}
Odpovězeno 30/11/2011 v 10:20
zdroj uživatelem

hlasů
3

Pro ty, co normu () a svorku () metody dělat v odpovědi od rbgrn, můžete vidět zde: http://developer.apple.com/library/IOS/samplecode/AccelerometerGraph/Listings/AccelerometerGraph_AccelerometerFilter_m.html

Odpovězeno 25/05/2012 v 03:57
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more