技术文章及通讯

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

作者:Kiran Kintali, MathWorks


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

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

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

matlab_fig1_w.jpg
图1。自适应中值滤波器的Simulink模型,用于C代码生成,具有原始和输出图像(左上)和相应的MATLAB代码(右上)。

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

算法对整个图像进行运算。典型的硬件实现将数据以小块的形式传输到芯片中窗户内核减少芯片I/O次数;数据处理速度更快,在下一帧数据可用之前,芯片完成了整帧数据的处理。

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

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

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

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

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

改进硬件自适应滤波算法

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

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

本文主要关注前两个任务。

序列化输入图像

大多数硬件算法并不适用于整个图像,而是适用于每个时间步的小窗口。因此,原始输入图像必须被序列化并流到芯片中,并且根据算法计算需要的图像的多少,缓冲到芯片上的内存中。这种算法的硬件建模必须考虑可用来保存图像数据的内存数量,以及芯片上可用来传输数据的I/O引脚的数量。

在我们的例子中,序列化涉及到重构Simulink模型,以便我们的自适应滤波器设计将图像分解为9x1列的像素数据,并将其作为输入输入到滤波器。数据在芯片内缓冲9个周期,创建一个9x9窗口来计算一个新的中心像素。过滤器处理这个窗口的数据,并为9x9窗口传输修改后的中心像素值。在滤波器的输出端,修改后的中心像素数据应用于原始图像,重建去噪后的图像。现在过滤器处理的是更小的数据窗口,它需要以更快的速度运行,以便在下一张图像输入前完成对图像的整个算法处理。我们使用速率转换块对算法行为建模。

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

matlab_fig2_w.jpg
图2。自适应中值滤波器的Simulink模型,为HDL代码生成而建立,通过“capture_column_data”子系统(左下)表示对9x1列数据的扫描,并实现自适应中值滤波器(右下)。

在过滤器的输出端,分系统“update_image”从“MedianFilter_2D_HW”分系统获取过滤后的数据,并根据控制信号重建完整的映像。

算法并行化

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

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

硬件优化算法

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

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

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

我们可以探索其他领域的权衡——例如,我们可以实现一个二维过滤算法,该算法适用于对象的各个行和列nxn区域,而不是所有像素。这将比1D过滤器消耗更少的资源,并且需要800个比较器(18 + 100 + 196 + 486)而不是4752个。然而,因为我们知道中心像素值通常在3x3区域,我们可以通过应用有损2D算法(get_median_2d),同时对3x3区域应用1D算法(图3,底部)。

为了尝试这些权衡,我们只需交换对路径上函数的调用get_median_1dget_ median_2d并对模型进行仿真,比较不同方案降噪效果的差异。

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

这种方法的优点

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

自适应中值滤波器

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

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

发布于2011年- 91893v00

Baidu
map