DSP数的表示:定点数乘法
[toc]
本文翻译自
https://www.allaboutcircuits.com/technical-articles/multiplication-examples-using-the-fixed-point-representation/
做定点数乘法的时候,首先忽略掉小数点位置,将两个乘数的补码相乘;然后再确定小数点位置。
无符号数乘以无符号数
例一:假设
a=101.0012" role="presentation" style="position: relative;">a=101.0012,
b=100.0102" role="presentation" style="position: relative;">b=100.0102,a、b均为Q3.3格式无符号数。求axb。
考虑小数点位置,两个数可以表示为:
a=(101001)2×(2−3)10b=(100010)2×(2−3)10" role="presentation">a=(101001)2×(2−3)10b=(100010)2×(2−3)10
axb可以表示为
a×b=((101001)2×(2−3)10)×((100010)2×(2−3)10)" role="presentation">a×b=((101001)2×(2−3)10)×((100010)2×(2−3)10)
即
a×b=((101001)2×(100010)2)×(2−6)10" role="presentation">a×b=((101001)2×(100010)2)×(2−6)10
以上运算显示,在做定点小数乘法时,可以先不考虑点数的,当做整数来乘,然后将小数点放在右边起第6bit左边即可。
axb的二进制乘法过程如下:
将小数点放在结果的右边第六个bit的左边,得到结果
a×b=10101.1100102=21.7812510" role="presentation" style="position: relative;">a×b=10101.1100102=21.7812510。
例一的结果可以总结如下:
如果a、b的字长分别为Qn1.m1格式和Qn2.m2格式,那么axb格式为Qn.m。其中n=n1+n2,m=m1+m2。乘法结果字长为n+m,可以保证结果不会发生溢出。
在计算axb时,首先忽略小数点,看做整数做乘法,然后在结果的右边起第m bit的左边点小数点即可得到正确的结果。
有符号数乘以无符号数
例二:假设
a=101.0012" role="presentation" style="position: relative;">a=101.0012,
b=100.0102" role="presentation" style="position: relative;">b=100.0102,a、b均为Q3.3格式,a为有符号数,b为无符号数。求axb。
有符号数乘以无符号数的时候,与上面不同的是,所有的部分积都是有符号的。在做有符号数加法的时候,需要对长度较短的数进行符号位扩展。因此,这里所有的部分积相加的时候需要先进行符号扩展。首先忽略小数点,我们可以得到如下计算过程:
例二与例一唯一不同的地方是例二需要对部分积进行符号扩展。因为两个乘数都是6bit,相乘结果会是12bit,因此所有部分积都符号扩展到12bit。又由于所有数都是补码表示,12bit结果为模12运算,因此我们需要将结果的第13bit忽略掉。
然后考虑结果的小数点位置,可以得到
a×b=110011.1100102=−(001100.0011102)=−12.2187510" role="presentation" style="position: relative;">a×b=110011.1100102=−(001100.0011102)=−12.2187510。该结果是和上面计算的十进制结果等效的,即
−12.21875=−78264" role="presentation" style="position: relative;">−12.21875=−78264。
例三:假设
a=100.002" role="presentation" style="position: relative;">a=100.002,
b=111.1112" role="presentation" style="position: relative;">b=111.1112,a、b均为Q3.3格式,a为有符号数,b为无符号数。求axb。
该例子的计算过程和例二相似:
为了简化计算,可以对部分积进行两两逐步相加,每次相加后要将结果的符号位左边的值忽略掉。考虑小数点位置后得到最终结果:
a×b=100000.1000002" role="presentation" style="position: relative;">a×b=100000.1000002。
在进行接下来的讨论之前,需要回顾一下二进制补码表示的一个重要特性。
二进制补码表示重要特性
假设