首先要理解什么是定点运算,浮点运算
你要知道DSP芯片是如何处理小数的
这就涉及的是小数的定标问题。数值的精度与数值的范围就成了一对矛盾了。
你要知道:支持浮点运算的DSP就是浮点DSP芯片,在这种片子上可以自由进行小数运算。
而在定点DSP上是不能直接进行小数运算的,需要先给数值定标,且这个小数点不可移动。
因此,定点DSP完成小数运算时,编程稍微复杂一点。速度肯定就不如浮点的片子了。
声明:本**系转载并稍加整理标注,可能对于入门级的dsp开发者有所帮助。本文关注定点dsp与浮点dsp的对比,感谢我所引用的资料的作者。 定点dsp与浮点dsp的比较(1) DSP数字信号处理器是一种特别适合于进行数字信号处理的微处理器,主要用于实时快速地实现各种数字信号处理算法定点运算DSP数字信号处理器在应用中已取得了极大的成功,而且仍然是DSP应用的主体。然而,随着对DSP处理速度与精度、存储器容量、编程的灵活性和方便性要求的不断提高、自80年代中后期以来,各DSP生产厂家陆续推出了各自的32bit浮点运算DSP。
定点DSP指令集 定点DSP指令集是按两个目标来设计的: ·使处理器能够在每个指令周期内完成多个操作,从而提高每个指令周期的计算效率。 ·将存贮DSP程序的存储器空间减到最小(由于存储器对整个系统的成本影响甚大,该问题在对成本敏感的DSP应用中尤为重要)。
和定点运算DSP相比,浮点运算DSP具有许多优越性: 浮点运算DSP比定点运算DSP的动态范围要大很多。定点DSP的字长每增加1bit,动态范围扩大6dB。16bit字长的动态范围为96dB。程序员必须时刻关注溢出的发生。例如,在作图像处理时,图像作旋转、移动等,就很容易产生溢出。这时,要么不断地移位定标,要么作截尾。前者要耗费大量的程序空间和执行时间,后者则很快带来图像质量的劣化。总之,是使整个系统的性能下降。在处理低信噪比信号的场合,例如进行语音识别、雷达和声纳信号处理时,也会发生类似的问题。而32bit浮点运算DSP的动态范围可以作到1536dB,这不仅大大扩大了动态范围,提高了运算精度,还大大节省了运算时间和存储空间,因为大大减少了定标,移位和溢出检查。 由于浮点DSP的浮点运算用硬件来实现,可以在单周期内完成,因而其处理速度大大高于定点DSP。这一优点在实现高精度复杂算法时尤为突出,为复杂算法的实时处理提供了保证。 32bit浮点DSP的总线宽度较定点DSP宽得多,因而寻址空间也要大得多。这一方面为大型复杂算法提供了可能、因为省的DSP目标子程序已使用到几十MB存储器或更多;另一方面也为高级语言编译器、DSP操作系统等高级工具软件的应用提供了条件。 DSP的进一步发展,必然是多处理器的应用。新型的浮点DSP已开始在通信口的设置和强化、资源共享等方面有所响应。 定点的计算不过是把一个数据当作整数来处理,通常AD采样来的都是整数,这个数相对于真实的模拟信号有一个刻度因子,大家都知道用一个16位的AD去采样一个0到5V的信号,那么AD输出的整数除以2^16再乘以5V就是对应的电压。在定点DSP中是直接对这个16位的采样进行处理,并不将它转换成以小数表示的电压,因为定点DSP无法以足够的精度表示一个小数,它只能对整数进行计算。 而浮点DSP的优势在于它可以把这个采样得到的整数转换成小数表示的电压,并不损失精度(这个小数用科学记数法来表示),原因在于科学记数法可以表示很大的动态范围的一个信号,以IEEE754浮点数为例,单精度浮点格式: [31] 1位符号 [30-23]8位指数 [22-00]23位小数,这样的能表示的最小的数是+-2^-149,最大的数是+-(2-2^23)*2^127.(这里不去研究这个最小最大范围是如何计算出来的)动态范围为20*log(最大的数/最小的数)=1667.6dB 这样大的动态范围使得我们在编程的时候几乎不必考虑乘法和累加的溢出,而如果使用定点处理器编程,对计算结果进行舍入和移位则是家常便饭,这在一定程度上会损失是精度。原因在于定点处理处理的信号的动态范围有限,比如16位定点DSP,可以表示整数范围为1-65536,其动态范围为20*log(65536/1)=96dB.对于32定点DSP,动态范围为20*log(2^32/1)=192dB,远小于32位ieee浮点数的1667.6dB,但是,实际上192dB对绝大多数应用所处理的信号已经足够了。
由于AD转换器的位数限制,一般输入信号的动态范围都比较小,但在DSP的信号处理中,由于点积运算会使中间节点信号的动态范围增加,所以主要考虑信号处理流程中中间结果的动态范围,以及算法对中间结果的精度要求,来选择相应的DSP。 2、硬件上 暂时抛开这些宏观的特点对比,单纯从技术的角度来看,定点与浮点的区别主要在两个方面,即硬件和软件。硬件上的区别来自于:浮点dsp处理器具有浮点/整数乘法器,整数/浮点算术逻辑运算单元ALU,适合存放扩展精度的浮点结果的寄存器等。 3、软件上 再看看在软件开发上的不同之处,主要有浮点dsp编程的特点以及注意事项;定点dsp进行浮点运算时的定标,移位,检测溢出操作。比较两个浮点数时,永远不要使用操作符==来判断是否相等。即使比较两个相同的数,还是可能有微小的舍入差别。甚至定义精确的0,也不是很安全,尽管C语言中有0的表示,永远不要写这样的代码(x==0),而应该写成(fabs(x)<TINY),其中TINY定义为一个很小的值,也就是处理器的浮点格式舍入误差。(待续~~)
|