Q
Q格式简介
-
Q格式是一种固定点数表示方法,用于在不支持浮点运算或需要高效利用存储空间的情况下表示小数。一个Q格式的数字由两部分组成:整数位和小数位。通常表示为Qm.n,其中:
- m 表示分配给整数部分的位数(包括符号位)。
- n 表示分配给小数部分的位数。(例如,Q15.16表示有15位用于整数部分,16位用于小数部分。)
- 整个数据需要1+m+n位空间进行存储,最高的一位作为符号位。
关键特性
-
范围与精度:
- 范围取决于整数位的数量;更多的整数位意味着更大的数值范围。
- 精度取决于小数位的数量;更多的小数位意味着更高的精度。
-
算术运算:
- 加减法可以直接对Q格式数执行,前提是它们具有相同的Q格式。
- 乘法和除法则需特别注意,因为结果可能需要调整以保持正确的Q格式。
-
转换:
- 浮点到Q格式的转换涉及缩放因子的应用。
- Q格式到浮点的转换则相反,涉及去除缩放因子。
示例:Q15格式(16位)
- 假设我们使用Q15格式,这意味着总共有16位,其中15位用于小数部分,1位用于符号(即没有专门的整数部分)。这种格式非常适合表示介于-1到+1之间的值。
转换示例
- 从浮点到Q15:
如果有一个浮点数0.75,要将其转换为Q15格式,首先将它乘以(2^{15}) (因为Q15有15位小数),然后取最接近的整数值。
0.75 × 32768 = 24576 0.75 \times 32768 = 24576 0.75×32768=24576
所以,0.75在Q15格式下表示为24576。
- DSP中的实现 :
// Saturate input to minimum or maximum value and return value.
// https://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/DSPLib/1_30_00_02/exports/html/group__dsplib__support__device.html#ga954566620ef7aea48fdfd27439cf7762
#define __saturate(x, min, max) (((x)>(max))?(max):(((x)<(min))?(min):(x)))
// https://software-dl.ti.com/msp430/msp430_public_sw/mcu/msp430/DSPLib/1_30_00_02/exports/html/group__dsplib__support__device.html#gaf6a919769cef83b0e251fb353706b8b7
((_q15)((((uint32_t)1 << 15) * \
__saturate(A,-1.0,32767.0/32768.0))))
-
从Q15到浮点:
反之,如果你有一个Q15格式的数24576,想要转换回浮点数,只需将其除以(2^{15})。
24576 / 32768 = 0.75 24576 / 32768 = 0.75 24576/32768=0.75 -
https://chummersone.github.io/qformat.html#information