基于DSP5402的指纹识别系统实现问题研究
摘要:TI的54系列DSP属于低端产品,主频低且内存小,但有着极大的价格优势, 要实现基于DSP5402的指纹识别系统就需要解决两个难题,一是合理分配存储空间,二是在不影响算法准确度的前提下尽可能优化算法。 本文针对5402的特点,采取了一些解决办法,主要包括对指纹进行分块处理,使用混合编程来实现滤波,最后根据编程实践经验提出了一些编程细节上的优化建议。试验结果表明这些改进都是切实有效的。
关键词:指纹识别;优化;混合编程
1 引言
随着生物特征技术的发展,目前基于PC机的指纹识别算法已经有了很大进步,但往往由于受到内存和速度的限制而无法移植到嵌入式系统中,特别是一些性价比较高的低端处理器中。例如TMS320VC5402这款DSP[1],其主频为100MHZ,片上内存只有16K,扩展后寻址空间可以到64K,而一幅256x256大小的指纹图像就已经有64K,如何解决在这种低端硬件环境下实现指纹的处理与识别仍旧是个比较重要而有意义的问题,目前的论文还少有论述,本文针对TMS320VC5402这款DSP的特点,提出了一些有效的解决方法。
2 数据空间扩展和分块处理方法
2.1 数据空间的扩展
首先设置MP/MC=0,OVLY=1,即DSP工作在微机模式,在这种模式下,DSP上电后先运行引导程序,将FLASH中的程序加载到片上16K的空间里。5402的64K数据空间对于指纹处理是远远不够的,所以本文为5402扩展了一个256Kx16bit的SRAM。将SRAM的低16位地址A0-A15与DSP对应的地址线连接,而将DSP的8位HPI主机接口通过把HPIENA接地设置成为通用IO口,将其中的HD0,HD1通过寄存器GPIOCR编程设置成输出,作为SRAM的A16-A17的地址发生信号。这样就把256K的SRAM分为4页,分别对应HD0,HD1为00,01,10,11。DSP和SRAM的连接方法如图1所示。
图1 DSP与SRAM连接简图
2.2 指纹分块处理的实现
虽然扩展的256K空间被分成了4页,每页都有64K的空间,但外扩的数据空间每页的头16K是无法使用的,对他们的寻址实际上就是对片上的16K内存寻址,而片上16K的空间已经分配给程序了,所以每页实际可以使用的空间只有48K,这就需要将指纹分块处理。本文使用的指纹为64K,大小为256x256像素,分块实现过程如下,当对指纹采集时,将指纹分为2块,分别存放在第2页和第3页,每块32K;当对指纹进行增强处理时,由于要开辟一个和待处理指纹大小一样的空间存放中间平滑结果,所以一次只能处理四分之一大小即16K的指纹图像。将这16K的指纹图像和中间结果空间共32K放在第0页,而第1页空间用于特征点提取和去除伪特征点。分配示意图见图2。
图2 扩展数据空间分配图
3 使用混合编程实现图象增强滤波
在对TMS320C54x DSP进行软件开发时,既可由汇编语言、也可由C语言实现。汇编语言作为一种面向机器的低级语言,可以最充分地利用DSP所提供的硬件资源,编译效率高,执行速度快,但程序的可读性、可维护性及可移植性均较差,且代码编写繁杂,开发周期较长,不易升级。另外,对DSP某些硬件控制的编程,用C语言不如用汇编语言方便,有些甚至根本无法实现[2]。为了充分发挥上述两种语言的优势,克服各自的不足,可将它们混合进行编程。在指纹识别的核心算法中,象素的卷积乘加运算是最耗时的部分[3],对于256X256大小的指纹图象,用7X7的模板进行一次平滑滤波就需3211264次的乘加运算,在100MHZ主频下耗时0.9875S。如果再进行一次锐化滤波那就还需要将近1S,再加上求指纹方向和细化的运算,算法时间将超过3S,而正常指纹识别产品的指纹登记时间不超过2S,所以有必要混合编程的方法将核心算法部分用汇编改写。
3.1 混合编程的接口规则
C 程序与汇编程序定义的变量相互之间可以进行访问,但要遵守一定规则[4][5] 。在C中定义的变量,在汇编程序中使用时,需要用.global加以声明,并在变量前加下划线“_”。
例如在C语言中定义一个全局数组:
int block[22x22];
在汇编程序中应声明为:
.global _block
C 程序中调用的汇编函数,在汇编中其名称以程序标号的形式出现。程序标号作为操作数用.global进行定义。并且同变量一样,在前面加下划线“_”,在C语言中用extern声明。
本文增强滤波汇编函数的声明为:
.global _filter
.text
_filter:
… ;函数主体采用线性汇编
RET
在C语言声明为:
extern _filter();
C语言调用的形式为:
filter (enhance,10,7);
其中enhance为增强模板数组名,10表示原图像分块大小为10x10,7表示模板数组大小为7x7。
3.2 调用函数的参数传递
按照惯例, C语言是利用堆栈将参数传递给被调用的子函数(即子程序) 的。但对TMS320C54xDSP有些特殊,它不仅利用堆栈,而且还利用累加器A进行参数传递。传递的规则为:第一个参数传递给累加器A,其余参数以逆序压入堆栈,即最右边的参数最先入堆栈,然后自右向左将参数依次压入堆栈。当被调子程序开始执行时,便从累加器A及堆栈按约定的顺序取出参数并进行相应的运算。当被调子程序运行结束后,其返回值(存于累加器A中)传递给调用函数。
下面给出增强滤波汇编函数的参数传递语句:
_filter:
PSHM AR1 ;保护AR1,AR6,AR7
PSHM AR6
PSHM AR7
STL A,*(pt) ;传递模板数组地址
MVDK *SP(4),sw ;传递分块图像大小
MVDK *SP(5),tw ;传递模板数组大小
…
RET 3.3 混合编程指纹处理结果
经过实验验证,锐化算法耗时0.5735S,比用C语言减少了0.414S。只要严格遵循混合编程的各项规则,开发设计人员就能够更充分地利用两种语言的优势,从而编写出实时性更强、效率更高的DSP程序。
5 结论
本文针对DSP5402速度低,内存少的缺点,对基于5402的指纹识别算法采取了一系列调整和优化,通过对指纹进行分块处理来实现内存的合理高效的使用,通过使用混合编程改写C语言增强算法,显著提高了Gabor滤波算法的速度,最后针对算法的细节问题提出了几点优化建议。实验结果表明,这些措施和改进都取得了较好的效果。
|