主要内容

过滤多像素视频流

这个例子展示了如何设计在多像素输入视频流上操作的过滤器。使用多像素流来处理具有与单像素流接口相同的合成时钟频率的高分辨率或高帧率视频。多像素流还可以提高模拟速度和吞吐量,因为处理每帧需要更少的迭代,同时保持流接口的硬件优势。

示例模型有三个子系统,每个子系统执行相同的算法:

  • SinglePixelGaussianEdge:使用图像过滤器和边缘检测器块对单个像素流进行操作。这个子系统展示了单像素流的速率和接口如何与多像素设计进行比较。

  • MultiPixelGaussianEdge:使用图像过滤器和边缘检测器块对多像素流进行操作。这个子系统展示了如何使用库块的多像素接口。

  • MultiPixelCustomGaussianEdge:使用Line Buffer块为多像素流建立高斯滤波器和Sobel边缘检测。这个子系统展示了如何使用Line Buffer输出进行多像素设计。

处理多像素视频流允许在不相应增加时钟频率的情况下实现更高的帧率。每个子系统都可以在Xilinx ZC706板上实现200MHz的时钟频率。480p视频流有每行总像素x总视频线= 800*525循环每帧。使用单个像素流,您可以处理200M/(800*525) = 475帧每秒。在多像素子系统中,每个循环处理4个像素,每行循环数减少到200个。这意味着在480p的流上,如果一个多像素的流每次运行4个像素,频率为200MHz,每秒可以处理1900帧。如果分辨率从480p提高到1080p,那么在单个像素的情况下每秒可以达到80帧,而在4像素的情况下每秒可以达到323帧或8像素的情况下每秒646帧。

使用库块的多像素流

通过设置从帧到像素块生成一个多像素流数量的像素48.的默认值1返回采样率为的标量像素流每行总像素总视频线比帧速率快。这个速率在示例模型中显示为红色。两个多像素子系统使用的多像素流数量的像素设置为4.该配置在每个时钟周期返回4个像素,采样率为(每行总像素/ 4) *总视频线.较低的输出速率(在模型中为绿色)表明,您可以将输入帧速率或分辨率提高4倍,从而在同一帧周期内使用与单个像素相同的时钟频率处理4倍的像素。

SinglePixelGaussianEdgeMultiPixelGaussianEdge子系统使用图像滤波和边缘检测器块计算出相同的结果。

MultiPixelGaussianEdge,块接受并返回四个像素在每个时钟周期。你不必为多像素流配置块,它们检测端口上的输入大小。的pixelcontrol总线表示每组4个像素在帧中的有效性和位置。块缓冲区[4x1]流形成4 [KernelHeightxKernelWidth]核,并并行计算4个卷积得到[4x1]输出。

自定义Multipixel算法

MultiPixelCustomGaussianEdge子系统使用Line Buffer块实现自定义滤波算法。这个子系统类似于库块内部实现多像素内核操作的方式。图像过滤器和边缘检测器块使用了比这里显示的更详细的优化。这个实现显示了使用Line Buffer块的输出来构建自定义多像素算法的起点。

自定义滤波器和自定义边缘检测器使用Line Buffer块返回连续的[KernelHeightxNumberofPixels)地区。每个区域被传递给KernelIndexer子系统,该子系统使用缓存和索引逻辑形成像素数量* [KernelHeightxKernelWidth过滤器的内核。然后,每个内核被传递到一个单独的FilterKernel子系统,以并行地执行卷积。

从行缓冲区输出形成内核

KernelIndexer子系统从Line Buffer块的2d输出形成4 [5x5]滤波内核。

图中显示了如何从[5x4]输出流中提取滤波器核,对于以[4x1]输出中的第一个像素为中心的核。第一个核包含来自2个相邻的[5x4] Line Buffer输出的像素。

以[4x1]输出中最后一个像素为中心的核也包括第三个相邻的[5x4]输出。因此,为了形成4个[5x5]内核,子系统必须从3个[5x4]矩阵中访问列。

KernelIndexer子系统使用当前的[5x4]输入,并使用寄存器存储另外两个[5x4]矩阵shiftEnable.这种设计类似于使用单像素流的线缓冲器的抽头延迟线。子系统然后访问跨列的像素数据,以形成4个[5x5]内核。当块有多个像素输入时,Image Filter块在内部使用相同的逻辑。该块在编译时为任何受支持的内核大小自动设计此逻辑。万博1manbetx

实现过滤器

由于输入的多像素流是一个[4x1]向量,过滤器必须在每个周期上执行四次卷积,以跟上传入数据的速度。有四个并行的FilterKernel子系统,每个子系统执行相同的操作。[5x5]矩阵乘法是通过使用包含流水线乘法器的For Each子系统实现的[5x1]向量乘法。输出被传递到一个加法器树。加法器树也是管道连接的,管道延迟应用于pixelcontrol信号匹配。四个FilterKernel子系统的结果然后被连接到一个[4x1]输出向量中。

实现边缘检测器

为了匹配边缘检测器块的算法,这个自定义边缘检测器使用[3x3]的核大小。将用于[3x3]边缘检测的KernelIndexer子系统与上面描述的[5x5]内核进行比较。该算法仍然必须从Line Buffer块的输出中访问三个连续的矩阵(包括在内核的任何一边的填充)。然而,该算法节省了更少的列来形成更小的过滤器内核。

扩展到更大的内核大小

对于[4x1]多像素流,KernelIndexer逻辑看起来与[11x11]内核大小相似。在这个尺寸下,填充像素的数量,(地板(11))= 5,将在从行缓冲区返回的两个[11x4]矩阵上重叠。这种重叠意味着算法需要从Line Buffer中存储5个[5x4]矩阵,以在每个循环中形成4个[11x11]核。

提高仿真时间

在默认的示例配置中,单个像素、多像素和自定义多像素子系统都并行运行。仿真速度受到处理单像素路径的时间限制,因为处理相同大小的帧需要更多的迭代。为了观察多像素流模拟速度的提高,注释掉单像素数据路径。

HDL实现结果

HDL是由MultiPixelGaussianEdge子系统和MultiPixelCustomGaussianEdge在Xilinx™ZC706板上通过Place和Route。的MultiPixelCustomGaussianEdge子系统,它不尝试优化系数,有以下结果-

T = 4x2 table Resource Usage _________ _____ DSP48 108 Flip Flop 9842 LUT 4960 BRAM 12

MultiPixelGaussianEdge子系统,使用优化的Image Filter和Edge Detector块使用更少的资源,如下表所示。这个比较显示了由于块分析滤波器结构和预添加重复系数而节省的资源。

T = 4x2 table Resource Usage _________ _____ DSP48 16 Flip Flop 3959 LUT 1789 BRAM 10

另请参阅

|||

相关的话题