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

Complex 32-bit Vector API

headroom_t vect_complex_s32_add()

将一个复数32位向量与另一个相加。

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

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

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

操作:

bksat32(bk2b_shr)cksat32(ck2c_shr)Re{ak}Re{bk}+Re{ck}Im{ak}Im{bk}+Im{ck}其中 k0 ... (length1)\begin{align*} &b_k' \leftarrow sat_{32}(\lfloor b_k \cdot 2^{-b\_shr} \rfloor) \\ &c_k' \leftarrow sat_{32}(\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'\} \\ &\text{其中 }k\in 0\ ...\ (length-1) \end{align*}

块浮点数:

如果 bˉ\bar{b}cˉ\bar{c} 是复数32位BFP向量 bˉ2b_exp\bar{b} \cdot 2^{b\_exp}cˉ2c_exp\bar{c} \cdot 2^{c\_exp} 的尾数,则结果向量 aˉ\bar{a} 是复数32位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_s32_add_prepare()可以根据输入指数 b_expb\_expc_expc\_exp 以及输入头空间 b_hrb\_hrc_hrc\_hr 来获取 a_expa\_expb_shrb\_shrc_shrc\_shr 的值。

参数:

  • complex_s32_t a[] – [out] 复数输出向量 aˉ\bar{a}

  • const complex_s32_t b[] – [in] 复数输入向量 bˉ\bar{b}

  • const complex_s32_t c[] – [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} 的头空间。

异常:

另请参阅:

  • vect_complex_s32_add_prepare

参考性能:

vect_complex_s32_add


headroom_t vect_complex_s32_add_scalar()

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

该操作将复数标量加到复数32位向量的每个元素上。该操作可以在输入向量上安全地原地执行。

操作:

bksat32(bk2b_shr)Re{ak}Re{bk}+Re{c}Im{ak}Im{bk}+Im{c} 其中 k0 ... (length1)\begin{align*} & b_k' \leftarrow sat_{32}(\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*}

参数:

  • complex_s32_t a[] – [out] 复数输出向量 aˉ\bar{a}

  • const complex_s32_t b[] – [in] 复数输入向量 bˉ\bar{b}

  • const complex_s32_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_s32_add_scalar_prepare

参考性能:

vect_complex_s32_add_scalar


headroom_t vect_complex_s32_conj_mul()

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

该操作对一个复数32位向量与另一个复数的共轭进行逐元素相乘。该操作可以在输入向量上安全地原地执行。

操作:

bksat32(bk2b_shr)cksat32(ck2c_shr)Re{ak}(Re{bk}Re{ck}+Im{bk}Im{ck})230Im{ak}(Im{bk}Re{ck}Re{bk}Im{ck})230 其中 k0 ... (length1)\begin{align*} & b_k' \leftarrow sat_{32}(\lfloor b_k \cdot 2^{-b\_shr} \rfloor) \\ & c_k' \leftarrow sat_{32}(\lfloor c_k \cdot 2^{-c\_shr} \rfloor) \\ & Re\{a_k\} \leftarrow \left( Re\{b_k'\} \cdot Re\{c_k'\} + Im\{b_k'\} \cdot Im\{c_k'\} \right) \cdot 2^{-30} \\ & Im\{a_k\} \leftarrow \left( Im\{b_k'\} \cdot Re\{c_k'\} - Re\{b_k'\} \cdot Im\{c_k'\} \right) \cdot 2^{-30} \\ & \qquad\text{ 其中 }k\in 0\ ...\ (length-1) \end{align*}

参数:

  • complex_s32_t a[] – [out] 复数输出向量 aˉ\bar{a}

  • const complex_s32_t b[] – [in] 复数输入向量 bˉ\bar{b}

  • const complex_s32_t c[] – [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} 的头空间。

异常:

另请参阅:

  • vect_complex_s32_conj_mul_prepare

参考性能:

vect_complex_s32_conj_mul


headroom_t vect_complex_s32_add_scalar()

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

该操作将复数标量加到复数32位向量的每个元素上。该操作可以在输入向量上安全地原地执行。

操作:

bksat32(bk2b_shr)Re{ak}Re{bk}+Re{c}Im{ak}Im{bk}+Im{c} 其中 k0 ... (length1)\begin{align*} & b_k' \leftarrow sat_{32}(\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*}

参数:

  • complex_s32_t a[] – [out] 复数输出向量 aˉ\bar{a}

  • const complex_s32_t b[] – [in] 复数输入向量 bˉ\bar{b}

  • const complex_s32_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_s32_add_scalar_prepare

参考性能:

vect_complex_s32_add_scalar


headroom_t vect_complex_s32_conj_mul()

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

该操作对一个复数32位向量与另一个复数的共轭进行逐元素相乘。该操作可以在输入向量上安全地原地执行。

操作:

bksat32(bk2b_shr)cksat32(ck2c_shr)Re{ak}(Re{bk}Re{ck}+Im{bk}Im{ck})230Im{ak}(Im{bk}Re{ck}Re{bk}Im{ck})230 其中 k0 ... (length1)\begin{align*} & b_k' \leftarrow sat_{32}(\lfloor b_k \cdot 2^{-b\_shr} \rfloor) \\ & c_k' \leftarrow sat_{32}(\lfloor c_k \cdot 2^{-c\_shr} \rfloor) \\ & Re\{a_k\} \leftarrow \left( Re\{b_k'\} \cdot Re\{c_k'\} + Im\{b_k'\} \cdot Im\{c_k'\} \right) \cdot 2^{-30} \\ & Im\{a_k\} \leftarrow \left( Im\{b_k'\} \cdot Re\{c_k'\} - Re\{b_k'\} \cdot Im\{c_k'\} \right) \cdot 2^{-30} \\ & \qquad\text{ 其中 }k\in 0\ ...\ (length-1) \end{align*}

参数:

  • complex_s32_t a[] – [out] 复数输出向量 aˉ\bar{a}

  • const complex_s32_t b[] – [in] 复数输入向量 bˉ\bar{b}

  • const complex_s32_t c[] – [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} 的头空间。

异常:

另请参阅:

  • vect_complex_s32_conj_mul_prepare

参考性能:

vect_complex_s32_conj_mul


headroom_t vect_complex_s32_headroom()

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

N位整数的头空间是整数的值可以左移的位数,而不会丢失任何信息。等效地说,它比前导符号位的数量少1。

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

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

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

x[]表示复数32位向量xˉ\bar{x}x[]必须从字对齐的地址开始。

lengthx[]中的元素数量。

操作定义为:

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

参数:

  • const complex_s32_t x[] – [in] 复数输入向量xˉ\bar{x}

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

返回值:

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

异常:

另请参阅:

  • vect_s16_headroom,
  • vect_s32_headroom,
  • vect_complex_s16_headroom

参考性能:

vect_complex_s32_headroom


headroom_t vect_complex_s32_macc()

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

acc[]表示复数32位累加器尾数向量aˉ\bar{a}。每个aka_k都是acc[k]

b[]c[]表示复数32位输入尾数向量bˉ\bar{b}cˉ\bar{c},其中每个bkb_k都是b[k],每个ckc_k都是c[k]

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

length是向量中的元素数量。

acc_shrb_shrc_shr是应用于输入元素aka_kbkb_kckc_k的有符号算术右移。

操作定义为:

b~ksat32(bk2b_shr)c~ksat32(ck2c_shr)a~ksat32(ak2acc_shr)vkround(sat32((Re{b~k}Re{c~k}Im{b~k}Im{c~k})230))skround(sat32((Im{b~k}Re{c~k}+Re{b~k}Im{c~k})230))Re{ak}sat32(Re{a~k}+vk)Im{ak}sat32(Im{a~k}+sk) for k0 ... (length1)\begin{split}\begin{align*} & \tilde{b}_k \leftarrow sat_{32}( b_k \cdot 2^{-b\_shr} ) \\ & \tilde{c}_k \leftarrow sat_{32}( c_k \cdot 2^{-c\_shr} ) \\ & \tilde{a}_k \leftarrow sat_{32}( a_k \cdot 2^{-acc\_shr} ) \\ & v_k \leftarrow round( sat_{32}( ( Re\{\tilde{b}_k\} \cdot Re\{\tilde{c}_k\} - Im\{\tilde{b}_k\} \cdot Im\{\tilde{c}_k\} ) \cdot 2^{-30}) ) \\ & s_k \leftarrow round( sat_{32}( ( Im\{\tilde{b}_k\} \cdot Re\{\tilde{c}_k\} + Re\{\tilde{b}_k\} \cdot Im\{\tilde{c}_k\} ) \cdot 2^{-30}) ) \\ & Re\{a_k\} \leftarrow sat_{32}( Re\{\tilde{a}_k\} + v_k ) \\ & Im\{a_k\} \leftarrow sat_{32}( Im\{\tilde{a}_k\} + s_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}的尾数,并且输入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+b_shr+c_shra\_exp + acc\_shr = b\_exp + c\_exp + b\_shr + c\_shr

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

参数:

  • complex_s32_t acc[] – [inout] 复数累加器aˉ\bar{a}

  • const complex_s32_t b[] – [in] 复数输入向量bˉ\bar{b}

  • const complex_s32_t c[] – [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 b_shr – [in] 应用于bˉ\bar{b}元素的有符号算术右移。

  • const right_shift_t c_shr – [in] 应用于cˉ\bar{c}元素的有符号算术右移。

返回值:

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

异常:

另请参阅:

  • vect_complex_s32_macc_prepare

参考性能:

vect_complex_s32_macc


headroom_t vect_complex_s32_nmacc()

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

acc[]表示复数32位累加器的尾数向量 aˉ\bar{a}。每个元素 aka_kacc[k]

b[]c[]表示复数32位输入尾数向量 bˉ\bar{b}cˉ\bar{c},其中每个 bkb_kb[k],每个 ckc_kc[k]

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

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

acc_shrb_shrc_shr是应用于输入元素 aka_kbkb_kckc_k 的有符号算术右移。

此函数执行的操作可以表示如下:

b~ksat32(bk2b_shr)c~ksat32(ck2c_shr)a~ksat32(ak2acc_shr)vkround(sat32((Re{b~k}Re{c~k}Im{b~k}Im{c~k})230))skround(sat32((Im{b~k}Re{c~k}+Re{b~k}Im{c~k})230))Re{ak}sat32(Re{a~k}vk)Im{ak}sat32(Im{a~k}sk) for k0 ... (length1)\begin{align*} & \tilde{b}_k \leftarrow sat_{32}( b_k \cdot 2^{-b\_shr} ) \\ & \tilde{c}_k \leftarrow sat_{32}( c_k \cdot 2^{-c\_shr} ) \\ & \tilde{a}_k \leftarrow sat_{32}( a_k \cdot 2^{-acc\_shr} ) \\ & v_k \leftarrow round( sat_{32}( ( Re\{\tilde{b}_k\} \cdot Re\{\tilde{c}_k\} - Im\{\tilde{b}_k\} \cdot Im\{\tilde{c}_k\} ) \cdot 2^{-30}) ) \\ & s_k \leftarrow round( sat_{32}( ( Im\{\tilde{b}_k\} \cdot Re\{\tilde{c}_k\} + Re\{\tilde{b}_k\} \cdot Im\{\tilde{c}_k\} ) \cdot 2^{-30}) ) \\ & Re\{a_k\} \leftarrow sat_{32}( Re\{\tilde{a}_k\} - v_k ) \\ & Im\{a_k\} \leftarrow sat_{32}( Im\{\tilde{a}_k\} - s_k ) \\ & \qquad\text{ for }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+b_shr+c_shra\_exp + acc\_shr = b\_exp + c\_exp + b\_shr + c\_shr

函数vect_complex_s32_macc_prepare()可以根据输入指数 a_expa\_expb_expb\_expc_expc\_exp 和输入头空间 a_hra\_hrb_hrb\_hrc_hrc\_hr 来获取 a_expa\_expacc_shracc\_shrb_shrb\_shrc_shrc\_shr 的值。

参数:

  • complex_s32_t acc[] – [inout] 复数累加器 aˉ\bar{a}

  • const complex_s32_t b[] – [in] 复数输入向量 bˉ\bar{b}

  • const complex_s32_t c[] – [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 b_shr – [in] 应用于 bˉ\bar{b} 的元素的有符号算术右移

  • const right_shift_t c_shr – [in] 应用于 cˉ\bar{c} 的元素的有符号算术右移

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

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

另请参阅: vect_complex_s32_nmacc_prepare

参考性能:

vect_complex_s32_nmacc


headroom_t vect_complex_s32_conj_macc()

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

acc[] 表示复数32位累加器尾数向量 aˉ\bar{a}。每个 aka_kacc[k]

b[]c[] 表示复数32位输入尾数向量 bˉ\bar{b}cˉ\bar{c},其中每个 bkb_kb[k],每个 ckc_kc[k]

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

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

acc_shrb_shrc_shr 是应用于输入元素 aka_kbkb_kckc_k 的有符号算术右移。

操作:

b~ksat32(bk2b_shr)c~ksat32(ck2c_shr)a~ksat32(ak2acc_shr)vkround(sat32((Re{b~k}Re{c~k}+Im{b~k}Im{c~k})230))skround(sat32((Im{b~k}Re{c~k}Re{b~k}Im{c~k})230))Re{ak}sat32(Re{a~k}+vk)Im{ak}sat32(Im{a~k}+sk)其中k0 ... (length1)\begin{align*} & \tilde{b}_k \leftarrow sat_{32}( b_k \cdot 2^{-b\_shr} ) \\ & \tilde{c}_k \leftarrow sat_{32}( c_k \cdot 2^{-c\_shr} ) \\ & \tilde{a}_k \leftarrow sat_{32}( a_k \cdot 2^{-acc\_shr} ) \\ & v_k \leftarrow round( sat_{32}( ( Re\{\tilde{b}_k\} \cdot Re\{\tilde{c}_k\} + Im\{\tilde{b}_k\} \cdot Im\{\tilde{c}_k\} ) \cdot 2^{-30}) ) \\ & s_k \leftarrow round( sat_{32}( ( Im\{\tilde{b}_k\} \cdot Re\{\tilde{c}_k\} - Re\{\tilde{b}_k\} \cdot Im\{\tilde{c}_k\} ) \cdot 2^{-30}) ) \\ & Re\{a_k\} \leftarrow sat_{32}( Re\{\tilde{a}_k\} + v_k ) \\ & Im\{a_k\} \leftarrow sat_{32}( Im\{\tilde{a}_k\} + s_k ) \\ & \qquad\text{其中} \quad 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+b_shr+c_shra\_exp + acc\_shr = b\_exp + c\_exp + b\_shr + c\_shr

可以使用函数 vect_complex_s32_conj_macc_prepare() 基于输入的指数 a_expa\_expb_expb\_expc_expc\_exp,以及输入的头空间 a_hra\_hrb_hrb\_hrc_hrc\_hr 来获取 a_expa\_expacc_shracc\_shrb_shrb\_shrc_shrc\_shr 的值。

参数:

  • complex_s32_t acc[] – [inout] 复数累加器向量 aˉ\bar{a}
  • const complex_s32_t b[] – [in] 复数输入向量 bˉ\bar{b}
  • const complex_s32_t c[] – [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 b_shr – [in] 应用于 bˉ\bar{b} 元素的有符号算术右移
  • const right_shift_t c_shr – [in] 应用于 cˉ\bar{c} 元素的有符号算术右移

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

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

参见: vect_complex_s32_conj_macc_prepare

参考性能:

vect_complex_s32_conj_macc


headroom_t vect_complex_s32_conj_nmacc()

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

acc[] 表示复数32位累加器尾数向量 aˉ\bar{a}。每个 aka_kacc[k]

b[]c[] 表示复数32位输入尾数向量 bˉ\bar{b}cˉ\bar{c},其中每个 bkb_kb[k],每个 ckc_kc[k]

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

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

acc_shrb_shrc_shr 是应用于输入元素 aka_kbkb_kckc_k 的有符号算术右移。

操作:

b~ksat32(bk2b_shr)c~ksat32(ck2c_shr)a~ksat32(ak2acc_shr)vkround(sat32((Re{b~k}Re{c~k}+Im{b~k}Im{c~k})230))skround(sat32((Im{b~k}Re{c~k}Re{b~k}Im{c~k})230))Re{ak}sat32(Re{a~k}vk)Im{ak}sat32(Im{a~k}sk)其中k0 ... (length1)\begin{align*} & \tilde{b}_k \leftarrow sat_{32}( b_k \cdot 2^{-b\_shr} ) \\ & \tilde{c}_k \leftarrow sat_{32}( c_k \cdot 2^{-c\_shr} ) \\ & \tilde{a}_k \leftarrow sat_{32}( a_k \cdot 2^{-acc\_shr} ) \\ & v_k \leftarrow round( sat_{32}( ( Re\{\tilde{b}_k\} \cdot Re\{\tilde{c}_k\} + Im\{\tilde{b}_k\} \cdot Im\{\tilde{c}_k\} ) \cdot 2^{-30}) ) \\ & s_k \leftarrow round( sat_{32}( ( Im\{\tilde{b}_k\} \cdot Re\{\tilde{c}_k\} - Re\{\tilde{b}_k\} \cdot Im\{\tilde{c}_k\} ) \cdot 2^{-30}) ) \\ & Re\{a_k\} \leftarrow sat_{32}( Re\{\tilde{a}_k\} - v_k ) \\ & Im\{a_k\} \leftarrow sat_{32}( Im\{\tilde{a}_k\} - s_k ) \\ & \qquad\text{其中} \quad 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+b_shr+c_shra\_exp + acc\_shr = b\_exp + c\_exp + b\_shr + c\_shr

可以使用函数 vect_complex_s32_conj_nmacc_prepare() 基于输入的指数 a_expa\_expb_expb\_expc_expc\_exp,以及输入的头空间 a_hra\_hrb_hrb\_hrc_hrc\_hr 来获取 a_expa\_expacc_shracc\_shrb_shrb\_shrc_shrc\_shr 的值。

参数:

  • complex_s32_t acc[] – [inout] 复数累加器向量 aˉ\bar{a}
  • const complex_s32_t b[] – [in] 复数输入向量 bˉ\bar{b}
  • const complex_s32_t c[] – [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 b_shr – [in] 应用于 bˉ\bar{b} 元素的有符号算术右移
  • const right_shift_t c_shr – [in] 应用于 cˉ\bar{c} 元素的有符号算术右移

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

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

参见: vect_complex_s32_conj_nmacc_prepare

参考性能:

vect_complex_s32_conj_nmacc


headroom_t vect_s32_abs()

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

  • a[]b[] 分别表示32位向量 aˉ\bar{a}bˉ\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_expa\_exp = b\_exp

参数:

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

返回值:

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

异常:

相关:

  • vect_s32_abs_prepare

参考性能:

vect_s32_abs


headroom_t vect_complex_s32_mag()

计算复数32位向量的每个元素的幅值。

  • a[] 表示实部32位输出尾数向量 aˉ\bar{a}
  • b[] 表示复数32位输入尾数向量 bˉ\bar{b}
  • a[]b[] 必须从字对齐的地址开始。
  • length 是向量中的元素数量。
  • b_shr 是应用于 bˉ\bar{b} 的有符号算术右移量。
  • rot_table 必须指向一个预先计算的复数向量表,用于计算幅值。table_rows 是表中的行数。

该库附带了所需旋转表的默认版本。可以使用以下符号在用户代码中引用它:

const extern unsigned rot_table32_rows;
const extern complex_s32_t rot_table32[30][4];

通过生成较小版本的表格,可以实现更快的计算(精度降低)。提供了一个Python脚本来生成这个表格。

此函数执行的操作如下:

vkbk2b_shrak(Revk)2+(Imvk)2其中 k0 ... (length1)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 } \\ \qquad\text{其中 } k \in 0\ ...\ (length-1)

参数:

  • int32_t a[] – [out] 实部输出向量 aˉ\bar{a}
  • const complex_s32_t b[] – [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 complex_s32_t* rot_table – [in] 用于计算幅值的预计算旋转表
  • const unsigned table_rows – [in] rot_table 中的行数

返回值:

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

异常:

  • ET_LOAD_STORE 如果 ab 不是字对齐的

相关:

  • vect_complex_s32_mag_prepare

参考性能:

vect_complex_s32_mag


headroom_t vect_complex_s32_mul()

逐元素将一个复数32位向量与另一个复数32位向量相乘。

  • a[]b[]c[] 分别表示32位尾数向量 aˉ\bar{a}bˉ\bar{b}cˉ\bar{c}。每个向量必须从字对齐的地址开始。此操作可以在 b[]c[] 上安全地原地执行。
  • length 是向量中的元素数量。
  • b_shrc_shr 是应用于 bˉ\bar{b}cˉ\bar{c} 的有符号算术右移量。

操作:

bksat32(bk2b_shr)cksat32(ck2c_shr)Re{ak}(Re{bk}Re{ck}Im{bk}Im{ck})230Im{ak}(Im{bk}Re{ck}+Re{bk}Im{ck})230其中 k0 ... (length1)\begin{align*} & b_k' \leftarrow sat_{32}(\lfloor b_k \cdot 2^{-b\_shr} \rfloor) \\ & c_k' \leftarrow sat_{32}(\lfloor c_k \cdot 2^{-c\_shr} \rfloor) \\ & Re\{a_k\} \leftarrow \left( Re\{b_k'\} \cdot Re\{c_k'\} - Im\{b_k'\} \cdot Im\{c_k'\} \right) \cdot 2^{-30} \\ & Im\{a_k\} \leftarrow \left( Im\{b_k'\} \cdot Re\{c_k'\} + Re\{b_k'\} \cdot Im\{c_k'\} \right) \cdot 2^{-30} \\ & \qquad\text{其中 } k \in 0\ ...\ (length-1) \end{align*}

块浮点数:

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

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

参数:

  • complex_s32_t a[] – [out] 复数输出向量 aˉ\bar{a}
  • const complex_s32_t b[] – [in] 复数输入向量 bˉ\bar{b}
  • const complex_s32_t c[] – [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} 的右移量

返回值:

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

异常:

  • ET_LOAD_STORE 如果 abc 不是字对齐的

相关:

  • vect_complex_s32_mul_prepare

参考性能:

vect_complex_s32_mul


headroom_t vect_complex_s32_real_mul()

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

a[]b[]分别表示复数32位尾数向量 aˉ\bar{a}bˉ\bar{b}c[]表示实数32位尾数向量 cˉ\bar{c}

a[]b[]c[]必须从字对齐的地址开始。这个操作可以在b[]上安全地原地执行。

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

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

操作:

bksat32(bk2b_shr)cksat32(ck2c_shr)Re{ak}(Re{bk}ck)230Im{ak}(Im{bk}ck)230 其中 k0 ... (length1)\begin{split}\begin{align*} & b_k' \leftarrow sat_{32}(\lfloor b_k \cdot 2^{-b\_shr} \rfloor) \\ & c_k' \leftarrow sat_{32}(\lfloor c_k \cdot 2^{-c\_shr} \rfloor) \\ & Re\{a_k\} \leftarrow \left( Re\{b_k'\} \cdot c_k' \right) \cdot 2^{-30} \\ & Im\{a_k\} \leftarrow \left( Im\{b_k'\} \cdot c_k' \right) \cdot 2^{-30} \\ & \qquad\text{ 其中 }k\in 0\ ...\ (length-1) && \end{align*}\end{split}

块浮点数:

如果 bˉ\bar{b} 是BFP向量 bˉ2b_exp\bar{b} \cdot 2^{b\_exp} 的复数32位尾数,cˉ\bar{c} 是浮点数值 c2c_expc \cdot 2^{c\_exp} 的复数32位尾数,那么结果向量 aˉ\bar{a} 是BFP向量 aˉ2a_exp\bar{a} \cdot 2^{a\_exp} 的尾数,其中 a_exp=b_exp+c_exp+b_shr+c_shra\_exp = b\_exp + c\_exp + b\_shr + c\_shr

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

参数:

  • complex_s32_t a[] – [out] 复数输出向量 aˉ\bar{a}
  • const complex_s32_t b[] – [in] 复数输入向量 bˉ\bar{b}
  • const int32_t c[] – [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} 的头空间。

异常:

参考性能:

vect_complex_s32_real_mul


headroom_t vect_complex_s32_real_scale()

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

a[]b[]分别表示复数32位尾数向量 aˉ\bar{a}bˉ\bar{b}c表示实数32位缩放因子 cc

a[]b[]必须从字对齐的地址开始。这个操作可以在b[]上安全地原地执行。

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

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

操作:

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

块浮点数:

如果 bˉ\bar{b} 是BFP向量 bˉ2b_exp\bar{b} \cdot 2^{b\_exp} 的复数16位尾数,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+b_shr+c_shra\_exp = b\_exp + c\_exp + b\_shr + c\_shr

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

参数:

  • complex_s32_t a[] – [out] 复数输出向量 aˉ\bar{a}
  • const complex_s32_t b[] – [in] 复数输入向量 bˉ\bar{b}
  • const int32_t c – [in] 实数输入向量 cc
  • 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] 应用于 cc 的右移位数

返回值:

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

异常:

参考性能:

vect_complex_s32_real_scale


headroom_t vect_complex_s32_scale()

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

a[]b[]分别表示复数32位尾数向量 aˉ\bar{a}bˉ\bar{b}

c表示复数32位缩放因子 cc

a[]b[]必须从字对齐的地址开始。该操作可以在b[]上安全地原地执行。

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

b_shrc_shr是应用于每个 bˉ\bar{b} 元素和 cc 的带符号算术右移位数。

操作:

bksat32(bk2b_shr)Re{ak}(Re{vk}Re{c}Im{vk}Im{c})230Im{ak}(Re{vk}Im{c}+Im{vk}Re{c})230 其中 k0 ... (length1)\begin{align*} & b_k' \leftarrow sat_{32}(\lfloor b_k \cdot 2^{-b\_shr} \rfloor) \\ & Re\{a_k\} \leftarrow \left( Re\{v_k\} \cdot Re\{c\} - Im\{v_k\} \cdot Im\{c\} \right) \cdot 2^{-30} \\ & Im\{a_k\} \leftarrow \left( Re\{v_k\} \cdot Im\{c\} + Im\{v_k\} \cdot Re\{c\} \right) \cdot 2^{-30} \\ & \qquad\text{ 其中 }k\in 0\ ...\ (length-1) && \end{align*}

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

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

参数:

  • complex_s32_t a[] – [out] 复数输出向量 aˉ\bar{a}
  • const complex_s32_t b[] – [in] 复数输入向量 bˉ\bar{b}
  • const int32_t c_real – [in] cc 的实部。
  • const int32_t c_imag – [in] cc 的虚部。
  • const unsigned length – [in] 向量 aˉ\bar{a}bˉ\bar{b} 中的元素数量。
  • const right_shift_t b_shr – [in] 应用于 bˉ\bar{b} 的右移位数。
  • const right_shift_t c_shr – [in] 应用于 cc 的右移位数。

返回值:

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

异常:

参考性能:

vect_complex_s32_scale


void vect_complex_s32_set()

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

a[]表示复数32位向量 aˉ\bar{a}a[]必须从字对齐的地址开始。

b_realb_imag是要设置为每个元素的实部和虚部的值。

lengtha[]中的元素数量。

操作:

akb_real+jb_imag 其中 k0 ... (length1) 其中 j2=1\begin{align*} & a_k \leftarrow b\_real + j\cdot b\_imag \\ & \qquad\text{ 其中 }k\in 0\ ...\ (length-1) \\ & \qquad\text{ 其中 } j^2 = -1 \end{align*}

如果 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

参数:

  • complex_s32_t a[] – [out] 复数输出向量 aˉ\bar{a}
  • const int32_t b_real – [in] 要将 aˉ\bar{a} 的实部设置为的值
  • const int32_t b_imag – [in] 要将 aˉ\bar{a} 的虚部设置为的值
  • const unsigned length – [in] aˉ\bar{a} 中的元素数量

异常:

参考性能:

vect_complex_s32_set


headroom_t vect_complex_s32_shl()

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

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

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

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

操作:

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

块浮点数:

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

参数:

  • complex_s32_t a[] – [out] 复数输出向量 aˉ\bar{a}
  • const complex_s32_t b[] – [in] 复数输入向量 bˉ\bar{b}
  • const unsigned length – [in] 向量 bˉ\bar{b} 中的元素数量
  • const left_shift_t b_shl – [in] 应用于 bˉ\bar{b} 的左移量

返回值:

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

异常:

参考性能:

vect_complex_s32_shl


headroom_t vect_complex_s32_shr()

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

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

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

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

操作:

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

块浮点数:

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

参数:

  • complex_s32_t a[] – [out] 复数输出向量 aˉ\bar{a}
  • const complex_s32_t b[] – [in] 复数输入向量 bˉ\bar{b}
  • const unsigned length – [in] 向量 bˉ\bar{b} 中的元素数量
  • const right_shift_t b_shr – [in] 应用于 bˉ\bar{b} 的右移量

返回值:

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

异常:

参考性能:

vect_complex_s32_shr


headroom_t vect_complex_s32_squared_mag()

计算复数32位向量元素的平方幅值。

a[]表示复数32位尾数向量 aˉ\bar{a}b[]表示实数32位尾数向量 bˉ\bar{b}。每个向量必须从字对齐的地址开始。

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

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

操作:

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

块浮点数:

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

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

参数:

  • int32_t a[] – [out] 复数输出向量 aˉ\bar{a}
  • const complex_s32_t b[] – [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不是双字对齐的或b不是字对齐的,则引发ET_LOAD_STORE异常(参见 笔记:向量对齐

返回值:

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

另请参阅:

  • vect_complex_s32_squared_mag_prepare

参考性能:

vect_complex_s32_squared_mag


headroom_t vect_complex_s32_sub()

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

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

length是向量中的元素数量。

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

操作:

bksat32(bk2b_shr)cksat32(ck2c_shr)Re{ak}Re{bk}Re{ck}Im{ak}Im{bk}Im{ck} 其中 k0 ... (length1)\begin{align*} & b_k' \leftarrow sat_{32}(\lfloor b_k \cdot 2^{-b\_shr} \rfloor) \\ & c_k' \leftarrow sat_{32}(\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}的复数32位尾数,则结果向量aˉ\bar{a}是BFP向量aˉ2a_exp\bar{a} \cdot 2^{a\_exp}的复数32位尾数。

在这种情况下,必须选择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_s32_sub_prepare()可以根据输入指数b_expb\_expc_expc\_exp以及输入头空间b_hrb\_hrc_hrc\_hr来获取a_expa\_expb_shrb\_shrc_shrc\_shr的值。

参数:

  • complex_s32_t a[] – [out] 复数输出向量 aˉ\bar{a}

  • const complex_s32_t b[] – [in] 复数输入向量 bˉ\bar{b}

  • const complex_s32_t c[] – [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} 的头空间。

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

另请参阅: vect_complex_s32_sub_prepare

参考性能:

vect_complex_s32_sub


void vect_complex_s32_sum()

计算复数32位向量的元素和。

a是结果和的复数64位尾数。

b[]表示复数32位尾数向量 bˉ\bar{b}b[]必须从字对齐的地址开始。

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

b_shr是应用于bˉ\bar{b}无符号算术右移。

操作:

bkbk2b_shrRe{a}k=0length1(Re{bk})Im{a}k=0length1(Im{bk})\begin{align*} & b_k' \leftarrow b_k \cdot 2^{-b\_shr} \\ & 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}的复数64位尾数,其中a_exp=b_exp+b_shra\_exp = b\_exp + b\_shr

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

额外细节:

内部上,和累积到四个不同的复数40位累加器中。这些累加器使用对称的40位饱和逻辑进行累加(范围为±2391\pm 2^{39}-1)。最后,这4个累加器被求和到a的64位字段中。在最后一步中,不应用饱和逻辑。

在最极端的情况下,每个bkb_k可能是231-2^{31}。将其中的256个元素添加到同一个累加器中,得到239-2^{39},这将饱和到239+1-2^{39}+1,引入1个LSB的误差(根据具体情况可能可接受或不可接受)。然后,每个部分的最终结果可能达到4(239+1)=241+44\cdot(-2^{39}+1) = -2^{41}+4,每个部分都适合42位的有符号整数。

参数:

  • complex_s64_t* a – [out] 复数和 aa

  • const complex_s32_t b[] – [in] 复数输入向量 bˉ\bar{b}

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

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

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

另请参阅: vect_complex_s32_sum_prepare

参考性能:

vect_complex_s32_sum


void vect_complex_s32_tail_reverse()

反转复数32位向量尾部的顺序。

该函数将复数32位向量 xˉ\bar x 尾部的元素顺序进行反转。在这个上下文中,xˉ\bar x 的尾部是除了 x0x_0 之外的所有元素。换句话说,第一个元素 x0x_0 保持不变,剩下的 length1length-1 个元素按照相反的顺序重新排列。

该函数在对一组实数值执行正向或反向FFT(即单声道FFT)时使用,并原地操作 x[]

操作:

x0x0xkxlengthk其中 k1(length1)\begin{align*} x_0 &\leftarrow x_0 \\ x_k &\leftarrow x_{length - k} \quad \text{其中 } k \in 1 \ldots (length-1) \end{align*}

参数:

  • complex_s32_t x[] – [inout] 要反转尾部的复数向量
  • const unsigned length – [in] 向量 xˉ\bar x 中的元素数量

异常:

参考性能:

vect_complex_s32_tail_reverse


headroom_t vect_complex_s32_conjugate()

获取复数32位向量的共轭。

复数标量 z=x+yiz = x + yi 的共轭是 z=xyiz^* = x - yi。该函数计算 bˉ\bar b 的每个元素的共轭(取每个元素的虚部的相反数),并将结果放入 aˉ\bar a

操作:

Re{ak}Re{bk}Im{ak}Im{bk}其中 k1 ... (length1)\begin{align*} Re\{a_k\} &\leftarrow Re\{b_k\} \\ Im\{a_k\} &\leftarrow - Im\{b_k\} \\ &\qquad\text{其中 } k \in 1\ ...\ (length-1) \end{align*}

参数:

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

返回值:

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

异常:

参考性能:

vect_complex_s32_conjugate


void vect_complex_s32_to_vect_complex_s16()

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

该函数将复数32位尾数向量 bˉ\bar b 转换为复数16位尾数向量 aˉ\bar a。从概念上讲,输出的BFP向量 aˉ2a_exp\bar a \cdot 2^{a\_exp} 表示与输入的BFP向量 bˉ2b_exp\bar b \cdot 2^{b\_exp} 相同的值,只是降低了位深度。

在大多数情况下,b_shrb\_shr 应为 16b_hr16 - b\_hr,其中 b_hrb\_hr 是32位输入尾数向量 bˉ\bar b 的头空间。然后,输出指数 a_expa\_exp 将由 a_exp=b_exp+b_shra\_exp = b\_exp + b\_shr 给出。

操作:

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

参数:

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

异常:

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

vect_complex_s32_to_vect_complex_s16