Q31表示的数的有效范围是[-1.0, 1.0).最高位为1表示负数,最高位为0表示正数, 其中-1.0对应为0x80000000, 1.0为0x7FFFFFFF,实际上0x7FFFFFFF = 0.5^1+0.5^2+0.5^3+...+0.5^31 是无限接近+1.0,但实际比1.0小.
如果数X的范围是在[-1.0, 1.0)之间,则其Q31(X) = X*power(2,31). 小于-1.0的数在DSP里都被当成0x80000000, 大于等于1.0的数都被当成0x7FFFFFFF.
比如有一个IIR 二阶的滤波器系数是[b0,b1,b2,a1,a2] = [2.0, 1.0, 0.5, 0.5, 0.5], 那么其中的b0必须要先除2变成1.0才能用Q31格式表示, 这个除2要在程序里再补回来,一般DSP里都有带8个保护位的长累加器,可以支持一定程度的中间运算结果的数值溢出.
算式xn=(long)(2147483648*(sin(Rad) + cos(Rad*2.3567))/2):
sin(Rad)和cos(Rad*2.3567)都是[-1.0, 1.0],所以(sin(Rad) + cos(Rad*2.3567))/2 的取值范围是[-1.0,1.0];用那个算式计算是没有错的, 特别需要注意的是在(sin(Rad) + cos(Rad*2.3567))/2 = 1.0的时候,
xn = long(2147483648) 应该转换成0x7FFFFFFF,而不应该转成0x80000000,其中的常数2147483648应该是隐含无符号的整数. |