C 手臂皮质从浮动转换为q7_t?

C 手臂皮质从浮动转换为q7_t?,c,arm,embedded,signal-processing,microcontroller,C,Arm,Embedded,Signal Processing,Microcontroller,我知道ARM Cortex M4中使用的分数类型用于最大化n位数字的精度,在q7_t的情况下,它是从-1到1-2^-7的标准化数字 但是它的典型工作流程是如何使用的呢?是否需要不断地规范化和非规范化变量 我找到了下一个将单精度浮点转换为q7_t的示例代码,“128”数字在做什么 float test_float = 3.1416f; q7_t test_frac = (q7_t)( test_float * 128); 提前谢谢。因为该类型只有7位存储分数,所以适合将其存储为128的分数。它只

我知道ARM Cortex M4中使用的分数类型用于最大化n位数字的精度,在q7_t的情况下,它是从-1到1-2^-7的标准化数字

但是它的典型工作流程是如何使用的呢?是否需要不断地规范化和非规范化变量

我找到了下一个将单精度浮点转换为q7_t的示例代码,“128”数字在做什么

float test_float = 3.1416f;
q7_t test_frac = (q7_t)( test_float * 128);
提前谢谢。

因为该类型只有7位存储分数,所以适合将其存储为128的分数。它只是意味着数字的小数部分被分成128个大小相等的块,每个块可以用整数值
0
127
表示


因此整数值
0
表示
0.0
。整数值
1
表示
0.0078125
1/128.0
)。整数值
2
表示
0.015625
2/128.0
)。等等。

Q格式只是从整数到小数的缩放

让我们考虑字节中的位,编号从0(在右边写入位时)到7(在左边)。在通用二进制表示法中,位i表示2i的值。由八位表示的值是由设置位表示的值的总和,因此01000011表示67(26+21+20)

当使用2的补码来支持负数时,最高的位(本例中的位7)表示其普通二进制值的负数,因此−二十七,

在“Q”格式中,这些位的值被移位。在Q7格式中,位i表示2i−7,但最高位的值为负数,因此位7为负−27−7 = −1.名称也可以写成Q0.7。从概念上讲,这些数字告诉我们在位中放置“二进制点”(如小数点)以读取所表示的值的位置。Q3.4格式有一个符号位,在二进制点前三位,在二进制点后四位,如0100.0011,它表示4+3/16=26−4 + 21−4 + 20−4 = 22 + 2−3 + 2−4=4+1/8+1/16=43/16

另一种思考方式是,以普通二进制(或两个补码)格式表示某个x的位以Qm.n格式表示x/2n

如果您的编译器有一个完全受支持的
q7
类型,您可以只为它赋值,而不必处理它们的表示方式:
q7x=.25
将初始化
x
以包含值1/4,方法是将位00100000放入其中

从你的例子来看,你似乎有一个“自己动手”的想法“Q7类型实际上只是一个8位有符号整数。在这种情况下,您必须在表示的值和Q7类型之间进行一些转换。给定表示整数x的任何8位,它们将在Q7格式中表示x/128,因为在Q7格式中,整数格式中值为2i的位的值为2i−7的Q7格式


因此,如果您有一些浮点
f
,并且希望以Q7格式存储它,则使用
Q7_t x=f*128;
f
调整为整数的正常缩放中的相应值。相反,
x/128.f
x
表示的整数值,并将其缩放为位在e Q7格式。

是否有反汇编?“用于最大限度地提高n位数字的精度”没有什么意义。它只是用来表示8位的+/-1.0。由于pi X 128>255,代码也没有意义。关于128的问题的答案是它会导致算术溢出-不能说更多了。数据类型是用于相关的arm_math.h库,而不是通用算术。因此它仍然是在转换为q类型之前,是否需要将函数中的浮点变量规格化为特定于应用程序的预定义范围?