硬汉嵌入式论坛

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

[DSP] DSP视频教程第13期:汇编浮点库qfplib性能媲美TI的IQmath和硬件FPU,强于C库的math和ARM DSP库,适用于M0和M3(2024-10-12)

  [复制链接]

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
发表于 2024-10-12 00:36:33 | 显示全部楼层 |阅读模式
本期专题视频给大家分享一个qfplib浮点库,这个库早期周报给大家分享过,后来部分网友测试非常给力,所以我们DSP视频教程也给大家分享一期

【视频】

https://www.bilibili.com/video/BV1Te2DY1Edx/



【简介】

代码采用汇编实现,qflib的性能媲美TI的IQmath和硬件FPU,强于C库的math和ARM DSP库。并且易于使用,不需要用户手动做浮点转定点,定点转浮点之类的操作。

1、ARM DSP库的三角函数浮点是直接调用的C库实现,所以性能一般,并没有加速作用。
2、M3的qfplib和MDK的C库,IAR的C库以及GoFast库的比较,可以看到速度优势比较明显。单位时钟周期数
1.png

3、M0的qflib库和TI IQmath的浮点运算比较

如果是单纯的qflib浮点和IQmath定点比较,IQmath有优势,如果是直接操作浮点数值,IQmath就没有优势了(甚至强于IQmath,后面专门实测下),因为要做浮点转定点,定点转浮点处理函数,时间就比较长了。

而且从应用的角度来说,使用浮点库qflib操作更加便捷,不需要额外调用API做定点转浮点和浮点转定点,用户全程浮点数据操作即可

[C] 纯文本查看 复制代码
X = _IQ24(1.0f);
Y = _IQ24(1.0f);
Z = _IQ24atan2(Y, X);

W = _IQ24toF(Z);


2345.png

2345.png

4、从时钟周期上来看,媲美硬件FPU浮点计算

27.png

5、同时还提供了一个M0 tiny版的库,适合Flash容量比较小的M0内核芯片使用

234.png


【移植】
1、这个库只有一个.h头文件和一个.s汇编文件。所以移植比较简单,添加工程工程即可。
2、有问题的地方是汇编库的兼容问题,这个汇编库在GCC上使用直接添加就可以正常编译,如果是MDK上使用,请使用AC6,并在汇编Option的ASM汇编选项里面设置选择ARMCLANG AUTO

123.png



【参考资料】
1、参考案例下载
注:这里提供的例子是采用我们H7板子关闭硬件FPU使用,这种情况可以使用M3的库测试,否则运算不正确

V7-Qfplib template.7z (1.31MB)

2、源代码库下载
M0 tiny版 qfplib-m0-tiny-20200617.7z (18.04KB)
M0 全功能版 qfplib-m0-full-20240105.7z (27.49KB)
M3版 qfplib-m3-20160408.7z (23.49KB)

3、官方地址
https://www.quinapalus.com/qfplib.html

4、DSP视频教程第12期:TI开源分享IQmath DSP源码,适用于所有Cortex-M内核,本期教程做个手把手移植
https://www.armbbs.cn/forum.php?mod=viewthread&tid=119296

5、DSP视频教程第8期:DSP库三角函数,C库三角函数和硬件三角函数的性能比较,以及与Matlab的精度比较
https://www.armbbs.cn/forum.php?mod=viewthread&tid=112675








回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
 楼主| 发表于 2024-10-12 01:03:16 | 显示全部楼层
更新完毕
回复

使用道具 举报

81

主题

490

回帖

733

积分

金牌会员

积分
733
发表于 2024-10-12 07:24:49 | 显示全部楼层
为何它能做的比arm公司的dsp库还专业啊
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
 楼主| 发表于 2024-10-12 08:43:43 | 显示全部楼层
tangqianfeng 发表于 2024-10-12 07:24
为何它能做的比arm公司的dsp库还专业啊

ARM DSP的三角函数没有做加速。
回复

使用道具 举报

81

主题

490

回帖

733

积分

金牌会员

积分
733
发表于 2024-10-12 08:54:46 | 显示全部楼层
eric2013 发表于 2024-10-12 08:43
ARM DSP的三角函数没有做加速。

果断收藏
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2024-10-12 09:51:03 | 显示全部楼层
如果使用MDK低一点的版本,比如5.18,请问要怎么设置才可以使用这个库
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
 楼主| 发表于 2024-10-12 10:15:50 | 显示全部楼层
mythor 发表于 2024-10-12 09:51
如果使用MDK低一点的版本,比如5.18,请问要怎么设置才可以使用这个库

最低得用5.30, 要不AC6的汇编选项里面没有auto select
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2024-11-2 08:53:59 | 显示全部楼层
又一次提升M0的可使用性!硬汉哥威武!!!
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2024-11-20 09:43:00 | 显示全部楼层
现在在AC6下浮点性能测试下来没有自带的快,不知道为什么 1732066763937.png 1732066788712.png
回复

使用道具 举报

5

主题

102

回帖

117

积分

初级会员

积分
117
发表于 2024-11-21 12:05:37 | 显示全部楼层
本帖最后由 calvinxxw 于 2024-11-21 12:09 编辑

为什么我在MDK AC5 AC6 开最高优化,用DWT计数器测得sin()执行周期在120左右,完全不是60多,乘法周期是80,不是36。最上面的数据有没有准确的测试条件,测试代码是
[C] 纯文本查看 复制代码
while (1)
  {
    /* USER CODE END WHILE */
    a = 1.1;
    b = 1.2;
    c = 3.1415926;

    start_timer();
    sinA = sin(a);
    cycle1 = get_cycles();

    start_timer();
    sinA = qfp_fsin(a);
    cycle2 = get_cycles();

    cosB = qfp_fcos(b);
    tanC = qfp_ftan(c);
    /* USER CODE BEGIN 3 */
  }
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
 楼主| 发表于 2024-11-22 09:27:05 | 显示全部楼层
shangs.. 发表于 2024-11-20 09:43
现在在AC6下浮点性能测试下来没有自带的快,不知道为什么

这个和F4系列的硬件FPU比浮点加减乘除不行,硬件浮点几乎一个周期就完成了。跟硬件浮点比的话,三角函数可以比一下。

另外这个库主要还是用于没有硬件浮点的MCU上比较合适。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
 楼主| 发表于 2024-11-22 09:28:05 | 显示全部楼层
calvinxxw 发表于 2024-11-21 12:05
为什么我在MDK AC5 AC6 开最高优化,用DWT计数器测得sin()执行周期在120左右,完全不是60多,乘法周期是80 ...

用AC5测试下,AC6下使用DWT有时候统计不准。
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2024-11-22 17:48:17 | 显示全部楼层
eric2013 发表于 2024-11-22 09:27
这个和F4系列的硬件FPU比浮点加减乘除不行,硬件浮点几乎一个周期就完成了。跟硬件浮点比的话,三角函数 ...

我这个没有硬件FPU
回复

使用道具 举报

5

主题

102

回帖

117

积分

初级会员

积分
117
发表于 2024-11-23 09:45:45 | 显示全部楼层
eric2013 发表于 2024-11-22 09:28
用AC5测试下,AC6下使用DWT有时候统计不准。

AC5 AC6各种优化以及不开优化,结果都差不多,因为汇编代码是固定不变的。反正比官方宣传执行周期长一倍时间。优势在于除法和三角函数运算,确实比标准库快得多,而且比IQmath方便。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
 楼主| 发表于 2024-11-23 10:22:52 | 显示全部楼层
calvinxxw 发表于 2024-11-23 09:45
AC5 AC6各种优化以及不开优化,结果都差不多,因为汇编代码是固定不变的。反正比官方宣传执行周期长一倍 ...

加减乘除的地方,还可以优化的测试的地:不同优先级下测试,同时for循环测试500次求平均,for循环代码注意展开,比如16个计算为一组。

回复

使用道具 举报

81

主题

490

回帖

733

积分

金牌会员

积分
733
发表于 2024-11-26 22:42:54 | 显示全部楼层
本帖最后由 tangqianfeng 于 2024-11-26 23:53 编辑

版主,把qfplib移值到iar下要如何处理啊,编译不通过...
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2024-11-26 23:02:07 | 显示全部楼层
STM32G030C8,MDK539,AC6编译器,armclang(Auto Select),编译报错...
Snipaste_2024-11-26_23-00-15.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
 楼主| 发表于 2024-11-27 08:30:05 | 显示全部楼层
傲寒 发表于 2024-11-26 23:02
STM32G030C8,MDK539,AC6编译器,armclang(Auto Select),编译报错...

这个地方修改没


回复

使用道具 举报

81

主题

490

回帖

733

积分

金牌会员

积分
733
发表于 2024-11-27 09:18:00 | 显示全部楼层

版主,把qfplib移值到iar下要如何处理啊,编译不通过...好些错误。。。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
 楼主| 发表于 2024-11-28 08:26:24 | 显示全部楼层
tangqianfeng 发表于 2024-11-27 09:18
版主,把qfplib移值到iar下要如何处理啊,编译不通过...好些错误。。。。

这个在IAR下,我也没测试过。
回复

使用道具 举报

81

主题

490

回帖

733

积分

金牌会员

积分
733
发表于 2024-11-28 08:59:28 | 显示全部楼层
本帖最后由 tangqianfeng 于 2024-11-28 09:35 编辑
eric2013 发表于 2024-11-28 08:26
这个在IAR下,我也没测试过。

好象iar下,汇编文件不符合iar汇编,
另外试了下,qfplib-m3在mdk中编译能通过,但qfplib-m0-full在mdk中编译不通过
回复

使用道具 举报

81

主题

490

回帖

733

积分

金牌会员

积分
733
发表于 2024-11-28 11:11:09 | 显示全部楼层
需要使用arm gcc编译器,   附上已经编译好的lib文件,

qfplib-m0-full.rar

31.44 KB, 下载次数: 9

回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2024-11-28 18:08:51 | 显示全部楼层
tangqianfeng 发表于 2024-11-28 08:59
好象iar下,汇编文件不符合iar汇编,
另外试了下,qfplib-m3在mdk中编译能通过,但qfplib-m0-full在mdk ...

一样,m3没问题,m0编译不通过...
回复

使用道具 举报

81

主题

490

回帖

733

积分

金牌会员

积分
733
发表于 2024-11-29 07:34:58 | 显示全部楼层
傲寒 发表于 2024-11-28 18:08
一样,m3没问题,m0编译不通过...

需要用gcc编译,楼上我已上传编译好的库
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
 楼主| 发表于 2024-11-29 08:08:58 | 显示全部楼层
tangqianfeng 发表于 2024-11-28 11:11
需要使用arm gcc编译器,   附上已经编译好的lib文件,

谢谢分享。
回复

使用道具 举报

81

主题

490

回帖

733

积分

金牌会员

积分
733
发表于 2024-11-29 09:34:39 | 显示全部楼层
本帖最后由 tangqianfeng 于 2024-11-29 10:27 编辑

测下来,浮点运算确实速度快。。。


test = qfp_fadd(1.256732f,3.5f);//55 cycles
    const1 = 1.256732f;
    const2 = 3.5f;
    test1 = const1 + const2;//54 cycles
   
    test = qfp_fmul(1.2356f,3.5267f);//58 cycles
    const1 = 1.2356f;
    const2 = 3.5267f;
    test1 = const1 * const2;//57 cycles
   
    test = qfp_fdiv(2567.32f,3.57824f);//71 cycles
    const1 = 2567.32f;
    const2 = 3.57824f;
    test1 = const1 / const2;//178 cycles
   
    test = qfp_fsin(0.52359877f);//414 cycles
    test1 = sinf(0.52359877f);//612 cycles
   
    test = qfp_fln(234.15683f);//224 cycles
    test1 = logf(234.15683f);//1119 cycles
   
    test = qfp_fexp(3.25935f);//192 cycles
    test1 = expf(3.25935f);//1253 cycles
   
    test = qfp_fsqrt(243.782495);//60 cycles
    test1 = sqrtf(243.782495);//191 cycles

回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
 楼主| 发表于 2024-11-30 06:42:49 | 显示全部楼层
tangqianfeng 发表于 2024-11-29 09:34
测下来,浮点运算确实速度快。。。

三角函数这块,这个函数还是有些优势的。
回复

使用道具 举报

0

主题

13

回帖

13

积分

新手上路

积分
13
发表于 2025-1-18 23:05:54 | 显示全部楼层
tangqianfeng 发表于 2024-11-28 11:11
需要使用arm gcc编译器,   附上已经编译好的lib文件,

大哥,qfplib-m3由ARM GCC编译生成的.A库文件能否也上传一下?直接在MDK里添加.S文件编译好像一堆错误,改为AC6和改asm为auto也是一样。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
115434
QQ
 楼主| 发表于 2025-1-20 06:21:26 | 显示全部楼层
ldh2020 发表于 2025-1-18 23:05
大哥,qfplib-m3由ARM GCC编译生成的.A库文件能否也上传一下?直接在MDK里添加.S文件编译好像一堆错误, ...

这个帖子里面有lib方式的

大家试试浮点库Qfplib测试效果
https://www.armbbs.cn/forum.php? ... 1317&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 22:00 , Processed in 0.688104 second(s), 38 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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