首页 > 编程知识 正文

c语言实现实现滤波器(c语言单片机算法)

时间:2023-05-05 00:19:59 阅读:75275 作者:4444

读了几篇文章,终于能写一点自己的理解了。 首先,使用这个算法必须先了解它的公式,但要理解公式必须有概率论的基础。 我现在就没有,所以很无知,很多地方都不清楚。 本文主要谈卡尔曼的简单应用,因此一维卡尔曼滤波器的应用,既是存在单变量,又是单传感器的输入。 所以,直接给出简单场景下的公式,不推导公式更容易理解,更容易得到。

最简化的表达式:

这里,下标k指的是当前状态。 举个例子,假设现在你要测量不同时间的室内温度,这个下标k是指时间,带下标的参数或变量是指k小时内的某个值。

是当前的估计值。 (本论文所称估计值,是指利用卡尔曼公式得到的计算结果。

如果是wydfy (不管wydfy是什么,只要知道这个名词就可以了);

现在的测量值,也就是机器测量的值

之前状态的估计值。

接下来,用简单的例子(电压测量)说明应用卡尔曼滤波算法的过程。

虽然想直接给出简单情况下的三个简单公式,但是让我们来给出最原始的几个公式吧。

步骤1 :建模

首先,请确认模型是否为线性。 当然,既然是简单场景中的东西,基本上满足线性,所以有以下公式。

()

())为

是系统的控制量,在我们说的简单场景中一般没有控制量,所以这个可以直接关掉。

a、b、h都是系统参数,在多维情况下是矩阵,但在我们说的简单情况下是常数,基本上是值为1的常数。

——符合大蜗牛分布的过程噪声,其协方差为q

——符合大蜗牛分布的测量噪声,其协方差如下

上述噪声在我的理解中是所谓的误差。 不管一个仪器多么精密,都一定有误差。 只是误差的大小不同。

为了进入下一步,给出了几个公式。

() )为

() )为

)

)

是随时间更新的方程,即预测值是随测量值的变化而变化的,是应用卡尔曼滤波算法得到的比较准确的估计值,可以说是更正值。

到的一些公式现在看起来还是很高级的,但正如我前面所说,在简单的情况下应用a、b、h的一些参数是常数,而且基本上是1,所以这些公式很简单。 我建议用自己的手写来增加形象。 如果不愿意也没关系的话,我给你看。 以下表示原来的公式。 这将是我们需要的简化的第一个表达式。 从这里类推。

1

=

() ) ) ) ) )。

程序很容易实现。 使用迭代就可以了。 接下来只要确定了x和p的初始值,程序就能跑了。 但是,正因为卡尔曼滤波算法强大,所以没有必要烦恼初始值应该做什么。 只需提供初始值即可执行程序,但卡尔曼滤波器自身会消除不合理之处,请尝试设定

=0,

=1。 注意: p的初始值不能为0。 p为0意味着完全相信测量结果,认为测量没有误差。 这样的设备不存在,卡尔曼滤波器不起作用。 这表明,p越接近0,越相信机器的测量结果。

全程最困难的不是决定协方差r和q的值。 r的值也许我们可以很好地确定。 一般情况下,我们可以很好地了解仪器的测量误差,这需要自己推测和计算。 但是,q超出了我的能力范围,所以这里就不谈如何调整了。 参数的值决定了精度。 如果你想知道如何调整参数,请阅读以下文章。 有详细的解说。

卡尔曼滤波的简单实现(Matlab OC ) -简单的书

另外,虽然不知道为什么在中将工艺噪声也直接进行了0化处理,但不会影响应用,所以在此不做说明。 有疑问的朋友如果感兴趣可以自己再去别的学习。 以下是数据。 请试着实现一下程序得到的结果是否相同。

图1

如果是这样的话,得到的结果应该如下

图2

然后,展示给大家直观感受卡尔曼滤波伟大的图表

="center">

图三

在图中我们可以看到曲线是在变平稳,像是在趋向某个值。

讲到这,一个简单应用的示例基本讲完了,下面展示我的代码:#include

#include

int main()

{

double R,z,p,x,k;

printf("X = ");

scanf("%lf",&x);

printf("P = ");

scanf("%lf",&p);

printf("R = ");

scanf("%lf",&R);

printf("Z = ");

while(scanf("%lf",&z) != EOF)//kalman algorithm

{

k = p / (p+R);

x = x + k * (z-x);

p = (1-k) * p;

printf("k=%.3f x=%.3f p=%.3fnZ = ",k,x,p);

}//end

return 0;

}

上面是个需要靠手纯输入的,可以利用文本输入输出来进一步完善,只需要简单的几行代码就行。如需要完整的应用代码可至此处进行下载:提取码:mnh4或者卡尔曼滤波算法一维多传感器的简单应用_C语言.zip 里面包含有数据,以及使用Excel进行数据处理的可视化结果。

写文章是个技术活,想要表达清楚更是技术活,本文语言比较拙劣,想要更清晰理解的可以阅读下面这篇文章,本文主要参考的对象就是它:

Bilgin's Blog | Kalman Filter For Dummies

这些只是我的理解,错误在所难免,还请批评指正。

好了,本文到此结束。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。