基于定点DSP的软件锁相环的设计和实现
2 48位定点扩展精度算法
图3描述的算法在TMS320VC5510上用C语言直接利用浮点运算实现时,只能通过C编译器产生模拟浮点运算的定点指令。这种方法效率很低,每次环路计算需花费875个指令周期。在调制数据速率为76.8kbps的数字接收机中,需要67.2MIPS的运算量。为了降低环路计算的运算量,同时保持浮点运算具有动态范围大、精度高的优点,笔者提出了一种48位定点扩展精度计算的方法。参加运算的每个操作数由三个16位定点数W2、W1、W0级联表示,其中高16位为二进制补码的整数部分,低32位为二进制补码的小数部分,符号位在最高位,粤可称为Q15.32格式,如图3所示。
一个Q15.32 数的表示范围是(-32768,32768),小数分辨率是1/232(2﹒3283e-10),远远超过16位定点表示的精度,即3e-5(1/2^15-1)。以下用加(ADD_ 48)、减(SUB_48)、乘(MULT_48)三种基本运算来说明定点扩展精度算法。操作数X由X2、X1、X0构成,操作数Y由Y2、Y1、Y0构成,结果W由W2、W1、W0构成。执行48位加法运算时,W2W1W0=X2X1X0十Y2Y1Y0,首先把小数部分X1X0和Y1Y
0相加,结果保存到W1W0中,产生的进位位CARRY与X2、Y2相加,结果保存到W2。执行48位减法运算时,W2W1W0=X2X1X0-Y2Y1Y0,首先X1X0减去Y1Y0,结果保存到W1W0,产生借位位BORROW,再由X2减去Y2和借位位BORROW,结果保存到W2。两个Q15.32数相乘时,乘积是一个Q30.64数,出于前面实现SPLL时对动态范围和计算精度的要求,该Q30.64数可以双向截位为Q15.32的48位定点数。具体做法是保留符号位和整数部分的低15位以及小数部分的高32位。48位定点数的乘法由图4所示。
除了以上加、减、乘三种基本运算外,48位窄点扩展精度算法还包括取负(NEC-48)、数据拷贝(MOVE_48)两种操作。取负操作即将X1X0取负,结果保存到W1W0,产生借位位BORROW,再用0减去X2和借位位BORROW,结果保存到w2;数据拷贝,即把X1X0拷贝到W1W0,X2拷贝到W2。
在TMS320VC5510可编程DSP的基础上,利用48位定点扩展精度算法实现SPLL。在实现过程中,采取了模块化的思路。首先,把SPLL整个环路计算封装成一个可调用的C语言函数。函数参数包括C1、C2、K_norm、基带信号的I及Q分量、环路中间变量、调整频率。DSP的中断例程(ISR)可以直接调用环路计算函数,而且通过输入不同的Cl、C2,适用于不同的载波恢复环路中。另外,在函数内部用汇编语言进行编程,以充分利用DSP的计算能力,把48位定点扩展精度算法的五个基本操作封装成用汇编指令写的宏(macro),对照计穿流程,调用这些宏,完成SPLL的核心计算部分。经统计,每次环路计算需132个指令周期,总的运算量10.1MIPS,是浮点算法运算量(67.2MIPS)的14%。
用48位扩展精度算法实现软件接收机中的SPLL,解决了浮点算法运算量大的问题,同时还具备浮点算法动态范围大、精度高的优点,已经成功应用于"创新一号"小卫星地面手持低功耗通信终端中。另外,本文提出的SPLL实现算法,通过修改环路滤波器系数,也可以应用在其他软件接收机中,具有很好的扩展性。
《基于定点DSP的软件锁相环的设计和实现(第3页)》