DMelt:DSP/6 Kalman Filter
From HandWiki
Member
Kalman filter
Read Kalman filter article first. The Kalman filter is implemented in the Java jhplot.math.kalman.JKalman class.
Let us give an example of using the Kalman filter using the Python syntax.
from jhplot import * from java.util import Random from jhplot.math.kalman import JKalman from jhplot.math.kalman.jama import Matrix kal=JKalman(4,2) rand =Random() x,y=0,0 dx,dy=rand.nextDouble(),rand.nextDouble() s =Matrix(4, 1) # state [x, y, dx, dy, dxy] c = Matrix(4, 1) # corrected state [x, y, dx, dy, dxy] m = Matrix(2, 1) # measurement [x] m.set(0, 0, x) m.set(1, 0, y) # transitions for x, y, dx, dy tr = [ [1, 0, 1, 0], [0, 1, 0, 1], [0, 0, 1, 0], [0, 0, 0, 1] ] kal.setTransition_matrix(Matrix(tr)) # 1s somewhere? kal.setError_cov_post(kal.getError_cov_post().identity()) print "first x:" + str(x) + ", y:" +str(y) + ", dx:" + str(dx) + ", dy:" + str(dy) print "no; x; y; dx; dy; predictionX; predictionY; predictionDx; predictionDy; correctionX; correctionY; correctionDx; correctionDy;"; for i in range(200): s = kal.Predict() # check state before m.set(1, 0, rand.nextDouble()) # function init x = rand.nextGaussian() y = rand.nextGaussian() m.set(0, 0, m.get(0, 0) + dx + rand.nextGaussian()); m.set(1, 0, m.get(1, 0) + dy + rand.nextGaussian()); # a missing value (more then 1/4 times) if rand.nextGaussian() < -0.8: print "", i , ";;;;;", s.get(0, 0), ";", s.get(1, 0), ";" , s.get(2, 0) , ";" , s.get(3, 0), ";" else: # measurement is ok : c = kal.Correct(m) # look better print "" , i, ";" , m.get(0, 0), ";" , m.get(1, 0), ";", x, ";", y , ";", s.get(0, 0) ,";",s.get(1, 0), ";" ,s.get(2, 0) ,";",s.get(3, 0), ";",c.get(0, 0), ";", c.get(1, 0), ";", c.get(2, 0), ";" ,c.get(3, 0),";"