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

Complex 16-bit Vector API

headroom_t vect_complex_s16_add()

将一个复合16位向量与另一个相加。

a_real[]a_imag[] 共同表示复合16位输出尾数向量 aˉ\bar{a}。其中 Re{ak}Re\{a_k\}a_real[k]Im{ak}Im\{a_k\}a_imag[k]

b_real[]b_imag[] 共同表示复合16位输入尾数向量 bˉ\bar{b}。其中 Re{bk}Re\{b_k\}b_real[k]Im{bk}Im\{b_k\}b_imag[k]

c_real[]c_imag[] 共同表示复合16位输入尾数向量 cˉ\bar{c}。其中 Re{ck}Re\{c_k\}c_real[k]Im{ck}Im\{c_k\}c_imag[k]

每个输入向量必须从字对齐的地址开始。该操作可以在输入 b_real[]b_imag[]c_real[]c_imag[] 上安全地原地执行。

length 是每个向量中的元素数量。

b_shrc_shr 是应用于 bˉ\bar{b}cˉ\bar{c} 的有符号算术右移。

操作:

bksat16(bk2b_shr)cksat16(ck2c_shr)Re{ak}Re{bk}+Re{ck}Im{ak}Im{bk}+Im{ck} for k0 ... (length1)\begin{split}\begin{align*} & b_k' \leftarrow sat_{16}(\lfloor b_k \cdot 2^{-b\_shr} \rfloor) \\ & c_k' \leftarrow sat_{16}(\lfloor c_k \cdot 2^{-c\_shr} \rfloor) \\ & Re\{a_k\} \leftarrow Re\{b_k'\} + Re\{c_k'\} \\ & Im\{a_k\} \leftarrow Im\{b_k'\} + Im\{c_k'\} \\ & \qquad\text{ for }k\in 0\ ...\ (length-1) \end{align*}\end{split}

块浮点数:

如果 bˉ\bar{b}cˉ\bar{c} 是BFP向量 bˉ2b_exp\bar{b} \cdot 2^{b\_exp}cˉ2c_exp\bar{c} \cdot 2^{c\_exp} 的复合16位尾数,则结果向量 aˉ\bar{a} 是BFP向量 aˉ2a_exp\bar{a} \cdot 2^{a\_exp} 的复合16位尾数。

在这种情况下,必须选择 bshrb_shrcshrc_shr,使得 a_exp=b_exp+b_shr=c_exp+c_shra\_exp = b\_exp + b\_shr = c\_exp + c\_shr。只有当尾数与相同的指数关联时,才有意义地相加或相减。

函数 vect_complex_s16_add_prepare() 可以根据输入指数 b_expb\_expc_expc\_exp 以及输入头空间 b_hrb\_hrc_hrc\_hr 来获取 a_expa\_expb_shrb\_shrc_shrc\_shr 的值。

参数:

  • int16_t a_real[] – [out] 复合输出向量 aˉ\bar{a} 的实部

  • int16_t a_imag[] – [out] 复合输出向量 aˉ\bar{a} 的虚部

  • const int16_t b_real[] – [in] 复合输入向量 bˉ\bar{b} 的实部

  • const int16_t b_imag[] – [in] 复合输入向量 bˉ\bar{b} 的虚部

  • const int16_t c_real[] – [in] 复合输入向量 cˉ\bar{c} 的实部

  • const int16_t c_imag[] – [in] 复合输入向量 cˉ\bar{c} 的虚部

  • const unsigned length – [in] 向量 aˉ\bar{a}bˉ\bar{b}cˉ\bar{c} 中的元素数量

  • const right_shift_t b_shr – [in] 应用于 bˉ\bar{b} 的右移量

  • const right_shift_t c_shr – [in] 应用于 cˉ\bar{c} 的右移量

返回值:

输出向量 aˉ\bar{a} 的头空间。

异常:

如果 a_reala_imagb_realb_imagc_realc_imag 不是字对齐的,则引发 ET_LOAD_STORE 异常(参见 笔记:向量对齐)。

另请参阅:

vect_complex_s16_add_prepare()

参考性能:

vect_complex_s16_add


headroom_t vect_complex_s16_add_scalar()

将一个标量添加到复数16位向量中。

a[]b[]分别表示复数16位尾数向量 aˉ\bar{a}bˉ\bar{b}。每个向量必须从字对齐的地址开始。该操作可以在b[]上安全地原地执行。

c是要添加到 bˉ\bar{b} 的每个元素的复数标量 cc

length是每个向量中的元素数量。

b_shr是应用于 bˉ\bar{b} 的带符号算术右移位数。

该操作可以描述如下:

bksat16(bk2b_shr)Re{ak}Re{bk}+Re{c}Im{ak}Im{bk}+Im{c} 其中 k0 ... (length1)\begin{align*} & b_k' \leftarrow sat_{16}(\lfloor b_k \cdot 2^{-b\_shr} \rfloor) \\ & Re\{a_k\} \leftarrow Re\{b_k'\} + Re\{c\} \\ & Im\{a_k\} \leftarrow Im\{b_k'\} + Im\{c\} \\ & \qquad\text{ 其中 }k\in 0\ ...\ (length-1) \end{align*}

块浮点数:

如果 bˉ\bar{b} 的元素是BFP向量 bˉ2b_exp\bar{b} \cdot 2^{b\_exp} 的复数尾数,并且 cc 是浮点数 c2c_expc \cdot 2^{c\_exp} 的尾数,则结果向量 aˉ\bar{a} 是BFP向量 aˉ2a_exp\bar{a} \cdot 2^{a\_exp} 的尾数。

在这种情况下,必须选择 b_shrb\_shrc_shrc\_shr 使得 a_exp=b_exp+b_shr=c_exp+c_shra\_exp = b\_exp + b\_shr = c\_exp + c\_shr。只有当尾数与相同的指数相关联时,加法或减法才有意义。

函数 vect_complex_s16_add_scalar_prepare() 可以根据输入的指数 b_expb\_expc_expc\_exp 以及输入的头空间 b_hrb\_hrc_hrc\_hr 来获取 a_expa\_expb_shrb\_shrc_shrc\_shr 的值。

注意,c_shrc\_shrvect_complex_s16_add_scalar_prepare() 的输出,但它不是此函数的参数。由 vect_complex_s16_add_scalar_prepare() 产生的 c_shrc\_shr 应由用户应用,并将结果作为输入 c 传递。

参数:

  • int16_t a_real[] – [out] 复数输出向量 aˉ\bar{a} 的实部

  • int16_t a_imag[] – [out] 复数输出向量 aˉ\bar{a} 的虚部

  • const int16_t b_real[] – [in] 复数输入向量 bˉ\bar{b} 的实部

  • const int16_t b_imag[] – [in] 复数输入向量 bˉ\bar{b} 的虚部

  • const complex_s16_t c – [in] 复数输入标量 cc

  • const unsigned length – [in] 向量 aˉ\bar{a}bˉ\bar{b} 中的元素数量

  • const right_shift_t b_shr – [in] 应用于 bˉ\bar{b} 的右移位数

返回值:

  • 输出向量 aˉ\bar{a} 的头空间。

异常:

参见:

  • vect_complex_s16_add_scalar_prepare()

参考性能:

vect_complex_s16_add_scalar


headroom_t vect_complex_s16_conj_mul()

逐元素将一个复数16位向量与另一个的共轭相乘。

a_real[]a_imag[] 一起表示复数16位输出尾数向量 aˉ\bar{a}。每个 Re{ak}Re\{a_k\}a_real[k],每个 Im{ak}Im\{a_k\}a_imag[k]

b_real[]b_imag[] 一起表示复数16位输入尾数向量 bˉ\bar{b}。每个 Re{bk}Re\{b_k\}b_real[k],每个 Im{bk}Im\{b_k\}b_imag[k]

c_real[]c_imag[] 一起表示复数16位输入尾数向量 cˉ\bar{c}。每个 Re{ck}Re\{c_k\}c_real[k],每个 Im{ck}Im\{c_k\}c_imag[k]

每个输入向量必须从字对齐的地址开始。该操作可以在输入 b_real[]b_imag[]c_real[]c_imag[] 上安全地原地执行。

length 是向量中的元素数量。

a_shr 是应用于保存倒数第二个结果的32位累加器的无符号算术右移。

操作:

vk=Re{bk}Re{ck}+Im{bk}Im{ck}sk=Im{bk}Re{ck}Re{bk}Im{ck}Re{ak}round(sat16(vk2a_shr))Im{ak}round(sat16(sk2a_shr)) 其中 k0 ... (length1)\begin{split}\begin{align*} & v_k = \leftarrow Re\{b_k\} \cdot Re\{c_k\} + Im\{b_k\} \cdot Im\{c_k\} \\ & s_k = \leftarrow Im\{b_k\} \cdot Re\{c_k\} - Re\{b_k\} \cdot Im\{c_k\} \\ & Re\{a_k\} \leftarrow round( sat_{16}( v_k \cdot 2^{-a\_shr} ) ) \\ & Im\{a_k\} \leftarrow round( sat_{16}( s_k \cdot 2^{-a\_shr} ) ) \\ & \qquad\text{ 其中 }k\in 0\ ...\ (length-1) && \end{align*}\end{split}

参数:

  • int16_t a_real[] – [out] 复数输出向量 aˉ\bar{a} 的实部
  • int16_t a_imag[] – [out] 复数输出向量 aˉ\bar{a} 的虚部
  • const int16_t b_real[] – [in] 复数输入向量 bˉ\bar{b} 的实部
  • const int16_t b_imag[] – [in] 复数输入向量 bˉ\bar{b} 的虚部
  • const int16_t c_real[] – [in] 复数输入向量 cˉ\bar{c} 的实部
  • const int16_t c_imag[] – [in] 复数输入向量 cˉ\bar{c} 的虚部
  • const unsigned length– [in] 向量 aˉ\bar{a}bˉ\bar{b}cˉ\bar{c} 中的元素数量
  • const right_shift_t a_shr – [in] 应用于32位中间结果的右移量

返回值:

  • 输出向量 aˉ\bar{a} 的头空间

异常:

  • ET_LOAD_STORE 如果a_reala_imagb_realb_imagc_realc_imag不是字对齐的(参见笔记:向量对齐

参见:

  • vect_complex_s16_mul_prepare

参考性能:

vect_complex_s16_conj_mul


headroom_t vect_complex_s16_headroom()

计算复数16位数组的头空间。

N位整数的头空间是整数值左移而不丢失任何信息的位数。等效地,它比领先的符号位少一位。

complex_s16_t 结构体的头空间是其16位字段 reim 的头空间的最小值。

complex_s16_t 数组的头空间是其每个 complex_s16_t 元素的头空间的最小值。

该函数高效地遍历 xˉ\bar{x} 的元素以确定其头空间。

b_real[]b_imag[] 一起表示复数16位输入尾数向量 bˉ\bar{b}

lengthb_real[]b_imag[] 中的元素数量。

操作:

min ⁣{HR16(x0),HR16(x1),...,HR16(xlength1)}min\!\{ HR_{16}\left(x_0\right), HR_{16}\left(x_1\right), ..., HR_{16}\left(x_{length-1}\right) \}

参数:

  • const int16_t b_real[] – [in] 复数输入向量 bˉ\bar{b} 的实部
  • const int16_t b_imag[] – [in] 复数输入向量 bˉ\bar{b} 的虚部
  • const unsigned length– [in] 向量 xˉ\bar{x} 中的元素数量

返回值:

  • 向量 xˉ\bar{x} 的头空间

参见:

  • vect_s16_headroom
  • vect_s32_headroom
  • vect_complex_s32_headroom

参考性能:

vect_complex_s16_headroom


headroom_t vect_complex_s16_mag()

计算复合16位向量每个元素的幅值。

a[] 表示实部的16位输出尾数向量 aˉ\bar{a}

b_real[]b_imag[] 一起表示复合16位输入尾数向量 bˉ\bar{b}。每个 Re{bk}Re\{b_k\}b_real[k],每个 Im{bk}Im\{b_k\}b_imag[k]

每个输入向量必须从字对齐的地址开始。此操作可以安全地原地执行在输入 b_real[]b_imag[] 上。

length 是向量中的元素数量。

b_shr 是应用于 bˉ\bar{b} 元素的有符号算术右移。

rot_table 必须指向预先计算的用于计算幅值的复合向量表。table_rows 是表中的行数。

此函数执行的操作如下:

vkbk2b_shrak(Re{vk})2+(Im{vk})2其中 k0(length1)\begin{align*} v_k & \leftarrow b_k \cdot 2^{-b\_shr} \\ a_k & \leftarrow \sqrt { {\left( Re\{v_k\} \right)}^2 + {\left( Im\{v_k\} \right)}^2 } \\ \text{其中 } k & \in 0 \ldots (length-1) \end{align*}

参数:

  • int16_t a[] – [out] 实部输出向量 aˉ\bar{a}

  • const int16_t b_real[] – [in] 复合输入向量 bˉ\bar{b} 的实部

  • const int16_t b_imag[] – [in] 复合输入向量 bˉ\bar{b} 的虚部

  • const unsigned length – [in] 向量 aˉ\bar{a}bˉ\bar{b} 中的元素数量

  • const right_shift_t b_shr – [in] 应用于 bˉ\bar{b} 的右移量

  • const int16_t* rot_table – [in] 计算幅值所需的预先计算的旋转表

  • const unsigned table_rows – [in] rot_table 中的行数

返回值:

  • headroom_t - 输出向量 aˉ\bar{a} 的头空间。

参考性能:

vect_complex_s16_mag


headroom_t vect_complex_s16_macc()

逐元素将一个复合16位向量与另一个向量相乘,并将结果累加到累加器中。

acc_real[]acc_imag[] 一起表示复合16位累加器尾数向量 aˉ\bar{a}。每个 Re{ak}Re\{a_k\}acc_real[k],每个 Im{ak}Im\{a_k\}acc_imag[k]

b_real[]b_imag[] 一起表示复合16位输入尾数向量 bˉ\bar{b}。每个 Re{bk}Re\{b_k\}b_real[k],每个 Im{bk}Im\{b_k\}b_imag[k]

c_real[]c_imag[] 一起表示复合16位输入尾数向量 cˉ\bar{c}。每个 Re{ck}Re\{c_k\}c_real[k],每个 Im{ck}Im\{c_k\}c_imag[k]

每个输入向量必须从字对齐的地址开始。

length 是向量中的元素数量。

acc_shr 是应用于累加器元素 aka_k 的有符号算术右移。

bc_sat 是应用于 bkb_kckc_k 的乘积后添加到累加器的无符号算术右移。

此函数执行的操作如下:

vkRe{bk}Re{ck}Im{bk}Im{ck}skIm{bk}Re{ck}+Re{bk}Im{ck}a^ksat16(ak2acc_shr)Re{ak}sat16(Re{a^k}+round(sat16(vk2bc_sat)))Im{ak}sat16(Im{a^k}+round(sat16(sk2bc_sat))) 其中 k0 ... (length1)\begin{align*} & v_k \leftarrow Re\{b_k\} \cdot Re\{c_k\} - Im\{b_k\} \cdot Im\{c_k\} \\ & s_k \leftarrow Im\{b_k\} \cdot Re\{c_k\} + Re\{b_k\} \cdot Im\{c_k\} \\ & \hat{a}_k \leftarrow sat_{16}( a_k \cdot 2^{-acc\_shr} ) \\ & Re\{a_k\} \leftarrow sat_{16}( Re\{\hat{a}_k\} + round( sat_{16}( v_k \cdot 2^{-bc\_sat} ) ) ) \\ & Im\{a_k\} \leftarrow sat_{16}( Im\{\hat{a}_k\} + round( sat_{16}( s_k \cdot 2^{-bc\_sat} ) ) ) \\ & \qquad\text{ 其中 }k\in 0\ ...\ (length-1) && \end{align*}

参数:

  • int16_t acc_real[] – [inout] 复合累加器 aˉ\bar{a} 的实部

  • int16_t acc_imag[] – [inout] 复合累加器 aˉ\bar{a} 的虚部

  • const int16_t b_real[] – [in] 复合输入向量 bˉ\bar{b} 的实部

  • const int16_t b_imag[] – [in] 复合输入向量 bˉ\bar{b} 的虚部

  • const int16_t c_real[] – [in] 复合输入向量 cˉ\bar{c} 的实部

  • const int16_t c_imag[] – [in] 复合输入向量 cˉ\bar{c} 的虚部

  • const unsigned length – [in] 向量 aˉ\bar{a}bˉ\bar{b}cˉ\bar{c} 中的元素数量

  • const right_shift_t acc_shr – [in] 应用于累加器元素的有符号算术右移

  • const right_shift_t bc_sat – [in] 应用于元素 bkb_kckc_k 乘积的无符号算术右移

返回值:

  • headroom_t - 输出向量 aˉ\bar{a} 的头空间。

参考性能:

vect_complex_s16_macc


headroom_t vect_complex_s16_nmacc()

逐元素将一个复数16位向量与另一个相乘,并从累加器中减去结果。

acc_real[]acc_imag[]一起表示复数16位累加器的尾数向量 aˉ\bar{a}。其中 Re{ak}Re\{a_k\}acc_real[k]Im{ak}Im\{a_k\}acc_imag[k]

b_real[]b_imag[]一起表示复数16位输入的尾数向量 bˉ\bar{b}。其中 Re{bk}Re\{b_k\}b_real[k]Im{bk}Im\{b_k\}b_imag[k]

c_real[]c_imag[]一起表示复数16位输入的尾数向量 cˉ\bar{c}。其中 Re{ck}Re\{c_k\}c_real[k]Im{ck}Im\{c_k\}c_imag[k]

输入向量的每个元素必须从字对齐的地址开始。

length是每个向量中的元素数量。

acc_shr是应用于累加器 aka_k 的有符号算术右移。

bc_sat是应用于 bkb_kckc_k 的乘积后从累加器中减去之前的无符号算术右移。

操作:

vkRe{bk}Re{ck}Im{bk}Im{ck}skIm{bk}Re{ck}+Re{bk}Im{ck}a^ksat16(ak2acc_shr)Re{ak}sat16(Re{a^k}round(sat16(vk2bc_sat)))Im{ak}sat16(Im{a^k}round(sat16(sk2bc_sat))) 其中 k0 ... (length1)\begin{align*} & v_k \leftarrow Re\{b_k\} \cdot Re\{c_k\} - Im\{b_k\} \cdot Im\{c_k\} \\ & s_k \leftarrow Im\{b_k\} \cdot Re\{c_k\} + Re\{b_k\} \cdot Im\{c_k\} \\ & \hat{a}_k \leftarrow sat_{16}( a_k \cdot 2^{-acc\_shr} ) \\ & Re\{a_k\} \leftarrow sat_{16}( Re\{\hat{a}_k\} - round( sat_{16}( v_k \cdot 2^{-bc\_sat} ) ) ) \\ & Im\{a_k\} \leftarrow sat_{16}( Im\{\hat{a}_k\} - round( sat_{16}( s_k \cdot 2^{-bc\_sat} ) ) ) \\ & \text{ 其中 }k\in 0\ ...\ (length-1) \end{align*}

块浮点数:

如果输入 bˉ\bar{b}cˉ\bar{c} 是BFP向量 bˉ2b_exp\bar{b} \cdot 2^{b\_exp}cˉ2c_exp\bar{c} \cdot 2^{c\_exp} 的尾数,并且输入 aˉ\bar{a} 是累加器BFP向量 aˉ2a_exp\bar{a} \cdot 2^{a\_exp},则输出的 aˉ\bar{a} 的值具有指数 2a_exp+acc_shr2^{a\_exp + acc\_shr}

为了使累加在数学上有意义,必须选择 bc_satbc\_sat 使得 a_exp+acc_shr=b_exp+c_exp+bc_sata\_exp + acc\_shr = b\_exp + c\_exp + bc\_sat

函数 vect_complex_s16_nmacc_prepare() 可以根据输入的指数 a_expa\_expb_expb\_expc_expc\_exp 以及输入的头空间 a_hra\_hrb_hrb\_hrc_hrc\_hr 来获取 a_expa\_expacc_shracc\_shrbc_satbc\_sat 的值。

参数:

  • int16_t acc_real[] – [inout] 复数累加器 aˉ\bar{a} 的实部

  • int16_t acc_imag[] – [inout] 复数累加器 aˉ\bar{a} 的虚部

  • const int16_t b_real[] – [in] 复数输入向量 bˉ\bar{b} 的实部

  • const int16_t b_imag[] – [in] 复数输入向量 bˉ\bar{b} 的虚部

  • const int16_t c_real[] – [in] 复数输入向量 cˉ\bar{c} 的实部

  • const int16_t c_imag[] – [in] 复数输入向量 cˉ\bar{c} 的虚部

  • const unsigned length – [in] 向量 aˉ\bar{a}bˉ\bar{b}cˉ\bar{c} 中的元素数量

  • const right_shift_t acc_shr – [in] 应用于累加器元素的有符号算术右移

  • const right_shift_t bc_sat – [in] 应用于元素 bkb_kckc_k 乘积后从累加器中减去的无符号算术右移

返回值:

  • 输出向量 aˉ\bar{a} 的头空间

异常:

  • 如果acc_realacc_imagb_realb_imagc_realc_imag不是字对齐的,则引发ET_LOAD_STORE异常(参见 笔记:向量对齐

另请参阅:

  • vect_complex_s16_nmacc_prepare

参考性能:

vect_complex_s16_nmacc


headroom_t vect_complex_s16_conj_macc()

逐元素将一个复数16位向量与另一个复数的共轭相乘,并将结果加到累加器中。

acc_real[]acc_imag[]共同表示复数16位累加器尾数向量 aˉ\bar{a}。每个 Re{ak}Re\{a_k\}acc_real[k],每个 Im{ak}Im\{a_k\}acc_imag[k]

b_real[]b_imag[]共同表示复数16位输入尾数向量 bˉ\bar{b}。每个 Re{bk}Re\{b_k\}b_real[k],每个 Im{bk}Im\{b_k\}b_imag[k]

c_real[]c_imag[]共同表示复数16位输入尾数向量 cˉ\bar{c}。每个 Re{ck}Re\{c_k\}c_real[k],每个 Im{ck}Im\{c_k\}c_imag[k]

每个输入向量必须从字对齐的地址开始。

length 是向量中的元素数量。

acc_shr 是应用于累加器 aka_k 的有符号算术右移。

bc_sat 是应用于 bkb_kckc_k^* 的乘积后加到累加器中的无符号算术右移。

操作:

vkRe{bk}Re{ck}+Im{bk}Im{ck}skIm{bk}Re{ck}Re{bk}Im{ck}a^ksat16(ak2acc_shr)Re{ak}sat16(Re{a^k}+round(sat16(vk2bc_sat)))Im{ak}sat16(Im{a^k}+round(sat16(sk2bc_sat))) 其中 k0 ... (length1)\begin{align*} & v_k \leftarrow Re\{b_k\} \cdot Re\{c_k\} + Im\{b_k\} \cdot Im\{c_k\} \\ & s_k \leftarrow Im\{b_k\} \cdot Re\{c_k\} - Re\{b_k\} \cdot Im\{c_k\} \\ & \hat{a}_k \leftarrow sat_{16}( a_k \cdot 2^{-acc\_shr} ) \\ & Re\{a_k\} \leftarrow sat_{16}( Re\{\hat{a}_k\} + round( sat_{16}( v_k \cdot 2^{-bc\_sat} ) ) ) \\ & Im\{a_k\} \leftarrow sat_{16}( Im\{\hat{a}_k\} + round( sat_{16}( s_k \cdot 2^{-bc\_sat} ) ) ) \\ & \qquad\text{ 其中 }k\in 0\ ...\ (length-1) \end{align*}

块浮点数:

如果输入 bˉ\bar{b}cˉ\bar{c} 是BFP向量 bˉ2b_exp\bar{b} \cdot 2^{b\_exp}cˉ2c_exp\bar{c} \cdot 2^{c\_exp} 的尾数,并且输入 aˉ\bar{a} 是累加器BFP向量 aˉ2a_exp\bar{a} \cdot 2^{a\_exp},那么 aˉ\bar{a} 的输出值具有指数 2a_exp+acc_shr2^{a\_exp + acc\_shr}

为了使累加在数学上有意义,必须选择 bc_satbc\_sat ,使得 a_exp+acc_shr=b_exp+c_exp+bc_sata\_exp + acc\_shr = b\_exp + c\_exp + bc\_sat

可以使用函数 vect_complex_s16_macc_prepare() 根据输入指数 a_expa\_expb_expb\_expc_expc\_exp 以及输入头空间 a_hra\_hrb_hrb\_hrc_hrc\_hr 来获取 a_expa\_expacc_shracc\_shrbc_satbc\_sat 的值。

参数:

  • int16_t acc_real[] – [inout] 复数累加器 aˉ\bar{a} 的实部
  • int16_t acc_imag[] – [inout] 复数累加器 aˉ\bar{a} 的虚部
  • const int16_t b_real[] – [in] 复数输入向量 bˉ\bar{b} 的实部
  • const int16_t b_imag[] – [in] 复数输入向量 bˉ\bar{b} 的虚部
  • const int16_t c_real[] – [in] 复数输入向量 cˉ\bar{c} 的实部
  • const int16_t c_imag[] – [in] 复数输入向量 cˉ\bar{c} 的虚部
  • const unsigned length – [in] 向量 aˉ\bar{a}bˉ\bar{b}cˉ\bar{c} 中的元素数量
  • const right_shift_t acc_shr – [in] 应用于累加器元素的有符号算术右移
  • const right_shift_t bc_sat – [in] 应用于元素 bkb_kckc_k^* 的乘积后加到累加器中的无符号算术右移

返回值:

  • 输出向量 aˉ\bar{a} 的头空间

异常:

  • ET_LOAD_STORE 如果 acc_realacc_imagb_realb_imagc_realc_imag 不是字对齐的(参见 笔记:向量对齐

参见:

  • vect_complex_s16_conj_macc_prepare

参考性能:

vect_complex_s16_conj_macc


headroom_t vect_complex_s16_conj_nmacc()

逐元素将一个复数16位向量乘以另一个复数的共轭,并从累加器中减去结果。

acc_real[]acc_imag[] 分别表示复数16位累加器的实部向量 aˉ\bar{a}。每个 Re{ak}Re\{a_k\} 对应 acc_real[k],每个 Im{ak}Im\{a_k\} 对应 acc_imag[k]

b_real[]b_imag[] 分别表示复数16位输入的实部向量 bˉ\bar{b}。每个 Re{bk}Re\{b_k\} 对应 b_real[k],每个 Im{bk}Im\{b_k\} 对应 b_imag[k]

c_real[]c_imag[] 分别表示复数16位输入的实部向量 cˉ\bar{c}。每个 Re{ck}Re\{c_k\} 对应 c_real[k],每个 Im{ck}Im\{c_k\} 对应 c_imag[k]

输入向量的每个元素必须从字对齐的地址开始。

length 是向量中的元素数量。

acc_shr 是应用于累加器 aka_k 的有符号算术右移量。

bc_sat 是应用于 bkb_kckc_k^* 的乘积后从累加器中减去之前的无符号算术右移量。

操作:

vkRe{bk}Re{ck}+Im{bk}Im{ck}skIm{bk}Re{ck}Re{bk}Im{ck}a^ksat16(ak2acc_shr)Re{ak}sat16(Re{a^k}round(sat16(vk2bc_sat)))Im{ak}sat16(Im{a^k}round(sat16(sk2bc_sat))) 其中 k0 ... (length1)\begin{split}\begin{align*} & v_k \leftarrow Re\{b_k\} \cdot Re\{c_k\} + Im\{b_k\} \cdot Im\{c_k\} \\ & s_k \leftarrow Im\{b_k\} \cdot Re\{c_k\} - Re\{b_k\} \cdot Im\{c_k\} \\ & \hat{a}_k \leftarrow sat_{16}( a_k \cdot 2^{-acc\_shr} ) \\ & Re\{a_k\} \leftarrow sat_{16}( Re\{\hat{a}_k\} - round( sat_{16}( v_k \cdot 2^{-bc\_sat} ) ) ) \\ & Im\{a_k\} \leftarrow sat_{16}( Im\{\hat{a}_k\} - round( sat_{16}( s_k \cdot 2^{-bc\_sat} ) ) ) \\ & \qquad\text{ 其中 }k\in 0\ ...\ (length-1) && \end{align*}\end{split}

块浮点数:

如果输入 bˉ\bar{b}cˉ\bar{c} 是 BFP 向量 bˉ2b_exp\bar{b} \cdot 2^{b\_exp}cˉ2c_exp\bar{c} \cdot 2^{c\_exp} 的尾数,并且输入 aˉ\bar{a} 是累加器 BFP 向量 aˉ2a_exp\bar{a} \cdot 2^{a\_exp},则输出向量 aˉ\bar{a} 的指数为 2a_exp+acc_shr2^{a\_exp + acc\_shr}

为了使数学上的累加有意义,必须选择 bc_satbc\_sat,使得 a_exp+acc_shr=b_exp+c_exp+bc_sata\_exp + acc\_shr = b\_exp + c\_exp + bc\_sat

函数 vect_complex_s16_macc_prepare() 可以根据输入的指数 a_expa\_expb_expb\_expc_expc\_exp 以及输入的头空间 a_hra\_hrb_hrb\_hrc_hrc\_hr 来获取 a_expa\_expacc_shracc\_shrbc_satbc\_sat 的值。

参数:

  • int16_t acc_real[] – [inout] 复数累加器的实部 aˉ\bar{a}
  • int16_t acc_imag[] – [inout] 复数累加器的虚部 aˉ\bar{a}
  • const int16_t b_real[] – [in] 复数输入向量的实部 bˉ\bar{b}
  • const int16_t b_imag[] – [in] 复数输入向量的虚部 bˉ\bar{b}
  • const int16_t c_real[] – [in] 复数输入向量的实部 cˉ\bar{c}
  • const int16_t c_imag[] – [in] 复数输入向量的虚部 cˉ\bar{c}
  • const unsigned length – [in] 向量 aˉ\bar{a}bˉ\bar{b}cˉ\bar{c} 中的元素数量
  • const right_shift_t acc_shr – [in] 应用于累加器元素的有符号算术右移量
  • const right_shift_t bc_sat – [in] 应用于 bkb_kckc_k^* 的乘积从累加器中减去之前的无符号算术右移量

返回值: 输出向量 aˉ\bar{a} 的头空间。

异常: 如果 acc_realacc_imagb_realb_imagc_realc_imag 不是字对齐的,则引发 ET_LOAD_STORE 异常(参见 笔记:向量对齐

参考性能:

vect_complex_s16_conj_nmacc


headroom_t vect_complex_s16_mul()

逐元素将一个复数16位向量乘以另一个复数16位向量。

a_real[]a_imag[] 分别表示复数16位输出的实部向量 aˉ\bar{a}。每个 Re{ak}Re\{a_k\} 对应 a_real[k],每个 Im{ak}Im\{a_k\} 对应 a_imag[k]

b_real[]b_imag[] 分别表示复数16位输入的实部向量 bˉ\bar{b}。每个 Re{bk}Re\{b_k\} 对应 b_real[k],每个 Im{bk}Im\{b_k\} 对应 b_imag[k]

c_real[]c_imag[] 分别表示复数16位输入的实部向量 cˉ\bar{c}。每个 Re{ck}Re\{c_k\} 对应 c_real[k],每个 Im{ck}Im\{c_k\} 对应 c_imag[k]

输入向量的每个元素必须从字对齐的地址开始。该操作可以在输入的 b_real[]b_imag[]c_real[]c_imag[] 上安全地原地执行。

length 是向量中的元素数量。

a_shr 是应用于保存中间结果的32位累加器的无符号算术右移量。

操作:

vk=Re{bk}Re{ck}Im{bk}Im{ck}sk=Im{bk}Re{ck}+Re{bk}Im{ck}Re{ak}round(sat16(vk2a_shr))Im{ak}round(sat16(sk2a_shr)) 其中 k0 ... (length1)\begin{split}\begin{align*} & v_k = \leftarrow Re\{b_k\} \cdot Re\{c_k\} - Im\{b_k\} \cdot Im\{c_k\} \\ & s_k = \leftarrow Im\{b_k\} \cdot Re\{c_k\} + Re\{b_k\} \cdot Im\{c_k\} \\ & Re\{a_k\} \leftarrow round( sat_{16}( v_k \cdot 2^{-a\_shr} ) ) \\ & Im\{a_k\} \leftarrow round( sat_{16}( s_k \cdot 2^{-a\_shr} ) ) \\ & \qquad\text{ 其中 }k\in 0\ ...\ (length-1) && \end{align*}\end{split}

块浮点数:

如果 bˉ\bar{b} 是复数16位向量 bˉ2b_exp\bar{b} \cdot 2^{b\_exp} 的尾数,cˉ\bar{c} 是复数16位向量 cˉ2c_exp\bar{c} \cdot 2^{c\_exp} 的尾数,aˉ\bar{a} 是复数16位向量 aˉ2a_exp\bar{a} \cdot 2^{a\_exp} 的尾数,则输出向量 aˉ\bar{a} 的指数为 2a_exp+a_shr2^{a\_exp + a\_shr}

函数 vect_complex_s16_mul_prepare() 可以根据输入的指数 b_expb\_expc_expc\_exp 以及输入的头空间 b_hrb\_hrc_hrc\_hr 来获取 a_expa\_expa_shra\_shr 的值。

参数:

  • int16_t a_real[] – [out] 复数输出向量的实部 aˉ\bar{a}
  • int16_t a_imag[] – [out] 复数输出向量的虚部 aˉ\bar{a}
  • const int16_t b_real[] – [in] 复数输入向量的实部 bˉ\bar{b}
  • const int16_t b_imag[] – [in] 复数输入向量的虚部 bˉ\bar{b}
  • const int16_t c_real[] – [in] 复数输入向量的实部 cˉ\bar{c}
  • const int16_t c_imag[] – [in] 复数输入向量的虚部 cˉ\bar{c}
  • const unsigned length – [in] 向量 aˉ\bar{a}bˉ\bar{b}cˉ\bar{c} 中的元素数量
  • const right_shift_t a_shr – [in] 应用于保存中间结果的32位累加器的右移量

返回值:

  • 输出向量 aˉ\bar{a} 的头空间。

异常:

  • 如果 a_reala_imagb_realb_imagc_realc_imag 不是字对齐的,则引发 ET_LOAD_STORE 异常(参见 笔记:向量对齐

参见:

  • vect_complex_s16_mul_prepare

参考性能:

vect_complex_s16_mul


headroom_t vect_complex_s16_real_mul()

逐元素将复数16位向量与实数16位向量相乘。

a_real[]a_imag[] 共同表示复数16位输出尾数向量 aˉ\bar{a}。其中 Re{ak}Re\{a_k\} 对应 a_real[k]Im{ak}Im\{a_k\} 对应 a_imag[k]

b_real[]b_imag[] 共同表示复数16位输入尾数向量 bˉ\bar{b}。其中 Re{bk}Re\{b_k\} 对应 b_real[k]Im{bk}Im\{b_k\} 对应 b_imag[k]

c_real[] 表示实数16位输入尾数向量 cˉ\bar{c}

每个输入向量必须从字对齐的地址开始。这个操作可以在 b_real[]b_imag[]c_real[] 上安全地原地执行。

length 是向量中的元素数量。

a_shr 是应用于保存倒数第二个结果的32位累加器的无符号算术右移。

该操作由以下方程描述:

vk=Re{bk}cksk=Im{bk}ckRe{ak}=round(sat16(vk2a_shr))Im{ak}=round(sat16(sk2a_shr))\begin{align*} v_k & = Re\{b_k\} \cdot c_k \\ s_k & = Im\{b_k\} \cdot c_k \\ Re\{a_k\} & = round( sat_{16}( v_k \cdot 2^{-a\_shr} ) ) \\ Im\{a_k\} & = round( sat_{16}( s_k \cdot 2^{-a\_shr} ) ) \\ \end{align*}

其中 kk 的取值范围为 0 ... (length1)0\ ...\ (length-1)

如果 bˉ\bar{b} 是复数16位BFP向量 bˉ2b_exp\bar{b} \cdot 2^{b\_exp} 的尾数,并且 cˉ\bar{c} 是浮点值 c2c_expc \cdot 2^{c\_exp} 的复数16位尾数,则结果向量 aˉ\bar{a} 是BFP向量 aˉ2a_exp\bar{a} \cdot 2^{a\_exp} 的尾数,其中 a_exp=b_exp+c_exp+a_shra\_exp = b\_exp + c\_exp + a\_shr

函数 vect_s16_real_mul_prepare() 可以根据输入的指数 b_expb\_expc_expc\_exp 以及输入的头空间 b_hrb\_hrc_hrc\_hr 来获取 a_expa\_expa_shra\_shr 的值。

参数:

  • int16_t a_real[] – [out] 复数输出向量 aˉ\bar{a} 的实部

  • int16_t a_imag[] – [out] 复数输出向量 aˉ\bar{a} 的虚部

  • const int16_t b_real[] – [in] 复数输入向量 bˉ\bar{b} 的实部

  • const int16_t b_imag[] – [in] 复数输入向量 bˉ\bar{b} 的虚部

  • const int16_t c_real[] – [in] 实数输入向量 cˉ\bar{c}

  • const unsigned length – [in] 向量 aˉ\bar{a}bˉ\bar{b}cˉ\bar{c} 中的元素数量

  • const right_shift_t a_shr – [in] 应用于32位中间结果的右移量

返回值:

  • 输出向量 aˉ\bar{a} 的头空间。

异常:

  • 如果 a_reala_imagb_realb_imagc_real 不是字对齐的,则引发 ET_LOAD_STORE 异常(参见 笔记:向量对齐

参考性能:

vect_complex_s16_real_mul


headroom_t vect_complex_s16_real_scale()

将复数16位向量乘以实数标量。

a_real[]a_imag[] 共同表示复数16位输出尾数向量 aˉ\bar{a}。其中 Re{ak}Re\{a_k\} 对应 a_real[k]Im{ak}Im\{a_k\} 对应 a_imag[k]

b_real[]b_imag[] 共同表示复数16位输入尾数向量 bˉ\bar{b}。其中 Re{bk}Re\{b_k\} 对应 b_real[k]Im{bk}Im\{b_k\} 对应 b_imag[k]

每个输入向量必须从字对齐的地址开始。这个操作可以在 b_real[]b_imag[] 上安全地原地执行。

c 是实数16位输入尾数 cc

length 是向量中的元素数量。

a_shr 是应用于保存倒数第二个结果的32位累加器的无符号算术右移。

该操作由以下方程描述:

vk=Re{bk}csk=Im{bk}cRe{ak}=round(sat16(vk2a_shr))Im{ak}=round(sat16(sk2a_shr))\begin{align*} v_k & = Re\{b_k\} \cdot c \\ s_k & = Im\{b_k\} \cdot c \\ Re\{a_k\} & = round( sat_{16}( v_k \cdot 2^{-a\_shr} ) ) \\ Im\{a_k\} & = round( sat_{16}( s_k \cdot 2^{-a\_shr} ) ) \\ \end{align*}

其中 kk 的取值范围为 0 ... (length1)0\ ...\ (length-1)

如果 bˉ\bar{b} 是复数16位BFP向量 bˉ2b_exp\bar{b} \cdot 2^{b\_exp} 的尾数,并且 cc 是浮点值 c2c_expc \cdot 2^{c\_exp} 的复数16位尾数,则结果向量 aˉ\bar{a} 是BFP向量 aˉ2a_exp\bar{a} \cdot 2^{a\_exp} 的尾数,其中 a_exp=b_exp+c_exp+a_shra\_exp = b\_exp + c\_exp + a\_shr

函数 vect_complex_s16_real_scale_prepare() 可以根据输入的指数 b_expb\_expc_expc\_exp 以及输入的头空间 b_hrb\_hrc_hrc\_hr 来获取 a_expa\_expa_shra\_shr 的值。

参数:

  • int16_t a_real[] – [out] 复数输出向量 aˉ\bar{a} 的实部

  • int16_t a_imag[] – [out] 复数输出向量 aˉ\bar{a} 的虚部

  • const int16_t b_real[] – [in] 复数输入向量 bˉ\bar{b} 的实部

  • const int16_t b_imag[] – [in] 复数输入向量 bˉ\bar{b} 的虚部

  • const int16_t c – [in] 实数输入尾数 cc

  • const unsigned length – [in] 向量 aˉ\bar{a}bˉ\bar{b} 中的元素数量

  • const right_shift_t a_shr – [in] 应用于32位中间结果的右移量

返回值:

  • 输出向量 aˉ\bar{a} 的头空间。

异常:

  • 如果 a_reala_imagb_realb_imagc 不是字对齐的,则引发 ET_LOAD_STORE 异常(参见 笔记:向量对齐

参考性能:

vect_complex_s16_real_scale


headroom_t vect_complex_s16_scale()

将复数16位向量乘以复数16位标量。

a_real[]a_imag[] 共同表示复数16位输出尾数向量 aˉ\bar{a}。其中 Re{ak}Re\{a_k\} 对应 a_real[k]Im{ak}Im\{a_k\} 对应 a_imag[k]

b_real[]b_imag[] 共同表示复数16位输入尾数向量 bˉ\bar{b}。其中 Re{bk}Re\{b_k\} 对应 b_real[k]Im{bk}Im\{b_k\} 对应 b_imag[k]

每个输入向量必须从字对齐的地址开始。这个操作可以在 b_real[]b_imag[] 上安全地原地执行。

c_realc_imag 是复数16位输入尾数 cc 的实部和虚部。

length 是向量中的元素数量。

a_shr 是应用于保存倒数第二个结果的32位累加器的无符号算术右移。

该操作由以下方程描述:

vk=Re{bk}Re{c}Im{bk}Im{c}sk=Im{bk}Re{c}+Re{bk}Im{c}Re{ak}=round(sat16(vk2a_shr))Im{ak}=round(sat16(sk2a_shr))\begin{align*} v_k & = Re\{b_k\} \cdot Re\{c\} - Im\{b_k\} \cdot Im\{c\} \\ s_k & = Im\{b_k\} \cdot Re\{c\} + Re\{b_k\} \cdot Im\{c\} \\ Re\{a_k\} & = round( sat_{16}( v_k \cdot 2^{-a\_shr} ) ) \\ Im\{a_k\} & = round( sat_{16}( s_k \cdot 2^{-a\_shr} ) ) \\ \end{align*}

其中 kk 的取值范围为 0 ... (length1)0\ ...\ (length-1)

如果 bˉ\bar{b} 是复数16位BFP向量 bˉ2b_exp\bar{b} \cdot 2^{b\_exp} 的尾数,并且 cc 是浮点值 c2c_expc \cdot 2^{c\_exp} 的复数16位尾数,则结果向量 aˉ\bar{a} 是BFP向量 aˉ2a_exp\bar{a} \cdot 2^{a\_exp} 的尾数,其中 a_exp=b_exp+c_exp+a_shra\_exp = b\_exp + c\_exp + a\_shr

函数 vect_complex_s16_scale_prepare() 可以根据输入的指数 b_expb\_expc_expc\_exp 以及输入的头空间 b_hrb\_hrc_hrc\_hr 来获取 a_expa\_expa_shra\_shr 的值。

参数:

  • int16_t a_real[] – [out] 复数输出向量 aˉ\bar{a} 的实部

  • int16_t a_imag[] – [out] 复数输出向量 aˉ\bar{a} 的虚部

  • const int16_t b_real[] – [in] 复数输入向量 bˉ\bar{b} 的实部

  • const int16_t b_imag[] – [in] 复数输入向量 bˉ\bar{b} 的虚部

  • const int16_t c_real – [in] 复数输入尾数 cc 的实部

  • const int16_t c_imag – [in] 复数输入尾数 cc 的虚部

  • const unsigned length – [in] 向量 aˉ\bar{a}bˉ\bar{b} 中的元素数量

  • const right_shift_t a_shr – [in] 应用于32位中间结果的右移量

返回值:

  • 输出向量 aˉ\bar{a} 的头空间。

异常:

  • 如果 a_reala_imagb_realb_imagc_realc_imag 不是字对齐的,则引发 ET_LOAD_STORE 异常(参见 笔记:向量对齐

参考性能:

vect_complex_s16_scale


void vect_complex_s16_set()

将复数16位向量的每个元素设置为指定的值。

a_real[]a_imag[] 共同表示复数16位输出尾数向量 aˉ\bar{a}。其中 Re{ak}Re\{a_k\}a_real[k]Im{ak}Im\{a_k\}a_imag[k]。每个向量必须从字对齐的地址开始。

b_realb_imag 是复数16位输入尾数 bb 的实部和虚部。每个 a_real[k] 将被设置为 b_real。每个 a_imag[k] 将被设置为 b_imag

lengtha_real[]a_imag[] 中的元素数量。

操作:

Re{ak}Re{b}Im{ak}Im{b} for k0 ... (length1)\begin{split}\begin{align*} Re\{a_k\} &\leftarrow Re\{b\} \\ Im\{a_k\} &\leftarrow Im\{b\} \\ & \text{ for }k\in 0\ ...\ (length-1) && \end{align*}\end{split}

块浮点数:

如果 bb 是浮点值 b2b_expb \cdot 2^{b\_exp} 的尾数,则输出向量 aˉ\bar{a} 是BFP向量 aˉ2a_exp\bar{a} \cdot 2^{a\_exp} 的尾数,其中 a_exp=b_expa\_exp = b\_exp

参数:

  • int16_t a_real[] – [out] 复数输出向量 aˉ\bar{a} 的实部
  • int16_t a_imag[] – [out] 复数输出向量 aˉ\bar{a} 的虚部
  • const int16_t b_real – [in] 复数输入标量 bb 的实部
  • const int16_t b_imag – [in] 复数输入标量 bb 的虚部
  • const unsigned length – [in] 向量 aˉ\bar{a}bˉ\bar{b} 中的元素数量

参考性能:

vect_complex_s16_set


headroom_t vect_complex_s16_shl()

将复数16位向量的每个元素左移指定的位数。

a_real[]a_imag[] 共同表示复数16位输出尾数向量 aˉ\bar{a}。其中 Re{ak}Re\{a_k\}a_real[k]Im{ak}Im\{a_k\}a_imag[k]

b_real[]b_imag[] 共同表示复数16位输入尾数向量 bˉ\bar{b}。其中 Re{bk}Re\{b_k\}b_real[k]Im{bk}Im\{b_k\}b_imag[k]

输入向量必须从字对齐的地址开始。此操作可以在输入 b_real[]b_imag[] 上安全地原地执行。

lengthaˉ\bar{a}bˉ\bar{b} 中的元素数量。

b_shl 是应用于 bˉ\bar{b} 的有符号算术左移。

操作:

Re{ak}sat16(Re{bk}2b_shl)Im{ak}sat16(Im{bk}2b_shl) for k0 ... (length1)\begin{split}\begin{align*} & Re\{a_k\} \leftarrow sat_{16}(\lfloor Re\{b_k\} \cdot 2^{b\_shl} \rfloor) \\ & Im\{a_k\} \leftarrow sat_{16}(\lfloor Im\{b_k\} \cdot 2^{b\_shl} \rfloor) \\ & \qquad\text{ for }k\in 0\ ...\ (length-1) && \end{align*}\end{split}

块浮点数:

如果 bˉ\bar{b} 是复数16位BFP向量 bˉ2b_exp\bar{b} \cdot 2^{b\_exp} 的尾数,则结果向量 aˉ\bar{a} 是复数16位BFP向量 aˉ2a_exp\bar{a} \cdot 2^{a\_exp} 的尾数,其中 aˉ=bˉ2b_shl\bar{a} = \bar{b} \cdot 2^{b\_shl}a_exp=b_expa\_exp = b\_exp

参数:

  • int16_t a_real[] – [out] 复数输出向量 aˉ\bar{a} 的实部
  • int16_t a_imag[] – [out] 复数输出向量 aˉ\bar{a} 的虚部
  • const int16_t b_real[] – [in] 复数输入向量 bˉ\bar{b} 的实部
  • const int16_t b_imag[] – [in] 复数输入向量 bˉ\bar{b} 的虚部
  • const unsigned length – [in] 向量 aˉ\bar{a}bˉ\bar{b} 中的元素数量
  • const left_shift_t b_shl – [in] 应用于 bˉ\bar{b} 的左移量

返回值:

  • headroom_t – 输出向量 aˉ\bar{a} 的头空间

参考性能:

vect_complex_s16_shl


headroom_t vect_complex_s16_shr()

将复合16位向量的每个元素向右移动指定的位数。

a_real[]a_imag[]一起表示复合16位输出尾数向量 aˉ\bar{a}。每个 Re{ak}Re\{a_k\}a_real[k],每个 Im{ak}Im\{a_k\}a_imag[k]

b_real[]b_imag[]一起表示复合16位输入尾数向量 bˉ\bar{b}。每个 Re{bk}Re\{b_k\}b_real[k],每个 Im{bk}Im\{b_k\}b_imag[k]

输入向量必须从字对齐的地址开始。该操作可以在输入 b_real[]b_imag[] 上安全地原地执行。

lengthaˉ\bar{a}bˉ\bar{b} 中的元素数量。

b_shr 是应用于 bˉ\bar{b} 的有符号算术右移位数。

操作:

Re{ak}sat16(Re{bk}2b_shr)Im{ak}sat16(Im{bk}2b_shr) 其中 k0 ... (length1)\begin{split}\begin{align*} & Re\{a_k\} \leftarrow sat_{16}(\lfloor Re\{b_k\} \cdot 2^{-b\_shr} \rfloor) \\ & Im\{a_k\} \leftarrow sat_{16}(\lfloor Im\{b_k\} \cdot 2^{-b\_shr} \rfloor) \\ & \qquad\text{ 其中 }k\in 0\ ...\ (length-1) && \end{align*}\end{split}

块浮点数:

如果 bˉ\bar{b} 是复合16位BFP向量 bˉ2b_exp\bar{b} \cdot 2^{b\_exp} 的尾数,则结果向量 aˉ\bar{a} 是复合16位BFP向量 aˉ2a_exp\bar{a} \cdot 2^{a\_exp} 的尾数,其中 aˉ=bˉ2b_shr\bar{a} = \bar{b} \cdot 2^{-b\_shr}a_exp=b_expa\_exp = b\_exp

参数:

  • int16_t a_real[] – [out] 复合输出向量 aˉ\bar{a} 的实部
  • int16_t a_imag[] – [out] 复合输出向量 aˉ\bar{a} 的虚部
  • const int16_t b_real[] – [in] 复合输入向量 bˉ\bar{b} 的实部
  • const int16_t b_imag[] – [in] 复合输入向量 bˉ\bar{b} 的虚部
  • const unsigned length – [in] 向量 aˉ\bar{a}bˉ\bar{b} 的元素数量
  • const right_shift_t b_shr – [in] 应用于 bˉ\bar{b} 的右移位数

返回值:

  • 输出向量 aˉ\bar{a} 的头空间

异常:

  • ET_LOAD_STORE 如果 a_reala_imagb_realb_imag 不是字对齐的,将引发该异常。

参考性能:

vect_complex_s16_shr


headroom_t vect_complex_s16_squared_mag()

获取复合16位向量元素的平方幅值。

a[] 表示实部16位输出尾数向量 aˉ\bar{a}

b_real[]b_imag[] 一起表示复合16位输入尾数向量 bˉ\bar{b}。每个 Re{bk}Re\{b_k\}b_real[k],每个 Im{bk}Im\{b_k\}b_imag[k]

输入向量必须从字对齐的地址开始。

length 是向量 aˉ\bar{a}bˉ\bar{b} 中的元素数量。

a_shr 是应用于保存倒数第二个结果的32位累加器的无符号算术右移位数。

操作:

ak((Re{bk})2+(Im{bk})2)2a_shr 其中 k0 ... (length1)\begin{split}\begin{align*} & a_k \leftarrow ((Re\{b_k'\})^2 + (Im\{b_k'\})^2)\cdot 2^{-a\_shr} \\ & \qquad\text{ 其中 }k\in 0\ ...\ (length-1) && \end{align*}\end{split}

块浮点数:

如果 bˉ\bar{b} 是复合16位BFP向量 bˉ2b_exp\bar{b} \cdot 2^{b\_exp} 的尾数,则结果向量 aˉ\bar{a} 是实部16位BFP向量 aˉ2a_exp\bar{a} \cdot 2^{a\_exp} 的尾数,其中 a_exp=2b_exp+a_shra\_exp = 2 \cdot b\_exp + a\_shr

函数 vect_complex_s16_squared_mag_prepare() 可以根据输入指数 b_expb\_exp 和头空间 b_hrb\_hr 获取 a_expa\_expa_shra\_shr 的值。

参数:

  • int16_t a[] – [out] 实部输出向量 aˉ\bar{a}
  • const int16_t b_real[] – [in] 复合输入向量 bˉ\bar{b} 的实部
  • const int16_t b_imag[] – [in] 复合输入向量 bˉ\bar{b} 的虚部
  • const unsigned length – [in] 向量 aˉ\bar{a}bˉ\bar{b} 中的元素数量
  • const right_shift_t a_shr – [in] 应用于32位中间结果的右移位数

异常:

  • ET_LOAD_STORE 如果 ab_realb_imag 不是字对齐的,将引发该异常。

参见:

  • vect_complex_s16_squared_mag_prepare

参考性能:

vect_complex_s16_squared_mag


headroom_t vect_s32_abs()

计算32位向量的逐元素绝对值。

a[]b[]分别表示32位向量aˉ\bar abˉ\bar b。每个向量必须从字对齐的地址开始。此操作可以安全地原地执行在b[]上。

length是向量中的元素数量。

操作:

aksat32(bk)对于k0 ... (length1)\begin{align*} & a_k \leftarrow sat_{32}(\left| b_k \right|) \\ & \qquad\text{对于}k\in 0\ ...\ (length-1) \end{align*}

块浮点数:

如果bˉ\bar b是BFP向量bˉ2b_exp{\bar{b} \cdot 2^{b\_exp}}的尾数,则输出向量aˉ\bar a是BFP向量aˉ2a_exp{\bar{a} \cdot 2^{a\_exp}}的尾数,其中a_exp=b_exp{a\_exp = b\_exp}

参数:

  • int32_t a[] – [out] 输出向量aˉ\bar a
  • const int32_t b[] – [in] 输入向量bˉ\bar b
  • const unsigned length – [in] 向量aˉ\bar abˉ\bar b中的元素数量

返回值: 输出向量aˉ\bar a的头空间。

异常: 如果ab不是字对齐的(参见 笔记:向量对齐),则引发ET_LOAD_STORE异常。

相关文档: vect_s32_abs_prepare

参考性能:

vect_s32_abs


headroom_t vect_complex_s16_sub()

从一个复数16位向量中减去另一个复数16位向量。

a_real[]a_imag[]一起表示复数16位输出尾数向量aˉ\bar a。每个Re{ak}Re\{a_k\}a_real[k],每个Im{ak}Im\{a_k\}a_imag[k]

b_real[]b_imag[]一起表示复数16位输入尾数向量bˉ\bar b。每个Re{bk}Re\{b_k\}b_real[k],每个Im{bk}Im\{b_k\}b_imag[k]

c_real[]c_imag[]一起表示复数16位输入尾数向量cˉ\bar c。每个Re{ck}Re\{c_k\}c_real[k],每个Im{ck}Im\{c_k\}c_imag[k]

输入向量的每个元素必须从字对齐的地址开始。此操作可以在输入b_real[]b_imag[]c_real[]c_imag[]上安全地原地执行。

length是向量中的元素数量。

b_shrc_shr是应用于bˉ\bar{b}cˉ\bar{c}的有符号算术右移。

操作:

bksat16(bk2b_shr)cksat16(ck2c_shr)Re{ak}Re{bk}Re{ck}Im{ak}Im{bk}Im{ck}对于k0 ... (length1)\begin{align*} & b_k' \leftarrow sat_{16}(\lfloor b_k \cdot 2^{-b\_shr} \rfloor) \\ & c_k' \leftarrow sat_{16}(\lfloor c_k \cdot 2^{-c\_shr} \rfloor) \\ & Re\{a_k\} \leftarrow Re\{b_k'\} - Re\{c_k'\} \\ & Im\{a_k\} \leftarrow Im\{b_k'\} - Im\{c_k'\} \\ & \qquad\text{对于}k\in 0\ ...\ (length-1) \end{align*}

块浮点数:

如果bˉ\bar{b}cˉ\bar{c}是BFP向量bˉ2b_exp\bar{b} \cdot 2^{b\_exp}cˉ2c_exp\bar{c} \cdot 2^{c\_exp}的复数16位尾数,则结果向量aˉ\bar{a}是BFP向量aˉ2a_exp\bar{a} \cdot 2^{a\_exp}的复数16位尾数。

在此情况下,必须选择b_shrb\_shrc_shrc\_shr,使得a_exp=b_exp+b_shr=c_exp+c_shra\_exp = b\_exp + b\_shr = c\_exp + c\_shr。只有当尾数关联到相同的指数时,才有加法或减法的意义。

函数vect_complex_s16_sub_prepare()可以根据输入指数b_expb\_expc_expc\_exp以及输入头空间b_hrb\_hrc_hrc\_hr来获取a_expa\_expb_shrb\_shrc_shrc\_shr的值。

参数:

  • int16_t a_real[] – [out] 复数输出向量aˉ\bar a的实部
  • int16_t a_imag[] – [out] 复数输出向量aˉ\bar a的虚部
  • const int16_t b_real[] – [in] 复数输入向量bˉ\bar b的实部
  • const int16_t b_imag[] – [in] 复数输入向量bˉ\bar b的虚部
  • const int16_t c_real[] – [in] 复数输入向量cˉ\bar c的实部
  • const int16_t c_imag[] – [in] 复数输入向量cˉ\bar c的虚部
  • const unsigned length – [in] 向量aˉ\bar abˉ\bar bcˉ\bar c中的元素数量
  • const right_shift_t b_shr – [in] 应用于bˉ\bar{b}的右移
  • const right_shift_t c_shr – [in] 应用于cˉ\bar{c}的右移

返回值:

  • 输出向量aˉ\bar a的头空间。

异常:

  • 如果a_reala_imagb_realb_imagc_realc_imag不是字对齐的,则引发ET_LOAD_STORE异常。 参见笔记:向量对齐

相关文档: vect_complex_s16_sub_prepare

参考性能:

vect_complex_s16_sub


complex_s32_t vect_complex_s16_sum()

获取复数16位向量的元素和。

b_real[]b_imag[]一起表示复数16位输入尾数向量bˉ\bar b,并且必须从字对齐的地址开始。每个Re{bk}Re\{b_k\}b_real[k],每个Im{bk}Im\{b_k\}b_imag[k]

length是向量bˉ\bar b中的元素数量。

操作:

Re{a}k=0length1(Re{bk})Im{a}k=0length1(Im{bk})\begin{align*} & Re\{a\} \leftarrow \sum_{k=0}^{length-1} \left( Re\{b_k\} \right) \\ & Im\{a\} \leftarrow \sum_{k=0}^{length-1} \left( Im\{b_k\} \right) \end{align*}

块浮点数:

如果bˉ\bar{b}是BFP向量bˉ2b_exp\bar{b} \cdot 2^{b\_exp}的尾数,则返回的值aa是浮点值a2a_expa \cdot 2^{a\_exp}的复数32位尾数,其中a_exp=b_expa\_exp = b\_exp

参数:

  • const int16_t b_real[] – [in] 复数输入向量bˉ\bar b的实部
  • const int16_t b_imag[] – [in] 复数输入向量bˉ\bar b的虚部
  • const unsigned length – [in] 向量bˉ\bar b中的元素数量

返回值:

  • aa,向量bˉ\bar b的32位复数和。

异常:

  • 如果b_realb_imag不是字对齐的,则引发ET_LOAD_STORE异常。 参见笔记:向量对齐

参考性能:

vect_complex_s16_sum


void vect_complex_s16_to_vect_complex_s32()

将复数16位向量转换为复数32位向量。

a[]表示复数32位输出向量aˉ\bar a。它必须从双字(8字节)对齐的地址开始。

b_real[]b_imag[]一起表示复数16位输入尾数向量bˉ\bar b。每个Re{bk}Re\{b_k\}b_real[k],每个Im{bk}Im\{b_k\}b_imag[k]

参数length是每个向量中的元素数量。

操作:

Re{ak}Re{bk}Im{ak}Im{bk}对于k0 ... (length1)\begin{align*} & Re\{a_k\} \leftarrow Re\{b_k\} \\ & Im\{a_k\} \leftarrow Im\{b_k\} \\ & \qquad\text{对于}k\in 0\ ...\ (length-1) \end{align*}

块浮点数:

如果bˉ\bar{b}是BFP向量bˉ2b_exp\bar{b} \cdot 2^{b\_exp}的复数16位尾数,则结果向量aˉ\bar{a}是BFP向量aˉ2a_exp\bar{a} \cdot 2^{a\_exp}的复数32位尾数,其中a_exp=b_expa\_exp = b\_exp

注意事项:

  • 此函数不返回输出向量aˉ\bar a的头空间。输出的头空间始终比输入的头空间大16位。

参数:

  • complex_s32_t a[] – [out] 复数输出向量aˉ\bar a
  • const int16_t b_real[] – [in] 复数输入向量bˉ\bar b的实部。
  • const int16_t b_imag[] – [in] 复数输入向量bˉ\bar b的虚部。
  • const unsigned length – [in] 向量aˉ\bar abˉ\bar b中的元素数量。

异常:

参考性能:

vect_complex_s16_to_vect_complex_s32