|
//dsp的大多数指令是按照有符号数计算的.无符号数用mpyu做乘法
//定标是为了小数而存在
//定标实际是虚拟的,是程序员自己假定的。
//在dsp内部只有无符号数,但是我们约定用低15位表示大小,16位表示符号。
//算术运算时,符号位其实是跟其他位没有区别的,仅仅是我们认为它不一样
//由于整数乘法乘积总是 向左增长 多次相乘后就会超出范围。
//小数乘法也有同样的变化,但是小数可以去掉尾部而大小变化不多。所以一般编程都是设置好用小数乘法方式,通过st1的ftrc
//这是由于小数乘法的计算方式和整数乘法不一样,需要把乘积左移一位才符合结果。
//那么实际上dsp做的是q15还是q14呢?什么都不是,dsp只是在做普通的有符号运算,不同的是我们对数字的定义。比如1001可以是1.001也可以是10.01。对于dsp它只知道1001.
//举个例子,我们要计算000010.11*1111.1010 我们先不管符号之类。首先000010.11用00001011代替,1111.1010用11111010代替。然后计算结果。我们分析,000010.11扩大了4倍,1111.1010扩大了16倍。因此计算出来的结果是扩大了64倍的。编程的人知道,需要用到的时候再处理。
//左移一位是针对小数乘法的,比如计算0.100(0.5)*1.101(-0.375的补码)。dsp是按照0100*1101计算的,即4*(-3)结果是-12即 11110100(补码。可是看看11.110100代表什么?是-0.09325.不是我们期待的-0.1875 .。不过当我们去掉最高位(左移一位)低位补零之后11.101000刚好是-0.1875的补码 .所以我们要左移处理一下,我们才能虚拟出小数乘法。小数是我们幻想出来的,其实dsp还是在做原来的整数乘法,只不过结果被左移了。对于整数来说,这个当然是错误的乘法结果。
//附加一句,我们查看debug查看存储单元的是有符号数,不过不是补码。内部运算是补码形式的,但在系统内部时自动转换的。