Skip to main content
欢迎来到PAWPAW技术文档网站了解更多信息

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()完全相同。

该宏提供给开发人员以方便使用,并使代码更易读。

另请参阅:vect_s32_add_prepare()


#define vect_complex_s16_add_scalar_prepare vect_s32_add_prepare

获取调用vect_complex_s16_add_scalar()时所需的输出指数和移位数。

计算vect_complex_s16_add_scalar()的移位数和指数的逻辑与vect_s32_add()完全相同。

该宏提供给开发人员以方便使用,并使代码更易读。

另请参阅:vect_s16_add_prepare()


#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_expacc_shrbc_sat,这些值被选择为在不引起最终值或中间值饱和的情况下,最大化累加器向量的精度。通常,调用者将把这些输出传递给vect_complex_s16_macc()的相应输入。

acc_exp是操作前与累加器尾数向量 aˉ\bar a 关联的指数,而new_acc_exp是与更新后的累加器向量相对应的指数。

b_expc_exp分别是与复数输入尾数向量 bˉ\bar bcˉ\bar c 关联的指数。

acc_hrb_hrc_hr分别是 aˉ\bar abˉ\bar bcˉ\bar c 的头空间。如果这些向量中任何一个的头空间未知,可以通过调用vect_complex_s16_headroom()来获取。或者,始终可以安全地使用值0(但可能会导致精度降低)。

参数:

  • exponent_t *new_acc_exp – [out] 输出尾数向量 aˉ\bar a(macc之后)关联的指数

  • right_shift_t *acc_shr – [out]vect_complex_s16_macc()中用于 aˉ\bar a 的有符号算术右移量

  • right_shift_t *bc_sat – [out] 应用于元素乘积 bkb_kckc_k 的无符号算术右移量,用于vect_complex_s16_macc()

  • const exponent_t acc_exp – [in] 输入尾数向量 aˉ\bar a(macc之前)关联的指数

  • const exponent_t b_exp – [in] 输入尾数向量 bˉ\bar b 关联的指数

  • const exponent_t c_exp – [in] 输入尾数向量 cˉ\bar c 关联的指数

  • const headroom_t acc_hr – [in] 输入尾数向量 aˉ\bar a(macc之前)的头空间

  • const headroom_t b_hr – [in] 输入尾数向量 bˉ\bar b 的头空间

  • const headroom_t c_hr – [in] 输入尾数向量 cˉ\bar c 的头空间

调整输出指数:

如果需要特定的输出指数 desired_exp 用于结果(例如模拟定点算术),可以根据以下方式调整此函数产生的 acc_shrbc_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 >= 0bc_sat无符号 右移量)
  • acc_shr > -acc_hr(进一步左移可能会导致饱和)

用户需要确保任何此类修改不会导致饱和或不可接受的精度损失。

参见:vect_complex_s16_macc()


#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_expa_shr

a_exp是与尾数向量 Aˉ\bar A 关联的指数,必须选择足够大的值,以避免计算 Aˉ\bar A 元素时的溢出。为了最大化精度,该函数选择a_exp为已知的最小指数,以避免饱和(参见下面的异常)。此函数选择的a_exp是根据输入向量的指数和头空间推导得出的。

a_shrvect_complex_s16_mul()所需的移位参数,以实现选择的输出指数a_exp

b_expc_exp是与输入尾数向量 Bˉ\bar BCˉ\bar C 关联的指数。

b_hrc_hr分别是输入尾数向量 Bˉ\bar BCˉ\bar C 的头空间。如果不知道 Bˉ\bar BCˉ\bar C 的头空间,可以调用vect_complex_s16_headroom()来获取。或者,始终可以安全地使用值0(但可能会导致精度降低)。

参数:

  • exponent_t *a_exp – [out] 输出尾数向量 Aˉ\bar A 关联的指数

  • right_shift_t *a_shr – [out] vect_complex_s16_mul()使用的用于 Bˉ\bar B 的无符号算术右移

  • const exponent_t b_exp – [in] 输入尾数向量 Bˉ\bar B 关联的指数

  • const exponent_t c_exp – [in] 输入尾数向量 Cˉ\bar C 关联的指数

  • const headroom_t b_hr – [in] 输入尾数向量 Bˉ\bar B 的头空间

  • const headroom_t c_hr – [in] 输入尾数向量 Cˉ\bar C 的头空间

调整输出指数:

如果需要特定的输出指数 desired_exp 用于结果(例如用于模拟定点算术),可以根据以下方式调整此函数产生的 a_shrc_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_mulvect_complex_s16_mul


void vect_complex_s16_real_mul_prepare()

获取vect_complex_s16_real_mul()函数使用的输出指数和输出移位量。

此函数与vect_complex_s16_real_mul()配合使用,用于对复数16位BFP向量和实数16位向量进行逐元素复数乘法运算。

此函数计算a_expa_shr

参数:

  • exponent_t *a_exp – [out] 输出尾数向量 aˉ\bar{a} 的指数

  • right_shift_t *a_shr – [out] vect_complex_s16_real_mul()使用的aˉ\bar{a}的无符号算术右移位数

  • const exponent_t b_exp – [in] 输入尾数向量 bˉ\bar{b} 的指数

  • const exponent_t c_exp – [in] 输入尾数向量 cˉ\bar{c} 的指数

  • const headroom_t b_hr – [in] 输入尾数向量 bˉ\bar{b} 的头空间

  • const headroom_t c_hr – [in] 输入尾数向量 cˉ\bar{c} 的头空间

注意事项:

  • 使用此函数的输出,原本为INT16_MIN的输出尾数将饱和为-INT16_MAX。这是由VPU采用的对称饱和逻辑造成的,属于硬件特性。这是一个通常不太可能发生的边界情况,当发生时会产生1个LSb的误差。

  • 调整输出指数: 如果需要特定的输出指数desired_exp用于结果(例如用于模拟定点算术),则可以根据以下公式调整a_shrc_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_expa_shr

参数:

  • exponent_t *a_exp – [out] 输出幅值向量 aˉ\bar{a} 关联的指数

  • right_shift_t *a_shr – [out] vect_complex_s16_squared_mag()使用的aˉ\bar{a}的无符号算术右移位数

  • const exponent_t b_exp – [in] 输入幅值向量 bˉ\bar{b} 关联的指数

  • const headroom_t b_hr – [in] 输入幅值向量 bˉ\bar{b} 的头空间

备注:

  • 调整输出指数: 如果需要特定的输出指数 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()完全相同。

该宏的目的是方便开发人员,并使代码更易读。