CSI-DSP  Version 1.0.0
CSI DSP Software Library
函数
矩阵乘法

函数

csky_status csky_mat_mult_f32 (const csky_matrix_instance_f32 *pSrcA, const csky_matrix_instance_f32 *pSrcB, csky_matrix_instance_f32 *pDst)
 浮点矩阵乘法 更多...
 
csky_status csky_mat_mult_fast_q15 (const csky_matrix_instance_q15 *pSrcA, const csky_matrix_instance_q15 *pSrcB, csky_matrix_instance_q15 *pDst, q15_t *pState)
 Q15 矩阵乘法 (快速版本) 更多...
 
csky_status csky_mat_mult_fast_q31 (const csky_matrix_instance_q31 *pSrcA, const csky_matrix_instance_q31 *pSrcB, csky_matrix_instance_q31 *pDst)
 Q31 矩阵乘法 (快速版本) 更多...
 
csky_status csky_mat_mult_q15 (const csky_matrix_instance_q15 *pSrcA, const csky_matrix_instance_q15 *pSrcB, csky_matrix_instance_q15 *pDst, q15_t *pState)
 Q15 矩阵乘法 更多...
 
csky_status csky_mat_mult_q31 (const csky_matrix_instance_q31 *pSrcA, const csky_matrix_instance_q31 *pSrcB, csky_matrix_instance_q31 *pDst)
 Q31 矩阵乘法 更多...
 

简要说明

两个矩阵相乘

MatrixMultiplication.gif
两个3 x 3矩阵相乘

只有第一个矩阵的列数和第二个矩阵的行数相等的时候,才可以做矩阵乘法 M x N 矩阵和 N x P 矩阵相乘的结果是一个 M x P矩阵. 当矩阵大小检查使能的时候,函数会检查: (1) pSrcApSrcB 的内部尺寸相等; (2) 输出矩阵的尺寸与 pSrcApSrcB 计算出来的尺寸相等.

函数说明

csky_status csky_mat_mult_f32 ( const csky_matrix_instance_f32 pSrcA,
const csky_matrix_instance_f32 pSrcB,
csky_matrix_instance_f32 pDst 
)
参数
[in]*pSrcA指向第一个输入矩阵结构体
[in]*pSrcB指向第二个输入矩阵结构体
[out]*pDst指向输出矩阵结构体
返回
函数根据大小检查,返回 CSKY_MATH_SIZE_MISMATCH 或者 CSKY_MATH_SUCCESS
示例:
csky_class_marks_example_f32.c , 以及 csky_matrix_example_f32.c.
csky_status csky_mat_mult_fast_q15 ( const csky_matrix_instance_q15 pSrcA,
const csky_matrix_instance_q15 pSrcB,
csky_matrix_instance_q15 pDst,
q15_t pState 
)
参数
[in]*pSrcA指向第一个输入矩阵结构体
[in]*pSrcB指向第二个输入矩阵结构体
[out]*pDst指向输出矩阵结构体
[in]*pState指向保存中间结果的数组
返回
函数根据大小检查返回 CSKY_MATH_SIZE_MISMATCH 或者 CSKY_MATH_SUCCESS

缩放和溢出行为:

这个快速版本和函数 csky_mat_mult_q15() 的区别在于,快速版本使用了一个32位的累加器,而不是64位的累加器。 每个1.15和1.15相乘的结果截断为2.30的结果。 中间结果在2.30格式的32位寄存器累加。 最后累加器饱和转换为1.15格式的结果。
快速版本跟标准版本有相同的溢出行为,但是由于截断了每次相乘结果的低16位,所以提供的更低的精度。 为了防止溢出,必须缩小输入信号。 因为最多会有numColsA个加法进位,所以输入矩阵需要缩小 log2(numColsA) 个位,来防止溢出。
函数 csky_mat_mult_q15() 是这个函数的一个慢速版本,使用64位累加器提供更高的精度
csky_status csky_mat_mult_fast_q31 ( const csky_matrix_instance_q31 pSrcA,
const csky_matrix_instance_q31 pSrcB,
csky_matrix_instance_q31 pDst 
)
参数
[in]*pSrcA指向第一个输入矩阵结构体
[in]*pSrcB指向第二个输入矩阵结构体
[out]*pDst指向输出矩阵结构体
返回
函数根据大小检查,返回 CSKY_MATH_SIZE_MISMATCH 或者 CSKY_MATH_SUCCESS

缩放和溢出行为:

这个快速版本和函数 csky_mat_mult_q31() 的区别在于,快速版本使用了一个32位的累加器,而不是64位的累加器。 每个1.31和1.31相乘的结果截断为2.30的结果。 中间结果在2.30格式的32位寄存器累加。 最后累加器饱和转换为1.31格式的结果。
快速版本跟标准版本有相同的溢出行为,但是由于截断了每次相乘结果的低32位,所以提供的更低的精度。 为了防止溢出,必须缩小输入信号。 因为最多会有numColsA个加法进位,所以输入矩阵需要缩小 log2(numColsA) 个位,来防止溢出。
函数 csky_mat_mult_q31() 是这个函数的一个慢速版本,使用64位累加器提供更高的精度。
csky_status csky_mat_mult_q15 ( const csky_matrix_instance_q15 pSrcA,
const csky_matrix_instance_q15 pSrcB,
csky_matrix_instance_q15 pDst,
q15_t pState 
)
参数
[in]*pSrcA指向第一个输入矩阵结构体
[in]*pSrcB指向第二个输入矩阵结构体
[out]*pDst指向输出矩阵结构体
[in]*pState指向保存中间结果的数组 (未使用)
返回
函数根据大小检查返回 CSKY_MATH_SIZE_MISMATCH 或者 CSKY_MATH_SUCCESS

缩放和溢出行为:

函数实现使用了一个64位的内部累加器。输入都是1.15格式,相乘产生的结果是2.30格式。 2.30的中间结果在34.30格式的累加器累加。 因为提供了33个保护位,所有不会有溢出风险。 34.30的结果丢弃低15位,截断为34.15格式,然后饱和成1.15格式的最后结果
函数 csky_mat_mult_fast_q15() 是这个函数的一个快速版本,但是丢失了更多的精度
csky_status csky_mat_mult_q31 ( const csky_matrix_instance_q31 pSrcA,
const csky_matrix_instance_q31 pSrcB,
csky_matrix_instance_q31 pDst 
)
参数
[in]*pSrcA指向第一个输入矩阵结构体
[in]*pSrcB指向第二个输入矩阵结构体
[out]*pDst指向输出矩阵结构体
返回
函数根据大小检查返回 CSKY_MATH_SIZE_MISMATCH 或者 CSKY_MATH_SUCCESS

缩放和溢出行为:

函数实现使用了一个64位的内部累加器。 累加器使用2.62格式,维持了中间乘法结果的所有精度,但是只提供了1个保护位。 累加过程中没有饱和处理,累加器溢出会导致结果扭曲,因此必须缩小输入信号,防止溢出。 因为最多会有numColsA个加法进位,所以输入矩阵需要缩小 log2(numColsA) 个位,来防止溢出。 2.62格式的累加器右移31位,饱和生成1.31的最后结果。
函数 csky_mat_mult_fast_q31() 是这个函数的一个快速版本,但是丢失了更多的精度