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_shr和c_shr是应用于 bˉ\bar{b} 和 cˉ\bar{c} 的有符号算术右移位数。

操作:

bk′←sat32(⌊bk⋅2−b_shr⌋)ck′←sat32(⌊ck⋅2−c_shr⌋)Re{ak}←Re{bk′}+Re{ck′}Im{ak}←Im{bk′}+Im{ck′}其中 k∈0 ... (length−1)\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\_shr 和 c_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\_exp 和 c_expc\_exp 以及输入头空间 b_hrb\_hr 和 c_hrc\_hr 来获取 a_expa\_exp、b_shrb\_shr 和 c_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位向量的每个元素上。该操作可以在输入向量上安全地原地执行。

操作:

bk′←sat32(⌊bk⋅2−b_shr⌋)Re{ak}←Re{bk′}+Re{c}Im{ak}←Im{bk′}+Im{c} 其中 k∈0 ... (length−1)\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位向量与另一个复数的共轭进行逐元素相乘。该操作可以在输入向量上安全地原地执行。

操作:

bk′←sat32(⌊bk⋅2−b_shr⌋)ck′←sat32(⌊ck⋅2−c_shr⌋)Re{ak}←(Re{bk′}⋅Re{ck′}+Im{bk′}⋅Im{ck′})⋅2−30Im{ak}←(Im{bk′}⋅Re{ck′}−Re{bk′}⋅Im{ck′})⋅2−30 其中 k∈0 ... (length−1)\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位向量的每个元素上。该操作可以在输入向量上安全地原地执行。

操作:

bk′←sat32(⌊bk⋅2−b_shr⌋)Re{ak}←Re{bk′}+Re{c}Im{ak}←Im{bk′}+Im{c} 其中 k∈0 ... (length−1)\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位向量与另一个复数的共轭进行逐元素相乘。该操作可以在输入向量上安全地原地执行。

操作:

bk′←sat32(⌊bk⋅2−b_shr⌋)ck′←sat32(⌊ck⋅2−c_shr⌋)Re{ak}←(Re{bk′}⋅Re{ck′}+Im{bk′}⋅Im{ck′})⋅2−30Im{ak}←(Im{bk′}⋅Re{ck′}−Re{bk′}⋅Im{ck′})⋅2−30 其中 k∈0 ... (length−1)\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位字段re和im的头空间的最小值。

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

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

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

length是x[]中的元素数量。

操作定义为:

min ⁣{HR32(x0),HR32(x1),...,HR32(xlength−1)}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_shr,b_shr和c_shr是应用于输入元素aka_k,bkb_k和ckc_k的有符号算术右移。

操作定义为:

b~k←sat32(bk⋅2−b_shr)c~k←sat32(ck⋅2−c_shr)a~k←sat32(ak⋅2−acc_shr)vk←round(sat32((Re{b~k}⋅Re{c~k}−Im{b~k}⋅Im{c~k})⋅2−30))sk←round(sat32((Im{b~k}⋅Re{c~k}+Re{b~k}⋅Im{c~k})⋅2−30))Re{ak}←sat32(Re{a~k}+vk)Im{ak}←sat32(Im{a~k}+sk) for k∈0 ... (length−1)\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\_exp,b_expb\_exp和c_expc\_exp以及输入头空间a_hra\_hr,b_hrb\_hr和c_hrc\_hr来获取a_expa\_exp,acc_shracc\_shr,b_shrb\_shr和c_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_k 是 acc[k]。

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

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

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

acc_shr、b_shr和c_shr是应用于输入元素 aka_k、bkb_k 和 ckc_k 的有符号算术右移。

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

b~k←sat32(bk⋅2−b_shr)c~k←sat32(ck⋅2−c_shr)a~k←sat32(ak⋅2−acc_shr)vk←round(sat32((Re{b~k}⋅Re{c~k}−Im{b~k}⋅Im{c~k})⋅2−30))sk←round(sat32((Im{b~k}⋅Re{c~k}+Re{b~k}⋅Im{c~k})⋅2−30))Re{ak}←sat32(Re{a~k}−vk)Im{ak}←sat32(Im{a~k}−sk) for k∈0 ... (length−1)\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\_exp、b_expb\_exp 和 c_expc\_exp 和输入头空间 a_hra\_hr、b_hrb\_hr 和 c_hrc\_hr 来获取 a_expa\_exp、acc_shracc\_shr、b_shrb\_shr 和 c_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} 的头空间

异常: 如果acc、b或c不是字对齐的,则引发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_k 是 acc[k]。

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

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

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

acc_shr、b_shr 和 c_shr 是应用于输入元素 aka_k、bkb_k 和 ckc_k 的有符号算术右移。

操作:

b~k←sat32(bk⋅2−b_shr)c~k←sat32(ck⋅2−c_shr)a~k←sat32(ak⋅2−acc_shr)vk←round(sat32((Re{b~k}⋅Re{c~k}+Im{b~k}⋅Im{c~k})⋅2−30))sk←round(sat32((Im{b~k}⋅Re{c~k}−Re{b~k}⋅Im{c~k})⋅2−30))Re{ak}←sat32(Re{a~k}+vk)Im{ak}←sat32(Im{a~k}+sk)其中k∈0 ... (length−1)\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\_exp、b_expb\_exp 和 c_expc\_exp,以及输入的头空间 a_hra\_hr、b_hrb\_hr 和 c_hrc\_hr 来获取 a_expa\_exp、acc_shracc\_shr、b_shrb\_shr 和 c_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} 的头空间。

异常: 如果 acc、b 或 c 不是字对齐的,则引发 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_k 是 acc[k]。

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

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

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

acc_shr、b_shr 和 c_shr 是应用于输入元素 aka_k、bkb_k 和 ckc_k 的有符号算术右移。

操作:

b~k←sat32(bk⋅2−b_shr)c~k←sat32(ck⋅2−c_shr)a~k←sat32(ak⋅2−acc_shr)vk←round(sat32((Re{b~k}⋅Re{c~k}+Im{b~k}⋅Im{c~k})⋅2−30))sk←round(sat32((Im{b~k}⋅Re{c~k}−Re{b~k}⋅Im{c~k})⋅2−30))Re{ak}←sat32(Re{a~k}−vk)Im{ak}←sat32(Im{a~k}−sk)其中k∈0 ... (length−1)\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\_exp、b_expb\_exp 和 c_expc\_exp,以及输入的头空间 a_hra\_hr、b_hrb\_hr 和 c_hrc\_hr 来获取 a_expa\_exp、acc_shracc\_shr、b_shrb\_shr 和 c_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} 的头空间。

异常: 如果 acc、b 或 c 不是字对齐的,则引发 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 是向量中的元素数量。

操作:

ak←sat32(∣bk∣)其中 k∈0 ... (length−1)\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脚本来生成这个表格。

此函数执行的操作如下:

vk←bk⋅2−b_shrak←(Revk)2+(Imvk)2其中 k∈0 ... (length−1)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 如果 a 或 b 不是字对齐的

相关:

  • 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_shr 和 c_shr 是应用于 bˉ\bar{b} 和 cˉ\bar{c} 的有符号算术右移量。

操作:

bk′←sat32(⌊bk⋅2−b_shr⌋)ck′←sat32(⌊ck⋅2−c_shr⌋)Re{ak}←(Re{bk′}⋅Re{ck′}−Im{bk′}⋅Im{ck′})⋅2−30Im{ak}←(Im{bk′}⋅Re{ck′}+Re{bk′}⋅Im{ck′})⋅2−30其中 k∈0 ... (length−1)\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 是浮点数值 c⋅2c_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\_exp 和 c_expc\_exp 以及输入头空间 b_hrb\_hr 和 c_hrc\_hr 来获取 a_expa\_exp、b_shrb\_shr 和 c_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 如果 a、b 或 c 不是字对齐的

相关:

  • 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_shr和c_shr是应用于 bˉ\bar{b} 和 cˉ\bar{c} 的有符号算术右移位数。

操作:

bk′←sat32(⌊bk⋅2−b_shr⌋)ck′←sat32(⌊ck⋅2−c_shr⌋)Re{ak}←(Re{bk′}⋅ck′)⋅2−30Im{ak}←(Im{bk′}⋅ck′)⋅2−30 其中 k∈0 ... (length−1)\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} 是浮点数值 c⋅2c_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\_exp 和 c_expc\_exp,以及输入头空间 b_hrb\_hr 和 c_hrc\_hr 来获取 a_expa\_exp、b_shrb\_shr 和 c_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_shr和c_shr是应用于 bˉ\bar{b} 和 cc 的有符号算术右移位数。

操作:

bk′←sat32(⌊bk⋅2−b_shr⌋)Re{ak}←Re{bk′}⋅cIm{ak}←Im{bk′}⋅c 其中 k∈0 ... (length−1)\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 是浮点数值 c⋅2c_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\_exp 和 c_expc\_exp,以及输入头空间 b_hrb\_hr 和 c_hrc\_hr 来获取 a_expa\_exp、b_shrb\_shr 和 c_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_shr和c_shr是应用于每个 bˉ\bar{b} 元素和 cc 的带符号算术右移位数。

操作:

bk′←sat32(⌊bk⋅2−b_shr⌋)Re{ak}←(Re{vk}⋅Re{c}−Im{vk}⋅Im{c})⋅2−30Im{ak}←(Re{vk}⋅Im{c}+Im{vk}⋅Re{c})⋅2−30 其中 k∈0 ... (length−1)\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 是浮点值 c⋅2c_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\_exp 和 c_expc\_exp 以及输入头空间 b_hrb\_hr 和 c_hrc\_hr 来获取 a_expa\_exp、b_shrb\_shr 和 c_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_real和b_imag是要设置为每个元素的实部和虚部的值。

length是a[]中的元素数量。

操作:

ak←b_real+j⋅b_imag 其中 k∈0 ... (length−1) 其中 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 是浮点值 b⋅2b_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⌋)其中 k∈0 ... (length−1)\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}⋅2−b_shr⌋)Im{ak}←sat32(⌊Im{bk}⋅2−b_shr⌋)其中 k∈0 ... (length−1)\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ˉ⋅2−b_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} 的有符号算术右移。

操作:

bk′←sat32(⌊bk⋅2−b_shr⌋)ak←((Re{bk′})2+(Im{bk′})2)⋅2−30其中 k∈0 ... (length−1)\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\_exp 和 b_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_shr和c_shr是应用于bˉ\bar{b}和cˉ\bar{c}的有符号算术右移。

操作:

bk′←sat32(⌊bk⋅2−b_shr⌋)ck′←sat32(⌊ck⋅2−c_shr⌋)Re{ak}←Re{bk′}−Re{ck′}Im{ak}←Im{bk′}−Im{ck′} 其中 k∈0 ... (length−1)\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\_shr和c_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\_exp和c_expc\_exp以及输入头空间b_hrb\_hr和c_hrc\_hr来获取a_expa\_exp、b_shrb\_shr和c_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} 的头空间。

异常: 如果a、b或c不是字对齐的,则引发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}的无符号算术右移。

操作:

bk′←bk⋅2−b_shrRe{a}←∑k=0length−1(Re{bk′})Im{a}←∑k=0length−1(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是浮点值a⋅2a_expa \cdot 2^{a\_exp}的复数64位尾数,其中a_exp=b_exp+b_shra\_exp = b\_exp + b\_shr。

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

额外细节:

内部上,和累积到四个不同的复数40位累加器中。这些累加器使用对称的40位饱和逻辑进行累加(范围为±239−1\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 保持不变,剩下的 length−1length-1 个元素按照相反的顺序重新排列。

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

操作:

x0←x0xk←xlength−k其中 k∈1…(length−1)\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∗=x−yiz^* = x - yi。该函数计算 bˉ\bar b 的每个元素的共轭(取每个元素的虚部的相反数),并将结果放入 aˉ\bar a。

操作:

Re{ak}←Re{bk}Im{ak}←−Im{bk}其中 k∈1 ... (length−1)\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 a 和 bˉ\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 应为 16−b_hr16 - b\_hr,其中 b_hrb\_hr 是32位输入尾数向量 bˉ\bar b 的头空间。然后,输出指数 a_expa\_exp 将由 a_exp=b_exp+b_shra\_exp = b\_exp + b\_shr 给出。

操作:

bk′←sat16(⌊bk⋅2−b_shr⌋)Re{ak}←Re{bk′}Im{ak}←Im{bk′}其中 k∈0 ... (length−1)\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 a 和 bˉ\bar b 中的元素数量
  • const right_shift_t b_shr – [in] 应用于 bˉ\bar b 的右移位数

异常:

  • 如果 a_real、a_imag 或 b 不是字对齐的,则引发 ET_LOAD_STORE 异常(参见 笔记:向量对齐) 参考性能:

vect_complex_s32_to_vect_complex_s16