硬汉嵌入式论坛

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

[DSP] 请教一个STM32H7的DSP矩阵乘一个系数的指令arm_mat_scale_q15()

[复制链接]

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2021-4-14 18:44:28 | 显示全部楼层 |阅读模式
本帖最后由 yeasang 于 2021-4-14 18:55 编辑

函数代码如下:void test_dsp()
{

        uint8_t i;

        /****定点数Q15数组******************************************************************/
        q15_t pDataA2[9] = {1000, 1000, 2000, 2000, 3000, 3000, 4000, 4000, 5000};
        q15_t scaleFract1 = 100;
        int32_t shift1 = 5;
        q15_t pDataDst2[9];

        arm_matrix_instance_q15 pSrcA2; //3行3列数据
        arm_matrix_instance_q15 pDst2;

        /****定点数Q15***********************************************************************/
        pSrcA2.numCols = 3;
        pSrcA2.numRows = 3;
        pSrcA2.pData = pDataA2;

        pDst2.numCols = 3;
        pDst2.numRows = 3;
        pDst2.pData = pDataDst2;

        arm_mat_scale_q15(&pSrcA2, scaleFract1, shift1, &pDst2);
        for(i = 0; i < 9; i++)
        {
                printf("pDataDst2[%d] = %d\r\n", i, pDataDst2);
        }
}
        
测试结果如下:        
pDataDst2[0] = 97
pDataDst2[1] = 97
pDataDst2[2] = 195
pDataDst2[3] = 195
pDataDst2[4] = 292
pDataDst2[5] = 292
pDataDst2[6] = 390
pDataDst2[7] = 390
pDataDst2[8] = 488


从结果反推,矩阵被乘的系数是0.097,想问一下设了
        q15_t scaleFract1 = 100;
        int32_t shift1 = 5;
为何比例系数位0.097呢?这是怎么得出来的?从scaleFract1, shift1怎么知道比例系数是0.097???规律在哪里?
不懂规律,假设我想矩阵乘一个系数为0.001,那我怎么知道scaleFract1, shift1应该设为多少?

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2021-4-15 08:42:08 | 显示全部楼层
这个比较好理解,系数就是scaleFract1 * 2^shift1

即100 * 2^32 = 3200, 这个定点数对应的浮点就是3200/32678 = 0.0979
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
 楼主| 发表于 2021-4-15 15:52:01 | 显示全部楼层
eric2013 发表于 2021-4-15 08:42
这个比较好理解,系数就是scaleFract1 * 2^shift1

即100 * 2^32 = 3200, 这个定点数对应的浮点就是3200 ...

谢谢你的解答,对于这个我明白了,
还有一点Q15_t的数据范围为-32768~32767,这是int16_t的, 但是如果是uint16_t的数据范围是0~65535, 矩阵数据元素如果在32768~65535, 函数arm_mat_scale_q15()就不能用来缩放矩阵了, 我试过这个函数无法应对大于32767的元素,算出的结果都不对,我换成arm_mat_scale_q31()来缩放含有大于32767的矩阵,经测试发现结果也不对,这个函数是处理数据在大于65535的矩阵

矩阵数据元素如果在32768~65535,咋缩放呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106978
QQ
发表于 2021-4-15 16:26:47 | 显示全部楼层
yeasang 发表于 2021-4-15 15:52
谢谢你的解答,对于这个我明白了,
还有一点Q15_t的数据范围为-32768~32767,这是int16_t的, 但是如果是 ...

1、函数arm_mat_scale_q31是没问题。
2、这种情况建议你直接调用浮点吧,简单省事,无需倒腾。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-13 05:06 , Processed in 0.156295 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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