使用 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 快速入门

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

免费开源客服机器人tiledesk 实现一个查询天气机器人

第一步,槽位收集: 第二步:天气api接口调用: 效果展示:

云原生下GIS服务规划与设计

作者:lisong 目录 背景云原生环境下GIS服务的相关概念GIS服务在云原生环境下的规划调度策略GIS服务在云原生环境下的调度手段GIS服务在云原生环境下的服务规划调度实践 背景 作为云原生GIS系统管理人员,在面对新建的云GIS系统时,通常需要应对…

LTD251次升级 | 商机平台可筛选、浏览历史可查看 • 在线课程可秒杀购买 • 采购表单可实时计算价格与周期

1、 新增商机类型筛选及历史浏览功能; 2、 新增地址管理和物流公司管理功能; 3、 优化表单导出问题文件格式; 4、 可定制实时计算价格的表单; 5、 知识付费支持秒杀活动; 01 商机平台应用 在上次升级中,我…

大环境之下软件测试行业趋势能否上升?

如果说,2021年对于全世界来说,都是一场极大的挑战的话;那么,2022年绝对是机遇多多的一年。众所周知,随着疫情在全球范围内逐步得到控制,无论是国际还是国内的环境,都会呈现逐步回升的趋势&#…

PM2学习

目录 PM2简介 pm2的主要特性 PM2安装 启动PM2项目 查看应用列表(查看当前机器执行的所有进程) 查看某个应用详情 重启 停止 删除 日志查看 负载均衡 监控CPU/内存 内存使用超过上限自动重启 监听代码变化/自动重启 PM2简介 PM2是常用的node…

2023年【道路运输企业主要负责人】考试技巧及道路运输企业主要负责人复审模拟考试

题库来源:安全生产模拟考试一点通公众号小程序 道路运输企业主要负责人考试技巧是安全生产模拟考试一点通总题库中生成的一套道路运输企业主要负责人复审模拟考试,安全生产模拟考试一点通上道路运输企业主要负责人作业手机同步练习。2023年【道路运输企…

Redis应用场景及常见的数据类型

目录 一、Redis应用场景 1.1 Redis作为缓存 1.2 Redis作为消息队列 1.3 实现计数器和排行榜 1.4 实现分布式锁及分布式会话管理 二、Redis常见的数据类型 2.1 String(字符串)类型 2.2 list类型 2.3 Hash类型 2.4 Set类型 2.5 Sorted Set 一、Redis应用场…

什么是3D建模中的“高模”和“低模”?

3D建模中什么是高多边形和低多边形? 高多边形建模和低多边形建模之间的主要区别正如其名称所暗示的那样:您是否在模型中使用大量多边形或少量多边形。 然而,在决定每个模型的细节和多边形级别时,还需要考虑其他事项。最值得注意的…

安装宝塔,使用宝塔自动部署

这里用的是华为云服务器,其实也就是普普通通的一个linux操作系统 首先我们来到宝塔官网地址 宝塔面板下载,免费全能的服务器运维软件 (bt.cn) 翻到下面,会有使用脚本安装的命令。 yum install -y wget && wget -O install.sh https:/…

【C++面向对象】10. 多态

文章目录 【 前言 】【 虚函数 】【 纯虚函数 】 【 前言 】 多态按字面的意思就是多种形态。当 类之间存在层次结构,并且类之间是通过继承关联时 ,就会用到多态。 C 多态意味着调用成员函数时,会根据调用函数的对象的类型来执行不同的函数…

msvcp140_CODECVT_IDS.dll丢失怎么办,分享两个有效的方法

在计算机使用的过程中,我们经常会遇到一些错误提示,其中最常见的就是“缺少xxx.dll文件”。这些文件是动态链接库(DLL)文件,它们包含了程序运行所需的函数和资源。而msvcp140_CODECVT_IDS.dll就是其中之一。那么&#…

动态规划专题——背包问题

🧑‍💻 文章作者:Iareges 🔗 博客主页:https://blog.csdn.net/raelum ⚠️ 转载请注明出处 目录 前言一、01背包1.1 使用滚动数组优化 二、完全背包2.1 使用滚动数组优化 三、多重背包3.1 使用二进制优化 四、分组背包…

抽象 I/O设备模型

I/O设备模型框架 RT-Thread提供了一套简单的I/O设备模型框架。 如图所示,它位于硬件和应用程序之间,共分成三层,从上到下分别是I/O设备管理层、设备驱动框架层、设备驱动层。 应用程序通过I/O设备管理接口获得正确的设备驱动,然…

一题带你写出图论算法模板!!!

这题是道基础的图论算法题目 注释很重要!!!!!!! 在做这道题之前,我们先了解一下基础的图论算法吧!!! 1.floyd: 这样可以求出所有点…

闲聊从零开发一个2D数字人流程实战

.2D数字人技术 百度,腾讯,等大厂都有自己的数字平台制作(套壳:api后台转发vue前端),国外也有出名的heygen(非常厉害一个)通过开源项目组合实现,再打通每个项目已api的形…

LCD1602命令代码整合

本文为博主 日月同辉,与我共生,csdn原创首发。希望看完后能对你有所帮助,不足之处请指正!一起交流学习,共同进步! > 发布人:日月同辉,与我共生_单片机-CSDN博客 > 欢迎你为独创博主日月同…

C语言查看main函数的参数

这里写自定义目录标题 argc 代表参数的个数argv 代表参数的具体值,其中argv[0]代表的是可执行文件的名字,参考上图

微信这4个功能容易暴露隐私,记得关闭

每天高频使用微信的我们,常常觉得安全无忧,然而这样的想法并不准确。尽管微信本身的安全性能极高,但若我们不主动设置相关功能,个人隐私和位置信息仍可能被暴露。 在微信朋友圈上,有些人喜欢分享生活的点滴&#xff0c…

爆款标题怎么出来的?媒介盒子揭秘产出技巧

用户点开一篇文案的主要因素取决于标题是否具有吸引力,直观判断可能只需要半秒钟,用户的操作也决定了文章的点击率与阅读完成率。 然而有许多人为了取标题想破脑袋也想不出来,甚至文案内容出来了标题还没出来,今天媒介盒子就来为…

Java GUI小程序之图片浏览器

以下是一个简单的图片浏览器示例代码,它包含了图片放大缩小、拖拽、上一张/下一张查看等功能。你可以根据它进行扩展,提高用户体验。 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.e…