图片缩略图

学习卡尔曼滤波

版本1.0.0.0 (2.83 KB 迈克尔Kleder
基础卡尔曼滤波,大量评论,适合卡尔曼滤波的初学者。
4.5
119年评级

86下载

更新10月12日

没有许可

编者按:该文件被选为MATLAB中央本周精选受欢迎的文件20082009201020112012

当我第一次学习卡尔曼滤波时,我在这里的MATLAB中央文件交换中看到了许多高级信号处理提交,但我没有看到一个被大量评论的,基本的卡尔曼滤波出现,允许卡尔曼滤波器的新手学习如何创建它们。所以,一年后,我写了一个非常简单的,大量注释的离散过滤器。

引用作为

迈克尔·克莱德(2021年)。学习卡尔曼滤波(//www.tianjin-qmedu.com/matlabcentral/fileexchange/5377-learning-the-kalman-filter), MATLAB中央文件交换。检索

评论及评分(174

李junfang

巴拉特Charuku

乔·吉布斯

Ahmad Mujahid bin Turin

未定义的。该怎么办?

费德里科•Rodari

马赫迪Torabi

备忘录

曼德拉ouafo

山姆

yarzar Tun

雷德易卜拉欣

非常感谢!

Amir Allahverdi zadeh

Alireza R的

赛义德Resalat

至岑溪邹

我不能在开始时运行文件,错误显示:脚本中的所有函数必须以“结束”关闭。
在函数中,我很难理解if…其他的……为什么会有结局?
有人能帮我吗?

约翰•路易斯

天使费尔南德斯

恕我直言,这个kalmanf(s)是错误的。
应该如下所示。这产生了很好的结果。

函数s = kalmanf(s)
%步骤1:计算卡尔曼增益因子:
K = s.P*s.H'*inv(s.H*s.P*s.H'+s.R);
%第二步:根据观察进行修正:
s.x = s.x + K'*(s.z-s.H*s.x);
%step3:更新错误
s.P = s.P - K*s.H*s.P;
返回

Meysam Tavakoli

我已经开始研究卡尔曼滤波在参数估计中的应用。我的问题有点奇怪:
我们有一个简单的系统,有两种状态(x, y)和两种速率(K1, K2)。
我们的方程是:

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

我在寻找参数(a, b, K1, K2)
还有Z(x)和Z(y)的实际数据点
如何用卡尔曼滤波解决这个问题?

李郝

谢谢楼主分享!

高等商学院

你好,

我放入一个带有噪声的观察向量,我得到了一个错误信息:

未定义函数或变量z。

kalmanf错误(第150行)
如果~ isfield(年代,“x”);s.x =南* z;结束

有人能帮帮我吗

成成周

非常感谢!

Lyudmil Vladimirov

这是试图在M-script中定义m -函数的常见错误。在这里看看解释:

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

我猜您尝试做的只是取消注释示例代码并运行该文件。相反,在新脚本中复制/剪切并粘贴括号内的代码,并尝试运行该脚本。希望这能有所帮助!

Perparim Fetahi

你好,我得到以下错误,谁能告诉我是什么问题?

错误:文件:kalmanf。m行:147列:1
在此上下文中不允许函数定义。

埃文·卢卡斯

阮曼彤

拜托!给我一个卡尔曼夫函数的例子。

萨米人奥马尔

嘿,伙计们,
我新matlab,我试图实现卡尔曼滤波器与正弦波是可能的?

Auralius Manurung

第173行,文件kalmanf.m

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

这是错误的,它应该是:

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

这个例子也有误导性,参见Yi Cao(2008年1月25日)的评论,因为be不应该是= 0,而B应该是= 1。

湘曹

Yiman

谢谢,我喜欢

kushwinder辛格

非常有帮助

Carlos M. Velez S。

Simulink中线性卡尔曼滤波的一个很好的补充:万博1manbetx//www.tianjin-qmedu.com/matlabcentral/fileexchange/46407-linear-kalman-filter-in-万博1manbetxsimulink

Koranit

Koranit

天使洛佩兹

非常有用! !非常感谢。

安东尼

如何查看文档

亚伦Schurger

对于我们这些刚接触卡尔曼滤波的人来说,这是很好的资源。谢谢你!如果系统的状态是由向量而不是标量给出的呢?卡尔曼滤波在n维情况下是否有效?如果我想在一组数据上训练过滤器,然后把它应用到另一组数据上,我该怎么做呢?如果我的观察结果是两个或两个以上的信号加上噪声的总和呢?我如何“告诉”卡尔曼滤波器我想让它估计哪些信号?

百合科

文档很好,易于理解。

百合科

Aliakbar Alamdari

非常好的实现。但是卡尔曼滤波块有一个小错误。在传播方程中,1/Z必须放在其他地方。我们有P(k+1) = ap (k)A' + q在这部分后面我们需要加上1/z得到P(k)

jakub

换句话说,如果它们存储在我的data.mat中,如何绘制它们的值?
“情节”是否相同,而我必须使用循环“for”?
直接问关于代码示例,它在这里我处理了几个小时。

jakub

我的情况:

>>清楚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.z,“r”。)
> >香港=情节(年代,b -)

使用绘图错误
不可能从struct转换为double类型。

问题在哪里?

谢谢你

张蓝

蒂姆

蒂姆

我是K滤波的新手,我不理解以下内容:协方差矩阵P似乎只是以下输入的函数:a(由系统定义),P(本身),Q(已知的P .噪声cov.)和H(典型的身份),而且卡尔曼增益K。K本身只是P, H和R(已知的m.噪声cov.)的函数。

除了P,在迭代过程中这些都没有被重新定义。那么协方差矩阵P的估计是如何与观测z联系起来的呢?这样做的结果似乎是卡尔曼增益在第三次或第四次迭代时激增,使输出反映了有噪声的输入。我认为这似乎也是Enver Bahar所注意到的。

娜迦族VBN

实际上,我得到的错误s没有定义,我能做什么,这个例子给了我一个想法。

马库斯·施密特

谢谢你Shamir Alavi。

沙米尔Alavi

【整改到上面的帖子】:sry, 's'不是测量数据。你的数据在这里输入“s.z”。

马库斯·施密特

有一个错误

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

> > kalmanf(年代);
未定义函数或变量z。

kalmanf错误(第150行)
如果~ isfield(年代,“x”);s.x =南* z;结束

有人能解释一下为什么吗?

weijie

你太棒了

vamshi

有用且清晰的评论

会夺得e

谢谢,但是在运行这个演示时出现了一个错误。
输入参数“s”未定义
请帮帮我

曹国伟

鲁班Sugumar

很好的解释. .
真的很有帮助。

格雷格

很好地记录。
作为一个实践工程师,我永远不会使用所示的实现。这是卡尔曼滤波的标准协方差形式。在操作中,语句
s.P = s.P - K*s.H*s.P;
导致重大问题。s.P需要始终是正定的,但是四舍五入往往会违反这一假设,使卡尔曼滤波“爆炸”的时间或条件差的数据。

另一种方法是在平方根域中处理,其中P矩阵表示为P=Psr'*Psr。因此得到的矩阵必须总是正定的,没有这个问题。一个额外的优点是精度是在该领域的两倍处理,可以类似于输入数据分辨率,而不是提供相当精度的2倍位数。

有关更多信息,请参见
'线性估计' Kailath, Sayed, Hassibi或
“自适应滤波理论”海金

我认为应该总是在SR域进行过滤。如果下位数据复杂,处理分离的真实/图像数据也有优势。

prokash保罗

漂亮的医生

lotfi

好!

埃德加lobachevskiy

优秀的! !谢谢你! !

刘Kefeng

非常感谢!

哈里克里希南

女士垫

这和控制系统工具箱中的卡尔曼实现有什么区别?

乌鸦

恋人MSwamy

Sudhakar reddy akki

亨利·朱

亲爱的Michael Kleder,谢谢你!

奥斯曼Ozkaraca

太爱你了,你的样本比那些专业人士写的书更有帮助。简单,直接。尤其是对初学者。

非常感谢你的解释。

但是,我有一个简单的问题,为什么当我们给出很高的测量噪声时,结果不会改变?
在你的例子中,你给出的标准差是2,但当我把它设为1000时,它的估计是完美的。不应该改变吗?

有人能给我解释一下吗?
非常感谢

丹尼尔Armyr

很好的注释,byt不幸的是,代码有几个地方是错误的。它绝对不会处理向量输入,如果没有提供一些定义为可选的输入,则会导致程序崩溃。对于一个在文件交换中排名靠前的文件,我的期望要高得多。

理查德。

太棒了!现在说得通多了。谢谢。

史蒂夫·G

非常清晰的KF的例子,但对于处理状态向量来说还不够普遍。例如,s.x = inv(s.H)*s.z;和s.P = inv(s.H)*s.R*inv(s.H’)在状态数和测量数不相同的情况下不能工作。

狒狒LikesBananas

大安迪

joybing

谢谢楼主分享!

Erdal Bizkevelci

Venche

非常好!

约翰D

[续自上文]

不出所料,我的矩阵错了!

谢谢你举的例子!

约翰D

[续自上文]

我已经解决了这个问题,修改行为;

>> s.x = s.x + K' * (s.z-s.H*s.x);%加上K的转置

这是必要的,因为我的观察向量(z)是一个2X1矩阵(K也是,因此它们不能相乘)。虽然计算现在工作,我仍然想知道为什么它不工作与原始代码。

约翰D

我在修正步骤中得到一个错误。
>> s.x = s.x + K*(s.z-s.H*s.x);

错误使用= = > mtimes
矩阵内部维度必须一致

考虑到矩阵的大小,误差是有意义的,但我看不出它们怎么会出错。这段代码是否不能用于一个有两个观察者输入(位置和速度)的系统?

谢谢你的帮助!
Ps:如果你需要更多的信息,请让我知道-尽量保持简短。

?

非常感谢。

史蒂文

学习的例子

感谢你的

vu

托托

干得好!

Gervasio

非常有帮助,尽管我想看一个控制向量u的例子。

Raja mohd zaidi Raja ibrahim

你好,

有没有人在学习卡尔曼滤波时得到了正确的解。
你可以用电子邮件发送文件吗?M对我来说,rmzaidi8@gmail.com
我已经运行文件,但有很多错误。
请帮帮我。
谢谢。

naini纳文

很好

Shivaram

我见过的最优秀的KF实现!

benouis穆罕默德

谢谢

迈克尔乔丹

Prasetyo Utomo

非常感谢

穆罕默德·霍拉米·阿拉尼

谢谢

蒂姆•戴维斯

不错的评论。可怕的数字。为什么要考虑乘以逆矩阵呢?这是非常不准确和缓慢的。取代

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

至少是这样

x = H\z
P = (h \ r)/ h '

同样的

K = P * H' * inv(很多东西)

应该是

K = P * H' /(很多东西)

此外,如果H不变,则只分解一次,保留因子(LU或CHOL)。

一些古普塔

谢谢分享。:)

Imtiaz侯赛因

确实非常有用

Sid Saraiya

这对于像我这样的初学者来说非常有用。一个伟大的帖子!

Behnam Molaee Ardekani

对于那些第一次想知道什么是卡尔曼滤波的人来说很好。
它可以工作,在m文件中有一个简单的例子。

Sahil聊Ganguly

我一直得到这个错误,有人能解释我做错了什么吗?

kalmanf ? ?输入参数“s”未定义。==> kalmanf在150 if ~isfield(s,'x')错误;s.x =南* z;结束

bekir pasaoglu

伟大的

穆罕默德pumma

好吧

易曹

这是文件交换中非常流行的一个文件。这个函数本身很好。然而,我刚刚注意到该文件提供的示例是不正确的。不知何故,它会误导初学者。

在第131行中,流程定义为:
True (end+1) = randn*2 + 12;
也就是说,状态是一个常数加上一个噪声。如果是这样,标准状态空间形式中的流程应该是:
X (k+1) = 0 * X (k) + 12 + w(k)
即s.A = 0;s.B = 1;S.u = 12;
然而,在文件中它被错误地定义为:
s.A = 1;s.B = 0;S.u = 0;
不同的是在前一种定义中过程噪声不是动态累积的,而在后一种定义中过程噪声是动态累积的。

马克·卢克

詹姆斯Hokanson

Arsalan汗

我可以从这个文档中理解卡尔曼滤波,我打赌任何人都可以。

兰迪·科尔曼

王毅

很好

p .麦克纳马拉

小心些而已。我们也在查看你的下载记录。

djeunang林

我想要一个卡尔曼滤波器

Utkarsh白肢野牛

Duong Minh Au

Hamid reza ghazizadeh

干式气体过滤器如何计算
天然气呢?请

x王

sk imtiaj

这很好

Bouchemmella abdelhalim

我想要这个参考

穆罕默德·阿里·阿拉巴奇

实际上,我在卡尔曼滤波问题上不是初学者。但是,我认为这是一个非常有用的工具,我希望当我第一次开始与卡尔曼工作时,我得到了这个m文件。因为,对于初学者来说,掌握问题的最简单形式并通过模拟程序看到它的解决方案是非常重要的。

SOURAV DAS

这是一个非常友好的用户,推荐

爱德华·泰勒

非常容易使用,推荐使用。

祝一永祝一永

很好

罗德里戈Badinez

良好的演示。
您可能应该将示例分离到另一个名为RunMeDemoKalman的m文件中。
对于真正的初学者。

赖zuomei

对我来说是一个很好的演示!

徐郑

非常好的工具
非常感谢

Rajesh克里希南

今天shoormij

离散卡尔曼滤波器

v ram

方式Jch

u v

卡里姆纪子

最好是将注释从m.file中分离出来,并以pdf格式将它们添加为“帮助”。

ravindar reddy

Tansel Yucelen

同样的错误!!

MORSHED马哈茂德

卡•古普塔

我得到了同样的错误:

kalmanf
???输入参数“s”未定义。

错误在==> kalmanf在150
如果~ isfield(年代,“x”);s.x =南* z;结束

clayonjj哈里森

我喜欢的解释,但我不能运行文件弹出以下错误。帮助!!


kalmanf
???输入参数“s”未定义。

错误在==> kalmanf在150
如果~ isfield(年代,“x”);s.x =南* z;结束

邵理塘寺

我需要卡尔曼滤波程序。

迪奥普巴拉

Colin O 'Flynn

谢谢你!很好的卡尔曼滤波的介绍,即使你不用Matlab。

ti脚趾

你必须先设置matlab,然后使用工作区运行

Bing李

尝试用A\B替换inv(A)*B来加速,尽管当矩阵大小很小的时候这并不显著

张志贤柴

我尝试在matlab中运行“学习卡尔曼滤波器”,但我不能运行它。
我可以知道如何运行这个文件吗?呢?

印第安纳琼斯

卡洛斯Orduno

这是我找到的开始使用卡尔曼滤波器的最佳来源。你有非线性版本的吗?

卡米洛·Lozoya

哲人内森

弗朗茨·迪特里希

代码中的有用注释。

爱德华多·维拉

法国航空猎鹰

它的伟大。

Xuewu戴

对理解卡尔曼滤波非常有用

卡洛斯Roldan称

罗伯特Kaddu

非常好的总结,比Matlab帮助函数提供的更有意义。

亚历山大·爱德华多

很好

Mehdi Sanaatiyan

第一次吃挺好的。完全没有

Rafal G。

简单,漂亮,优秀:-))非常感谢!!

克梅西奥·卡德纳斯·洛佩斯

好吧

扎希德·乌拉·汗

毫无疑问,它很好。

shobi库马尔

优秀的apporach
但是我不能经营这个项目
请帮帮我

Tsanko Tsankov

解释某事的好方法。再接再厉!但是,(在自动初始化步骤)有一些错误。不管怎样,我还是不太理解卡尔曼滤波的用法。给出的例子很好,但是我仍然不知道如何将这个过滤器应用到我的数据中。

门口的萨利姆

Rentian熊

不错的工作。如果有一个向量状态的例子就更好了。如果有人能把卡尔曼滤波算法放到simulink中,这样我们就能动态地看到状态的估计,那就太棒了。万博1manbetx当然,非线性系统的扩展卡尔曼滤波器也很有用。

李yk

你能给我样品的价值吗?
我还是没有完全理解。

蒂姆Gebbie

非常有趣。非常整洁。

失败失败

ARLINDA SAQELLARI

很好,我喜欢这个主意

Daniel O. Fufa

很好
谢谢丹尼尔
Aalborg大学

施拉瓦希德荷

这是一个非常好的例子,展示了应用卡尔曼滤波是多么容易。然而,它确实需要一些背景知识。如果有一个更复杂的例子u不为零H和a不等于1就更好了。谢谢迈克尔!

刘宝隆

你是一个伟大的导师!
我真的很感激。
非常感谢。

ARLINDA SAQELLARI

朱利亚诺Scimone

西蒙酒鬼

很有帮助。谢谢! !

Hooman Dejnabadi

托马斯·伯恩

优秀的! !谢谢你!

Vassilios穆萨

紧凑,文档完善,非常好的初始化和结构的使用。

Giap Do van

太棒了!

MATLAB版本兼容性
使用R11.1创建
与任何版本兼容
平台的兼容性
窗户 macOS Linux

社区寻宝

在MATLAB中央找到宝藏,并发现社区可以如何帮助你!

开始狩猎!