DSP 学习笔记|(六)DSP 中的定点 & 浮点
Last updated on April 30, 2023 am
DSP 中的定点与浮点转换
许多 DSP 都是定点 DSP,处理定点数据会相当快,但是处理浮点数据就会非常慢。可以利用 Q 格式进行浮点数据到定点的转化,节约 CPU 时间。实际应用中,浮点运算大都时候都是既有整数部分,也有小数部分的。所以要选择一个适当的定标格式才能更好的处理运算。
Q 格式表示为:Qm.n,表示数据用 m 比特表示整数部分,n 比特表示小数部分,共需要 m+n+1 位来表示这个数据,多余的一位用作符合位。假设小数点在 n位的左边(从右向左数),从而确定小数的精度
例如 Q15 表示小数部分有 15 位,一个 short 型数据,占 2 个字节,最高位是符号位,后面 15 位是小数位,就假设小数点在第 15 位左边,表示的范围是:-1 < X < 0.9999695 。
浮点数据转化为 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
Q 格式的运算
- 定点加减法:须转换成相同的 Q 格式才能加减
- 定点乘法:不同 Q 格式的数据相乘,相当于 Q 值相加,即 Q15 数据乘以 Q10 数据后的结果是 Q25 格式的数据
- 定点除法:不同 Q 格式的数据相除,相当于 Q 值相减
- 定点左移:左移相当于 Q 值增加
- 定点右移:右移相当于 Q 减少
Q 格式的应用格式
实际应用中,浮点运算大都时候都是既有整数部分,也有小数部分的。所以要选择一个适当的定标格式才能更好的处理运算。一般用如下两种方法:
- 使用时使用适中的定标,既可以表示一定的整数复位也可以表示小数复位,如对于 2812 的 32 位系统,使用 Q15 格式,可表示-65536.0~65535.999969482 区间内的数据。
- 全部采用小数,这样因为小数之间相乘永远是小数,永远不会溢出。取一个极限最大值(最好使用 2 的 n 次幂),转换成 x/Max 的小数(如果 Max 是取的 2 的 n 次幂,就可以使用移位代替除法)。
其他资料
支持浮点运算的DSP就是浮点DSP芯片,在这种片子上可以自由进行小数运算。而在定点DSP上是不能直接进行小数运算的,需要先给数值定标,且这个小数点不可移动。
因此,定点DSP完成小数运算时,编程稍微复杂一点。速度肯定就不如浮点的片子了。