Complex 16-bit Vector Prepare API
#define vect_complex_s16_add_prepare vect_s32_add_prepare
获取调用vect_complex_s16_add()时所需的输出指数和移位数。
计算vect_complex_s16_add()的移位数和指数的逻辑与vect_s32_add()完全相同。
该宏提供给开发人员以方便使用,并使代码更易读。
#define vect_complex_s16_add_scalar_prepare vect_s32_add_prepare
获取调用vect_complex_s16_add_scalar()时所需的输出指数和移位数。
计算vect_complex_s16_add_scalar()的移位数和指数的逻辑与vect_s32_add()完全相同。
该宏提供给开发人员以方便使用,并使代码更易读。
#define vect_complex_s16_conj_mul_prepare vect_complex_s16_mul_prepare
获取调用vect_complex_s16_conj_mul()时所需的输出指数和移位数。
计算vect_complex_s16_conj_mul()的移位数和指数的逻辑与vect_complex_s16_mul()完全相同。
该宏提供给开发人员以方便使用,并使代码更易读。
另请参阅:vect_complex_s16_mul_prepare()
void vect_complex_s16_macc_prepare()
获取vect_complex_s16_macc()函数所需的输出指数和移位量。
此函数与vect_complex_s16_macc()结合使用,用于对复数16位BFP向量进行逐元素乘累加运算。
该函数计算new_acc_exp、acc_shr和bc_sat,这些值被选择为在不引起最终值或中间值饱和的情况下,最大化累加器向量的精度。通常,调用者将把这些输出传递给vect_complex_s16_macc()的相应输入。
acc_exp是操作前与累加器尾数向量 关联的指数,而new_acc_exp是与更新后的累加器向量相对应的指数。
b_exp和c_exp分别是与复数输入尾数向量 和 关联的指数。
acc_hr、b_hr和c_hr分别是 、 和 的头空间。如果这些向量中任何一个的头空间未知,可以通过调用vect_complex_s16_headroom()来获取。或者,始终可以安全地使用值0(但可能会导致精度降低)。
参数:
-
exponent_t *new_acc_exp– [out] 输出尾数向量 (macc之后)关联的指数 -
right_shift_t *acc_shr– [out] 在vect_complex_s16_macc()中用于 的有符号算术右移量 -
right_shift_t *bc_sat– [out] 应用于元素乘积 和 的无符号算术右移量,用于vect_complex_s16_macc() -
const exponent_t acc_exp– [in] 输入尾数向量 (macc之前)关联的指数 -
const exponent_t b_exp– [in] 输入尾数向量 关联的指数 -
const exponent_t c_exp– [in] 输入尾数向量 关联的指数 -
const headroom_t acc_hr– [in] 输入尾数向量 (macc之前)的头空间 -
const headroom_t b_hr– [in] 输入尾数向量 的头空间 -
const headroom_t c_hr– [in] 输入尾数向量 的头空间
调整输出指数:
如果需要特定的输出指数 desired_exp 用于结果(例如模拟定点算术),可以根据以下方式调整此函数产生 的 acc_shr 和 bc_sat:
// 假设已在某处设置
exponent_t acc_exp, b_exp, c_exp;
headroom_t acc_hr, b_hr, c_hr;
exponent_t desired_exp;
...
// 调用 prepare
right_shift_t acc_shr, bc_sat;
vect_complex_s16_macc_prepare(&acc_exp, &acc_shr, &bc_sat,
acc_exp, b_exp, c_exp,
acc_hr, b_hr, c_hr);
// 修改结果
right_shift_t mant_shr = desired_exp - acc_exp;
acc_exp += mant_shr;
acc_shr += mant_shr;
bc_sat += mant_shr;
// 现在可以在调用 vect_complex_s16_macc() 时使用 acc_shr 和 bc_sat
在应用上述调整时,应保持以下条件:
bc_sat >= 0(bc_sat是 无符号 右移量)acc_shr > -acc_hr(进一步左移可能会导致饱和)
用户需要确保任何此类修改不会导致饱和或不可接受的精度损失。
#define vect_complex_s16_nmacc_prepare vect_complex_s16_macc_prepare
宏用于获取调用vect_complex_s16_nmacc()时所需的输出指数和移位数。
计算vect_complex_s16_nmacc()的移位数和指数的逻辑与vect_complex_s16_macc()相同。
该宏提供给开发人员以方便使用,并使代码更易读。
另请参阅:vect_complex_s16_macc_prepare(),vect_complex_s16_nmacc()
#define vect_complex_s16_conj_macc_prepare vect_complex_s16_macc_prepare
宏用于获取调用vect_complex_s16_conj_macc()时所需的输出指数和移位数。
计算vect_complex_s16_conj_macc()的移位数和指数的逻辑与vect_complex_s16_macc()相同。
该宏提供给开发人员以方便使用,并使代码更易读。
另请参阅:vect_complex_s16_macc_prepare(),vect_complex_s16_conj_macc()
#define vect_complex_s16_conj_nmacc_prepare vect_complex_s16_macc_prepare
宏用于获取调用vect_complex_s16_conj_nmacc()时所需的输出指数和移位数。
计算vect_complex_s16_conj_nmacc()的移位数和指数的逻辑与vect_complex_s16_macc()相同。
该宏提供给开发人员以方便使用,并使代码更易读。
另请参阅:vect_complex_s16_macc_prepare(),vect_complex_s16_conj_nmacc()
#define vect_complex_s16_mag_prepare vect_complex_s32_mag_prepare
宏用于获取调用vect_complex_s16_mag()时所需的输出指数和移位数。
计算vect_complex_s16_mag()的移位数和指数的逻辑与vect_complex_s32_mag()相同。
该宏提供给开发人员以方便使用,并使代码更易读。
另请参阅:vect_complex_s32_mag_prepare()
void vect_complex_s16_mul_prepare()
获取vect_complex_s16_mul()和vect_complex_s16_conj_mul()函数使用的输出指数和输出移位。
此函数与vect_complex_s16_mul()配合使用,用于对两个复数16位BFP向量进行逐元素复数乘法。
该函数计算a_exp和a_shr。
a_exp是与尾数向量 关联的指数,必须选择足够大的值,以避免计算 元素时的溢出。为了最大化精度,该函数选择a_exp为已知的最小指数,以避免饱和(参见下面的异常)。此函数选择的a_exp是根据输入向量的指数和头空间推导得出的。
a_shr是vect_complex_s16_mul()所需的移位参数,以实现选择的输出指数a_exp。
b_exp和c_exp是与输入尾数向量 和 关联的指数。
b_hr和c_hr分别是输入尾数向量 和 的头空间。如果不知道 或 的头空间,可以调用vect_complex_s16_headroom()来获取。或者,始终可以安全地使用值0(但可能会导致精度降低)。
参数:
-
exponent_t *a_exp– [out] 输出尾数向量 关联的指数 -
right_shift_t *a_shr– [out]vect_complex_s16_mul()使用的用于 的无符号算术右移 -
const exponent_t b_exp– [in] 输入尾数向量 关联的指数 -
const exponent_t c_exp– [in] 输入尾数向量 关联的指数 -
const headroom_t b_hr– [in] 输入尾数向量 的头空间 -
const headroom_t c_hr– [in] 输入尾数向量 的头空间
调整输出指数:
如果需要特定的输出指数 desired_exp 用于结果(例如用于模拟定点算术),可以根据以下方式调整此函数产生的 a_shr 和 c_shr:
exponent_t desired_exp = ...; // 先验已知值
right_shift_t new_a_shr = a_shr + (desired_exp - a_exp);
在应用上述调整时,应保持以下条件:
new_a_shr >= 0
请注意,对于 a_shr 使用比严格要求更小的值可能导致饱和,而使用较大的值可能导致不必要的下溢或精度损失。
注意事项:
- 使用此函数的输出,本应为
INT16_MIN的输出尾数将饱和为-INT16_MAX。这是由VPU采用的对称饱和逻辑所致,这是一种硬件特性。这通常是一个不太可能的边界情况,当发生时会导致1个LSb的误差。
另请参阅:vect_complex_s16_conj_mul,vect_complex_s16_mul。
void vect_complex_s16_real_mul_prepare()
获取vect_complex_s16_real_mul()函数使用的输出指数和输出移位量。
此函数与vect_complex_s16_real_mul()配合使用,用于对复数16位BFP向量和实数16位向量进行逐元素复数乘法运算。
此函数计算a_exp和a_shr。
参数:
-
exponent_t *a_exp– [out] 输出尾数向量 的指数 -
right_shift_t *a_shr– [out]vect_complex_s16_real_mul()使用的的无符号算术右移位数 -
const exponent_t b_exp– [in] 输入尾数向量 的指数 -
const exponent_t c_exp– [in] 输入尾数向量 的指数 -
const headroom_t b_hr– [in] 输入尾数向量 的头空间 -
const headroom_t c_hr– [in] 输入尾数向量 的头空间
注意事项:
-
使用此函数的输出,原本为
INT16_MIN的输出尾数将饱和为-INT16_MAX。这是由VPU采用的对称饱和逻辑造成的,属于硬件特性。这是一个通常不太可能发生的边界情况,当发生时会产生1个LSb的误差。 -
调整输出指数: 如果需要特定的输出指数
desired_exp用于结果(例如用于模拟定点算术),则可以根据以下公式调整a_shr和c_shr:
exponent_t desired_exp = ...; // 先验已知的值
right_shift_t new_a_shr = a_shr + (desired_exp - a_exp);
在应用上述调整时,应保持以下条件:new_a_shr >= 0。请注意,使用比a_shr严格要求更小的值可能会导致饱和,而使用较大的值可能会导致不必要的下溢或精度损失。
#define vect_complex_s16_real_scale_prepare vect_s16_scale_prepare
获取调用vect_complex_s16_real_scale()所需的输出指数和移位量。
计算vect_complex_s16_real_scale()的移位和指数的逻辑与vect_s32_scale()完全相同。
此宏的目的是为了方便 开发人员,并使代码更具可读性。
#define vect_complex_s16_scale_prepare vect_complex_s16_mul_prepare
获取调用vect_complex_s16_scale()所需的输出指数和移位量。
计算vect_complex_s16_scale()的移位和指数的逻辑与vect_complex_s32_mul()完全相同。
此宏的目的是为了方便开发人员,并使代码更具可读性。
void vect_complex_s16_squared_mag_prepare()
获取vect_complex_s16_squared_mag()使用的输出指数和输入移位。
此函数与vect_complex_s16_squared_mag()配合使用,用于计算复合16位BFP向量每个元素的平方幅值。
此函数计算a_exp和a_shr。
参数:
-
exponent_t *a_exp– [out] 输出幅值向量 关联的指数 -
right_shift_t *a_shr– [out]vect_complex_s16_squared_mag()使用的的无符号算术右移位数 -
const exponent_t b_exp– [in] 输入幅值向量 关联的指数 -
const headroom_t b_hr– [in] 输入幅值向量 的头空间
备注:
- 调整输出指数: 如果需要特定的输出指数
desired_exp用于结果(例如,用于模拟定点算术),可以根据以下方式调整此函数产生的a_shr:
exponent_t a_exp;
right_shift_t a_shr;
vect_s16_mul_prepare(&a_exp, &a_shr, b_exp, c_exp, b_hr, c_hr);
exponent_t desired_exp = ...; // 先验已知值
a_shr = a_shr + (desired_exp - a_exp);
a_exp = desired_exp;
在应用上述调整时,应保持以下条件: a_shr >= 0。使用比a_shr严格需要的更大值可能会导致不必要的下溢或精度损失。
#define vect_complex_s16_sub_prepare vect_s32_add_prepare
获取调用vect_complex_s16_sub()所需的输出指数和移位数。
计算vect_complex_s16_sub()的移位数和指数的逻辑与vect_s32_add()完全相同。
该宏的目的是方便开发人员,并使代码更易读。