对于定点数Q7格式,0x80(对应的浮点数是-1)需要饱和运行到0x7f。
老版本DSP库处理是饱和指令__QSUB8做个减法运算取反,即用0去减这个数值。
/* C = |A| */
/* Read inputs */
in1 = (q31_t) * pSrc;
in2 = (q31_t) * (pSrc + 1);
in3 = (q31_t) * (pSrc + 2);
/* find absolute value */
out1 = (in1 > 0) ? in1 : (q31_t)__QSUB8(0, in1);
而新版DSP,处理有误,改成了__QSUB去处理,导致0x80没有包含运算到0x7f。
*pDst++ = (in > 0) ? in : (q7_t)__QSUB(0, in);
如果不使用专门的饱和执行,手动处理就是:
*pDst++ = (in > 0) ? in : ((in == (q7_t) 0x80) ? (q7_t) 0x7f : -in); |