使用 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.mzph.cn/news/143451.shtml

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

相关文章

11.15 知识总结(模板层、模型层)

一、 模板层 1.1 过滤器 1.什么是过滤器? 过滤器类似于python的内置函数,用来把变量值加以修饰后再显示。 2. 语法 1、 {{ 变量名|过滤器名 }} 2、链式调用:上一个过滤器的结果继续被下一个过滤器处理 {{ 变量名|过滤器1|过滤器2 }} 3、有的过…

idea中搭建Spring boot项目(借助Spring Initializer)

创建新项目 启动端口 在项目配置文件application.properties中写入 #启动端口server.port8088编写测试方法 创建控制类文件夹–>便于规范我们新建一个controller包–>建一个HelloWorld.class package com.example.hellospringboot.controller;import org.springframew…

Linux下MSSQL (SQL Server)数据库无法启动故障处理

有同事反馈一套CentOS7下的mssql server2017无法启动需要我帮忙看看,启动报错情况如下 检查日志并没有更新日志信息 乍一看mssql-server服务有问题,检查mssql也确实没有进程 既然服务有问题,那么我们用一种方式直接手工后台启动mssql引擎来…

arcgis--填充面域空洞

方法一:使用【编辑器】-【合并工具】进行填充。首选需要在相同图层中构造一个填充空洞的面域,然后利用【合并】工具进行最后填充。 打开一幅含有空洞的矢量数据,如下: 打开【开始编辑】-【构造工具】-【面】进行覆盖空洞的面域的…

时间序列预测实战(九)PyTorch实现LSTM-ARIMA融合移动平均进行长期预测

一、本文介绍 本文带来的是利用传统时间序列预测模型ARIMA(注意:ARIMA模型不属于机器学习)和利用PyTorch实现深度学习模型LSTM进行融合进行预测,主要思想是->先利用ARIMA先和移动平均结合处理数据的线性部分(例如趋势和季节性&#xff09…

[html] 动态炫彩渐变背景

废话不多说&#xff0c;直接上源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>ZXW-NUDT: 动态炫…

CF1324F题解

题目大意 给出一颗 n n n个节点的无根树&#xff0c;每个节点有一个颜色 a u a_u au​&#xff0c;如果 a u 0 a_u0 au​0则为黑色&#xff0c;否则为白色。 对于每个节点 u u u&#xff0c;选出一个包含 u u u的联通子图&#xff0c;设子图中白点个数为 c n t 1 cnt_1 cnt1…

如何在 macOS 中删除 Time Machine 本地快照

看到这个可用82GB&#xff08;458.3MB可清除&#xff09; 顿时感觉清爽&#xff0c;之前的还是可用82GB&#xff08;65GB可清除&#xff09;&#xff0c;安装个xcode都安装不上&#xff0c;费解半天&#xff0c;怎么都解决不了这个问题&#xff0c;就是买磁盘情理软件也解决不了…

Spring Boot 整合xxl-job实现分布式定时任务

xxl-job介绍 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 xxl是xxl-job的开发者大众点评的许雪里名称的拼音开头。 设计思想 将调度行为抽象形成“调度…

阿里云 业务集群的冗余、备份、监控方案

1. 请解释什么是业务集群的冗余、备份和监控&#xff1f; 一、冗余方案 硬件冗余&#xff1a;在业务集群中&#xff0c;关键设备如服务器、存储设备等应采用双机热备或集群技术&#xff0c;确保在某台设备出现故障时&#xff0c;其他设备能够自动接管工作&#xff0c;保证业务…

一、认识微服务

目录 一、单体架构 二、分布式架构 三、微服务 1、微服务架构特征&#xff1a; 1.单一职责&#xff1a; 2.面向服务&#xff1a; 3.自治&#xff1a; 4.隔离性强&#xff1a; 2、微服务结构&#xff1a; 3、微服务技术对比&#xff1a; 一、单体架构 二、分布式架构 三…

thinkphp5 application/json请求取json数据

当http的content-typeapplication/json时 我们在thinkphp5中如何取json数据&#xff1f; 1&#xff0c;参数信息获取 $user $this->request->param(user); 2&#xff0c;json数据获取并转为字符串 $json json_encode($this->request->post()); 3&#xff…

MyBatis Plus整合Redis实现分布式二级缓存

MyBatis缓存描述 MyBatis提供了两种级别的缓存&#xff0c; 分别时一级缓存和二级缓存。一级缓存是SqlSession级别的缓存&#xff0c;只在SqlSession对象内部存储缓存数据&#xff0c;如果SqlSession对象不一样就无法命中缓存&#xff0c;二级缓存是mapper级别的缓存&#xff…

TYUST-RM2023-NewMaker哨兵视觉代码

目录 1 TYUST-RM2023-NewMaker哨兵视觉代码 1.1 说明 1.2 算法设计 1.3 识别思路 TYUST-RM2023-NewMaker哨兵视觉代码 说明 本套代码是太原科技大学NewMaker战队2023赛季哨兵开源代码 本套代码主要含有&#xff1a;TYUST-RM2023赛季哨兵视觉代码&#xff0c;主要模块…

等保到底在“保”什么?

在信息时代&#xff0c;等保评级成为衡量企业信息安全水平的重要标准。那么&#xff0c;什么是等保评级呢&#xff1f;等保合规到底保的是什么呢&#xff1f;一起来看看吧。 编辑搜图 请点击输入图片描述&#xff08;最多18字&#xff09; 等保评级&#xff0c;会从七个维度进…

DevEco Studio开发工具下载、安装(HarmonyOS开发)_For Mac

一、说明 初学HarmonyOS开发&#xff0c;DevEco Studio开发工具的安装和使用是必须的。 &#xff08;注&#xff1a;不多废话&#xff0c;跟着下面流程操作下载、安装DevEco Studio即可。&#xff09; 二、下载DevEco Studio 1.官网下载地址&#xff1a; https://developer.…

ffmpeg EasyAVFilter去B帧

要设置无B帧的 ffmpeg 命令行&#xff0c;可以使用以下命令&#xff1a; ffmpeg -i input.mp4 -bf 0 output.mp4 其中&#xff0c;-bf 参数表示 B 帧数。将其设置为 0 即可禁用 B 帧。 那么EasyAVFilter里面去B帧就是调用&#xff1a;EasyAVFilter_AddFilter(handle, “-bf 0”…

springboot苍穹外卖实战:十、缓存菜品(手动用redisTemplate实现缓存逻辑)+缓存套餐(Spring cache实现)

缓存菜品 缺点 缓存和数据库的数据一致性通常解决方案&#xff1a;延时双删、异步更新缓存、分布式锁。 该项目对于缓存菜品的处理较为简单&#xff0c;实际可以用管道技术提高redis的操作效率、同时cache自身有注解提供使用。 功能设计与缓存设计 建议这部分去看下原视频&…

华为:每个企业都能“一触即达”数智世界

在大模型浪潮的影响下&#xff0c;几乎各行各业都在探讨数智化转型的课题&#xff0c;一些隐藏在水面下的问题正逐渐浮出水面&#xff1a; 一方面&#xff0c;数智化转型的呼声很高&#xff0c;但很多企业不知道该从何处着手&#xff0c;怎么通过数智化的能力降本增效&#xf…