技术文章和通讯

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

作者:Kiran Kintali, MathWorks


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

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

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

matlab_fig1_w.jpg
图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_ data”帮助扫描图像,并且在9x1窗口中,将数据提供给主Filter子系统(“MedianFilter_2D_ HW”)。由于2D自适应中值滤波器的最大窗口尺寸为9x9,因此需要9个周期在每行图像的开头填充滤波管道并计算第一个中心像素。这意味着我们需要额外的控制信号在滤波器的输出,以表明中心像素输出的有效性。

matlab_fig2_w.jpg
图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)}比较器的数量。

Top:计算3x3窗口最小/最大/中值的算法;下:硬件优化的一维中值滤波器的实现
图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_1dget_ median_2d并对模型进行仿真,比较不同选择的降噪效果的差异。

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

这种方法的优点

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

自适应中值滤波器

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

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

出版于2011年- 91893v00