STM32 DSP库CUBEMX配置+FFT频率计算
创始人
2024-11-10 06:40:41
0

文章目录

  • 前言
  • 一、DSP库添加
    • 1.1 加一个define
    • 1.2 添加文件路径
    • 1.3 主函数
  • 二、FFT运算求频率
    • 2.1 初始版本
    • 版本2
  • 总结


前言

使用DSP中的函数加快计算。
本文首先讲述如何通过添加dsp库。
再讲述使用DSP库进行实数FFT运算。(FFT运算用到了前面讲述的STM32CubeMX-ADC hal库 3定时器触发)

参考1文章
参考2文章


一、DSP库添加

1.1 加一个define

,ARM_MATH_CM3//F1是M3,F4是M4,H7是M7 

在这里插入图片描述

1.2 添加文件路径

先找到文件路径
在这里插入图片描述
在这里插入图片描述然后设置如下路径
在这里插入图片描述
双击如下并找到路径D:\STM32CubeMX\STM32Cube_FW_F4_V1.26.2\Drivers\CMSIS\Lib\ARM选择arm_cortexM4lf_math.lib
在这里插入图片描述

1.3 主函数

包含头文件

#include "arm_math.h" #include "arm_const_structs.h" 

进行编译

二、FFT运算求频率

FFT运算简单理解就是从时域来求解频域的问题。
对于FFT的思路和代码参考这位大佬写的。
那我们根据他的步骤,将文章简化并复现代码。(在复刻的过程中发现了一些问题,所以不完全按照上面大佬的文章)
这篇大佬讲述了arm_rfft_fast_f32的用法
这里还列出一些其他参考。
参考1
参考2
参考3
参考4,,,这个用的不是实数而是complex。所以稍微看下
cmsis官网

2.1 初始版本

宏定义和全局变量

#define adc_SIZE 2048*2// ADC 采样大小的定义 uint32_t adcConvertValue[adc_SIZE]={0};// 存放 ADC 采样数据的数组 uint8_t flag=0;// 标记位,用于标识 ADC 采样是否完成 float32_t frequency ;// 用于存放计算结果的频率变量 // FFT 相关参数的定义 #define FFT_SIZE 2048 #define FFT_LEN FFT_SIZE  #define SAMPLING_FREQUENCY 100000 float32_t inputSignal[FFT_SIZE*2];// FFT 输入信号数组 float32_t fftOutput[FFT_SIZE];// FFT 输出数组 uint32_t index_;// 存放 FFT 输出中最大值的索引 

运算函数

void fftCalculate(void)// FFT 计算函数 {     arm_cfft_f32(&arm_cfft_sR_f32_len2048, inputSignal, 0, 1);// 执行 FFT 计算     arm_cmplx_mag_f32(inputSignal, fftOutput, FFT_LEN);// 计算 FFT 输出的幅度     index_ = 0;// 查找 FFT 输出中的最大值     float32_t maxValue = fftOutput[1]; //    for (uint32_t i = 1; i < FFT_LEN/2; i++) //    { //        if (fftOutput[i] > maxValue) //        { //            maxValue = fftOutput[i]; //            index = i; //        } //    } 		arm_max_f32(&fftOutput[1], FFT_LEN, &maxValue, &index_); // 使用 arm_max_f32 函数快速找到 FFT 输出中的最大值及其索引     frequency = (float32_t)index_ * (float32_t)SAMPLING_FREQUENCY / (float32_t)FFT_SIZE;// 根据最大值的索引计算信号的频率  } 

主函数

	HAL_TIM_Base_Start(&htim3);//启动定时器3 	HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adcConvertValue,adc_SIZE);//启动ADC的DMA传输,采200点 

主循环

  while (1)   {     /* USER CODE END WHILE */     /* USER CODE BEGIN 3 */  		if(flag==1) 		{ 			flag=0; 			for(int j=0;j 				inputSignal[j*2]=(adcConvertValue[j])*3.3f/4095.0f;//12位采样数字值对应为0-3.3伏 				inputSignal[j*2+1]=0;//交替插零,添加数据的虚部 			}  			fftCalculate(); //			HAL_Delay(2000); 			HAL_TIM_Base_Start(&htim3);	//重新启动定时器3 			HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adcConvertValue,adc_SIZE);//重新开始下一轮采集	 		}			   } 

版本2

文件

根据抽样定理我们可以知道,采样率要是最高频率的两倍,所以对文中的一些东西进行了优化。
就是将本来size的位置都设置为/2,这样既可以防止跳变也可以减少运算。

	float32_t fftOutput[FFT_SIZE/2];// FFT 输出数组 
    arm_cmplx_mag_f32(inputSignal, fftOutput, FFT_LEN/2);// 计算 FFT 输出的幅度     arm_max_f32(&fftOutput[1], FFT_LEN/2, &maxValue, &index_); // 使用 arm_max_f32 函数快速找到 FFT 输出中的最大值及其索引 

总结

相关内容

热门资讯

3分钟了解!小程序挖坑辅助器!... 3分钟了解!小程序挖坑辅助器!总是一直都是有辅助app(有挂技巧)-哔哩哔哩1、在小程序挖坑辅助器插...
5分钟了解!樱花之盛辅助软件下... 5分钟了解!樱花之盛辅助软件下载!都是有辅助软件(真实有挂)-哔哩哔哩1、打开软件启动之后找到中间准...
第九分钟了解!爱玩联盟辅助软件... 第九分钟了解!爱玩联盟辅助软件!本来一直总是有辅助脚本(真是有挂)-哔哩哔哩1、每一步都需要思考,不...
四分钟了解!花花生活圈游戏辅助... 四分钟了解!花花生活圈游戏辅助!竟然是有辅助教程(有挂教程)-哔哩哔哩1、点击下载安装,花花生活圈游...
两分钟了解!欢乐对决破解版!一... 两分钟了解!欢乐对决破解版!一直存在有辅助攻略(果真有挂)-哔哩哔哩1、让任何用户在无需欢乐对决破解...
4分钟了解!三哥玩摆头辅助!竟... 4分钟了解!三哥玩摆头辅助!竟然一直都是有辅助攻略(有挂教学)-哔哩哔哩1、三哥玩摆头辅助辅助器安装...
7分钟了解!吉祥填大坑游戏攻略... 7分钟了解!吉祥填大坑游戏攻略!总是存在有辅助方法(真的有挂)-哔哩哔哩1、玩家可以在吉祥填大坑游戏...
围绕透视问题!蜀山四川辅助脚本... 围绕透视问题!蜀山四川辅助脚本多少钱"详细辅助神器"总是确实有挂(哔哩哔哩)1、玩家可以在蜀山四川辅...
第七分钟了解!心悦踢辅助软件!... 第七分钟了解!心悦踢辅助软件!竟然是真的有辅助软件(有挂秘诀)-哔哩哔哩在进入心悦踢辅助软件软件靠谱...
透视科技!xpoker透视辅助... 透视科技!xpoker透视辅助"普及辅助神器"都是存在有挂(哔哩哔哩)1、完成xpoker透视辅助有...