TI数字信号处理库,出现了一个Q31的格式,按照IQ格式的理解就是小数点在第31位上,那具体是什么意思呢?
手册里说需要转换成Q31格式,搞得我一头雾水 .
例程里,有这么一句 xn=(long)(2147483648*(sin(Rad) + cos(Rad*2.3567))/2); //Q31
从long的角度来看,第一位始终是1,也就是始终是负值. 具体请看附件
Q31,应该是一个什么样的通用解释呢?
我现在程序里是这样处理的: 变量a<10000,
a / 10000.0 * 2147483648 //Q31
页面提取自-C28x_Fixed_Point_Library_v1_01.pdf
(17.61 KB, 下载次数: 3)
2012-12-7 21:09 上传
点击文件名下载附件
如果数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应该是隐含无符号的整数.
我的 X 聚会范围为(-2000,2000),为了转换成Q31,我这样处理 X / 10000.0 * 2147483648; 应该正确的吧?
忘了感谢你的热心解答!!
一周热门 更多>