在数字信号处理中,经常需要进行大量的数字运算。例如,数字信号的解调需要采集大量的IQ数据进行解调操作。在实际的研究和学习中,我们通常使用操作系统中丰富的软件(Matlab、Python等)提供的便捷的计算工具,可以方便地处理我们研究的数字信号。但是学过计算机原理或者汇编语言的同学就会知道,数据的计算最终是在计算机硬件上完成的,而我们在操作系统层面的数据计算往往意味着需要进行大量的资源调度。虽然现在的计算机性能已经非常强大,但是对于面向应用的产品来说,其处理器的性能往往无法与计算机相提并论。通常,在通信、图像等数字信号处理中,数据运算(DSP、FPGA等)都是以硬件芯片的形式进行的。在这种硬件芯片上进行数字信号计算,可以大大提高计算效率,这也是工程应用中广泛采用的一种方法。在这些处理器中,各种数据往往以整数的形式存储(例如,通信中IQ值的存储)。其实我们需要进行计算的数据大部分都是小数,那么怎么解决呢?一般我们可以用定点数来表示小数。什么是定点数?定点数的英文名称是FixedPointNumber。关键是fixed和point这个词,也就是在表示十进制数据时,小数点的位置已经约定好固定在某个位置。与之对应的是浮点数,小数点位置不固定,浮点数不会扩容。定数是指在定点数中,小数点可以将数据分为整数和小数部分,因此我们可以约定数据中小数点的不同位置,可以表示不同大小和精度的小数。例如,当小数点的位置由符号位和数值位约定时,表示纯小数;当最后约定小数点的位置时,可以表示一个纯整数。纯小数和纯整数如何描述定点数的这种规则?其实我们可以用两种方法来表示:Q代表Qx,x代表小数位数。S表示法Sx.y,x代表整数的个数,y代表小数的个数。我们知道,在计算机中,根据是否有符号位,可以分为无符号整数和有符号整数。当然定点数也可以根据是否有符号位来划分:无符号定点数:无符号位有符号定点数:有符号位无符号定点数无符号定点数,取值有机器中字长的所有二进制位都没有符号位,都是值位。例如小数1.2转换成16位的固定数,小数点的位置约定在第14位和第15位之间。UnsignedQ14根据计算结果,小数1.2可以用Q14格式的无符号定点数19661来表示。无符号定点数比较简单,没有负小数;但是有符号的定点数就没有那么简单了,因为有正数和负数之分,它们的计算方法也不同。原码、反码、补码原码、反码、补码在大多数计算机程序设计相关书籍中基本都会提到。在学习有符号定点数之前,我们需要复习一下原码、反码和补码。由于计算中数据的存储方式是以补码的形式存储的,所以在学习有符号定点数之前,我们有必要先复习一下这一部分。原码:最高位作为符号位(没有符号就没有符号位),其他位是数据二进制真值的绝对值。例如无符号数5,其8位二进制原码为00000101;有符号数5,其8位二进制原码为00000101;有符号数-5,其8位二进制原码为10000101。反码:正数的反码就是原码本身,负数的反码在原码的基础上符号位相同,其他位取反。比如无符号数5,它的8位二进制补码是00000101;有符号数5,其8位二进制补码为00000101;而有符号数-5,它的8位二进制补码11111010。补码:正数的补码是它本身,负数的补码是它的反码加1。例如无符号数5,其8位二进制数的补码为00000101;有符号数5,其8位二进制数的补码为00000101;而有符号数-5,其8位二进制补码11111011。对于正数,原码=反码=补码对于负数,反码=符号位不变,原码取反码code=反码+1个有符号定点数有符号定点数需要专门取一个数据位作为符号位。通常,符号位上的1表示负数,0表示正数,其余位为值位。例如,将小数0.8和-0.8转换为Q15格式的定点数。有符号Q15计算正数的定点数0.8:求负数的定点数-0.8:在有符号的定点数中,需要注意的是负数的计算与负数的计算不同正数。最后,定点数和浮点数都可以表示小数,而且定点数的精度是固定的,表现范围比较有限;然而,定点数更容易在硬件上实现。在实际数据算法中,定点数比浮点数更高效。计算效率大大提高,数据存储资源也减少了。因此,定点数将广泛应用于数字信号处理的各种应用场景。本文转载自微信公众号“威尔的食堂”,可通过以下二维码关注。转载本文请联系威尔食堂公众号。
