### Highlights fromLearning the Kalman Filter

4.44944

4.4 | 91 ratings Rate this file 426 Downloads (last 30 days) File Size: 7.16 KB File ID: #5377

# Learning the Kalman Filter

30 Jun 2004 (Updated 12 Oct 2005)

Basic Kalman filter, heavily commented, for beginners to Kalman filtering.

### Editor's Notes:

This file was selected as MATLAB Central Pick of the Week

File Information
Description

When I first studied Kalman filtering, I saw many advanced signal processing submissions here at the MATLAB Central File exchange, but I didn't see a heavily commented, basic Kalman filter present to allow someone new to Kalman filters to learn about creating them. So, a year later, I've written a very simple, heavily commented discrete filter.

Acknowledgements
MATLAB release MATLAB 5.3.1 (R11.1)
Other requirements None.
Tags for This File
Everyone's Tags
Tags I've Applied
Comments and Ratings (134)
10 Apr 2013

In other words, how to draw their values​​, provided they are stored in my data.mat?
Will the "plot" are the same and I have to use a loop "for"?
Ask directly about the code sample, it's here I deal with a couple of hours.

09 Apr 2013

My case:

>> clear s
>> s.x = 12;
>> s.A = 1;
>> s.Q = 2^2;
>> s.H = 1;
>> s.R = 2^2;
>> s.B = 0;
>> s.u = 0;
>> s.x = nan;
>> s.P = nan;

>> s.z = [1 2 3 4 5 6 7 8 9 22 3 4 5 6 7 8 88];
>> kalmanf(s);

>> figure
>> hold on
>> grid on
>> hz=plot(s.z,'r.')
>> hk=plot(s,'b-')

Error using plot
Conversion to double from struct is not possible.

Where is the problem ?

Thank u

13 Feb 2013
07 Feb 2013
07 Feb 2013

I am new to k. filtering, and I don't understand the following: the covariance matrix P appears to be only a function of the following inputs: A (defined by the system), P (itself), Q (known p.noise cov.), and H (typically identity), and also the Kalman gain K. K itself is a function only of P, H, and R (known m.noise cov.).

None of these are re-defined during iteration except P. How then is the estimate of the covariance matrix P tied to observations z? The result of this appears to be that the Kalman gain explodes by the third or fourth iteration, making the output mirror the noisy input. This seems to be what Enver Bahar is noticing too, I think.

22 Jan 2013

Actually iam getting the error s not defined what can i do for this and this example gives v.gud idea.

09 Jul 2012

thank you Shamir Alavi.

09 Jul 2012

[rectification to the post above]: sry, 's' is not the measurement data. your data goes into 's.z' here.

09 Jul 2012

got an error with

>> s = [1 2 3 4 5 6 7 8 9 22 3 4 5 6 7 8 88];

>> kalmanf(s);
Undefined function or variable 'z'.

Error in kalmanf (line 150)
if ~isfield(s,'x'); s.x=nan*z; end

Can someone explain me why pls?

22 Jun 2012

you are awesome

18 Jun 2012
13 Mar 2012

25 Feb 2012

Thanks..but an error occurred while running this demo.
Input argument "s" is undefined

18 Feb 2012
11 Feb 2012

Nice Explanation..

05 Aug 2011

Nicely documented.
As a practicing engineer I would never use the implementation shown. This is the standard covariance form of the Kalman filter. In operation the statement
s.P = s.P - K*s.H*s.P;
causes significant issues. s.P needs to always be positive definite but with rounding this will tend to violate this assmption making the Kalman filter 'blow up' over time or with poorly conditioned data.

The alternative is to process in the square root domain where the P matrix is expressed as a P=Psr'*Psr. Therefore the resuting matrix must always be positive definite and does not have this issue. An added advantage is the precision is doubled processing in this domain and can be similar to the input data resolution rather than 2x the number of bits to provide comparable precision.

'Linear estimation' Kailath, Sayed, Hassibi or
'adaptive filter thoery' Haykin

IMHO one should always to filtering in the SR domain. There are also advantages of processing with separated real/imag data rather then complex if the underling data is complex.

22 Jul 2011

nice doc

16 Jul 2011

good !

27 Jun 2011

excellent!! Thank you!!

02 Jun 2011

thank you very much!

26 May 2011
10 Apr 2011

What is the difference between this and kalman implementation in Control System toolbox ?

01 Apr 2011
29 Mar 2011
23 Feb 2011
15 Jan 2011

Dear Michael Kleder,thank you !

24 Nov 2010

good

22 Nov 2010

love you so much, your sample is more helpful than those books wrote by some professional guys. easy, straightforward. especially for beginners.

12 Nov 2010
25 Oct 2010

Thanks a lot because of your great explanation.

But, I have a simple question, why results don't change when we give very high measurement noise?
You gave standart deviation as 2 in your example, but when I make it for example 1000, it estimates perfectly. Doesn't supposed to change?

Can anyone explain this to me?
Thanks a lot
-Enver

24 Sep 2010

Good commenting, byt unfortunately, the code is wrong in several places. It absolutely does not handle vector inputs and some inputs that are defined as optional will cause the program to crash if they are not provided. From a file that is top ranked on the file exchange, I expected alot more.

23 Sep 2010

awesome! makes so much more sense now. thanks.

19 Aug 2010

Very clean example of KF, but not general enough to deal with state vectoc. For example, s.x = inv(s.H)*s.z; and s.P = inv(s.H)*s.R*inv(s.H') would not work if number of state and number of measurement are not the same.

17 Aug 2010
11 Aug 2010
21 Jul 2010

thank you for sharing!

12 Jul 2010
10 Jun 2010

sehr gut!

09 Jun 2010

[continued from poste above]

As expected my matrices were wrong!

Thanks for the example!

09 Jun 2010

[continued from poste above]

I have solved the problem by modifying the line to;

>> s.x = s.x + K' * (s.z-s.H*s.x); %added transpose of K

This was required as my observance vector (z) was a 2X1 matrix(and so is K and hence they couldn't be multiplied). Although the calculation now works I am still wondering why it doesnt work with the original code.

08 Jun 2010

I get an error during the correction step.
>> s.x = s.x + K*(s.z-s.H*s.x);

Error using==>mtimes
Inner matrix dimensions must agree

The error makes sense given the size of my matrices but I don't see how they could be wrong. Is this code expected to not work for a system with two observer inputs (position and speed)?

Thanks for the help!
ps: let me know if you need more info - tried to keep it short.

06 Jun 2010

Thanks very much.

06 Jun 2010
21 May 2010

Thank you for your hard work
http://learnbyexamples.org/category/matlab

01 Apr 2010

thank your

29 Mar 2010

good

18 Mar 2010

Great job !

03 Mar 2010

Very Helpful, although i would like to see an example with a control vector u.

13 Jan 2010

hi,

is there anyone got the right solution in learning Kalman Filter.
Could you email file.m to me, rmzaidi8@gmail.com
I've run the file given but have alot error.
Thank.

24 Jul 2009

very good

24 Jun 2009

Excellent KF implementation I have ever seen!

06 Apr 2009

thanks

26 Jan 2009
11 Nov 2008

Thanks very much

26 Sep 2008

Thanks

21 Jul 2008

Nice comments. Awful numerics. Why would you consider multiplying by the inverse? That's horribly inaccurate and slow. Replace

x = inv(H)*z
P = inv(H)*R*inv(H')

with, at least

x = H\z
P = (H\R)/H'

likewise

K = P * H' * inv (lots of stuff)

should be

K = P * H' / (lots of stuff)

further more, if H is not changing, it should be factorized just once and the factors kept (LU or CHOL).

13 Jul 2008

Thanks for sharing. :)

03 Jul 2008

Very Useful Indeed

19 Jun 2008

This was extremely useful for a beginner like me. A great post!

03 Jun 2008

Good for those who want to see what the Kalman Filter is for the first time.
It works and there is a simple example in the m file.

27 Apr 2008

I keep getting this error,can someone explain what i'm doing wrong?

kalmanf ??? Input argument "s" is undefined. Error in ==> kalmanf at 150 if ~isfield(s,'x'); s.x=nan*z; end

22 Apr 2008

great

03 Mar 2008

ok

25 Jan 2008

This is a very popular file in the File Exchange. The function itself is excelent. However, I just noticed that the example provide with the file is not correct. Somehow, it is misleading to beginers.

In line 131, the process is defined as:
true(end+1) = randn*2 + 12;
i.e. the state is a constant plus a noise. If so, the process in the standard state space form should be:
x(k+1) = 0 * x(k) + 12 + w(k)
i.e. s.A = 0; s.B = 1; s.u = 12;
However, in the file it is wrongly defined as:
s.A = 1; s.B = 0; s.u = 0;
The difference is that the process noise is not dynamically cumulated in the former definition but does in the later.

04 Jan 2008
31 Dec 2007
27 Dec 2007

I can understand Kalman filter from this document, I bet anyone can.

28 Nov 2007
27 Nov 2007

very good

06 Nov 2007

Be careful. Also we are looking at your downloads records.

19 Oct 2007

i want a kalman filter

05 Oct 2007
04 Oct 2007
11 Jul 2007

how con I find calculation of dry gas filter
for natural gas ? please

14 Jun 2007
10 Jun 2007

this is very good

07 Jun 2007

I want this refference

29 May 2007

Actually, I am not a beginner at Kalman filter issue. But, i think this is a very useful tool and i wish i got this m-file when i first started to work with Kalman. Because, it is very important for the beginners to have the simplest form of the problem and to see its solution with a simulation program.

23 May 2007

It is a very user friendly, recommended

15 May 2007

Very easy to use, recommended.

09 May 2007

very good

29 Apr 2007

Good demo.
You probably should separete the example, to another m file, named like RunMeDemoKalman.
For the really beginners.

26 Apr 2007

a good demo for me!

25 Apr 2007

very good tools
thank you very much

29 Mar 2007
28 Mar 2007

discrete kalman filter

13 Mar 2007
13 Mar 2007
08 Jan 2007
11 Dec 2006

It will be better if you separate the comment from the m.file and try to add them as "help" in a pdf format.

30 Nov 2006
14 Nov 2006

Same Error !!!

01 Nov 2006
29 Oct 2006

I get the same error:

kalmanf
??? Input argument "s" is undefined.

Error in ==> kalmanf at 150
if ~isfield(s,'x'); s.x=nan*z; end

26 Oct 2006

i like the explanation but I cant run the file the following error pops up.HELP!!

kalmanf
??? Input argument "s" is undefined.

Error in ==> kalmanf at 150
if ~isfield(s,'x'); s.x=nan*z; end

17 Oct 2006

I need Kalman Filter program.

27 Aug 2006

good

15 Aug 2006

Thank You! Great introduction to the Kalman filter, even if you don't use Matlab.

14 Jun 2006

you have to set up matlab first and run with workspace

26 Apr 2006

try to replace inv(A)*B by A\B to speed up, although it's not significant when the matrix size is small

23 Apr 2006

I try to run the "learning the kalman filter" in the matlab but i unable to run it.
May i know how to run the file? thks

13 Apr 2006
06 Apr 2006

The best source I've found to start working with Kalman Filters. Do you have anything for the nonlinear version?

29 Mar 2006
22 Feb 2006
15 Feb 2006

Useful Comments in Code.

09 Feb 2006
20 Jan 2006

its great.

13 Jan 2006

Very Useful for understanding Kalman Filter

12 Jan 2006
07 Jan 2006

Very well presented summary that makes more sense than that provide within the Matlab help function.

07 Jan 2006

VERY GOOD

25 Dec 2005

Well,it's good for first time.No at all

20 Nov 2005

Simple, pretty, excellent :-))) Thanks a lot!!

15 Nov 2005

ok

29 Oct 2005

Its nice, no doubt.

21 Oct 2005

excellent apporach
but i m unable to run this prog
plz help me

03 Aug 2005

A good try to explain something. Keep up the good work! There are, however, some mistakes (at the autoinitialization step). Anyway I still don't quite understand the use of Kalman filter. The given example is good, but I'm still confused how to apply this filter to my data.

10 Jul 2005
08 Jul 2005

Nice work. It would be better if there is an example for vector state. Also it would be very cool if someone can put Kalman filter algorithm in simulink so that we can see the estimation of states dynamically. And of course, an extended kalman filter for nonlinear system would be also very useful.

30 Jun 2005

Would you like to give me sample 's' value?
I still don't understand it perfectly.

29 Jun 2005

Very fun. Very neat.

16 Jun 2005
19 May 2005

very good, I like the idea

30 Mar 2005

very good
Thanks Daniel
Aalborg university

23 Mar 2005

This is a very good example and shows how easy it is to apply the Kalman filter. It does, however, require some background knowledge. It would be nice to have a more complicated example with non-zero u and where H and A are not =1. Thanks Michael!

23 Mar 2005

You are a great tutor !
I really appreciate it .
Thank you very much.

25 Jan 2005
21 Jan 2005
14 Jan 2005

11 Jan 2005
29 Nov 2004

Excellent!! Thank You.

05 Oct 2004

Compact, well documented, very good initialization and use of structures.

23 Sep 2004

great!