常用图像处理方法在ADSP2189上的实现
近几年来,Analog Devices公司的ADSP系列数字信号处理器以其优异的性能和简单易学的语言逐渐受到人们的青睐,其中的ADSP218X定点系列更是得到广泛的应用。ADSP2189片内有192KB的RAM,因此更多地应用于图像领域。本文就图像处理压缩过程中常用到的算法及其在ADSP2189上的实现进行了分析,如何充分利用ADSP系列数字信号处理器特殊的硬件结构和功能强大的指令集实现各种算法是本文讨论的重点。然而作为通用定点处理器,处理过程中如何避免可能出现的问题以及如何解决问题也是本文所要讨论的。
1 ADSP2189及EZ-KIT简介
ADSP2189是指令执行速度最高可达75MIPS的16位定点数字信号处理器,主要具有以下特点:单周期指令执行,片内的程序控制器不会附加循环和条件指令的执行周期;三总线的体系结构允许在单指令周期中进行双操作数传递;片内192KB的存储器可被配置成32K×24bit的程序区(PM Program Memory)和48K×16bit的数据区(DM: Data Memory),而PM中还可同时存放数据。除了具有优异的计算能力外,ADSP2189还具有强大的系统接口:8位的BDMA端口寻址可达4MB,用来提供片内外存储器的高速存取;16位的IDMA(Internal Direct Memory Access)端口可实现主系统对片内存储器的高速存取;2048个I/O地址,支持并行的外设;两个双缓冲串口,带自动压扩。
ADSP-2189M EZ-KIT Lite是一块可用来演示验证DSP基本算法的仿真板,也是本文所有算法的测试平台。它主要由以下器件组成:
·ADSP-2189M 75 MIPS DSP
·AD73322立体声编译码器
·RS-232接口
·FLASH存储器
EZ-KIT Lite的FLASH存储器中带有监控程序,这段程序可完成仿真板与PC机间的串行通信,并允许用户下载、执行和调试ADSP2189程序。EZ-KIT Lite可与EZ-ICE仿真器相连,通过EZ-ICE仿真器,用户可以单步执行程序、观察和改变寄存器和内存值以及完成其它调试工作[1]。
2 模板运算
在图像处理时,模板运算有着广泛的应用。例如,在边沿检测时,通过将像素矩阵与边沿检测矩阵即模板相卷积来实现检测功能;在图像平滑时,通过模板运算来滤除噪声。模板运算的数学涵义就是卷积(或互相关)运算[2],它是一项非常耗时的运算。以模板1/16[1 2 1 2 4 2 1 2 1]为例,每个像素完成一次模板操作要用9个乘法、8个加法和1个除法。对于一幅N×N的图像,就是9N2个乘法,8N2个加法和N2个除法,算法复杂度为0(N2)。一幅较大的图像计算量是很大的,所以很多专用的图像处理系统,用硬件来完成模板运算,这样可以大大提高速度。在ADSP2189上快速实现模板运算需要充分利用ADSP2189的结构特点和功能强大的指令集。由于ADSP的哈佛结构允许同时访问程序和数据存储器,而ADSP的多功能指令(Multifunction Instructions)在执行算术操作的同时还可以并行进行数据传输,因此在单周期内可以完成取指、译码、读数、执行和调整寄存器。例如,MR=MR+MX0*MY0(SS)、MX0=DM(I0,M0)、MY0=PM(I4,M4),MX0和MY0分别从数据和程序存储区以间接寻址方式取得操作数相乘,乘积与结果寄存器中数值相加后放回结果寄存器,数值计算的同时地址指针寄存器I0、I4中的地址自动与调整寄存器中M值进行相加更新。虽然ADSP2189支持除法指令,但为了提高速度,可在程序中将除法改为乘以除数的倒数。另外,在程序中将2维模板运算转换成1维模板运算,可极大地降低运算量。需要注意的是,由于ADSP2189中CNTR寄存器为14bit,所以在单循环处理中输入像素个数必须小于16383。模板运算程序的流程如图1所示。
以3×3模板为例,通过在Visual DSP环境下设置PROFILE选项,可以得到以下结论:对于一个100×100的数组,完成模板运算共需要96445个指令周期;对于一个640×480的数组,共需要3052205个指令周期,远远低于直接计算。
3 DCT变换
许多图像压缩算法采用DCT(Discrete Cosine Transform,即离散余弦变换)来消除像素间冗余,例如JPEG 、H.261以及MPEG。采用DCT是因为它具有以下优点:DCT不同于DFT(Discrete Fourier Transform,即离散傅立叶变换),它属于实域运算;DCT变换矩阵的基向量很接近于托波列兹矩阵的特征向量,所得变换系数具有弱相关性,可以单独处理各系数而不损失压缩效率。
一维DCT表达式如下:
二维DCT表达式如下:
式中
由上面的表达式可以看出DCT属于可分离变换,所以二维DCT通常不采用直接计算的方式,而是对原始图像数据的行和列分别做一维DCT,即将图像数据的各行做一维DCT,然后将结果矩阵各列再做一次一维DCT。以8×8的图像块为例,进行行列一维DCT需要1024次乘法和896次加法,难以满足实时要求。因此人们研究了许多DCT的快速算法,如何选取一种适合ADSP结构的算法是提高运算速度的关键。计算DCT的快速算法大体上可以归纳为三类[3~6]:(1)间接计算法。利用FFT和Walsh-Hadamard变换计算DCT,这类算法包含许多多余的过程,降低了运算速度;(2)直接矩阵分解法。利用稀疏矩阵直接分解,使计算速度优于其它算法,仅需较少的乘法和加法,但需对余弦系数进行求反和除法,因而数值不稳定;(3)递归算法。Kashef提出的递归算法[4]需要计算N阶三角矩阵,而Hou[5]提出的算法不仅具有规则的递归结构,并且具有稳定的数值特性,适合于在DSP上实现,因为它通过少量的乘加运算就可实现DCT,并且对DSP的片内存储区占用少。这一算法的基本思想类似于Cooley- Tukey FFT算法,它用两个相同的低阶DCT来构成一个高阶DCT。以8点一维DCT为例,其信号流程图如图2所示。
由图2可以看出,利用这种方法计算8×8的DCT仅仅需要计算192次乘法和464次加法,计算量远远小于标准算法。由于算法的递归性以及对各行各列做同样的处理,所以将分解计算过程以子程序方式调用可以大大降低对存储区的要求。另外,如果采用"同址计算"的方式,即把运算结果放回到参加运算的输入数据的原存储地址,还可以节省存储空间。以8×8的数据块为例,应用这种算法的程序流程图如图3所示。
在Visual DSP++2.0环境下编译执行,可以得到8×8数据块快速算法和标准算法的指令周期数和执行时间,如表1所示。
很明显,采用快速算法将大大减少处理时间,因此对于实时图像处理选取合适的算法很重要。
在图像编码中,DCT本身并不减少数据。真正的数据量减少出现在将DCT的结果也就是DCT系数进行量化,量化后大部分系数接近于零,最后把经之字形扫描的系数进行熵编码,就达到了压缩效果。之字形扫描在ADSP2189上实现起来简单方便,因为对于8×8的数据块进行之字形扫描仅需要四个地址调整变量。而ADSP2189的数据内存和程序内存各有4个用于产生地址的指针寄存器,每个指针寄存器都可以被四个调整寄存器调整进行更新,即被I0~I3和M0~M3以任何组合进行调整,因此定义M0~M3分别为1、-7、7和8,就可以方便地进行之字扫描。在这个过程中,间接寻址和其它数值计算并行进行,因此不会增加指令执行时间和代码大小。所以在ADSP2189上实现JPEG编码,可以在量化的同时进行之字扫描,无需额外开销。
4 常见问题和解决方法
在ADSP218X上实现各种处理时,算法本身或者某型号的处理器会出现各种各样的问题,常见原因主要有:
(1)内存问题 对于ADSP218X系列处理器来讲,其主要区别就在于内部存储区大小的不同。但由于受内部总线的限制,无论程序存储区还是数据存储区每次只能处理16K,因此在编译程序的过程中,应预先估算一下占用内存的情况,以避免运行错误,尤其是c语言源程序在使用默认的LDF(Linker Description File)文件时很容易发生超出内存范围的情况。在Visual DSP编译环境下可利用MAP文件查看存储区的分配。由于DSP采用数据区与程序区分离的哈佛结构,所以可利用这一特点将较大的数据块放在不同的区域,充分利用片内资源。其次是采用原址运算,即输出变量和输入变量占用同样的存储区,从而节省空间,或者通过LDF文件使用内存重叠区。
(2)溢出问题 在ADSP2189中通常采用1.15数据格式,而它属于定点DSP,动态范围有限,两个1.15格式的数相乘后,结果字长变成了2.30格式,在多次相乘累加后,32位的MAC(乘加器)有可能溢出。如果用舍位方法使结果仍然保持为预定的位数,则会引入误差。多次舍位可能造成严重的误差积累。因此在存放运算结果的字长一定的情况下,需要防止计算结果特别是中间结果的溢出。如果这个溢出能够预期的话,可以预先确定运算的标度,即预先确定应空出的高位位数(称为预定标度)。预定标度防止了数据溢出,但是以丢失精度为代价的,同时这样又增加了运算量。为了保证结果不溢出,预先空出来的位数不仅与待处理数据有关,还与处理数据的函数和该函数的实现过程有关。在实际图像处理应用中,要从精度和溢出两方面综合考虑,选择一个最佳的定标方案,在保证不产生溢出的情况下尽量降低误差。另外还有一种输入溢出,此时输入值被截取为可表示数据的最大或最小值,从而使得输入失真。解决方法同样是对输入值进行预定标处理。
(3)量化效应 对于定点的处理器ADSP2189,量化效应对某些算法有较大影响。例如在数字滤波器的设计当中,传输函数的系数必须用固定长度的二进制表示,这样的量化处理就会引起量化误差,使得滤波器实际系数偏离原来设计系数,造成极零点位置偏离理论设计位置,从而使滤波性能变差。严重时极点移到单位圆上,破坏了滤波器的稳定性。因此在DSP上进行滤波处理时,应合理选择算法和运算字长。
(4)延时问题 当DSP需要对每个输入信号进行顺序处理时,输入信号频率就对处理器的执行速度提出了要求。通常的处理延时主要由DSP的速度和所执行算法的复杂程度来决定,也与外围逻辑及存储器件的时间特性有关。所以要想提高系统的实时性,必须选用高速的器件,并尽量简化处理算法。
从以上讨论可以看出,即使是很常用的算法,在DSP上的实现过程与在PC机上的实现过程也会有很大不同,如何针对不同的芯片选取合适的算法,充分利用各芯片所支持指令集是保证高速处理图像的关键。
|