因为某个测试需要,在STM32F407平台上验证矩阵乘法,使用ARM官方库“CMSIS_5-5.5.1\CMSIS\DSP\Source\MatrixFunctions\arm_mat_mult_q31.c”中函数arm_mat_mult_q31。
测试实例,参照《安富莱_STM32-V5开发板_数字信号处理教程(V1.0).pdf》-20.2 矩阵乘法 MatMult
-20.2.6 实例讲解中所列(参考并便于对比)。
实例代码整理如下:
uint8_t i;
arm_status status;
arm_matrix_instance_q31 pMatrixSrcA1_q31; /* 10 * 10 */
arm_matrix_instance_q31 pMatrixSrcB1_q31; /* 10 * 10 */
arm_matrix_instance_q31 pMatrixDst1_q31; /* 10 * 10 */
for (i = 0; i < DEF_matrix_src_size; i++)
{
pDataSrcA1_q31[i] = i;
pDataSrcB1_q31[i] = i + 100;
pDataDst1_q31[i] = 1;
pDataDst1_q31[i + 10] = 1;
}
arm_mat_init_q31(&pMatrixSrcA1_q31, DEF_matrix_square_size, DEF_matrix_square_size, pDataSrcA1_q31);
arm_mat_init_q31(&pMatrixSrcB1_q31, DEF_matrix_square_size, DEF_matrix_square_size, pDataSrcB1_q31);
arm_mat_init_q31(&pMatrixDst1_q31, DEF_matrix_square_size, DEF_matrix_square_size, pDataDst1_q31);
status = arm_mat_mult_q31(&pMatrixSrcA1_q31, &pMatrixSrcB1_q31, &pMatrixDst1_q31);
//arm_mat_add_q31(&pMatrixSrcA1_q31, &pMatrixSrcB1_q31, &pMatrixDst1_q31);
printf("\r\n----status = %d\r\n", status);
/* ====for debugging==== */
printf("\r\n----pDataSrcA1_q31 = ");
for (i = 0; i < DEF_matrix_src_size; i++)
{
if ((i % 10) == 0)
printf("\r\n");
printf("%2d ", pDataSrcA1_q31[i]);
}
printf("\r\n\r\n----pDataSrcB1_q31 = ");
for (i = 0; i < DEF_matrix_src_size; i++)
{
if ((i % 10) == 0)
printf("\r\n");
printf("%2d ", pDataSrcB1_q31[i]);
}
printf("\r\n\r\n----After matrix mult--------------- \r\n");
printf("--pMatrixDst1_q31: Rows=%2d, Cols=%2d\r\n", pMatrixDst1_q31.numRows, pMatrixDst1_q31.numCols);
printf("--pMatrixDst1_q31.pData=");
for (i = 0; i < DEF_matrix_src_size; i++)
{
if ((i % 10) == 0)
printf("\r\n");
printf("%d ", pMatrixDst1_q31.pData[i]);
//printf("%d ", pDataDst1_q31[i]);
}
printf("%d \r\n", pMatrixDst1_q31.pData[10]);
printf("%d \r\n", pMatrixDst1_q31.pData[11]);
但实际输出结果发现全为0,如下:
后来注意到,实际上安富莱文档中的输出结果其实也是全0,如下:
大概跟了下原函数arm_mat_mult_q31的代码,发现如下地方有些存疑:
源代码考虑两个32位大数相乘后长度加倍的
情况,这块考虑肯定没问题,因为暂时没有太多时间去细细品味,对于我目前测试所需和问题情况,尝试将2处的右移
注掉,改为使用3的代码,结果ok,如下:
目前结果ok,暂时没有太多时间去推敲,暂时记录一下。
如果有高人清楚其中原因,也请直接指点一二,多谢!