定点数-背景知识
请注意,buff[]是一个q1_31数组。q1_31是在lib_xcore_math中定义的32位整数类型。在处理32位定点算术时,我们可以始终使用int32_t值,但这并不能告诉我们数据所表示的逻辑值。由于与定点值关联的指数是固定的,我们可以直接将这些信息编码到存储它们的变量和常量的类型中。
为此,lib_xcore_math定义了q1_31和许多相关类型(例如q2_30、q8_24等),用于表示底层数据 的_Q格式_(Q格式)。它们可以用来向用户_暗示_给定值应与特定指数相关联。同样,它们可以被理解为包含特定数量的小数位。
类型q1_31对应于Q格式Q1.31。这是一个带有1个整数位和31个小数位的32位值。同样,q8_24表示Q8.24格式,具有8个整数位和24个小数位,依此类推。
- 尾数和指数
- 定点算术
lib_xcore_math中的定点支持
组件函数
与第1部分类似,第2部分中每个阶段的行为由4个组件函数定义:
rx_frame()tx_frame()filter_sample()filter_task()
这些函数在第2部分中的作用与在第1部分中的作用基本相同。
其中,filter_task()、rx_frame()和tx_frame()这三个函数在所有三个阶段中使用相同的实现。在这些阶段之间唯一变化的是filter_sample()的实现。
在本页面中,我们将先看看每个阶段共有的这些函数,然后深入研究选择指数来表示我们的定点值的逻辑。最后,我们将给出一些深入的例子。
第2部分滤波器系数
与第1部分不同的是,滤波器系数在第1A中被实现为一个常量double数组(第1部分)或float数组(阶段1和阶段2),而在第2部分中,滤波器系数由一个q4_28值数组表示(即Q4.28格式)。这些系数具有28个小数位,因此其隐含指数为-28。
本部分中的滤波器系数来自filter_coef_q4_28.c。
作为一个平均FIR滤波器,所有系数的逻辑值都是。让我们将其转换为Q4.28格式。
因此,在Q4.28格式中,我们的每个滤波器系数应该由整数值0x40000表示。
使用Q4.28格式是我们的选择。通常,在选择定点数据的表示时,最好使用最低的指数来避免数据丢失。这对应于具有零头空间的概念,我们将在第3部分中讨论。使用最小指数通常意味着最大精度。在这种特殊情况下,因为我们的系数是2的幂,任何允许的指数都是等效的。