主要内容

过滤多像素视频流

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

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

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

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

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

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

使用库块的多像素流

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

SinglePixelGaussianEdge而且MultiPixelGaussianEdge子系统使用图像过滤器和边缘检测器块计算相同的结果。

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

自定义多像素算法

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

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

从行缓冲区输出中生成内核

KernelIndexer子系统从Line Buffer块的2-D输出中形成4个[5x5]过滤器内核。

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

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

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

实现过滤器

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

实现边缘检测器

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

扩展到更大的内核大小

对于较大的内核大小,[KernelHeightxNumPixels]区域存储在KernelIndexer中(2 *隔间(地板(KernelWidth/ 2) /NumPixels) + 1).在这种情况下,连接器的输入数量增加到KernelWidth你必须从line Buffer矩阵的延迟线路由这些额外的输入。对于内核大小为[11x11]的[4x1]多像素流,您需要从Line Buffer中存储5个[11x4]矩阵,以形成每个周期的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

另请参阅

|||

相关的话题