我这里通过调用DSP库里的FFT干系函数实现1024点的FFT运算,样点数据及运算结果均为浮点数。
上图中A区代码是做样点数据准备,B区代码完成FFT运算。我们来一起看看基本的配置以及不启用硬件浮点单元和启用硬件浮点单元实行B区代码的韶光上的差别。

程序里要调用一些数学函数,而这些数学函数每每集成在相应的数学函数库里。我们选用ARM公司的DSP数学库,该库系专门针对AMR核芯片及指令系统而组织的代码,比较IDE自带的通用数学函数库会更优化、高效。
目前该DSP数学库包括基本数学函数、复数数学函数、滤波函数、矩阵函数等几大块,详细内容可以去ARM网站阅读比较方便。【可点击左下方原文链接前往】
我们开拓时,这些文件详细在哪里呢?在各个编译环境的安装目录下都不难找到。不妨看看ARM keil MDK环境下它们所在位置。
上面我们看到的是DSP库源文件所在目录,在另一个目录存放着基于不同内核、不同存储端格式以及是否支持硬件浮点单元而编译出来的库文件。我们在开拓时,直接添加得当的库文件进工程即可,不必逐个查找源文件来添加。下图便是可以用于ARM MDK环境的库文件。【对付不同IDE,库文件名后缀略有差异】
这里以用于M4内核的DSP数学函数库稍作阐明,详见下面表格。
从上表可以看出,基于Cortex M4内核芯片进行DSP运算可以能用到的库有四个,但详细到STM32基于M4内核的芯片可以选用的只有两个,即xxxM4l_math.lib或xxxM4lf_math.lib,由于STM32芯片的存储设计都是小端模式。所谓小端模式,大略点说便是指多字节数据在内存中存储时,按照低位字节对应地址低位来存放,反之则为大端模式。
在上面截图中,我还截取了对应M0内核可用的DSP数学库,它为什么只有两个?这是由于M0内核没有FPU硬件单元,不存在FPU是否启用的可选情形。
现在就利用STM32F429开拓板,基于开篇的截图代码进行测试,并用定时器丈量下面实行代码在不该用FPU和利用FPU分别所花费的韶光,并打算二者的韶光比。【注:STM32F429芯片自身是带硬件FPU的】
必要的配置和文件包含及添加,如下表所示:
基于上面条件实行FFT运算代码,不该用FPU和利用FPU的韶光比为16。
采取相似的条件,基于IAR环境对相同功能代码段进行测试,不该用FPU和利用FPU的韶光比为11。
关于这个韶光比,除了跟是否利用微库、优化等级、浮点精度等有关外,跟你所选取的测试代码也有很大关系,由于有些代码只能靠CPU实行的话,开不开FPU硬件单元对这部分韶光是没有影响的。不难明得,被测试代码里只能靠CPU运行的代码占比越多,上面的这个比值就会越小。一样平常来说,我们不必太过纠结这个值的大小,知道有这个硬件浮点单元,既减轻了CPU负荷,又可以提升打算速率就好。
其余,我们在做DSP干系运用时,把稳添加的DSP库既要跟所用芯片匹配,还要跟IDE里的配置匹配。还是以上面测试代码为例,本意是想启用FPU,结果添加的DSP库却是基于不该用FPU硬件的数学库,那会怎么样呢?
本该当添加arm_cortexM4lf_math.h的,结果弄错了。如果按照上面条件构建ARM MDK工程,一起编译下来没有任何警告或缺点提示。程序也能流畅运行,FFT运算结果彷佛也出来了。
但仔细查当作果,跟之前精确配置的运行结果明显不一样。履历证核对,这次运算结果是错的。为此我特意添加一行打算90°的正弦值代码,它算出来结果竟然是1.5!
逆天了。
如果说在不知情的情形下这一起下来,估计要被摧残一顿了。毕竟很多数学函数结果凡人是无法一眼能看出对错的,纵然看出错了若没未及时想到库问题的话,恐怕还得折腾折腾。
针对这种环境,基于同样代码于IAR环境下测试,情形比较ARM MDK貌似要好点。至少编译时有警告提示,提示引用冲突之类的。打算结果没有MDK的那么具有暗藏性【至少对付本次测试是这样】,基本是清一色的0,颇有冲击效果!
当然,此时让它打算90°的正弦值结果也是明显错的。
觉得上,这种环境下,利用IAR时挖的坑彷佛轻微浅些,更随意马虎让人警觉疑惑哪里出问题了。
好,就分享到这里,祝君好运!










