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

news2024/11/27 0:31:39

使用 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.coloradmin.cn/o/1213303.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vim + YCM + clangd

目录 1. Vim的安装 1.1 Vim安装vim-plug2. 安装YCM3. 进行语言补全配置 3.1 测试效果 1. 目的:让 Vim 像 C/C IDE 一样具备自动补全代码等功能 2. YCM:YouCompleteMe GitHub - ycm-core/YouCompleteMe: A code-completion engine for Vi…

[数据结构]—带头双向循环链表——超详解

💓作者简介🎉:在校大二迷茫大学生 💖个人主页🎉:小李很执着 💗系列专栏🎉:数据结构 每日分享✨:旅行是为了迷路,迷路是为了遇上美好❣️❣️❣️ …

2年博士后|心外医生赴美国耶鲁大学开展研究

G医生决定放弃申报CSC,改为自费出国,并在美国密歇根大学安娜堡分校和耶鲁大学两所名校中选择了更为出名的后者。因为不是CSC出资,G医生得以通过签证,顺利出国,实现了在世界知名高校从事2年博士后的个人职业规划目标。 …

11月15日星期三今日早报简报微语报早读

1、2023胡润女企业家榜出炉:郭得胜夫人邝肖卿首次成为中国女首富,龙湖吴亚军蝉联中国白手起家女首富; 2、叶剑英元帅夫人吴博逝世,享年106岁; 3、外交部:所谓“联合国军”是冷战产物,于法无据…

低代码JNPF,发挥软件定制的威力

目录 1.介绍 2.可视化逻辑编排工具 提供自动化的解决方案 3.功能特色展示 4.结语 近几年,随着低代码与无代码相关话题的火热,逻辑编排作为其重要构成部分也备受关注,集团内外不乏优秀的实践。之前在做技术调研时发现了不少业内逻辑编排相关的…

智能导诊的开发技术有哪些?

智能导诊源码 智能导诊是医疗领域中一项重要的应用,它可以帮助医生和患者更快速、更准确地诊断疾病,提高医疗效率和精度。以下是智能导诊开发技术的几个方面: 1.数据收集整合 智能导诊系统需要收集大量的医疗数据,包括患者症状、病史、检查结…

jenkins+centos7上传发布net6+gitlab

工作中实践了一下jenkins的操作,所以记录一下这次经验 首先安装好jenkins并注册自己的jenkins账号 因为我们的项目代码管理使用的是gitlab,在开始之前先在jenkins上安装gitlab的插件,安装之后应该是要重启jenkins的服务,后续jen…

python+django+mysql个人博客项目部署(VMware部署)

目录 一、Vmware新建win7虚拟机 二、组件/软件安装 2.1 安装python3 2.2 更新pip 2.3 安装pycharm 2.4 安装django 2.5 win安装mysql 三、配置数据库 3.1 安装sqlite客户端 3.2 db.sqlite3导出为myblog.sql 3.3 Heidisql连接本地sql 四、部署项目 4.1 安装模块 4.2 尝试运行 …

python之 flask 框架(2)项目拆分的 执行逻辑

项目的结构图 app.py # 导入__init__.py 比较特殊 from APP import create_appapp create_app() if __name__ __main__:app.run(debugTrue)init.py # __inti__.py # 初始化文件,创建Flask应用 from flask import Flask from .views import bluedef create_ap…

OpenAI 上线新功能力捧 RAG,开发者真的不需要向量数据库了?

近期, OpenAI 的开发者大会迅速成为各大媒体及开发者的热议焦点,有人甚至发出疑问“向量数据库是不是失宠了?” 这并非空穴来风。的确,OpenAI 在现场频频放出大招,宣布推出 GPT-4 Turbo 模型、全新 Assistants API 和一…

初试 jmeter做压力测试

一.前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试,他可以帮助我们发现系统中的瓶颈问题,减少发布到生产环境后出问题的几率;预估系统的承载能力,使我们能根据其做出一些应对措施。所以压力测试是一个非常重要的步…

【遗传算法】Genetic algorithms (GAs) 遗传算法原理入门与应用代码

目录 1 遗传算法 2 遗传算法的基本步骤 3 Python示例 4 遗传算法解决TSP(旅行商问题) 1 遗传算法 遗传算法是一种优化搜索算法,模拟自然选择和遗传机制来寻找问题的最优解。这种算法的设计灵感来自于达尔文的进化论和遗…

Android studio配置Flutter开发环境报错问题解决

博主前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住也分享一下给大家 👉点击跳转到教程 报错问题截图 报错原因已经给出: You need Java 11 or higher to build your app with this version of G…

一步路难倒英雄汉?app自动化测试,怎么从零搭建appium!

不少软件测试想进阶到自动化测试,没有前人知道,只能像个无头的苍蝇,到处乱转,根本不知道从何处下手 特别是自学路上碰到需要安装什么程序、工具的时候,一个报错就需要在百度上查个半天,这么浪费时间的事情…

FPGA时序约束与分析-简单入门

FPGA时序约束与分析-简单入门 文章目录 FPGA时序约束与分析-简单入门1. 本课程概述2. 时序约束简介2.1 什么是时序约束2.2 合理的时序约束2.3 *基于Vivado的时序约束方法 3. 时序分析的基本概念3.1 时钟与时钟偏差3.2 建立时间和保持时间3.3 时序分析中路径、沿和关系的定义 4.…

立体库堆垛机控制程序故障输出功能块

故障输出块 A "提升变频器故障" // O "提升变频器通讯故障" // ON "提升变频器准备好" "提升变频故障" A "水平变频器故障" // O "水平变频器通讯故障" // ON…

Spring源码—初识IOC

👽System.out.println(“👋🏼嗨,大家好,我是代码不会敲的小符,双非大四,Java实习中…”); 📚System.out.println(“🎈如果文章中有错误的地方,恳请大家指正&a…

水库大坝安全监测预警系统的重要作用

水库大坝建造在地质构造复杂、岩土特性不均匀的地基上,在各种荷载的作用和自然因素的影响下,其工作性态和安全状况随时都在变化。如果出现异常,又不被及时发现,其后果不堪设想。全天候实时监测,实时掌握水库水位、雨情…

基于JuiceFS 的低成本 Elasticsearch 云上备份存储

杭州火石创造是国内专注于产业大数据的数据智能服务商,为了解决数据存储及高效服务客户需求,选择了 Elasticsearch 搜索引擎进行云上存储。基于性能和成本的考虑,在阿里云选择用本地 SSD ECS 机型自建集群。但由于是自建集群,如何…

uniapp Android如何打开常用系统设置页面?

uniapp Android 如何打开常用系统设置页面? 在使用App过程时,有时候会对一些权限获取,比如打开蓝牙、打开通知栏通知等设置,我们如何快速跳转到需要的设置页面? 文章目录 uniapp Android 如何打开常用系统设置页面&…