第3章 数字信号处理中的基本运算
以数字方式进行信号处理,归根结底可分解为一些基本的数学运算,如加法运算、乘法运算、累加运算、比较运算及开方运算等。其中,加法运算和乘法运算是数字信号处理中的两大主要运算。既然是数学运算,就涉及一个根本问题:数字的表示方法。而数字又可分为定点数和浮点数,这使问题进一步分解为定点数的表示和浮点数的表示。就FPGA而言,其胜任定点运算的能力更为显著。鉴于此,本章只讨论定点数所涉及的相关内容。
众所周知,计算机以二进制方式表示数字,所以深入理解二进制原码、反码和补码等基本概念是进行逻辑设计的关键环节。本章将二进制运算贯穿其中,重点阐述基本运算涉及的相关问题及相应的电路设计。
3.1 定点数的表示
3.1.1 二进制数的原码与补码
二进制计数是数字电路的本质。数字电路中的高、低电平即表征了1和0。为了能够正确地使用二进制计数,就必须清楚二进制表示数字的方法和特点。这里首先给出以下结论。
N位二进制数所能表示的无符号整数范围是[0,2N-1],所能表示的有符号整数范围是[-2N-1,2N-1 -1]。
需要强调的是,N位二进制数是无法表示有符号整数2N-1的。在表示无符号整数时,采用的是二进制原码;而表示有符号整数时,则采用二进制补码,此时,最高位为符号位,0表示正数,1表示负数。因此,在用二进制数表示无符号整数时,可虚拟出一个符号位作为最高位,此符号位始终为0,从而达到二进制原码与补码的统一。
表3.1举例给出了4位二进制原码与无符号整数的对应关系[1],也给出了将二进制原码转换为无符号整数的方法。例如,12=1 ×8+1 ×4。
表3.1 4位二进制原码与无符号整数的对应关系
进一步,将4位二进制原码从最高有效位(Most Significant Bit,MSB)到最低有效位(Least Significant Bit,LSB)依次展开纵向排列,如图3.1所示,图中DEC表示十进制数。可以发现,最低位波形变化速率是次低位的2倍,次低位波形变化速率是次高位的2倍,次高位波形变化速率又是最高位的2倍。这为设计等占空比的2的整数次幂的分频器提供了依据,也为测试模数转换器(Analog Digital Converter,ADC)芯片提供了方法。同时,也启迪设计师从不同角度去看待事物,正如宋代著名诗人苏轼那极富哲理的诗句“横看成岭侧成峰,远近高低各不同”。
图3.1 展开的4位二进制原码纵向排列
在设计计数器时常用无符号整数,而在数学运算中大多采用有符号整数,这就涉及如何获取负整数的二进制补码的问题。表3.2举例给出了4位二进制补码与有符号整数的对应关系,也给出了将二进制补码转换为有符号整数的方法。例如,-4=1 ×(-8)+1 ×4。对比表3.1和表3.2,不难发现-7的补码和9的原码以4位二进制表示时相同,且-7和9分别取绝对值并相加,其结果为24。这就为我们求取负整数的二进制补码提供了方法,如图3.2所示,图中给出了3种求取负整数二进制补码的方法。
表3.2 4位二进制补码与有符号整数的对应关系
图3.2 将整数转换为二进制补码的方法
根据如图3.2所示的求补码的方法,求取有符号整数-4的4位二进制补码可按以下方法进行。
方法1:24 -| -4|=12,12以4位二进制原码表示为1100,这即为-4的4位二进制补码。
方法2:|-4|=4,4以4位二进制原码表示为0100,其反码为1011,加1为1100。
方法3:|-4|=4,4以4位二进制原码表示为0100,逐位取反直至最后一个1止,即为1100,次高位1及其后面的两个0保持不变。
用同样的方法可知,-4的5位二进制补码为11100。不难发现,11100是1100将符号位扩展1位得到的。所谓符合位扩展,是指将符号位向高位复制。这说明符号位扩展是不改变数值大小的,认识这一点是非常重要的。
根据上述有符号整数与二进制码的对应关系,对于给定的有符号整数 X,可由式(3.1)确定其以二进制补码表示时的最小位宽ws。
式中,ceil表示向上取整。
对于无符号整数,因为不需要符号位,故其以二进制原码表示时的最小位宽为
3.1.2 定点数的字长问题
字长(位宽)和小数部分字长共同构成了定点数的两个要素。以wl表示字长,以fl表示小数部分字长,那么有符号定点数以Fix_wl_fl的形式表示,无符号定点数以UFix_wl_fl的形式表示。整数可看做是小数点在最后一位,即fl为0。对于定点小数,一旦wl与fl确定,那么小数点的位置即可固定。表3.3举例给出了Fix_5_3与十进制小数的对应关系。
在定点小数中,有一类值得关注,那就是只有一位整数位的定点小数。表3.4给出了Fix_5_4与十进制小数的对应关系。可见,此类定点小数只能表示(-1,1)区间内的纯小数,范围受限。在表3.4中,如果将小数点“抹掉”,把其视为整数,那么也就是将数值放大了16倍,这对运算结果并没有实质的影响。采用FPGA实现数字信号处理时是可以这么做的。
表3.3 Fix_5_3与十进制小数的对应关系
表3.4 Fix_5_4与十进制小数的对应关系
定点数据在运算时要防止溢出,包括上溢(Overflow)和下溢(Underflow)。上溢是指运算结果超出了定点数整数部分所能表示的范围,下溢是指运算结果超出了定点数小数部分所能表示的范围。例如,UFix_4_2所能表示的定点数的范围为[0,3.75],步进(精度)为0.25,如果运算结果为4,则发生上溢;如果运算结果为0.125,则发生下溢。一旦溢出将会造成计算精度的损失甚至结果的错误。因此,合理地选择字长尤为重要。
定点数据的量化模式决定了当运算结果的精度高于定点数所能表示的精度时如何对超出精度部分的比特处理。通常有两种处理方式:Truncate和Round。Truncate为直接截尾,将超出精度部分的比特舍弃掉。Round即“四舍五入”,将舍去的比特的最高位加到要保留的比特的最低位。量化模式的两种处理方式如图3.3所示。显然,采用Round可获得更高的精度,但也需要额外的资源。这两种方式都是针对发生下溢时的处理方式。
图3.3 量化模式的两种处理方式
定点数据的溢出模式决定了当运算结果大于定点数所能表示的最大值时如何对溢出部分处理。通常有两种处理方式:Saturate和Wrap。Saturate为饱和处理,一旦溢出就将计算结果饱和处理为最大值。Wrap为截断处理。溢出模式的两种处理方式如图3.4所示。不难看出溢出对计算结果的不利影响。这两种方式都是针对发生上溢时的处理方式。
图3.4 溢出模式的两种处理方式