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

news/2024/6/16 18:54:08 标签: fpga开发, matlab, 开发语言

使用 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.niftyadmin.cn/n/5180975.html

相关文章

谈谈一个IT杂家的职业生涯规划,你的护城河被AI 攻破了么

文章大纲 没有顶会的从业者:成为深度学习老中医AIGC 还未能克服的难点:忽然的惊喜 -- 大模型的智能涌现未来还能做点什么,从计算机视觉的发展走向看T 字型人才与护城河成为更加熟练使用人工智能的人 参考文献与学习路径 我的职业生涯将近十年…

Chrome版本对应Selenium版本

1.获得浏览器版本号和驱动 浏览器版本: 119.0.6045.124 浏览器驱动版本: 119.0.6043.1 / 120.0.6051.0 访问 https://vikyd.github.io/download-chromium-history-version/ 2. 安装selenium pip install selenium4.1.1 -i http://pypi.mirrors.ustc.edu.cn/simple/ --trusted…

LeetCode 1334. 阈值距离内邻居最少的城市:多次运用单源最短路的迪杰斯特拉算法

【LetMeFly】1334.阈值距离内邻居最少的城市:多次运用单源最短路的迪杰斯特拉算法 力扣题目链接:https://leetcode.cn/problems/find-the-city-with-the-smallest-number-of-neighbors-at-a-threshold-distance/ 有 n 个城市,按从 0 到 n-1…

Django实战项目-学习任务系统-任务完成率统计

接着上期代码内容,继续完善优化系统功能。 本次增加任务完成率统计功能,为更好的了解哪些任务完成率高,哪些任务完成率低。 该功能完成后,学习任务系统1.0版本就基本完成了。 1,编辑urls配置文件: ./mysi…

假如我是Langchain专家,你会问什么来测试我的水平

推荐Langchain YouTube 视频排行榜 1. 假如我是Langchain专家,你会问什么来测试我的水平; 作为Langchain专家,您可能需要回答一系列深入和具体的问题,这些问题旨在测试您对Langchain的理解和实际应用能力。以下是一些可能的问题…

预览PDF并显示当前页数

这里写目录标题 步骤实例实例效果图 步骤 1.安装依赖 npm install --save vue-pdf2.在需要的页面&#xff0c;引入插件 import pdf from vue-pdf3.使用 单页pdf可以直接使用 <pdf :src"获取到的pdf地址"></pdf>多页pdf通过循环实现 html标签部分 &l…

第1关:构造函数与析构函数的实现

题目&#xff1a;根据.h写出.cpp 考点&#xff1a; 1.链表的默认构造&#xff0c; 拷贝构造&#xff0c;传参构造以及析构函数等。 代码&#xff1a; /********** BEGIN **********/ #include <cstdlib> #include <cstring> #include "LinkedList.h&…

GORM学习笔记

GORM学习笔记 官方文档&#xff1a;https://gorm.io/zh_CN/docs/ 1、数据准备 create table student (id int auto_incrementprimary key,sn varchar(20) null,name varchar(20) null,email varchar(20) null,class_id int null,monitor…