4 votes

iOS - Équation du filtre passe-haut pour l'accéléromètre

Quelqu'un pourrait-il expliquer comment on arrive à l'équation ci-dessous pour le filtrage passe-haut des valeurs de l'accéléromètre ? Je n'ai pas besoin d'une dérivation mathématique, une interprétation intuitive suffit.

    #define kFilteringFactor 0.1
    UIAccelerationValue rollingX, rollingY, rollingZ;

    - (void)accelerometer:(UIAccelerometer \*)accelerometer didAccelerate:(UIAcceleration \*)acceleration {

        // Subtract the low-pass value from the current value to get a simplified high-pass filter

        rollingX = (acceleration.x \* kFilteringFactor) + (rollingX \* (1.0 - kFilteringFactor));

        rollingY = (acceleration.y \* kFilteringFactor) + (rollingY \* (1.0 - kFilteringFactor));

        rollingZ = (acceleration.z \* kFilteringFactor) + (rollingZ \* (1.0 - kFilteringFactor));

         float accelX = acceleration.x - rollingX;
         float accelY = acceleration.y - rollingY;
         float accelZ = acceleration.z - rollingZ;

       // Use the acceleration data.

    }

14voto

Jano Points 37593

Bien que les autres réponses soient correctes, voici une explication simpliste. Avec kFilteringFactor 0.1, vous prenez 10% de la valeur actuelle et ajoutez 90% de la valeur précédente. La valeur conserve donc une similitude de 90 % avec la valeur précédente, ce qui augmente sa résistance aux changements soudains. Cela réduit le bruit mais le rend aussi moins réactif aux changements du signal. Pour réduire le bruit et maintenir la réactivité, il faudrait des filtres non triviaux, par exemple des filtres de type "A" ou "B" : Complémentaire Kalman.

11voto

Paul R Points 104036

Les valeurs rollingX, rollingY, rollingZ sont persistantes entre les appels à la fonction. Elles doivent être initialisées à un moment donné avant d'être utilisées. Ces valeurs "rolling" sont juste des versions filtrées passe-bas des valeurs d'entrée (alias "moyennes mobiles") qui sont soustraites des valeurs instantanées pour vous donner une sortie filtrée passe-haut, c'est-à-dire que vous obtenez la déviation actuelle de la moyenne mobile.

EXPLICATION SUPPLÉMENTAIRE

Une moyenne mobile n'est qu'un filtre passe-bas grossier. Dans ce cas, il s'agit de ce que l'on appelle un ARMA (auto-regressive moving average) plutôt qu'une simple MA (moving average). En termes de DSP, il s'agit d'un filtre récursif (IIR) plutôt que d'un filtre non récursif (FIR). Indépendamment de toute cette terminologie, on peut considérer qu'il s'agit d'une fonction de lissage" - elle "lisse" toute l'énergie haute fréquence et vous laisse une estimation à variation lente de la valeur moyenne du signal. Si vous soustrayez ensuite ce signal lissé du signal instantané, la différence sera le contenu que vous avez filtré, c'est-à-dire les hautes fréquences, d'où l'obtention d'un filtre passe-haut. En d'autres termes : high_pass_filtered_signal = signal - smoothed_signal .

0voto

Unapiedra Points 2341

Ok, ce que fait ce code, c'est calculer un signal passe-bas et ensuite soustraire la valeur actuelle.

Chose d'un onde carrée qui prend deux valeurs 5 et 10. En d'autres termes, il oscille entre 5 et 10. Ensuite, le signal passe-bas est essayé pour trouver la moyenne (7,5). Le signal passe-haut est alors calculé comme la valeur actuelle moins la moyenne, c'est-à-dire 10 - 7,5 = 2,5, ou 5 - 7,5 = -2,5.

Le signal passe-bas est calculé en intégrant les valeurs passées en ajoutant une fraction de la valeur actuelle à 90% de la valeur passe-bas passée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X