+使用ARM的DSP库
STM32F4 采用 Cortex-M4 内核,相比 Cortex-M3 系列除了内置硬件 FPU 单元,在数字信号处理方面还增加了 DSP 指令集,支持诸如单周期乘加指令(MAC),优化的单指令多数据指令(SIMD),饱和算数等多种数字信号处理指令集。相比 Cortex-M3,Cortex-M4 在数字信号处理能力方面得到了大大的提升。Cortex-M4 执行所有的 DSP 指令集都可以在单周期内完成,而Cortex-M3 需要多个指令和多个周期才能完成同样的功能。STM32F4 的 DSP 库源码和测试实例在 ST 提供的标准库:STM32F4xx_DSP_StdPeriph_Lib_V1.7.1里面就有
DSP_Lib 源码包的 Source 文件夹是所有 DSP 库的源码,Examples 文件夹是相对应的一些测试实例。这些测试实例都是带 main 函数的,也就是拿到工程中可以直接使用。
我们可以不用去ST官网下载DSP库文件,因为KEIL安装目录下面会自带这些DSP库函数,在XX:\Keil_v5\ARM\CMSIS下面,如下图所示:
所有DSP函数都是以*.lib提供的,总共有4个文件:
arm_cortexM0l_math.lib (Cortex-M0 小端模式)
arm_cortexM3l_math.lib (Cortex-M3 小端模式)
arm_cortexM4l_math.lib (浮点 Cortex-M4 大端模式)
arm_cortexM4lf_math.lib (浮点 Cortex-M4 小端模式)
我们得根据所用 MCU 内核类型以及端模式来选择符合要求的.lib 文件,我们所用的STM32F4 属于 CortexM4F 内核,小端模式,应选择:arm_cortexM4lf_math.lib(浮点 Cortex-M4小端模式)。
在工程中添加库文件,如下图所示:
在程序中添加头文件:
#include"math.h"
#include"arm_math.h"
还要添加全局宏定义,
1,__FPU_USED
2,__FPU_PRESENT
3,ARM_MATH_CM4
4,__CC_ARM
5,ARM_MATH_MATRIX_CHECK
6,ARM_MATH_ROUNDING
在KEIL里面C/C++选项卡,然后在 Define 里面进行设置,如下图
至此可以使用ARM的DSP库函数了,有很多人找不到DSP库函数说明文档,所以有些人使用起来会出错;其实在KEIL5安装目录下面有帮助文件,在
XX:\Keil_v5\ARM\CMSIS\Documentation\DSP\html
DSP库包括以下几个系列:
BasicMathFunctions
基本数学函数:提供浮点数的各种基本运算函数,如向量加减乘除等运算。
CommonTables
arm_common_tables.c 文件提供位翻转或相关参数表。
ComplexMathFunctions
复杂数学功能,如向量处理,求模运算的。
ControllerFunctions
控制功能函数。包括正弦余弦,PID电机控制,矢量 Clarke变换,矢量 Clarke 逆变换等。
FastMathFunctions
快速数学功能函数。提供了一种快速的近似正弦,余弦和平方根等相比 CMSIS 计算库要快
的数学函数。
FilteringFunctions
滤波函数功能,主要为 FIR和 LMS(最小均方根)等滤波函数。
MatrixFunctions
矩阵处理函数。包括矩阵加法、矩阵初始化、矩阵反、矩阵乘法、矩阵规模、矩阵减法、
矩阵转置等函数。
StatisticsFunctions
统计功能函数。如求平均值、最大值、最小值、计算均方根 RMS、计算方差/标准差等。
SupportFunctions
支持功能函数,如数据拷贝,Q格式和浮点格式相互转换,Q 任意格式相互转换。
TransformFunctions
变换功能。包括复数 FFT(CFFT)/复数 FFT 逆运算(CIFFT)、实数 FFT(RFFT)/实数
FFT 逆运算(RIFFT)、和 DCT(离散余弦变换)和配套的初始化函数。
下面测试一下复数求模运算。函数定义如下:
void arm_cmplx_mag_f32(float32_t * pSrc,float32_t * pDst, uint32_t numSamples)
参数定义:
*pSrcA points to the first input vector
*pSrcB points to the second input vector
numSamples number of complex samples in each vector
*realResult real part of the result returned here
*imagResult imaginary part of the result returned here
其中pSrc代表输入复数数据(第一个数实部、第一个数虚部、……)
pDst代表结果输出(第一个数模值、第二个数模值……)
numSamples代表需要做几个复数求模数据个数
用matlab直接生成复数数据和结果数据(用来做对比使用)
复数数据是信号的FFT结果,因为这些在实际项目中也会经常使用FFT求模。
在Keil中用arm_cmplx_mag_f32进行计算和data_abs进行对比,把结果通过debug printf输出,可以看出结果相当精确。
将KEIL计算结果发送到串口,然后和Matlab中数据进行对比。
虽然没看懂,但是觉得和牛逼。