16-Bit BFP API
void bfp_s16_init()
初始化一个16位BFP向量。
该函数初始化BFP向量a的各个字段。
data指向用于存储向量元素的内存缓冲区,因此它的长度必须至少为length * 2个字节,并且必须以字对齐的地址开始。
exp是分配给BFP向量的指数。初始化后,第k个元素与逻辑值的关联为 。
如果calc_hr为false,则a->hr初始化为0。否则,计算BFP向量的头空间(headroom)并用于初始化a->hr。
参数:
-
bfp_s16_t *a– [out] 要初始化的BFP向量 -
int16_t *data– [in] 用于支持a的int16_t缓冲区 -
const exponent_t exp– [in] BFP向量的指数 -
const unsigned length– [in] BFP向量中的元素数量 -
const unsigned calc_hr– [in] 表示是否应计算BFP向量的头空间的布尔值
参考性能:

bfp_s16_t bfp_s16_alloc()
从堆中动态分配一个16位BFP向量。
如果分配不成功,返回向量的data字段将为NULL,length字段将为零。否则,data将指向已分配的内存,length字段将是用户指定的长度。length参数不能为零。
此函数不设置BFP指数、头空间或已分配尾数向量的元素。要将BFP向量的元素设置为已知值,请在返回的BFP向量上使用bfp_s16_set()。
使用此函数分配的BFP向量必须使用bfp_s16_dealloc()进行释放,以避免内存泄漏。
要使用静态内存分配初始化BFP向量,请改用bfp_s16_init()。
注意: BFP向量的动态分配依赖于堆分配,并且对执行时间没有任何保证。强烈不建议在任何时间关键的代码段中使用此函数。
参数:
const unsigned length– [in] 要分配的BFP向量的长度(以元素为单位)
返回:
bfp_s16_t16位BFP向量
参考性能:

void bfp_s16_dealloc()
释放由bfp_s16_alloc()动态分配的16位BFP向量。
使用此函数释放由bfp_s16_alloc()分配的堆内存。
对于成功动态分配尾数缓冲区的BFP向量,会设置一个标志来指示这一点。此函数可以安全地调用任何未手动操作其flags或data的bfp_s16_t,包括:
bfp_s16_t是通过成功调用bfp_s16_alloc()获得的bfp_s16_t是通过未成功调用bfp_s16_alloc()获得的bfp_s16_t是通过调用bfp_s16_init()进行初始化的
对于后两种情况,此函数不执行任何操作。对于前一种情况,将清除vector的data、length和flags字段的值,将它们设置为零。
参数:
bfp_s16_t* vector– [in] 要释放的BFP向量。
参考性能:

void bfp_s16_set()
将16位BFP向量的所有元素设置为指定值。
将a的指数设置为exp,并将每个元素的尾数设置为b。执行此操作后,所有元素将表示相同的值 。
a必须已经被初始化(参见bfp_s16_init())。
参数:
-
bfp_s16_t *a– [out] 要更新的BFP向量 -
const int16_t b– [in] 每个尾数要设置的新值 -
const exponent_t exp– [in] BFP向量的新指数
参考性能:

headroom_t bfp_s16_headroom()
获取16位BFP向量的头空间。
向量的头空间是其元素可以左移的位数,而不丢失任何信息。它传达了向量可能包含的值的范围的信息,这对于确定如何在可能有损坏的块浮点操作中保持精度非常有用。
在BFP环境中,头空间仅适用于尾数,而不适用于指数。如果16位尾数向量 具有 位的头空间,则对于 的任何元素 ,。
对于复数BFP向量 的任何元素 ,。
此函数确定 b 的头空间,更新 b->hr 的值,然后返回 b->hr。
参数:
bfp_s16_t *b– 要获取头空间的BFP向量
返回值:
- BFP向量
b的头空间
参考性能:

void bfp_s16_use_exponent()
将16位BFP向量修改为使用指定的指数。
此函数强制BFP向量 使用指定的指数。尾数向量 将被左移或右移以补偿更改的指数。
例如,可以在调用定点算术函数之前使用此函数,以确保底层尾数向量具有所需的Q格式。另一个例子是在与外围设备通信时(例如通过I2S),需要将样本数据以指定格式传输。
请注意,这设置了_当前_编码,而不是永久地_固定_指数(即后续操作可能像往常一样更改指数)。
如果所需的定点Q格式为 QX.Y,其中 Y 是结果尾数中的小数位数,则关联的指数(和参数 exp 的值)为 -Y。
a 指向输入BFP向量 ,具有尾数向量 和指数 。a 在原地更新,产生结果BFP向量 ,具有尾数向量 和指数 。
exp 是 ,即所需的指数。 是指数的所需变化量。
如果 ,则不修改BFP向量。
如果 ,则所需的指数大于当前指数,并且将 位右移应用于尾数 。在应用右移时,通过丢弃 位最低有效位可能会丢失精度。
如果 ,则所需的指数小于当前指数,并且将 位左移应用于尾数 。在左移时,将应用饱和逻辑,以使任何不能用新指数准确表示的元素饱和到16位饱和边界。
此函数会更新 a 的指数和头空间。
操作:
参数:
-
bfp_s16_t *a– [inout] 输入BFP向量 / 输出BFP向量 -
const exponent_t exp– [in] 所需的指数,
参考性能:

void bfp_s16_shl()
对一个16位BFP向量的尾数进行左移操作。
输入BFP向量 的每个尾数左移 b_shl 位,并将结果存储在输出BFP向量 的相应元素中。
此操作可用于给BFP向量添加或移除头空间。
b_shl 是每个尾数将要左移的位数。这个移位是有符号的算术移位,因此b_shl 的负值将会对尾数进行右移。
a 和 b 必须已经被初始化(参见bfp_s16_init()),并且长度必须相同。
此操作可以在b上安全地原地执行。
请注意,此操作绕过了保护调用者免受饱和或下溢的逻辑。输出值饱和到对称的16位范围(开区间 )。为了避免饱和,b_shl 应不大于 b 的头空间(b->hr)。
操作:
参数:
-
bfp_s16_t *a– [out] 输出BFP向量 -
const bfp_s16_t *b– [in] 输入BFP向量 -
const left_shift_t b_shl– [in] 要应用于 的尾数的有符号算术左移。
参考性能:

void bfp_s16_add()
将两个16位BFP向量相加。
将输入BFP向量 和 相加,并将结果存储在BFP向量 中。
a、b 和 c 必须已经被初始化(参见bfp_s16_init()),并且长度必须相同。
此操作可以在b或c上安全地原地执行。
操作:
参数:
-
bfp_s16_t *a– [out] 输出BFP向量 -
const bfp_s16_t *b– [in] 输入BFP向量 -
const bfp_s16_t *c– [in] 输入BFP向量
参考性能:

void bfp_s16_add_scalar()
将一个标量加到16位BFP向量中。
将实数标量 加到输入BFP向量 中,并将结果存储在BFP向量 中。
a 和 b 必须已经被初始化(参见bfp_s16_init()),并且长度必须相同。
此操作可以在b上安全地原地执行。
操作:
参数:
-
bfp_s16_t *a– [out] 输出BFP向量 -
const bfp_s16_t *b– [in] 输入BFP向量 -
const float c– [in] 输入标量
参考性能:

void bfp_s16_sub()
从一个16位BFP向量中减去另一个向量。
该函数从输入BFP向量 中减去输入BFP向量 ,并将结果存储在BFP向量 中。
a、b 和 c 必须已经被初始化(参见bfp_s16_init()),并且长度必须相同。
此操作可以在b或c上安全地原地执行。
操作:
参数:
-
bfp_s16_t *a– [out] 输出BFP向量 -
const bfp_s16_t *b– [in] 输入BFP向量 -
const bfp_s16_t *c– [in] 输入BFP向量
参考性能:

void bfp_s16_mul()
逐元素地将一个16位BFP向量与另一个向量相乘。
该函数将输入BFP向量 的每个元素与输入BFP向量 的相应元素相乘,并将结果存储在输出BFP向量 中。
a、b 和 c 必须已经被初始化(参见bfp_s16_init()),并且长度必须相同。
此 操作可以在b或c上安全地原地执行。
操作:
参数:
-
bfp_s16_t *a– [out] 输出BFP向量 -
const bfp_s16_t *b– [in] 输入BFP向量 -
const bfp_s16_t *c– [in] 输入BFP向量
参考性能:

void bfp_s16_macc()
逐元素地将一个16位BFP向量与另一个向量相乘,并将结果加到第三个向量上。
操作:
参数:
-
bfp_s16_t *acc– [inout] 输入/输出累加器BFP向 量 -
const bfp_s16_t *b– [in] 输入BFP向量 -
const bfp_s16_t *c– [in] 输入BFP向量
参考性能:

void bfp_s16_nmacc()
逐元素地将一个16位BFP向量与另一个向量相乘,并将结果从第三个向量中减去。
操作:
参数:
-
bfp_s16_t *acc– [inout] 输入/输出累加器BFP向量 -
const bfp_s16_t *b– [in] 输入BFP向量 -
const bfp_s16_t *c– [in] 输入BFP向量
参考性能:

void bfp_s16_scale()
将一个16位BFP向量乘以一个标量。
该函数将输入BFP向量 乘以标量 ,并将结果存储在输出BFP向量 中。
a 和 b 必须已经被初始化(参见bfp_s16_init()),并且长度必须相同。
alpha 表示标量 ,其中 是 alpha.mant, 是 alpha.exp。
此操作可以在b上安全地原地执行。
操作:
参数:
-
bfp_s16_t *a– [out] 输出BFP向量 -
const bfp_s16_t *b– [in] 输入BFP向量 -
const float alpha– [in] 用于乘以 的标量
参考性能:

void bfp_s16_abs()
计算16位BFP向量的元素的绝对值。
该函数计算输入BFP向量的每个元素的绝对值,并将结果存储在输出BFP向量中。
a和b必须已经初始化(参见bfp_s16_init()),并且长度必须相同。这个操作可以在b上安全地原地执行。
操作:
参数:
bfp_s16_t* a– [out] 输出BFP向量const bfp_s16_t* b– [in] 输入BFP向量
参考性能:

float_s32_t bfp_s16_sum()
求解16位BFP向量的元素和。
该函数将输入BFP向量的元素求和得到结果, 并将其返回。返回值的尾数为32位。
b必须已经初始化(参见bfp_s16_init())。
操作: