技术文章和新闻稿

将MATLAB算法转换为HDL代码生成的序列化设计

作者:Kiran Kintali,Mathworks


万博1manbetx®让你整合Matlab®将算法转换为Simulink模型,用万博1manbetx于生成C或HDL代码。然而,信号处理、通信和图像处理算法的许多MATLAB实现都需要重新设计,以使其适合HDL代码生成。例如,它们通常使用数据类型,如double、string和structure,并包含控制流结构,如while循环和break语句,这些结构不能很好地映射到硬件。除了这些构造之外,在编写大型数据集上运行的MATLAB算法时,并不总是考虑到硬件设计特性,如流和资源共享。本文使用一个典型的自适应中值滤波器的软件实现来说明将MATLAB算法转换为HDL代码生成的过程。

我们从一个模拟模型开始,该模型采万博1manbetx用嘈杂的131x131像素图像,并应用自适应中值滤波器以获得去噪图像(图1,左上)。

当前版本的算法在Matlab中实现了C代码生成(图1,右上角)。该算法将整个输入图像“I”为“I”,输入,在双精度下对数据进行操作,并将去噪图像“J”返回为输出。算法的核心在整个图像上运行的三个嵌套循环中实现。两个外部循环迭代图像的行和列。通过将中位数与阈值进行比较并决定是否更换像素或增加邻域大小并重新计算中值并重新计算中值并重新计算中位数,实现过滤器的自适应性质。

图1.自适应中值滤波万博1manbetx器的Simulink模型,设置为C代码生成,原始和输出图像(左上角)和相应的Matlab代码(右上角)。

该算法使用四个邻域大小:3x3,5x5,7x7和9x9。尽管目前的实现包含软件实现中典型的构造和范例,但对于软件有效,其当前形式不适合硬件合成,原因如下:

该算法在整个图像上运行。典型的硬件实现将数据流流入调用的小块中的芯片视窗内核减少芯片I / O计数;数据以更快的速率处理,并且在下一帧可用之前,芯片完成处理整个数据帧。

该算法使用双数据类型。双数据类型对于硬件实现来说效率不高。硬件实现必须有效地利用硅面积,避免使用双精度算法,这会消耗更多的面积和功率。算法应该使用定点数据类型,而不是浮点数据类型(双精度)。

该算法使用昂贵的数学函数。使用像罪恶,划分和模数的运算符,导致硬件效率低下。在硬件中实现这些功能的实现导致低时钟频率。为了硬件设计权衡,我们需要使用低成本重复的添加或基于减去基于Cordic的算法。

算法中的软件循环必须有效地映射到硬件。由于硬件执行需要确定性,因此我们无法允许带有动态界限的循环。硬件并行,这意味着我们可以在硬件中展开循环执行来提高并发性,但这将使用更多硅区域。

该算法包含大阵列和矩阵。当映射到硬件时,大阵列和矩阵消耗了寄存器和RAM等区域资源。

在下一节中,我们将看到有关相同的自适应中位过滤器的重组面向硬件的实现方式如何解决这些问题中的每一个问题。

修改硬件的自适应滤波器算法

将原始自适应中位数算法转换为硬件的过程涉及以下任务:

  • 序列化输入图像以进行处理
  • 分离自适应中值滤波器计算并行化
  • 使用denoise像素值更新原始图像

本文重点关注前两个任务。

序列化输入图像

大多数硬件算法不适用于整个图像,而是在每次步骤上的较小窗口。结果,必须将原始输入图像序列化并流入芯片,并且根据需要为算法计算提供多少图像,缓冲到片上存储器上。这种算法的这种硬件建模必须考虑到可用于保存图像数据的内存量,除了芯片上可用的I / O引脚的数量,还可以在芯片上流中流入。

在我们的示例中,序列化涉及重新构造Simulink模型,以便我们的自适应滤波器设计将图像分解为9x1列像素数据,并万博1manbetx将其作为滤波器的输入。数据在芯片内缓冲9个周期,创建9x9窗口以计算新的中心像素。滤波器处理此数据和流窗口9x9窗口的修改中心像素值。在过滤器输出时,修改后的中心像素数据应用于原始图像,以重建去噪图像。现在过滤器正在处理较小的数据窗口,它需要以更快的速度运行,以便在下一幅图像生成之前完成对图像的整个算法处理我们使用速率转换块对该算法行为进行建模。

这种类型的图像缓冲需要额外的控制信号,以便通过硬件中实现的算法处理数据流。在此模型(图2)中,子系统“捕获列数据”有助于扫描图像,在9x1窗口中,将数据提供给主过滤器子系统(“MedianFilter_2D_uhw”)。由于2D自适应中值滤波器的最大窗口大小为9x9,因此需要9个周期来填充每行图像开始处的滤波器管道并计算第一个中心像素。这意味着我们需要在滤波器的输出端附加控制信号,以指示中心像素输出的有效性。

图2. Adapti万博1manbetxve Median滤波器的Simulink模型,设置为HDL代码生成,表示“Capture_Column_Data”子系统(左下角)和Adaptive中值滤波器(右下)的实现的9x1列数据的扫描表示。

在过滤器的输出时,子系统“update_Image”从“MedianFilter_2D_HW”子系统中获取过滤数据,并基于控制信号重建全图像。

并行化算法

自适应中值滤波器基于选择窗口大小的选择,以计算局部统计数据的中位数。面向软件的实现在嵌套循环中顺序计算每个窗口大小的这些统计信息。硬件实现可以并行执行这些计算。

新的过滤器实现将数据缓冲区划分为3x3、5x5、7x7和9x9区域,并实现单独的中值过滤器以并行计算每个子区域的最小值、中值和最大值(图2,右下角)。并行化窗口计算使过滤器在硬件上执行得更快。

优化硬件算法

要找到相邻像素的最小,中值和最大值,软件实现中的嵌套循环遍历从左到右和顶部到底部的所有行迭代。在硬件友好实现中,Min / MAX /中音计算仅发生在感兴趣的区域上,使用1D中位滤波器识别。图3(顶部)显示了3x3窗口的Min / MAX / MEDIAN值的计算;可以看出,一个NXN像素区域需要{N.2*地板(日志2N2/ 2)}比较国的数目。

图3. TOP:用于计算MIN / MAX / MEDIAN for 3x3窗口的算法;底部:1D中值滤波器的硬件优化实现。

要在3x3,5x5,7x7和9x9窗口上实现算法,我们将共4752(9 * 4 + 25 * 12 + 49 * 24 + 81 * 40)比较器。

我们可以探索其他区域权衡 - 例如,我们可以实现一个2D过滤算法,适用于各个行和列NXN区域而不是在所有像素上。这将消耗更少的资源,而不是1D过滤器,并且需要800个比较器(18 + 100 + 196 + 486)而不是4752.但是,因为我们知道中心像素值通常在3x3区域中找到,我们可能会妥协质量通过应用损失的2D算法(get_median_2d.)在将1D算法应用于3x3区域时的其他区域(图3,底部)。

实验这些权衡,我们只需将呼叫交换到路径上的功能获得中位数get_ median_2d.并对模型进行仿真,比较不同选择的降噪效果差异。

该算法的输出像素用于对原始图像进行去噪。

这种方法的优点

MATLAB和SIMU万博1manbetxLINK提供了一种表示算法的简明方法:自适应中值滤波器在大约186行的MATLAB代码中描述。可比的C代码实现需要近1000行;HDL实现,2000多行。在定位硬件和软件时理解建模权衡是有效实现复杂信号和视频处理算法的关键。Matlab和Simu万博1manbetxlink帮助您在高级别的抽象中探索这些权衡,而无需编码太多的硬件细节,提供了使用MATLAB环境进行硬件部署的有效方法。

自适应中位过滤器

自适应中值滤波是一种常用的数字图像处理技术,用于减少斑点噪音和盐酸辣椒噪声。通用中值滤波器用其相邻像素值的中值替换当前像素值;它影响所有像素,无论它们是否都是嘈杂的,因此,具有高噪声内容的图像。自适应中值过滤器通过选择性地替换像素值来克服这种限制。它通过分析中位数来做出决定。如果中位数被噪音倾斜,它通过定义更大地区的中位数来适应自身。

由于这些优点,自适应中值滤波器通常用作清洁图像以进行进一步处理的预处理步骤。由于算法的计算复杂性和高吞吐量要求,滤波器的硬件实现是非常理想的。

2011年出版-91893v00