Vitis HLS 学习笔记--变量存储(DDR中的图像数据:生成、存储、调取 + Filter2D函数)

发布时间:2026/9/23 16:56:57

Vitis HLS 学习笔记--变量存储(DDR中的图像数据:生成、存储、调取 + Filter2D函数) 目录1. 简介2. 图像数据2.1 变量理解2.2 生成图像(随机数据)2.3 调取(传递)图像数据2.4 Filter2D函数3. 总结1. 简介通过 HLS 中提供的函数 Filter2D了解在硬件加速中图像数据在 DDR 中的存储模式从而理解的生成、调取方法方便快速测试和验证。1基本概念HWC 和 CHW高度(Height)、宽度(Width)、颜色通道(Channel)HWC图片为 RGB 256×256其在 HWC 格式下的表示为 [256, 256, 3]图像数据首先按照图像的高度和宽度排列对于图像中的任意一个像素点其 RGB 三个颜色通道的值是连续存储的。这种存储方式比较直观。CHW图片为 RGB 256×256在CHW格式下的表示为[3, 256, 256]。数据首先按颜色通道分布对于同一颜色通道内的数据则按照图像的高度和宽度顺序排列。对于图像中的任意一个像素点其RGB三个颜色通道的值在内存中是分开、不连续存储的。这种方式在某些图像处理和深度学习框架中比较常见它能提高某些类型的计算效率。2. 图像数据2.1 变量理解unsigned stride ceil(width/64.0)*64; // width 1080, stride 1088 unsigned nbytes (stride*height); // 图像的一个通道在内存中的大小1Stridestride 表示图像数据中一行像素的实际占用字节数。由于内存对齐的要求或为了提高访问效率图像的实际行宽度stride可能会比基于像素宽度直接计算的值更大。在这个例子中width 是 1080 像素通过 ceil(width / 64.0) * 64 计算得到 stride 为 1088 字节。这是因为内存对齐到 64 字节的倍数。2nbytesnbytes 表示图像的一个通道在内存中的总大小。它是 stride 和 height 的乘积。在这个例子中如果 height 是 720 像素那么 nbytes 就是 1088 * 720 字节。2.2 生成图像(随机数据)为图像的每个颜色通道分配内存空间然后初始化这些内存空间。目的初始化分配的内存空间。rand()为 y_src、u_src 和 v_src 分配随机值模拟图像数据。0将 y_dst、u_dst 和 v_dst 初始化为 0准备存储处理后的图像数据。//每个通道分别申请内存空间CHW存储模式 unsigned char *y_src (unsigned char *)malloc(nbytes); unsigned char *u_src (unsigned char *)malloc(nbytes); unsigned char *v_src (unsigned char *)malloc(nbytes); unsigned char *y_dst (unsigned char *)malloc(nbytes); unsigned char *u_dst (unsigned char *)malloc(nbytes); unsigned char *v_dst (unsigned char *)malloc(nbytes); for (int i0; inbytes; i) { y_src[i], u_src[i], v_src[i] rand(), rand(), rand(); y_dst[i], u_dst[i], v_dst[i] 0, 0, 0; }2.3 调取(传递)图像数据功能对源图像数据应用滤波器并将结果存储在目标图像数据中。float factor filterFactors[filterType]; short bias filterBiases[filterType];actor 和 bias从预定义的滤波器参数数组中获取当前滤波器类型的缩放因子和偏置值。这些参数用于滤波器计算。#pragma omp parallel for num_threads(3) for (int n0; nnumRuns; n) { // Compute reference results Filter2D(filterCoeffs[filterType], factor, bias, width, height, stride, y_src, y_dst); Filter2D(filterCoeffs[filterType], factor, bias, width, height, stride, u_src, u_dst); Filter2D(filterCoeffs[filterType], factor, bias, width, height, stride, v_src, v_dst); }OpenMP 并行化使用 OpenMP 指令 #pragma omp parallel for 并行执行循环指定使用 3 个线程。numRuns表示要执行的滤波操作的次数。Filter2D 函数对每个颜色通道Y、U、V分别应用二维滤波器。这段代码通过并行化处理提高了对图像数据的滤波效率。每个颜色通道Y、U、V分别应用滤波器并行执行可以显著减少处理时间。2.4 Filter2D函数Filter2D 函数的主要功能是对图像应用二维滤波器。Filter2D(…,… …) { for(int y0; yheight; y) { for(int x0; xwidth; x) { // Apply 2D filter to the pixel window int sum 0; for(int row0; row FILTER_V_SIZE; row) { for(int col0; col FILTER_H_SIZE; col) { unsigned char pixel; int xoffset (xcol-(FILTER_H_SIZE/2)); int yoffset (yrow-(FILTER_V_SIZE/2)); // Deal with boundary conditions : clamp pixels to 0 when outside of image if ( (xoffset0) || (xoffsetwidth) || (yoffset0) || (yoffsetheight) ) { pixel 0; } else { pixel src[yoffset*stridexoffset]; } sum pixel*coeffs[row][col]; } } unsigned char outpix MIN(MAX((int(factor * sum)bias), 0), 255); //归一化饱和处理 dst[y*stridex] outpix;}}解释 offsetxoffset 和 yoffset 用于计算当前滤波器元素对应的图像像素位置。xoffset (x col - (FILTER_H_SIZE / 2)) 和 yoffset (y row - (FILTER_V_SIZE / 2)) 确保滤波器中心对准当前像素点 (x, y)。边界处理检查 xoffset 和 yoffset 是否超出图像边界。如果超出边界将 pixel 设为 0否则从源图像 src 中获取对应像素值。3. 总结本文介绍了在硬件加速中使用 HLS 提供的 Filter2D 函数处理图像数据的过程。HWC 和 CHW 两种图像数据存储格式及其应用场景。图像数据在内存中的存储方式包括 stride 和 nbytes 的计算方法。展示生成随机图像数据并使用 OpenMP 并行化处理对图像数据应用滤波器。简单分析了 Filter2D 函数的实现细节。
延伸阅读

更多相关文章

2026/9/22 8:44:42

音频处理全流程指南:从降噪、均衡到母带处理的标准化工作流

在实际音乐制作、视频剪辑和内容创作领域,音频处理是一个基础但至关重要的环节。无论是为原创音乐添加效果,还是为视频内容制作背景音轨,亦或是处理网络投稿的音频素材,掌握一套清晰、可复现的音频处理工作流,都能极大…

2026/9/22 21:38:09

Scroll Reverser:终极解决macOS滚动方向混乱的完整指南

Scroll Reverser:终极解决macOS滚动方向混乱的完整指南 【免费下载链接】Scroll-Reverser Per-device scrolling prefs on macOS. 项目地址: https://gitcode.com/gh_mirrors/sc/Scroll-Reverser 你是否曾在MacBook触控板和鼠标之间切换时感到困惑&#xff1…

2026/9/22 9:57:38

ESP32C6 WiFi6智能语音助手:xiaozhi-esp32完整配置指南

ESP32C6 WiFi6智能语音助手:xiaozhi-esp32完整配置指南 【免费下载链接】xiaozhi-esp32 An MCP-based chatbot | 一个基于MCP的聊天机器人 项目地址: https://gitcode.com/GitHub_Trending/xia/xiaozhi-esp32 还在为传统WiFi模块的功耗和性能瓶颈而烦恼&…

2026/9/23 16:54:32

OTC焊接机器人基本操作说明:从开机到焊出第一条合格焊缝

简介:这份PDF面向OTC焊接机器人的一线操作人员、设备调试与维护人员,以及刚接触该品牌机器人的技术学习者,用于解决程序编写、参数变更与日常检查等基础操作无从下手的问题。资源包内仅含1个PDF文件,大小约36KB,轻量便…

2026/9/23 16:54:32

陈颂雄团队实战:5个避坑点搞定API变更最佳实践

陈颂雄团队实战:5个避坑点搞定API变更最佳实践 凌晨三点,线上服务突然崩了。你盯着日志,满屏都是 AttributeError: module 'xxx' has no attribute 'yyy' 。那种窒息感,老程序员都懂。这就是…

2026/9/23 16:54:32

2026最新cp126实战:从零搭建水文数据清洗工具,告别复制报错

2026最新cp126实战:从零搭建水文数据清洗工具,告别复制报错 刚把同事发的水文站数据脚本拷过来,直接运行就崩了?别急,这太常见了。很多老代码基于旧版Python或特定环境,复制过来后依赖库缺失、编码冲突,调试起来像无头苍蝇。2026最…

2026/9/23 16:54:32

联众打码速查手册:3步拆解核心源码逻辑

联众打码速查手册:3步拆解核心源码逻辑 官方文档动辄上百页,翻到第三页就犯困,关键参数藏在表格第5行,这种体验太劝退。很多新手卡在配置环节,不是代码写错,是没看懂底层逻辑。今天不聊虚的,直接给你一份 联众打码速查手册…

2026/9/23 16:54:32

qwen 千问、deepseek大模型联网及json格式化输出

1、qwen 千问 参考: https://bailian.console.aliyun.com/?spm5176.24532587.nav-v2-dropdown-menu-0.d_main_0_0_2.19b242f4vwiE7i&tabapi&scm20140722.M_10852062._.V_1#/api/?typemodel&url2712576 联网搜索回答 https://help.aliyun.com/zh/model…

2026/9/23 12:07:00

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/23 0:01:54

3个实战技巧搞定形式英语:从看教程到跑通性能优化

3个实战技巧搞定形式英语:从看教程到跑通性能优化 看了一堆教程还是不会写项目?别慌,这种“眼高手低”的困境在开发者圈子里太常见了。很多人以为卡点在语法,其实真正拦路虎是缺乏将知识点串联成完整链路的能力。今天咱们不聊虚的,直接拿【形式英语】这…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码