技术文章和通讯

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

作者:Kiran Kintali, MathWorks


金宝app®让你集成MATLAB®用于C或HDL代码生成的Simuli金宝appnk模型的算法。然而,许多MATLAB实现的信号处理,通信和图像处理算法需要一些重新设计以使其适用于HDL码生成。例如,它们经常使用数据类型,例如双打,字符串和结构,并包含控制流构造,例如循环和中断语句,这不会很好地映射到硬件。除了这些构造之外,在大数据集上运行的MATLAB算法并不总是写入以考虑流和资源共享等硬件设计特征。本文使用自适应中值滤波器的典型软件实现,以说明为HDL代码生成转换MATLAB算法的过程。

我们从一个Simulink模型开金宝app始,该模型采用131x131像素的噪声图像,并应用自适应中值滤波器来获得去噪图像(图1,左上角)。

该算法的当前版本是在MATLAB中实现的,用于C代码生成(图1,右上角)。该算法将整个输入图像'I'作为输入,以双倍精度对数据进行操作,并返回去噪后的图像'J'作为输出。算法的核心是在三层嵌套循环中对整个图像进行操作。两个外部循环遍历图像的行和列。最内层的循环通过比较中值和阈值来实现滤波器的自适应特性,并决定是替换像素还是增加邻域大小并重新计算中值。

图1所示。金宝appSimulink模型的一个自适应中值滤波器,用C代码生成,有原始和输出图像(左上)和相应的MATLAB代码(右上)。

该算法使用四种邻域大小:3x3、5x5、7x7和9x9。尽管当前的实现包含了软件实现中典型的结构和范例,并且对软件来说是有效的,但在当前的形式下,它不适合硬件合成,原因如下:

算法对整个图像进行操作。典型的硬件实现将数据以称为窗户或者内核减少芯片I/O计数;该芯片以更快的速度处理数据,并在下一帧可用之前完成一整帧数据的处理。

该算法使用双数据类型。双数据类型对于硬件实现不有效。硬件实现必须有效地使用硅区域,并避免使用双精度算术,这消耗更多区域和功率。该算法应使用固定点数据类型而不是浮点数据类型(双倍)。

该算法使用了昂贵的数学函数。对变量使用sin、除法和模等运算符会导致硬件效率低下。Naïve在硬件中实现这些功能会导致较低的时钟频率。为硬件设计权衡,我们需要使用低成本的重复加减算法,如CORDIC。

必须将算法中的软件循环有效地映射到硬件。因为硬件的执行需要是确定性的,所以我们不允许有动态边界的循环。硬件是并行的,这意味着我们可以在硬件中展开循环执行以增加并发性,但这将占用更多的硅区域。

该算法包含大型数组和矩阵。当映射到硬件时,大型数组和矩阵会消耗寄存器和ram等区域资源。

在下一节中,我们将看到同一个自适应中值过滤器的重构面向硬件实现是如何解决这些问题的。

修改硬件自适应滤波算法

将原始的自适应中值算法转换为硬件的过程包括以下任务:

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

本文主要讨论前两个任务。

序列化输入图像

大多数硬件算法不是在整个图像上工作,而是在每个时间步长的小窗口上工作。因此,原始输入图像必须序列化并流进芯片,根据算法计算所需图像的大小,将其缓冲到片上内存中。该算法的硬件建模必须考虑存储图像数据的可用内存数量,以及用于流数据的芯片上可用的I/O引脚数量。

在我们的示例中,序列化涉及重构Simulink模型,使得我们的自适应滤波器设计将图像破坏到9x1列的像素数据中,并金宝app将其作为输入输入到过滤器。数据在芯片内缓冲为9个周期,创建9x9窗口以计算新的中心像素。过滤器处理该数据窗口,并将修改的中心像素值流用于9x9窗口。在滤波器的输出处,修改的中心像素数据被施加到原始图像以重建去噪图像。既然过滤器正在进行较小的数据窗口,它需要以更快的速率运行,以完成在输入的下一个图像之前在图像上处理整个算法。我们使用速率转换块模拟该算法行为。

这种图像缓冲将需要通过在硬件中实现的算法进行额外的控制信号进行待处理的数据流。在此模型(图2)子系统“Capture_Column_数据”有助于扫描图像,并在9x1窗口中,将数据馈送到主滤波器子系统(“MedianFilter_2D_ HW”)。由于2D自适应中值滤波器在最大窗口大小为9x9,因此需要9个周期,以填充每行图像的开头并计算第一中心像素的滤波器流水线。这意味着我们在滤波器的输出时需要额外的控制信号,以指示中心像素输出的有效性。

图2。金宝app一个自适应中值过滤器的Simulink模型,用于HDL代码生成,通过“capture_column_data”子系统(左下)表示对9x1列数据的扫描,并实现自适应中值过滤器(右下)。

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

并行算法

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

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

硬件算法优化

为了找到相邻像素的最小值、中值和最大值,软件实现中的嵌套循环从左到右、从上到下对所有行进行迭代。在硬件友好的实现中,最小/最大/中值计算只发生在感兴趣的区域,使用1D中值滤波器识别。图3(顶部)显示了3x3窗口的min/max/中值的计算;可以看出,annxn像素区域需要{N2*地板(日志2N2/ 2)}比较器数量。

图3。Top:计算3x3窗口最小/最大/中值的算法;下:硬件优化的一维中值滤波器的实现。

为了在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),而对3x3区域应用1D算法(图3,下)。

为了试验这些权衡,我们只需在路径上交换对函数的调用get_median_1d.get_ median_2d并模拟模型以比较不同选择之间的降噪差异。

该算法的输出像素用于代位于原始图像。

这种方法的优点

MATLAB和Simu金宝applink提供了一种简洁的算法表示方法:自适应中值滤波器在大约186行MATLAB代码中进行了描述。一个类似的c代码实现需要将近1000行代码;一个HDL实现,超过2000行。理解针对硬件和软件的建模权衡是有效实现复杂信号和视频处理算法的关键。MATLAB和Simu金宝applink帮助您在不编码太多硬件细节的情况下,在高层次的抽象上探索这些权衡,提供了一种使用MATLAB环境进行硬件部署的有效方法。

自适应中值滤波器

自适应中值滤波是一种常用的数字图像处理技术,用于降低散斑噪声和椒盐噪声。通用中值滤波器用其相邻像素值的中值替换当前像素值;它影响所有像素,无论它们是否有噪声,因此,模糊图像与高噪声内容。自适应中值滤波器通过选择性地替换像素值克服了这一限制。它通过分析中值来做出决定。如果中值被噪声扭曲了,它会通过在更大的区域定义中值来调整自己。

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

发布2011年 - 91893V00