使用 MATLAB HDL Coder 和 FPGA 快速实现自动白平衡(AWB)

使用 MATLAB HDL Coder 和 FPGA 快速实现自动白平衡(AWB)

8194eb6932c9553d8a0eff3f31902c2e.png

在此项目中,我们将使用 MATLAB Simulink 和 HDL 编码器创建自定义 IP -- AWB。

MATLAB 设计

自动白平衡模块的设计是使用 HDL Coder 在 MATLAB 和 Simulink 中创建的。HDL Coder能够生成 HDL 文件,这些文件可以作为 IP 在我们的目标 FPGA 中运行。

AWB IP 设计旨在对每个时钟 2 个像素求和,这些像素是从 Vivado 设计中的demosaic 输出的 RGB 像素。

该算法非常简单,对每个帧的 RGB 通道进行求和并提供给微处理器。在微处理器中,像素的总和被划分创建校正白平衡所需的校正因子。

除法是在 MicroBlaze 中完成的,虽然必须快速收集每帧的统计数据,但除法不必那么快,因此为了节省逻辑资源,利用 Microblaze即可完成。

整体设计如下

419f6468014986c8d203b7d2e6aa3091.png

像素求和旨在捕获将传入的 AXI 流像素数据分割为三个元素 R、G、B,然后在求和之前对这些像素中的每一个进行缓冲。求和块的输出也被记录。

fe5eae2fbfac48a68c6a65bf4c7fbb02.png

求和块本身非常简单。获取输入、有效和复位信号。复位信号连接到来自 AXI Stream 接口的 SOF 信号。而 AXI Valid 信号使能寄存器和累加。

9745b8a51b7c2d71b37cc12ef4697069.png

为了在每一帧结束时向微处理器生成 IRQ,我们使用了以下结构

242c617d1083e6e4162f6574d42239d0.png

一旦 MicroBlaze 定义了系数数据,需要将其应用于后面帧像素。

ef62816906e069af3d49d33fc6ee7f0f.png

然后将它们连接起来,为 AXI-stream提供最终的像素数据。

当然,也需要针对 AWB 算法中插入延迟进行平衡

1bfa335db7908c30c77d999d0258f2f3.png

完整的模块设计如下:

5d534c548d5551d1eaf3761414d18406.png

MATLAB 测试

为了测试这个设计,我们将在 MATLAB 中创建了一个测试平台,它提取图像文件来提供算法

24aa202f5c9ba003f1e2c797905ec087.png

自定义 MATLAB 模块用于输入和接收图像,设置的 M 代码如下所示:

close all
[im, im_map] = imread("awb_test_img.jpg");
im_rgb = ind2rgb(im,im_map);
im_rgb = uint8(im_rgb * 2^8);
imshow(im_rgb);
vsize = size(im_rgb, 1);
hsize = size(im_rgb, 2);
div_val = 16;
for i =1:1:3
means(i) = mean(mean(im_rgb(:,:,i)/div_val));
end
max_mean = max(means);
im_corr = im_rgb;
for i =1:1:3
corr(i) = max_mean/means(i);
im_corr(:,:,i) = im_rgb(:,:,i) * corr(i);
end
figure()
imshow(im_corr)

要运行模拟,我们首先需要做一些事情

be4d131f0de0ace108c1765890143241.png

模拟输入

56157bfbb97dfa89e904e0d3511e7db5.png

浮点结果

0e4ac1733713afa44be8033d3464a3c8.png

定点结果

29a4a07d84120230ee989b8425422614.png

为了生成定点 HDL 解决方案,我们需要设置 HDL Coder生成器

3b46999fea67963ce2a1545d1c0701e1.png a8880a7a5e55abadd0b8c13e172e9783.png

Vivado 验证

导出IP核后,我们可以将其导入Vivado IP库并将其添加到演示项目中。

3d896a4ba7881613872bf5af486d6515.png

为了简化寄存器接口,我们使用 AXI GPIO 提供所需的系数。

0f7018a247b92bb7ea2d24fc9b416311.png

可以看到 AWB 提供 AXI Stream 输入和输出。

插入 AWB 后,接下来将在 Vitis 中的设计。

Vitis设计

算法非常简单

Status = XGpio_Initialize(&Gpio5, XPAR_AWB_AXI_GPIO_5_DEVICE_ID);Status = XGpio_Initialize(&Gpio6, XPAR_AWB_AXI_GPIO_6_DEVICE_ID);Status = XGpio_Initialize(&Gpio7, XPAR_AWB_AXI_GPIO_7_DEVICE_ID);exp_scale = 0.8;while(1) {r = XGpio_DiscreteRead(&Gpio5, 1);g = XGpio_DiscreteRead(&Gpio5, 2);b = XGpio_DiscreteRead(&Gpio6, 1);if (r >= g && r >= b){r_corr = 1.0 * 32768 * exp_scale;g_corr = ((float)r / (float)g) * 32768 * exp_scale;b_corr = ((float)r / (float)b) * 32768 * exp_scale;}else if (g >= r && g >= b){r_corr = ((float)g / (float)r) * 32768 * exp_scale;g_corr = 1.0 * 32768 * exp_scale;b_corr = ((float)g / (float)b) * 32768 * exp_scale;}else if (b >= r && b >= g){r_corr = ((float)b / (float)r) * 32768 * exp_scale;g_corr = ((float)b / (float)g) * 32768 * exp_scale;b_corr = 1.0 * 32768 * exp_scale;}XGpio_DiscreteWrite(&Gpio6, 2, (int)r_corr);XGpio_DiscreteWrite(&Gpio7, 1, (int)g_corr);XGpio_DiscreteWrite(&Gpio7, 2, (int)b_corr);

总结

MATLAB HDL Coder 和 FPGA联合开发,可以快速进行算法设计。

MATLAB / Simulink HDL 快速入门

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/179249.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu设置脚本开机自启动

rc-local.service flexmitd1:~$ cd /lib/systemd/system/ flexmitd1:/lib/systemd/system$ ls |grep rc-local.service rc-local.service rc-local.service.d flexmitd1:/lib/systemd/system$ pwd /lib/systemd/system flexmitd1:/lib/systemd/system$确保有rc-local.service文…

宝藏来袭,在线制作电子宣传册大公开

随着科技的进步,电子宣传册已经成为了企业宣传和推广的重要工具之一。它们不仅易于制作和更新,而且可以轻松地在网络上传播,让更多的人了解您的品牌和产品。 现在,给大家推荐一款FLBOOK在线制作电子杂志平台。无需任何专业的设计技…

kubectl 本地远程链接k8s多个集群,远程管控多集群,查看日志 部署服务(windows版)

文章目录 一、前言二、windows上安装kubectl和mobaxterm2.1 准备安装包2.2 安装kubectl2.3 链接k8s集群2.4 查看某一个pod的容器日志2.5 切换context 上下文配置,实现在多个k8s集群间动态切换 一、前言 现如今是一个万物皆上云 的时代,各种云层出不穷&am…

四川芸鹰蓬飞商务信息咨询有限公司是可靠的选择

随着电商行业的快速发展,越来越多的消费者选择通过线上平台购物。在这个大背景下,四川芸鹰蓬飞商务信息咨询有限公司以其独特的抖音电商服务,为广大消费者带来了更加便捷、安全的购物体验。 一、服务的优势 专业团队:公司拥有一支…

零基础学会酒店预订小程序制作

" 如果你想要开发一个酒店预订小程序,以下是一个简单的步骤指南,帮助你通过第三方制作平台/工具如乔拓云网来实现这一目标: 1. 找一个合适的第三方制作平台/工具: 在如今的市场上,有许多第三方制作平台/工具可供选…

JavaEE进阶学习:Spring核心和设计思想

Spring 是什么 我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃而庞大的社区,这就是它之所以能长久不衰的原因。Spring 支持广泛的应用场景,它可以让 Java 企业级…

面向对象和原型/原型链学习

##构造函数执行的机制 函数的其中一个作用,就是构造函数. ###new关键字 1.创建一个对象; 2.这个对象的原型,可以看到这个Function 3.该对象,实现了这个构造函数的方法. 4.根据一些特定情况,返回: (1)如果没有返回值,就返回一个对象; (2)如果返回一个基本类型,则还是返回…

12-使用vue2实现todolist待办事项

个人名片: 😊作者简介:一名大二在校生 🤡 个人主页:坠入暮云间x 🐼座右铭:懒惰受到的惩罚不仅仅是自己的失败,还有别人的成功。 🎅**学习目标: 坚持每一次的学习打卡 文章…

word批量图片导出wps office word 图片批量导出

word批量导出图片教程 背景 今天遇到了一个场景,因为word里的图片打开看太模糊了,如果一个一个导出来太麻烦。想批量将word中的图片全部导出 但是,wps导出的时候需要会员 教程开始: 将word保存为 .docx 格式,可以按F1…

JWT登录认证(2认证)

备注说明: 用户登录成功后,系统会自动下发JWT令牌,然后在后续的每次请求中,浏览器都需要在请求头header中携带到服务器,请求头的名称为Authorization,值为登录时下发的JWT令牌。 如果检测到用户未登录&…

二叉树(进阶)

文章目录 1.内容安排说明2. 二叉搜索树2.1二叉搜索树的概念2.2二叉搜索树的实现2.3二叉树的性能: 搜索二叉树的应用k 模型kv模型 1.内容安排说明 二叉树在前面c数据结构阶段;已经讲过了;本节取名二叉树进阶的原因是: 1.map和set特…