ARM官方矩阵乘法库函数arm_mat_mult_q31结果不太对路的问题

 

    因为某个测试需要,在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,暂时没有太多时间去推敲,暂时记录一下。

如果有高人清楚其中原因,也请直接指点一二,多谢!

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值