转换MATLAB算法到串行设计的HDL代码生成

Kiran Kintali, MathWorks

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

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

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

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

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

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

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

该算法使用昂贵的数学函数。对变量使用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个周期来填充每一行图像开始的过滤器管道,并计算第一个中心像素。这意味着我们需要在滤波器的输出处附加控制信号来指示中心像素输出的有效性。

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

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

并行算法

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

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

硬件算法的优化

为了找到相邻像素的最小值、中值和最大值,软件实现中的嵌套循环从左到右、从上到下遍历所有行。在硬件友好的实现中,最小/最大/中值计算只发生在感兴趣的区域,使用一维中值滤波器识别。图3(上)显示了3x3窗口的最小/最大/中值的计算;正如可以看到的,一个nxn像素区域要求{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_1dget_ median_2d并对模型进行仿真,比较不同选择之间的降噪差异。

该算法的输出像素用于原图像去噪。

这种方法的优点

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

自适应中值滤波器

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

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

发布2011 - 91893v00