基于H.264的运动估计算法的DSP实现
摘要:TMS320DM642是TI公司推出的一款面向数字多媒体应用的专业芯片,它基于C64X内核,使用先进的甚长指令字结构(VLIW),具有强大的并行处理能力。本文完成了基于H.264的运动估计算法的DSP实现,结合算法特点,充分利用DM642特性,采取了一系列的优化措施,很好地解决了算法实现过程中的实时性问题。 关键词:DM642;运动估计;软件流水
1 引言 多媒体业务的飞速发展对视频编码技术提出了更高的要求。如何在尽可能低的码率下获得尽可能好的图像质量是一系列视频编码标准的共同目标。H.264是新一代的面向低码率视频通信应用的视频图像压缩标准。与此前的视频编码标准相比较,H.264拥有极高的压缩效率和极强的容错性能,这使视频编码效率获得大幅提高,但同时这也使运算复杂度猛增。运动估计和运动补偿作为视频压缩编码系统的核心算法,占整个系统运算量的60%-80%。研究运动估计算法的DSP实现对整个H.264系统的嵌入式应用具有重要的指导意义。 TMS320DM642是TI公司推出的一款面向数字多媒体应用的专业芯片,它基于C64X内核,拥有强大的处理性能和丰富的外围接口。本文完成了基于H.264的运动估计算法的DSP实现,通过使用一系列优化方案,很好地实现了对算法的实时处理。
2 运动估计算法 运动估计算法是视频压缩编码的核心算法之一。高质量的运动估计算法是高效视频编码的前提和基础。其中块匹配法(BMA, Block Match Algorithm)由于算法简单和易于硬件实现,被广泛应用于各视频编码标准中。块匹配法的基本思想是先将图像划分为许多子块,然后对当前帧中的每一块根据一定的匹配准则在相邻帧中找出当前块的匹配块,由此得到两者的相对位移,即当前块的运动矢量。在H.264标准的搜索算法中,图像序列的当前帧被划分成互不重叠16×16大小的子块,而每个子块又可划分成更小的子块,当前子块按一定的块匹配准则在参考帧中对应位置的一定搜索范围内寻找最佳匹配块,由此得到运动矢量和匹配误差。运动估计的估计精度和运算复杂度取决于搜索策略和块匹配准则。这里使用H.264推荐算法UMHexagonS(Unsymmetrical-cross Multi-Hexagon-grid Search)作为DSP实现的算法参考,与FS算法比较,它在保证可靠搜索精度的前提下大幅降低搜索复杂度。同时使用绝对差和(SAD, the Sum of Absolute Difference)标准作为匹配准则,它具有便于硬件实现的优点。 式中,是位移矢量为当前子块左上角坐标,分别为当前帧和上一帧的灰度值,为子块大小。若在某一个点达到最小,则该点为要找的最优匹配点,对应的块即为最优匹配块。
3 TMS320DM642 DSP硬件平台 数字多媒体处理器DM642的结构如图3.1所示。DM642是TI公司C6000系列的一款新型高性能DSP,基于C64x内核,扩展的高级甚长指令字(VLIW, Very Long Instruction Word)体系结构,具有64个32位通用寄存器,8个独立计算功能单元可并行运行。主频为600MHz,峰值计算速度达4800MIPS。DM642采用两级缓存结构,第一级包括相互独立的L1P(16K字节)和L1D(16K字节),只能作为高速缓存使用。第二级L2(256K字节)是一个统一的程序/数据空间,可以整体作为SRAM映射到存储空间,也可以整体作为第二级Cache,或是二者按比例的一种组合来使用。DM642具有64个独立通道的增强型直接存储器访问(EDMA, Enhanced Direct Memory Access)控制器,负责片内L2与外设以及外设之间数据高速传输。 DM642具有丰富的外围设备接口:三个可配置的双通道视频端口Video Port;64bit的外部内存接口EMIF;10/100M以太网MAC;66MHz 32bit的PCI接口,符合PCI2.2标准。高性能DM642是目前构建数字多媒体处理应用的一个理想平台。 4 运动估计算法的DSP DM642实现与优化 4.1 算法实现流程 与基于PC的算法实现相比,基于DM642的算法实现对实时性提出了更高的要求。这就要求由视频采集、处理和显示组成的系统能够高效工作。基于DM642的视频处理系统流程如图4.1所示。 运动估计算法实现流程如图4.2所示: 4.2 存储器系统优化 4.2.1 Cache优化策略 Cache优化主要是要合理配置L2缓存中Cache和SRAM的大小。Cache和SRAM的大小应根据具体应用要求作相应的配置。通常,Cache容量越大越好,但是由于它是由CPU管理,而不能由程序员手动控制,这就降低了应用的灵活性。对于视频处理算法,把一些频繁访问的数据放入SRAM是很有必要的,这有利于系统性能的提升。实验表明,在本系统中将Cache和SRAM各配置成128Kbytes,能够获得最佳效果。
4.2.2 存储器空间分配 对于嵌入式系统来说,存储器大小有限,是系统宝贵的资源,对其应用需要作细致额考虑和周密的管理。由于DSP内核对不同存储空间的数据访问速度差异很大,运动估计算法涉及大量的数据存储和读取,所以存储器的使用是否恰当,对算法的实时性能有很大的影响。表4.1给出了系统中主要的存储器分配方案。 表4.1 运动估计算法实现所需的主要存储器空间的分配 通过对重要数据段和代码段的存储器配置,巧妙地克服了片上存储器空间太小带来的限制,同时又充分利用了DM642的分层存储特性,使缓存命中率有效提高,避免了不必要的CPU等待时间,使DM642性能充分发挥。 4.2.3 使用EDMA EDMA是DM642中用于快速数据交换的重要技术,具有独立于CPU的后台批量数据传输能力,能够满足实时图像处理中高速图像数据传输的要求,同时使DSP性能充分发挥。 在实时系统中,我们使用DAT_copy2d()函数完成视频采集和显示缓存与帧存储器SDRAM之间的数据传输。DAT_copy2d()完成2D数据直接的高速传输,非常适用于图像数据传输。通过充分利用EDMA的功能特性,为系统处理性能的提高提供了保障。
4.3 程序代码级优化 4.3.1 使用软件流水处理提高并行性 在算法实现过程中,循环代码往往要占用大量的时间。在运动估计算法中,有许多对图像宏块和像素的操作,这就涉及到大量的循环运算,为了使代码有理想的并行性,对多数代码的优化,特别是循环代码的优化,多采用软件流水技术。软件流水是一种用于安排循环内的指令运行方式的技术,编排循环指令,使得循环的多次迭代能够并行的执行。在C/C++编译器里,采用软件流水使编译出来的程序代码优化是一项核心技术。 4.3.2 运用TI图像库 TI提供了专用于C64x系列DSP的图像视频函数库IMGLIB。该库中包含大量的C代码可直接调用的、汇编优化的、通用的图像视频处理函数。通过使用库函数,可以得到比常规C代码函数优秀得多的性能。在程序优化过程中,我们使用IMG_sad_16×16函数计算当前宏块与参考宏块的SAD值,使运算复杂度有效降低。 4.3.3 使用线性汇编 线性汇编语言是C6000系列DSP独有的一种编程语言,介于高级语言和低级语言之间。编写线性汇编程序时可完全按照高级语言的方式编写,而不必考虑指令的延时、指令的并行与否、寄存器的使用和功能单元的分配,汇编优化器将根据代码情况自动确定这些信息。可通过性能分析工具Profiler找到调用频率高的C代码段,然后用线性汇编语言改写,采用汇编优化器进行优化,使代码效率获得最大限度的提升。表4.2列出了使用C代码与使用线性汇编优化的代码所耗费的时钟周期数。 表4.2 代码优化的结果比较 5 结论 本文采用TI公司生产的TMS320DM642芯片完成了基于H.264运动估计算法的实现与优化。在未对算法实现做优化时图像显示帧率为19帧/秒,经过一系列的优化措施之后,显示帧率达到32帧/秒,且图像清晰,无明显块效应。运动估计算法实现的难点主要在于软件程序的优化,通过软件流水和线性汇编等优化手段,可以达到较好的实时效果。
|