只有当第一个矩阵的列数和第二个矩阵的行数相等的时候,才可以做复数矩阵乘法。 M x N
矩阵和 N x P
矩阵相乘的结果是一个 M x P
矩阵。 当使能矩阵大小检查,函数会检查: (1) pSrcA
和 pSrcB
的内部尺寸是否相等; (2) 输出向量的尺寸是否跟 pSrcA
和 pSrcB
的计算结果相等.
- 参数
-
[in] | *pSrcA | 指向第一个输入的复数矩阵结构体 |
[in] | *pSrcB | 指向第二个输入的复数矩阵结构体 |
[out] | *pDst | 指向输出的复数矩阵结构体 |
- 返回
- 根据矩阵大小的检查结果返回
CSKY_MATH_SIZE_MISMATCH
或者 CSKY_MATH_SUCCESS
。
- 参数
-
[in] | *pSrcA | 指向第一个输入的复数矩阵结构体 |
[in] | *pSrcB | 指向第二个输入的复数矩阵结构体 |
[out] | *pDst | 指向输出的复数矩阵结构体 |
[in] | *pScratch | 指向保存中间结果的临时数组 |
- 返回
- 根据矩阵大小的检查结果返回
CSKY_MATH_SIZE_MISMATCH
或者 CSKY_MATH_SUCCESS
- 最佳性能的条件
- 输入,输出,和缓存都需要32位对齐
- 限制
- 如果芯片不支持分对齐访问,则定义宏 UNALIGNED_SUPPORT_DISABLE 同时,输入,输出,临时buffer,都应该是32位对齐。
缩放和溢出行为:
- 函数实现使用了一个内部64位累加器。输入都是1.15格式的,乘法生成2.30结果。 2.30格式的中间结果在34.30格式的64位累加器累加。 由于有33个保护位,所以不会有溢出风险。34.30的结果丢弃低15位截断为34.15格式,然后饱和成为1.15格式的结果。
- 函数
csky_mat_mult_fast_q15()
是这个函数的一个快速版本,但是丢失更多的精度
- 参数
-
[in] | *pSrcA | 指向第一个输入的复数矩阵结构体 |
[in] | *pSrcB | 指向第二个输入的复数矩阵结构体 |
[out] | *pDst | 指向输出的复数矩阵结构体 |
- 返回
- 根据矩阵大小的检查结果返回
CSKY_MATH_SIZE_MISMATCH
或者 CSKY_MATH_SUCCESS
缩放和溢出行为:
- 函数实现使用了一个内部64位累加器。 累加器用2.62格式维持了中间结果的所有精度,但是只有一个保护位。 累加时候没有饱和计算,因此累加器溢出会扭曲结果,需要缩小输入信号来防止中间结果溢出。 因为最多会有numColsA个加法进位,所以需要缩小 log2(numColsA) 位来防止溢出。 2.62格式的累加器右移31位,然后饱和生成1.31格式的最终结果。