FPU:浮点运算单元
Cortex-M7内核支持双精度浮点,可以大大加速浮点运算的处理速度。
开启后,小数的运算自动使用FPU进行运算。
FPU开启:
void SystemInit (void)
{
#if defined (DATA_IN_D2_SRAM)
__IO uint32_t tmpreg;
#endif /* DATA_IN_D2_SRAM */
/* FPU settings ------------------------------------------------------------*/
#if (__FPU_PRESENT == 1) && (__FPU_USED == 1)
SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2))); /* set CP10 and CP11 Full Access */
#endif
具体开启代码:写在初始化代码(看该条指令是否为灰色,可判断是否开启)
SCB->CPACR |= ((3UL << (10*2))|(3UL << (11*2))); /* set CP10 and CP11 Full Access */
开启的两个标志位:
__FPU_PRESENT默认默认就为1
开启FPU中的__FPU_USED标志位的地方。
使用:
就正常写计算式,计算时能自动调用FPU计算小数
其它:
选择更加高的优化等级,并且全部编译,可再次提高运算速度。
实际对比:
无FPU+优化等级0:900.4ms
FPU+优化等级0:100.4ms
FPU+优化等级3:55.4ms
DSP:数字信号处理
DSP单元集成了一批专用的指令集(主要是SMID指令和快速MAC乘积累加指令),可以加速数字信号处理的执行速度。
Keil添加库后,利用DSP库里的运算函数进行运算
ST将这些库封装成.lib
不同内核的.lib的选择
相关头文件
添加对应的宏
STM32H750xx,USE_HAL_DRIVER,ARM_MATH_DSP,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING
主要是后面几个:
,ARM_MATH_DSP,ARM_MATH_MATRIX_CHECK,ARM_MATH_ROUNDING
使用:
添加对应的头文件,然后调用对应的函数。
1.添加头文件
#include "arm_math.h"
2.调用运算函数:
/* 使用 DSP 优化的 sin, cos 函数, 输入角度,传出值*/
cosx = arm_cos_f32(angle);
sinx = arm_sin_f32(angle);
/* FFT 算法*/
/* Deprecated */
arm_status arm_cfft_radix4_init_f32(arm_cfft_radix4_instance_f32 * S,
uint16_t fftLen, uint8_t ifftFlag, uint8_t bitReverseFlag);
/* Deprecated */
void arm_cfft_radix4_f32(const arm_cfft_radix4_instance_f32 * S,float32_t * pSrc);
/**
* @brief Floating-point complex magnitude
* @param[in] pSrc points to the complex input vector
* @param[out] pDst points to the real output vector
* @param[in] numSamples number of complex samples in the input vector
*/
void arm_cmplx_mag_f32(float32_t * pSrc, float32_t * pDst,uint32_t numSamples);
第一个函数 arm_cfft_radix4_init_f32,用于初始化 FFT 运算相关参数,其中: fftLen 用于指
定 FFT 长度(16/64/256/1024/4096),本章设置为 1024; ifftFlag 用于指定是傅里叶变换(0)还是
反傅里叶变换(1),本章设置为 0; bitReverseFlag 用于设置是否按位取反,本章设置为 1;最后,
所有这些参数存储在一个 arm_cfft_radix4_instance_f32 结构体指针 S 里面。
第二个函数 arm_cfft_radix4_f32 就是执行基 4 浮点 FFT 运算的, pSrc 传入采集到的输入信
号数据(实部+虚部形式),同时 FFT 变换后的数据,也按顺序存放在 pSrc 里面, pSrc 必须大
于等于 2 倍 fftLen 长度。另外, S 结构体指针参数是先由 arm_cfft_radix4_init_f32 函数设置好,
然后传入该函数的。
第三个函数 arm_cmplx_mag_f32 用于计算复数模值,可以对 FFT 变换后的结果数据,执行
取模操作。 pSrc 为复数输入数组(大小为 2*numSamples)指针,指向 FFT 变换后的结果; pDst
为输出数组(大小为 numSamples)指针,存储取模后的值; numSamples 就是总共有多少个数
据需要取模。
通过这三个函数,我们便可以完成 FFT 计算,并取模值。
除此之外:还能计算PID等,填入参数就行。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/JasonKyro/article/details/134775772
|