基于Hdl Coder实现卡尔曼滤波算法
总所周知,FPGA极其不擅长复杂算法的运算,但是如果项目中又涉及一些高级算法的实现,在没有可封装IP核调用的形式下,我们应该如何进行程序开发呢?今夕已经是2020年,我们一味依赖于用verilog写代码无异于用汇编写程序,这种方式无异于古时钻木取火的原始时代。如今用Matlab联调FPGA,基于simulink的Hdl Coder模块搭建算法模型,再自动生成代码才是高阶有效的终极玩法。尤其在一些信号处理领域,掌握Matlab联调FPGA的技术更是必备技能。
下面以卡尔曼滤波为例,具体讲述如何基于Hdl Coder实现卡尔曼滤波算法实现。首先简单介绍下卡尔曼滤波算法:
卡尔曼滤波(Kalman filtering)是一种利用线性系统状态方程,通过系统输入输出观测数据,对系统状态进行最优估计的算法。由于观测数据中包含系统噪声和干扰的影响,所以最优估计也可看作是滤波过程。简单来说,它就是利用过去的状态值和现在的测量值来更正现在的状态值,利用卡尔曼增益不停在估计和测量中寻找最优化的平衡值。
Kalman filtering的经典五方程,在进行卡尔曼滤波的程序设计前必须要充分理解这五个方程的定义、推导以及相关变量的设定。
(1) 对于现在状态的预测方程:
X(k|k-1)=A X(k-1|k-1)+B U(k) ……….. (1)
P(k|k-1)=A P(k-1|k-1) A’+Q ……… (2)
(2)对于现在状态的更新方程:(拿过去的真实值得到现在的预测值,再集合现在的测量值Z(k),进行现在状态值的更新)
X(k|k)= X(k|k-1)+Kg(k) (Z(k)-H X(k|k-1)) ……… (3)
Kg(k)= P(k|k-1) H’ / (H P(k|k-1) H’ + R) ……… (4)
P(k|k)=(I-Kg(k) H)P(k|k-1) ……… (5)
其中Z(k)=H X(k)+V(k)为观测方程。
对于上述方程要明确以下几个变量的赋值:
1) 状态转移矩阵:A
2) 系统控制变量:U(k)
3) 观测矩阵:H
4)系统状态初值:X(0|0)
5)系统协方差:P(0|0)
6)R:测量噪声
7)Q:过程噪声
8)Z:观测值
这7个变量要根据不同的产品以及应用场景进行具体赋值,其中对于单系统输入,变量赋值为:
1)A=1(状态转移矩阵),U(k)=0(系统控制变量), H=1(观测矩阵),B=1(对于一维变量,全为1)
2)Z观测值就是系统外部灌进来的实时变量。
3)系统协方差:P(0|0),可以采样一段时间后进行运算保证在kalman滤波器工作前进行赋值即可。
4)对于卡尔曼应用,最难确定的就是Q、R这两个噪声,只能根据实际模型,不停调整以逼近最优解。
基于上述的卡尔曼滤波搭建simulink仿真模型

下面对上述simulink模型进行进一步封装

具体设置kalman模块的Hdl Coder参数模式



最后点击“Generate HDL”与“Generate Test Bench”,生成verilog源程序与测试代码

要对执行文件进行仿真,只需要在modelsim命令框自动执行以下后缀文件即可“kalman_compile.do”,"kalman_tb_compile.do","kalman_tb_sim.do"即可。

下面进行卡拉曼滤波效果展示:

结果展示:


结果展示:

基于Hdl Coder实现卡尔曼滤波算法的更多相关文章
- Google Cardboard的九轴融合算法——基于李群的扩展卡尔曼滤波
Google Cardboard的九轴融合算法 --基于李群的扩展卡尔曼滤波 极品巧克力 前言 九轴融合算法是指通过融合IMU中的加速度计(三轴).陀螺仪(三轴).磁场计(三轴),来获取物体姿态的方法 ...
- 基于FPGA的腐蚀膨胀算法实现
本篇文章我要写的是基于的腐蚀膨胀算法实现,腐蚀膨胀是形态学图像处理的基础,,腐蚀在二值图像的基础上做"收缩"或"细化"操作,膨胀在二值图像的基础上做" ...
- 基于MATLAB的腐蚀膨胀算法实现
本篇文章要分享的是基于MATLAB的腐蚀膨胀算法实现,腐蚀膨胀是形态学图像处理的基础,腐蚀在二值图像的基础上做“收缩”或“细化”操作,膨胀在二值图像的基础上做“加长”或“变粗”的操作. 什么是二值图像 ...
- matlab中hdl coder 的使用
今天摸索了一下hdl coder的使用方法,各个步骤主要是照猫画虎,有些地方还是不理解,先总结一下: 1.要想调用quartus或者Xilinx综合布局布线需要先设置,设置的方法有两种,命令窗口输入 ...
- 基于视觉信息的网页分块算法(VIPS) - yysdsyl的专栏 - 博客频道 - CSDN.NET
基于视觉信息的网页分块算法(VIPS) - yysdsyl的专栏 - 博客频道 - CSDN.NET 于视觉信息的网页分块算法(VIPS) 2012-07-29 15:22 1233人阅读 评论(1) ...
- VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法]
VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法] - tingya的专栏 - 博客频道 - CSDN.NET VIPS:基于视觉的页面分割算法[微软下一代搜索引擎核心分页算法] 分类 ...
- 基于FPGA的肤色识别算法实现
大家好,给大家介绍一下,这是基于FPGA的肤色识别算法实现. 我们今天这篇文章有两个内容一是实现基于FPGA的彩色图片转灰度实现,然后在这个基础上实现基于FPGA的肤色检测算法实现. 将彩色图像转化为 ...
- 基于MATLAB的人脸识别算法的研究
基于MATLAB的人脸识别算法的研究 作者:lee神 现如今机器视觉越来越盛行,从智能交通系统的车辆识别,车牌识别到交通标牌的识别:从智能手机的人脸识别的性别识别:如今无人驾驶汽车更是应用了大量的机器 ...
- 基于RNN的音频降噪算法 (附完整C代码)
前几天无意间看到一个项目rnnoise. 项目地址: https://github.com/xiph/rnnoise 基于RNN的音频降噪算法. 采用的是 GRU/LSTM 模型. 阅读下训练代码,可 ...
随机推荐
- [Qt] 默认的槽函数 例如 on_pushButton_clicked()
在 setupUI 函数里有一句: QMetaObject::connectSlotsByName(QWDialog); 它假设槽函数的名称是 void on_<object name>_ ...
- Manjaro Linux 入门使用教程
Manjaro 初体验 Manjaro 是一款基于 Arch LInux 的自由开源发行版,它吸收了 Arch Linux 优秀丰富的软件管理,同时提供了稳定流畅的操作体验.优雅简单是它的追求,稳定实 ...
- AjaxControlToolkit的安装步骤
1.下载: 下载地址:http://www.codeplex.com/AtlasControlToolkit/Release/ProjectReleases.aspx 打开网址后找到这些: AjaxC ...
- Spring5参考指南:IOC容器
文章目录 为什么使用Spring5 什么是IOC容器 配置元数据 实例化容器 XML嵌套 groovy bean定义DSL 使用容器 最近在翻译Spring Framework Documentati ...
- if __name__ == '__main__'到底是什么?
引子 要搞清楚这个问题,可以先听一个故事~~~ 像我们做事一样,都需要一个起始点,终点存在与否无关紧要.编程也是一样,任何程序都有一个入口,在所谓的静态编译语言中,如Java的入口是一个名字叫做Mai ...
- 【Leetcode】104. 二叉树的最大深度
题目 给定一个二叉树,找出其最大深度. 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数. 说明: 叶子节点是指没有子节点的节点. 示例:给定二叉树 [3,9,20,null,null,15,7 ...
- 通过express框架为前端提供api(数据),妈妈再也不用担心后端不给我数据了~
个人网站 https://iiter.cn 程序员导航站 开业啦,欢迎各位观众姥爷赏脸参观,如有意见或建议希望能够不吝赐教! 首先,确保自己安装了express框架. 没有安装的同学可以参照下面这篇博 ...
- redis系列之5----redis实战(redis与spring整合,分布式锁实现)
本文是redis学习系列的第五篇,点击下面链接可回看系列文章 <redis简介以及linux上的安装> <详细讲解redis数据结构(内存模型)以及常用命令> <redi ...
- 推荐一款Python数据可视化神器
1. 前言 在日常工作中,为了更直观的发现数据中隐藏的规律,察觉到变量之间的互动关系,人们常常借助可视化帮助我们更好的给他人解释现象,做到一图胜千文的说明效果. 在Python中,常见的数据可视化库有 ...
- 线段树 G - Mayor's posters 小技巧
G - Mayor's posters POJ - 2528 这个题目要倒着来写,从后面往前面贴,因为前面的有些会被后面的覆盖. 所以我们就判断这张海报的位置有没有完全被覆盖,如果完全被覆盖了就不能贴 ...