关于C28x Fixed Point DSP Library.pdf 中的Q31

2019-08-07 18:01发布

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 上传 点击文件名下载附件


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
aresc
1楼-- · 2019-08-07 19:41
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应该是隐含无符号的整数.
hong7817
2楼-- · 2019-08-07 21:41
aresc 发表于 2012-12-8 16:52
Q31表示的数的有效范围是[-1.0, 1.0).最高位为1表示负数,最高位为0表示正数, 其中-1.0对应为0x80000000, 1. ...

我的 X  聚会范围为(-2000,2000),为了转换成Q31,我这样处理  X / 10000.0 * 2147483648; 应该正确的吧?
hong7817
3楼-- · 2019-08-08 01:58
aresc 发表于 2012-12-8 16:52
Q31表示的数的有效范围是[-1.0, 1.0).最高位为1表示负数,最高位为0表示正数, 其中-1.0对应为0x80000000, 1. ...

忘了感谢你的热心解答!!
石摊摊
4楼-- · 2019-08-08 07:24
 精彩回答 2  元偷偷看……

一周热门 更多>