Le capteur est bruyant. Les données peuvent soudainement rebondir. Les humains sont également très analogiques. Même si je pense que je tiens mon doigt, les données vont fluctuer.
Si cela est utilisé numériquement tel quel, il en résultera un système très instable. Par conséquent, il est important d'avoir un filtre qui prépare les données brutes.
Utilisez le filtre de moyenne mobile exponentielle (EMA). [(Référence)](https://ja.wikipedia.org/wiki/%E7%A7%BB%E5%8B%95%E5%B9%B3%E5%9D%87#%E6%8C%87% E6% 95% B0% E7% A7% BB% E5% 8B% 95% E5% B9% B3% E5% 9D% 87)
S_t = α \times Y_{t-1} + (1-α) \times S_{t-1}
Plus la valeur de α est élevée, plus le poids de l'ancienne valeur est petit. Et vice versa.
Amplifie les fluctuations momentanées. Vous pouvez obtenir des données qui suppriment le bourdonnement.
var lastVal: CGFloat = 0.0
var alpha: CGFloat = 0.4
func lowpass(val: CGFloat) -> CGFloat {
lastVal = alpha * val + lastVal * (1 - alpha)
return lastVal
}
Seule la composante de fluctuation momentanée est utilisée. Vous pouvez obtenir les données lorsqu'elles changent soudainement.
var lastVal: CGFloat = 0.0
var alpha: CGFloat = 0.4
func highpass(val: CGFloat) -> CGFloat {
lastVal = alpha * val + lastVal * (1 - alpha)
return val - lastVal
}
Recommended Posts