本帖最后由 adam02 于 2011-9-14 01:19 编辑
DSP软件开发是一个技巧性很强的软件开发工作,开发者不仅要具有基本的C语言开发能力,还有有一定的嵌入式系统支持。简单地讲,只有清楚地知道自己所写的代码在DSP上是如何执行的,才能写出简洁高效的软件代码。
抛砖引玉,介绍一下自己在DSP软件开发中体会到的技巧,欢迎拍砖。本节介绍DSP内求倒数的方法:
在TI系列DSP中,有专门的指令_subc辅助完成除法运算,这个函数的伪码如下
c = _subc(b, a)
if ((b - a) > 0)
{
c = ((b - a) << 1) + 1;
}
else
{
c = b << 1;
}
如果要就算一个数sdDivData的倒数1/sdDivData,可以用下面代码实现:
ucScaleDivData = _norm(sdDivData);
sdTemp = sdDivData << ucScaleDivData;
a = sdTemp & 0x7fff0000;
b = 0x40000000;
for (i = 15; i > 0; i--)
{
b = _subc(b, a);
}
swDivDataInverse = b & 0x7fff;
swSftBits = 30 + (15 - 1) - ucScaleDivData;
首先将分子分母都左移至有效位高位对齐,记下各自的移位的位数Nx和Ny,a = x << Nx ,b = y << Ny 。例子中分子向左移位了30位,变为b, 分母向左移位了ucScaleDivData位,保证分子分母的最高有效位对齐。
设商的有效位为L,则需要对分子分母的低L比特先进行清零,保证这些比特位不会对商造成影响。例子中商的有效位为15比特。a和b高位对齐后,商不是1就是0:如果a>b,则说明商为1,余数为a-b,将商放在结果的最低位,余数进入下一轮计算;否则,商为0,余数为a,余数进入下一轮计算。
商的有效位为L,则需要循环L次,则商的实际左移的位数为L-1次。最后从循环减的结果中取出低L位。最后商最终向左移位的位数为: Nx+(L-1)-Ny |