File Exchange

## Learning the Kalman Filter

version 1.0.0.0 (2.83 KB) by Michael Kleder

### Michael Kleder (view profile)

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

101 Downloads

Updated 12 Oct 2005

No License

Editor's Note: This file was selected as MATLAB Central Pick of the Week Popular File 2008 2009 2010 2011 2012

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.

### Cite As

Michael Kleder (2020). Learning the Kalman Filter (https://www.mathworks.com/matlabcentral/fileexchange/5377-learning-the-kalman-filter), MATLAB Central File Exchange. Retrieved .

Joe Gibbs

### Joe Gibbs (view profile)

Ahmad Mujahid bin Turin

### Ahmad Mujahid bin Turin (view profile)

s undefined. what to do?

Federico Rodari

Mahdi Torabi

Mustafa Jafari

Mandela ouafo

sam

Yar Zar Tun

Raed Ibrahim

### Raed Ibrahim (view profile)

Thanks a lot!

Amir Allahverdi zadeh

Alireza R

Seyed Resalat

chenxi zou

### chenxi zou (view profile)

I can not run the file at the beginning, error shows: All functions in a script must be closed with an 'end'.
and in the function, I have problem to understand the if... else...why there is end in it?
Could anyone please help me?

john lewis

Angel Fernandez

### Angel Fernandez (view profile)

IMHO this kalmanf(s) is wrong.
It should be as posted below. That gives good results.

function s = kalmanf(s)
%step 1: Compute Kalman gain factor:
K = s.P*s.H'*inv(s.H*s.P*s.H'+s.R);
%step 2: Correction based on observation:
s.x = s.x + K'*(s.z-s.H*s.x);
%step3: update error
s.P = s.P - K*s.H*s.P;
return

Meysam Tavakoli

### Meysam Tavakoli (view profile)

I have started to work on application of Kalman filter to estimate parameters. My question is a little strange:
we have a simple system with 2 states (x, y) and 2 rates (K1, K2).
our equations are:

dx/dt = - K1*x + K2*y
dy/dt = K1*x - K2*y
Z(x)=a*x
Z(y)=b*y

and I am looking for the parameters (a, b, K1, K2)
also we have the actual data points for the Z(x) and Z(y)
How do I can solve this problem with Kalman filter?

Hao Li

### Hao Li (view profile)

thank you for sharing

HEC

### HEC (view profile)

hello,

I put a vector of observations with noises and I got an error message :

Undefined function or variable 'z'.

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

can someone help me please

Chengcheng Zhou

### Chengcheng Zhou (view profile)

Thanks a lot!

Lyudmil Vladimirov

### Lyudmil Vladimirov (view profile)

Perparim, this is a common mistake of trying to define an M-function inside an M-script. Have a look at the explanation here:

http://uk.mathworks.com/matlabcentral/answers/18401-please-help-error-function-definitions-are-not-permitted-in-this-context

What I am guessing you tried to do is simply un-comment the example code and run the file. Instead, copy/cut and paste the code within the brackets in a new script and try running that instead. Hope this helps!

Perparim Fetahi

### Perparim Fetahi (view profile)

Hello, I am getting the following error, can anyone tell me what is the issue?

Error: File: kalmanf.m Line: 147 Column: 1
Function definitions are not permitted in this context.

Evan Lucas

### Evan Lucas (view profile)

Nguyen Manh Tuong

### Nguyen Manh Tuong (view profile)

Please! Give me a example of kalmanf function.

sami omar

### sami omar (view profile)

hey guys,
Im new to matlab, Im trying to implement Kalman filter with sin wave is that possible?

Auralius Manurung

### Auralius Manurung (view profile)

Line 173, file kalmanf.m

s.P = s.A * s.P * s.A' + s.Q;

this is wrong, it should be:

s.P = s.A * s.P * s.A' + s.B * s.Q * s.B';

the example is also misleading, see cooment by Yi Cao (25 Jan 2008) since be should not be = 0 but B should be = 1.

Xiang CAo

Yiman

### Yiman (view profile)

thank you,I like it

kushwinder singh

### kushwinder singh (view profile)

its very helpful

venugopal kulkarni

### venugopal kulkarni (view profile)

Carlos M. Velez S.

Koranit

Koranit

Angel Lopez

### Angel Lopez (view profile)

very useful!! Thanks a lot.

anthony

### anthony (view profile)

how do i view the document

Aaron Schurger

### Aaron Schurger (view profile)

Excellent resource for those of us who are new to Kalman filtering. Thank you! What if the state of my system is given by a vector rather than a scalar? Can Kalman filtering work in n dimensions? If I want to train the filter on one set of data and then apply it to another, how would I do that? What if my observations are a sum of two or more signals, plus noise? How do I "tell" the Kalman filter which of the signals I want it to estimate?

liliaceae

### liliaceae (view profile)

nice documentation and easy to understand.

liliaceae

### liliaceae (view profile)

Aliakbar Alamdari

### Aliakbar Alamdari (view profile)

Very nice implementation. But there is a minor mistake in the Kalman filter block. In propagation equation, 1/Z must be placed in somewhere else. We have P(k+1) = A.P(k).A' + Q. after this part we have to put 1/z to get P(k).

jakub

### jakub (view profile)

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.

jakub

### jakub (view profile)

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

zhang blue

Tim

Tim

### Tim (view profile)

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.

NAGA VBN

### NAGA VBN (view profile)

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

Markus Schmidt

### Markus Schmidt (view profile)

thank you Shamir Alavi.

Shamir Alavi

### Shamir Alavi (view profile)

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

Markus Schmidt

### Markus Schmidt (view profile)

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?

weijie

you are awesome

vamshi

### vamshi (view profile)

Carolina Brum Medeiros

### Carolina Brum Medeiros (view profile)

helpful and clear comments

Roja e

### Roja e (view profile)

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

chao

Ruban Sugumar

### Ruban Sugumar (view profile)

Nice Explanation..
Really Helpful..

greg

### greg (view profile)

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.

For more information see
'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.

prokash paul

nice doc

lotfi

### lotfi (view profile)

good !

Edgar lobachevskiy

### Edgar lobachevskiy (view profile)

excellent!! Thank you!!

Liu Kefeng

### Liu Kefeng (view profile)

thank you very much!

HARI KRISHNAN

Ms. Mat

### Ms. Mat (view profile)

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

Raven

Karthik MSwamy

### Karthik MSwamy (view profile)

SUDHAKAR REDDY AKKI

Henry Zhu

### Henry Zhu (view profile)

Dear Michael Kleder,thank you !

osman Özkaraca

good

zheng

### zheng (view profile)

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

Joan

Enver

### Enver (view profile)

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

Daniel Armyr

### Daniel Armyr (view profile)

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.

Richard

### Richard (view profile)

awesome! makes so much more sense now. thanks.

Steve G

### Steve G (view profile)

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.

Baboon LikesBananas

Big Andy

joybing

### joybing (view profile)

thank you for sharing!

Erdal Bizkevelci

Venche

sehr gut!

John D

### John D (view profile)

[continued from poste above]

As expected my matrices were wrong!

Thanks for the example!

John D

### John D (view profile)

[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.

John D

### John D (view profile)

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.

?

### ? (view profile)

Thanks very much.

Steven

### Steven (view profile)

Examples Learn By

### Examples Learn By (view profile)

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

chen

thank your

vu

good

Toto

Great job !

Gervasio

### Gervasio (view profile)

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

RAJA MOHD ZAIDI RAJA IBRAHIM

### RAJA MOHD ZAIDI RAJA IBRAHIM (view profile)

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.
Please help me.
Thank.

naini naveen

very good

Shivaram

### Shivaram (view profile)

Excellent KF implementation I have ever seen!

benouis mohamed

thanks

Michael Jordan

Prasetyo Utomo

### Prasetyo Utomo (view profile)

Thanks very much

mohammad khorrami arani

Thanks

Tim Davis

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).

Vipin Gupta

Thanks for sharing. :)

Imtiaz Hussain

Very Useful Indeed

Sid Saraiya

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

Behnam Molaee Ardekani

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.

Sahil Ganguly

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

bekir pasaoglu

great

mohamed pumma

ok

Yi Cao

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.

marc luc

James Hokanson

Arsalan Khan

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

Randy Coleman

wang yi

very good

P. McNamara

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

djeunang brigitte

i want a kalman filter

Utkarsh Gaur

Duong Minh Au

hamid reza ghazizadeh

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

X. King

sk imtiaj

this is very good

Bouchemmella abdelhalim

I want this refference

mehmet ali arabaci

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.

SOURAV DAS

It is a very user friendly, recommended

Edward Taylor

Very easy to use, recommended.

zhu Yi Yong zhuyiyong

very good

Rodrigo Badínez

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

lai zuomei

a good demo for me!

xu zheng

very good tools
thank you very much

Rajesh Krishnan

fatemeh shoormij

discrete kalman filter

v ram

Way Jch

u v

karim kiko

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

ravindar reddy

Tansel Yucelen

Same Error !!!

MORSHED MAHMUD

Priyanka Gupta

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

clayonjj Harrison

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

shao litang

I need Kalman Filter program.

diop bara

good

Colin O'Flynn

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

ti toe

you have to set up matlab first and run with workspace

Bing Li

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

Teo chai

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

Indiana Jones

Carlos Orduno

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

Camilo Lozoya

swami nathan

Franz Dietrich

Useful Comments in Code.

Eduardo Veras

akher falcon

its great.

Xuewu Dai

Very Useful for understanding Kalman Filter

Carlos Roldan

Robert Kaddu

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

ALEXANDRE EDUARDO

VERY GOOD

Mehdi Sanaatiyan

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

Rafal G.

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

nemesio CARDENAS LOPES

ok

Zahid Ullah Khan

Its nice, no doubt.

shobi kumar

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

Tsanko Tsankov

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.

ammar saleem

Rentian Xiong

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.

lee yk

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

Tim Gebbie

Very fun. Very neat.

Flop Flop

ARLINDA SAQELLARI

very good, I like the idea

Daniel O. Fufa

very good
Thanks Daniel
Aalborg university

Nathir Rawashdeh

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!

Liu Baolong

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

ARLINDA SAQELLARI

Giuliano Scimone

Simon Tippler

Very helpful. Thanks!!

Hooman Dejnabadi

Thomas Byrne

Excellent!! Thank You.

Vassilios Moussas

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

Giap Do van

great!

### Updates

 12 Oct 2005 1.0.0.0 comment change
##### MATLAB Release Compatibility
Created with R11.1
Compatible with any release
##### Platform Compatibility
Windows macOS Linux