硬汉嵌入式论坛

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

[有问必答] 为什么DSP库的arm_float_to_q31这么耗时

[复制链接]

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2020-10-10 11:09:59 | 显示全部楼层 |阅读模式
本帖最后由 oneV 于 2020-10-10 17:13 编辑

在使用G4的硬件cordic时需要先转换数据类型,使用了arm_float_to_q31、arm_q31_to_float。与标准库和DSP库还有一个其他的快速sin和cos运算做对比,结果测试出来耗时相当厉害差点惊掉了眼睛,后排查到是arm_float_to_q31耗时太厉害导致的,换用了下面这种然后就好很多了,耗时时间用DWT测试得到。是我测试姿势不对还是arm_float_to_q31就是这样的呢?


int Value_To_CORDIC31(float Value, float Coefficient)
{
    int CORDIC31;
    CORDIC31 = (int)((Value/Coefficient)*0x80000000);
    return CORDIC31;
}




回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-10-10 11:38:52 | 显示全部楼层
这种的arm_float_to_q31、arm_q31_to_float是CPU在刷。
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2020-10-10 15:43:17 | 显示全部楼层
eric2013 发表于 2020-10-10 11:38
这种的arm_float_to_q31、arm_q31_to_float是CPU在刷。

但是我使用的上面这个函数肯定也是CPU 在刷呀

而且似乎arm_q31_to_float就没有什么问题 所以没有做替换 只替换了arm_float_to_q31
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-10-10 15:55:26 | 显示全部楼层
oneV 发表于 2020-10-10 15:43
但是我使用的上面这个函数肯定也是CPU 在刷呀

而且似乎arm_q31_to_float就没有什么问题 所以没有做替 ...

你这个函数写的太精简了,精度不行。ARM的那个是批量数据处理,且考虑了浮点数的四舍五入问题。
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2020-10-10 17:12:20 | 显示全部楼层
eric2013 发表于 2020-10-10 15:55
你这个函数写的太精简了,精度不行。ARM的那个是批量数据处理,且考虑了浮点数的四舍五入问题。

你确定?
我的测试来看好像结果是要比arm_sin_f32/arm_cos_f32更接近标准库的结果的
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2020-10-10 17:23:23 | 显示全部楼层
oneV 发表于 2020-10-10 17:12
你确定?
我的测试来看好像结果是要比arm_sin_f32/arm_cos_f32更接近标准库的结果的

是的,精度要差一些。arm的是直接先做64bit,然后截出32bit。

关于这个三角函数,我之前的测评,G4的硬件三角函数并没有计算优势,唯一的优势就是硬件计算,不需要CPU参与。

【性能测评】DSP库,MDK5的AC5,AC6,IAR和Embedded Studio的三角函数性能
https://forum.anfulai.cn/forum.php?m ... id=95455&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
 楼主| 发表于 2020-10-10 18:11:44 | 显示全部楼层
eric2013 发表于 2020-10-10 17:23
是的,精度要差一些。arm的是直接先做64bit,然后截出32bit。

关于这个三角函数,我之前的测评,G4的 ...

根据ST的文档,计算sin、cos硬件cordic还是很有优势的,实测也是如此,只是做这个硬件cordic之前要把数据转换成Q31,计算完了又转回来,本身的计算确实是很快的,但加上这种转换就增加时间了,从我的测试结果来看还是硬件cordic更快一些,精度也不错。其他的比如算根号这种是完全的劣势,所以我也就没有测试。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-16 16:08 , Processed in 0.040787 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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