DSP算法库到底有多快?

一、前言

在ARM单片机开发中,有CMSIS中提供的DSP数字信号处理函数库。这个函数库中包括有基本的数据函数、快速数学运算、复数运算、滤波器、矩阵、变换、点击控制、统计、支持函数,以及插值函数等,涵盖了大多数工程应用中的算法。

我有一个疑问,使用CMSIS中的DSP函数,与普通的数学库中的函数,究竟能够有多大的提速空间?

下面,就对比一下开方运算以及sine三角函数的运算速度,这样便能够将来在不同场合下选择使用不同的数学库。

图片

二、测试方法

测试硬件平台是昨天制作的STM32F103单片机,这是M3内核的ARM单片机。这个单片机比较简单和流行,看一下它的数学计算速度,利用一个端口输出高低电平表示计算所需要的时间。

图片

为了使用DSP数据库,需要在IAR开发环境中,对工程文件选项General中的连接库设置中,选择CMSIS DSP。在程序中增加arm math头文件即可。测试程序大循环中,执行普通的sine三角函数计算,前后设置LED输出管脚电平,因此输出高电平脉冲宽度表示sine函数计算时间。中间相隔1ms之后,再执行DSP中的sine函数,也使用LED管脚的高电平指示执行时间。后面通过示波器,便可直观对比两个函数执行速度的差异性了。

图片

图片

三、测试结果

使用示波器,测量LED管脚的波形,可以看到前后两个脉冲信号。前面的信号是普通数学库中的sine函数,时间较长,后面是DSP库中的sine函数,明显时间短。这说明了对于M3内核的单片机,使用DSP数学库的效率还是非常高的。

需要说明的是,此时单片机系统时钟为64MHz。为了更加精确的对比两个数学库执行时间,将波形展开。利用示波器的光标测量功能,测试脉冲的时间宽度。普通sine函数,计算时间为41.7微秒,测量DSP sine函数,执行时间只有10微秒,通过对比可以知道,对于三角函数sine计算,DSP算法库比起普通的数学函数要快四倍左右。

图片

  ●  sine运算对比:
   math:41.7us
   DSP:10us

图片

▲计算sine函数对比普通数学库与DSP库的执行速度

下面,再对比一下浮点开方数学运算,使用的方法是一样的,通过示波器测量 普通数学库函数和DSP数学库函数之间的差别。普通的数学库,计算一个浮点数开方需要12.52微秒,DSP数学库中的开方运算,只需要4.9微秒,比普通的数学库增加了不到3倍。这说明不同的数学运算,DSP提速不一样。

图片

  ●  开方运算对比:
   math:12.52us
   DSP:4.9us

图片

▲对比开方运算算法函数速度的差异

最后,对比一下普通的整数位移操作。对128个数字中的整型数往左位移,对比普通的C语言位移所需要的时间以及DSP库中位移函数运算时间。C语言位移消耗了大约24微秒,DSP库函数消耗了16.65微秒,速度大约快了三分之一左右。

图片

图片

▲位移操作

  ●  位移两位对比:
   C:24us
   DSP:16.65us

四、总结

本文对比了CMSIS DSP数学库中的部分函数速度,都比使用普通的C语言以及math库中函数速度有所提高,三角函数提高了四倍左右,普通的位移操作只提高了三分之左右。

### DSP库中的PID算法与自定义实现的PID算法性能对比 #### 运行速度分析 DSP(Digital Signal Processor)库通常由硬件厂商提供,经过高度优化以满足实时信号处理的需求。这类库中的PID算法往往利用底层硬件特性进行加速,例如SIMD指令集、流水线并行化以及专用寄存器操作等[^1]。因此,在大数情况下,DSP库中的PID算法具有更高的执行效率。 相比之下,自定义实现的PID算法可能缺乏类似的优化手段。开发者需要手动调整代码结构来提升性能,这不仅增加了开发难度,还可能导致运行速度不及DSP库版本。然而,如果开发者能够充分利用现代编译器的优化选项或者采用特定的语言特性(如C++模板元编程),则有可能缩小两者之间的差距[^2]。 以下是两种实现方式的一个简单伪代码示例: ```cpp // 自定义实现的PID算法 float PID(float error, float Kp, float Ki, float Kd, float dt){ static float integral = 0; static float derivative = 0; static float prev_error = 0; integral += error * dt; // 积分项计算 derivative = (error - prev_error)/dt;// 微分项计算 prev_error = error; return Kp*error + Ki*integral + Kd*derivative; } ``` 对于上述函数而言,尽管逻辑清晰易懂,但在实际部署过程中可能会因为浮点运算次数较而影响整体表现。反观DSP库内部实现,则很可能通过减少不必要的中间变量存储等方式进一步降低开销[^1]。 另外值得注意的是,当涉及到核处理器或线程环境下的并发调用时,标准软件包或许已经内置锁机制或者其他同步措施保障数据一致性;而对于手写的解决方案来说,则需额外考虑此类因素以免引发竞争条件等问题从而拖慢程序进度。 #### 结论 综上所述,除非具备深厚专业知识并且投入大量时间精力去打磨细节之处外,一般情形下选用现成可用且经验证可靠的第三方类库会更加明智合理一些——毕竟它们背后凝聚着众专家智慧结晶的同时也经历了无数次实战考验得以不断完善改进直至今日呈现出如此高效稳定的状态出来供人们便捷使用而已罢了! 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值