tag 标签: q格式

相关博文
  • 热度 9
    2014-6-23 15:28
    5153 次阅读|
    0 个评论
    Q格式 许多DSP都是定点DSP,处理定点数据会相当快,但是处理浮点数据就会非常慢。可以利用Q格式进行浮点数据到定点的转化,节约CPU时间。实际应用中,浮点运算大都时候都是既有整数部分,也有小数部分的。所以要选择一个适当的定标格式才能更好的处理运算。   Q格式表示为:Qm.n,表示数据用m比特表示整数部分,n比特表示小数部分,共需要m+n+1位来表示这个数据,多余的一位用作符合位。假设小数点在n位的左边(从右向左数),从而确定小数的精度   例如Q15表示小数部分有15位,一个short型数据,占2个字节,最高位是符号位,后面15位是小数位,就假设小数点在第15位左边,表示的范围是:-1   浮点数据转化为Q15,将数据乘以2^15;Q15数据转化为浮点数据,将数据除以2^15。   例如:假设数据存储空间为2个字节,0.333×2^15=10911=0x2A9F,0.333的所有运算就可以用0x2A9F表示,同理10911×2^(-15)=0.332977294921875,可以看出浮点数据通过Q格式转化后是有误差的。   例:两个小数相乘,0.333*0.414=0.137862   0.333*2^15=10911=0x2A9F,0.414*2^15=13565=0x34FD   short a = 0x2A9F;   short b = 0x34FD;   short c = a * b 15;  // 两个Q15格式的数据相乘后为Q30格式数据,因此为了得到Q15的数据结果需要右移15位    这样c的结果是0x11A4=0001000110100100,这个数据同样是Q15格式的,它的小数点假设在第15位左边,即为 0.001000110100100=0.1378173828125...和实际结果0.137862差距不大。或者0x11A4 / 2^15 = 0.1378173828125       DSP芯片的定点运算 1. 数据的溢出: 1 溢出分类: 上溢(overflow): 下溢(underflow) 2溢出的结果: Max Min Min Max unsigned char 0 255 signed char -128 127 unsigned int 0 65535 signed int -32768 32767 上溢在圆圈上按数据逆时针移动;下溢在圆圈上顺时钟移动。 例:signed int :32767+1=-32768; -32768-1=32767 unsigned char:255+1=0; 0-1=255 3为了避免溢出的发生,一般在DSP中可以设置溢出保护功能。当发生溢出时,自动将结果设置为最大值或最小值。 2. 定点处理器对浮点数的处理: 1 定义变量为浮点型(float,double),用C语言抹平定点处理器和浮点处理器的区别,但是程序的代码庞大,运算速度也慢。 2 放大若干倍表示小数。比如要表示精度为0.01的变量,放大100倍去运算,运算完成后再转化。但是这个做法比较僵硬,如要将上面的变量重新定义成0.001精度,又需要放大1000倍,且要重新编写整个程序,考虑溢出等问题。 3 定标法:Q格式:通过假定小数点位于哪一位的右侧,从而确定小数的精度。 Q0:小数点在第0位的后面,即我们一般采用的方法 Q15 小数点在第15位的后面,0~14位都是小数位。 转化公式:Q=(int)(F×pow(2,q)) F=(float)(Q×pow(2,-q)) 3. Q格式的运算 1 定点加减法:须转换成相同的Q格式才能加减 2 定点乘法:不同Q格式的数据相乘,相当于Q值相加 3 定点除法:不同Q格式的数据相除,相当于Q值相减 4 定点左移:左移相当于Q值增加 5 定点右移:右移相当于Q减少 4. Q格式的应用格式 实际应用中,浮点运算大都时候都是既有整数部分,也有小数部分的。所以要选择一个适当的定标格式才能更好的处理运算。一般用如下两种方法: 1 使用时使用适中的定标,既可以表示一定的整数复位也可以表示小数复位,如对于2812的32位系统,使用Q15格式,可表示-65536.0~65535.999969482区间内的数据。 2 全部采用小数,这样因为小数之间相乘永远是小数,永远不会溢出。取一个极限最大值(最好使用2的n次幂),转换成x/Max的小数(如果Max是取的2的n次幂,就可以使用移位代替除法)。   数据存储: 指针型为16位。 浮点型(float double long double)都是32位。 所有32位类型(long float等)的存储方式都是低位在前,高位在后。   DSP增强的C语法 DSP的C语言规定:没有显式初始化的,仍保持未初始化状态。 1. 强制类型转换的错误: unsingned int average(unsigned int a , unsigned int b) {    unsigned int c;    C = (a+b)/2;    return c; } 带入数值看看,当a 和 b 都是0x8001时,此时等式a + b 会产生溢出,不要想当然的认为;只要表达式“(a+b)/2”不超过无符号整数的范围,计算机就会给出正确的结果。自动类型转换在这里不会发生,正确的写法是显式的写出强制类型的转换:  c = ((unsigned long ) a + b )/2; 或:c= ((unsigned long )a + (unsigned long)b)/2;   2.  DSP的编译器是按照算术移位,来进行移位运算的。    有符号数的右移运算。C语言中移位运算常常在编程中取代乘除2的n次方。   16位数相乘 16位数相乘,如果只想获取乘积结果的高16位,可通过把乘积结果右移16位来获得。   int m1, m2, result1; unsigned m3, m4,result3; result1 = ((long)m1*m2)16; 或者: result3 = ((unsigned long)m3*m4)16; 或者:result3=((unsigned long )m3* (unsigned long)m4)16;   中断函数: 用interrupt声明的函数和普通函数的差别有: (1)普通函数的压栈只保护部分内核寄存器,这些需要保护的寄存器是C编译器 规定的。 (2)用interrupt 生命的函数压栈保护所有的内核寄存器。 进入中断函数后,默认是关中断状态,寄存器位INTM = 1,如果 用户希望实现中断嵌套的话,则应该在中断函数里重新开中断——INTM = 0;   IOPORT空间:ioport  数据类型 port0x00;   Q 格式 浮点数Xf转换为定点数Xq时:Xq = (int)(Xf * 2Q)  ----***(4-1) 定点数Xq转换为浮点数Xf时,Xf = (float)(Xq * 2(-Q))   Q15格式 如果一个数据既包括有整数又有小数,使用Q格式时,直观的做法是选定一个 合适的Q格式来表示,有些运算也必须这样做。 但还有一个常用且简介的方法:把数据全部转化为小数,再用Q15格式表示。 假设整数X取值范围不会放过某一极限最大值,设置极限最大值为MAX,将整整 数x除以常数MAX转换成一个小数,再按照浮点数转换定点数的公式(4-1),转换成Q15格式。 整数x转换为定点数x15: X15 =(int )((x/MAX)* 2 15)   -----(4-3) 或者写成:X15 = (int)((Uint32)x15 / max) 浮点数X15转换为整数X:X = (float)(x15 * MAX* 2 -15)     ----(4-4) 以上两公式互为逆运算。浮点数X15转换为整数X的速度非常快,只用到了乘法和移位。   把整数X转换为X15后,程序员应该建立起一个应用概念:变量x15是Q15格式, Q15格式只能表示一个小数,因此变量X15就代表一个不超过1的百分数(也可以 看作很多数学公式推导时常用的标称值),范围从-100%~+100%。   在上面的运算中用到了除法 “/”,而除法运算时比较费时的。解决的方法有以下3个:   1)很多数值都可以离线设定。也就是说,先离线计算f=((unsigned long)5015)/MAXF;然后在赋值f=13653即可。 2)从50到16353的设定过程,绝大数情况下对时间要求不苛刻,可以放在主程 序中或优先级比较低的任务中。 3)必须在线设定且对时间要求比较苛刻时,一个变通的方法是设定常数MAXF 为2的n次幂,比如MAXF= 128,即可把除法转化为右移。 Q15---Q0 当要达到频率精度0.01Hz时,对于频率变量f=50.01HZ,要稍微运用点技巧。 unsigned int  f; f= ((unsigned long)500115)/(MAXF*100) Q格式 有 符号数的表示法,机器数(出现在电脑的二进位数值)有3个特点, 无符号或符号转换成数值来表示,没有 +10101这样的资料,而是以010101来表示,只表示单纯的整数或小数,小数点的位置预设在一定的位置而较少变动,它的长度受到电脑硬体的限制,而 不能无限增长。Q格式,就是将一个小数放大若干倍后,用整数来表示小数。 目录 1 Q格式前提 2 DSPs 3 DSP芯片的定点运算 ▪ 数据的溢出 ▪ 定点处理器对浮点数的处理 ▪ Q格式的运算 ▪ Q格式的应用格式 1 Q格式前提 编辑 无符号数:当参与运算的数值没有负数且运算的结果也没有负数时,则所有字元都可以表示数值,这种没有符号的数,称为无符号数(如 记忆体 储存位址), 有符号数 :数值中有某位数值代表符号,通常最高位作为符号位,0代表正,1代表负。 真值: 有符号数 所代表的数值,例如:110所代表的值是 -2 而非 6,有符号数只要去除符号位就可以获得该数的大小,在运算时,它的符号位可参与运算。但在加减运算时,必须将它分离出来,才能进行运算。有时,还要确定哪个 有符号数 的真值比较大,才能确定结果的符号。为了达到这些功能,电路的设计就相当复杂。所以很多 电脑系统 不直接使用 有符号数 ,而使用有符号数的1’s补数或2’s补数表示法作为编码系统 正弦脉波宽度调变(SPWM)之控制方法经Q 格式乘法器转换成振幅与频率可变V/F 控制,当成其单相感应马达的输入信号,藉由控制责任周期的大小,以达到变电压相对改变频率的效果。 2 DSPs 编辑 1.实现数位系统的第一步 在自然世界中,所有的物理量包括时间、电压、质量、位移等等,都是类比的、连续的。可是在数位系统中,讯号是在不连 续的时间点取样,物理量或讯号的大小也不再是连续,而是被量化(Quantized)。在数位系统中,只能用有限字元长度的数字去表示数量的大小,而不能 以无限精确的数值(实数)去表示。为了实现数位系统;使用了定点数与浮点数的表示法。 a)定点数(Fixed Point Number):指一个数字的表示,其小数点是在固定的位置(位元)。 b)浮点数(Floating Point Number):使用假数以及指数两部分来表示数值。 例如:一个不含正负号的四位数十进制,包含三位整数和一位小数; 定点数所能表示的à ※最大值:999.9 ※最小值:000.1 ※动态范围:20log9999≒80(dB) ※所以小于0.1以及大于999.9的数值皆无法用此格式表示。 浮点数所能表示的à ※最大值:0.999 × 109 ※最小值:0.001 × 100 ※动态范围:20log1012≒240(dB) PS:动态范围:指一个数字表示法所能表示最大数值与最小数值的比值。 c)两种表示法的比较: ※有效位数:定点有效位数有四位数,浮点格式只有三位数。 ※价格:定点DSP价廉且普及(90%);浮点DSP运用在复杂运算价格昂 贵。 d)DSP 的算数运算: ※负数:采用二补数法来表示。例如;﹣46(d)可表示成1101 0010(b)。用 二补数来表示有号数的好处是:只需一个 加法器 ,就可以具备加、减 法运算的功能。 ※Q格式:小数点位于第 n 位元之右侧,称为Qn 格式。例如; 16 位元二进位无号数:0100 0010 1000 0001 à在Q0格式下其表示的是:2^14+2^9+2^7+2^0=17025(d) à在Q8格式下其表示的是:2^6+2^1+2^-1+2^-8=66.50390~(d) à在Q16格式下其表示的是:2^-2+2^-7+2^-9+2^-16=0.25978~(d) 进行加法或减法时,Q格式并不会影响运算法则,两个Q8 格式的小数相 加,所得到的数值仍是Q8格式。两个Q6格式相减,所得到的数值仍是Q6格 式。因此在定点数之加减运算并不因Q格式不同而有差异。不过可能会产生溢位(overflow),而且不同格式的数值不能直接相加减。 乘法时,Q格式便会影响运算结果。两个16 位元数做乘法,会得到32 位元数。此时只能取16位元。 àQ0 格式:取运算结果最低的16 位元,删除较高的16 位元。 àQ16 格式:取运算结果最高的16 位元,删除较低的16 位元。 3 处理有数号是采Q15格式来表示定点数,因为MSB被用来表示正负号。且在乘法运算不考虑溢位的问题。 举例:+0.5 × (-0.5) = -0.25 1.100 0000 0000 0000× 0.100 0000 0000 0000 s♁s.11 0000 0000 0000 0000 0000 0000 0000 得到的结果MSB 为两数的MSB 做XOR 求得,并取上面画底线Q15 的部分 可得1.110 0000 0000 0000 (16bit)。为了使结果也是Q15 格式,由于最高两位元 仅是表示正负号,所以DSP会自行将结果的最高位元舍弃。 CPU是定点 微处理器 不能直接处理小数,C语言中的自动调用运行时的函数来处理浮点数(float型),C语言中抹平了定点处理器和浮点处理器的差别,用户的 编程 工作量最少,但是编译出来的代码很庞大。在 嵌入式 应用中很多情况下,float型几乎不能去想。 整数定标本质上并不复杂,简单地说,就是通过假定 小数点 位于哪一位。从而确定小数精度。 常用Q格式来表示数的定标。Q0是把小数点位定于第0位的右侧,Q15是定于第15位的右侧。 公式为: 浮点Xf-定点Xq: 定点Xq-浮点Xf: 浮点1.1变成Q13就为:(int)(1.1*2^13)=9011; Q0范围:-32768 Q15范围:-1 定点加减法一定要具有相同的Q格式才能进行。 定点乘除法是Q值相加减。 DSP处理器本身没有硬件除法器,除法通过减法和移位完成的。 定点左移右移相当于Q值加减; Q15格式范围是个不超过1的小数,小数之间相互乘法还是小数,永远不会溢出。这是小数的一个优势。 如果一个数据既有整数也有小数。使用Q格式,直观的做法就是选定一个适当的Q格式。 再不就全部化为小数,再用Q15格式表示。 3 DSP芯片的定点运算 编辑 数据的溢出 1 溢出分类: 上溢(overflow), 下溢(underflow) 2溢出的结果:    Min Max unsigned char 0 255 signed char -128 127 unsigned int 0 65535 signed int -32768 32767 上溢在圆圈上按数据逆时针移动;下溢在圆圈上顺时钟移动。 例:signed int :32767+1=-32768; -32768-1=32767 unsigned char:255+1=0; 0-1=255 3为了避免溢出的发生,一般在DSP中可以设置溢出保护功能。当发生溢出时,自动将结果设置为最大值或最小值。 定点处理器对浮点数的处理 1 定义变量为 浮点型 (float,double),用C语言抹平定点处理器和浮点处理器的区别,但是程序的代码庞大, 运算速度 也慢。 2 放大若干倍表示小数。比如要表示精度为0.01的变量,放大100倍去运算,运算完成后再转化。但是这个做法比较僵硬,如要将上面的变量重新定义成0.001精度,又需要放大1000倍,且要重新编写整个程序,考虑溢出等问题。 3 定标法:Q格式:通过假定小数点位于哪一位的右侧,从而确定小数的精度。 Q0:小数点在第0位的后面,即我们一般采用的方法 Q15 小数点在第15位的后面,0~14位都是小数位。 转化公式:Q=(int)(F×pow(2,q)) F是浮点数 F=(float)(Q×pow(2,-q)) Q是定标数 Q格式的运算 1 定点加减法:须转换成相同的Q格式才能加减 2 定点乘法:不同Q格式的数据相乘,相当于Q值相加 3 定点除法:不同Q格式的数据相除,相当于Q值相减 4 定点左移:左移相当于Q值增加 5 定点右移:右移相当于Q减少 Q格式的应用格式 实际应用中, 浮点运算 大都时候都是既有整数部分,也有小数部分的。所以要选择一个适当的定标格式才能更好的处理运算。一般用如下两种方法: 1 使用时使用适中的定标,既可以表示一定的整数复位也可以表示小数复位,如对于2812的32位系统,使用Q15格式,可表示-65536.0~65535.999969482区间内的数据。 2 全部采用小数,这样因为小数之间相乘永远是小数,永远不会溢出。取一个极限最大值(最好使用2的n次幂),转换成x/Max的小数(如果Max是取的2的n次幂,就可以使用移位代替除法)。     0.9999695 32767