在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
▲ 图1.3.1 计算sine函数对比普通数学库与DSP库的执行速度
下面再对比一下浮点开方数学运算。使用的方法是一样的。通过示波器测量 普通数学库函数和 DSP数学库函数之间的差别。普通的数学库,计算一个浮点数开方需要 12.52 微秒,DSP数学库中的开方运算,只需要 4.9微秒。比普通的数学库增加了不到 3倍。这说明不同的数学运算,DSP提速不一样。
● 开方运算对比:
math
:12.52us
DSP
:4.9us
▲ 图1.3.2 对比开方运算算法函数速度的差异
最后对比一下普通的整数位移操作。对128个数字中的整型数往左位移,对比普通的 C 语言位移所需要的时间以及DSP 库中位移函数运算时间。C语言位移消耗了大约 24微秒,DSP 库函数消耗了 16.65微秒,速度大约快了 三分之一左右。
▲ 图1.3.3 位移操作
● 位移两位对比:
C
:24us
DSP
:16.65us
本文对比了 CMSIS DSP数学库中的部分函数速度,都比使用普通的C语言以及math 库中函数速度有所提高,三角函数提高了四倍左右,普通的位移操作只提高了三分之左右。