硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1988|回复: 6
收起左侧

[DSP] 请教一下DSP矩阵计算的问题

[复制链接]

2

主题

5

回帖

11

积分

新手上路

积分
11
发表于 2024-7-19 17:59:50 | 显示全部楼层 |阅读模式

void calculate_L_values(float32_t A_L[N * N], float32_t L0[N], float32_t L_values[N * n])
{


    uint8_t i = 0;
    uint8_t j = 0;
    // float32_t* temp = NULL;
    arm_matrix_instance_f32 A_L_Indexes;
    A_L_Indexes.numCols = N;
    A_L_Indexes.numRows = N;
    A_L_Indexes.pData = A_L;


    float32_t Li[N] = {0};
    float32_t Li_next[N] = {0};
    arm_matrix_instance_f32 Li_Indexes;
    Li_Indexes.numCols = N;
    Li_Indexes.numRows = 1;
    Li_Indexes.pData = Li;


    arm_matrix_instance_f32 Li_next_Indexes;
    Li_next_Indexes.numCols = N;
    Li_next_Indexes.numRows = 1;
    Li_next_Indexes.pData = Li_next;


    arm_matrix_instance_f32 L0_result;
    L0_result.numCols = N;
    L0_result.numRows = 1;
    L0_result.pData = L0;


    // Calculate initial Li
    arm_mat_mult_f32(&A_L_Indexes, &L0_result, &Li_Indexes);


    // Store transposed L_values
    for (i = 0; i < N; ++i)
    {
        L_values[0 * N + i] = Li;
    }
    i = 0;
    // Calculate and store all L values
    for (i = 1; i < n; ++i)
    {

        arm_mat_mult_f32(&A_L_Indexes, &Li_Indexes, &Li_next_Indexes);



        arm_copy_f32(Li_next, Li, N);
        // Store transposed L_values
        for (j = 0; j < N; ++j)
        {
            L_values[i * N + j] = Li[j];
        }
    }
}


问题是这样的,第一步的arm_mat_mult_f32都没有问题,我把    arm_mat_mult_f32(&A_L_Indexes, &L0_result, &Li_Indexes);与        arm_mat_mult_f32(&A_L_Indexes, &Li_Indexes, &Li_next_Indexes);调换位置之后也是第一个arm_mat_mult_f32可以运行,但是第二个arm_mat_mult_f32就运行不了,不知道是什么原因(我是在调试下试的,就一直卡在arm_mat_mult_f32(&A_L_Indexes, &Li_Indexes, &Li_next_Indexes);这个函数里面),n定义为60,N定义为4.改了很多天了,救救孩子吧
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2024-7-20 09:39:17 | 显示全部楼层
1、你的局部变量可能比较大,注意别栈溢出了
2、然后就是完整的测试代码没,我试试
回复

使用道具 举报

0

主题

37

回帖

37

积分

新手上路

积分
37
发表于 2024-7-20 11:04:23 | 显示全部楼层
矩阵乘法要求后一个矩阵的行数(numRows)等于前一个矩阵的列数(numCols),这样才有意义,你这两个函数调用都无法正常计算才对。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116230
QQ
发表于 2024-7-20 11:45:51 | 显示全部楼层
ME_Engineer 发表于 2024-7-20 11:04
矩阵乘法要求后一个矩阵的行数(numRows)等于前一个矩阵的列数(numCols),这样才有意义,你这两个函数调 ...

还有一个错误的地方,参数不对,L0_result是第3个参数,除非是随意做的名字

arm_mat_mult_f32(&A_L_Indexes, &L0_result, &Li_Indexes);

另外最重要的一点,他没用做,后面的版本,条件编译ARM_MATH_MATRIX_CHECK ,行列不匹配会立即返回的,源码有判断这个,他这里没立即返回。

23.jpg   


回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2024-7-20 16:22:22 | 显示全部楼层
ME_Engineer 发表于 2024-7-20 11:04
矩阵乘法要求后一个矩阵的行数(numRows)等于前一个矩阵的列数(numCols),这样才有意义,你这两个函数调 ...

是的,我把行和列看反了,前面计算矩阵乘法的这么写都没问题,我以为是我代码的问题,换了一下之后就可以了,感谢
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2024-7-20 16:25:30 | 显示全部楼层
eric2013 发表于 2024-7-20 11:45
还有一个错误的地方,参数不对,L0_result是第3个参数,除非是随意做的名字

arm_mat_mult_f32(&A_L_In ...


行列不匹配他会卡到内部函数的这一步
sum += *pIn1++ * *pIn2;
          pIn2 += numColsB;
我进调试的时候试过,不返回内容,直接就进硬件错误的死循环了
回复

使用道具 举报

2

主题

5

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2024-7-20 16:25:56 | 显示全部楼层
eric2013 发表于 2024-7-20 11:45
还有一个错误的地方,参数不对,L0_result是第3个参数,除非是随意做的名字

arm_mat_mult_f32(&A_L_In ...

感谢,已经解决了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 21:34 , Processed in 0.534335 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表