数字信号截位/位移引入的量化误差优化
当我们进行数字运算(比如右移)的时候,会因为“四舍五入”导致结果出现偏差,但这种运算引入的并不是真的四舍五入,而是满足以下规律:
- 正数时,右移会自动丢掉小数点的内容,也就是只舍。
- 负数时,右移会自动-1如果有小数的话,也就是只“入”。
所以,我们可以从这一点入手,将结果改成真正的四舍五入,这样,最终结果的偏移范围将会缩小。具体做法如下:
- 如要右移4位,那我们要判断低四位是否大于等于4'b1000即要位移的一半,如果大于就给最终结果加一。
解释,当正数时,大于一半的值应该进1,所以加上,小于就不加,默认舍掉
当负数时,数据是补码,大于一半的值实际是绝对值小于一半,应该不进1,但是默认会进1,所以我们同样加1抵消掉。
reg [7:0] mul_re;
wire is_round = mul_re[3:0] >= 4'b1000;
out <= mul_re[7:4] + is_round_i;