STM32 DSP库CUBEMX配置+FFT频率计算

这篇具有很好参考价值的文章主要介绍了STM32 DSP库CUBEMX配置+FFT频率计算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

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

参考1文章
参考2文章


一、DSP库添加

1.1 加一个define

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

cubemx dsp库,stm32,嵌入式硬件,单片机

1.2 添加文件路径

先找到文件路径
cubemx dsp库,stm32,嵌入式硬件,单片机
cubemx dsp库,stm32,嵌入式硬件,单片机然后设置如下路径
cubemx dsp库,stm32,嵌入式硬件,单片机
双击如下并找到路径D:\STM32CubeMX\STM32Cube_FW_F4_V1.26.2\Drivers\CMSIS\Lib\ARM选择arm_cortexM4lf_math.lib
cubemx dsp库,stm32,嵌入式硬件,单片机

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<FFT_SIZE;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,这样既可以防止跳变也可以减少运算。文章来源地址https://www.toymoban.com/news/detail-590833.html

	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 输出中的最大值及其索引

总结

到了这里,关于STM32 DSP库CUBEMX配置+FFT频率计算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32cubemx定时外部模式测量10M以上频率

    本文讲解利用定时器的外部时钟功能,巧妙测量高频外部信号频率。范围可以到高达30M以上。 所需工具: 开发板:STM32F103RCT6 STM32CubeMX IDE: Keil-MDK 定时器的时钟 我们在正常使用TIM定时器的时候,在cubemx里面的时钟树里,随便点击配置,就可以选择好定时器的时钟。比如下面这

    2024年02月11日
    浏览(33)
  • 2018年电赛A题 软件部分 STM32 FFT 时域到频域 STM32cubeMX HAL

    题目要求:任意波信号发生器输出非正弦信号时,基波频率范围为50Hz~200Hz,测量电流信号基波频率,频率测量精度优于1%;测量基波及各次谐波分量的幅度(振幅值),电流谐波测量频率不超过1kHz,测量精度优于5% 。 实现方式:利用STM32单片机内置ADC对待测信号进行采集,

    2024年02月15日
    浏览(88)
  • STM32 CubeMX学习实验13:定时器输入捕获获取PWM频率

    使用定时器5作为输入捕获定时器,将通道1(PA0)设置为输入捕获,设置预分频器和计数值,这里设置为1us计数一次,最大可以捕获周期为0xFFFFFFFFus的PWM,所以一般不需要考虑溢出的问题,使能自动重装载。 使能定时器中断,选择合适的优先级,   将引脚设置下拉,保证没

    2024年03月14日
    浏览(65)
  • STM32 CubeMX 无法将 STM32H7 的最大 CPU 频率设置为 480 MHz

    使用stm32cubemx设置时钟树为480MHz时,提示 cpu clock frequency must be =200MHZ 对于STM32H7 需要CPU修订版 为 V 才能达到 480 MHz 的最大频率。 使用STM32Programmer查看芯片修订版,确认是V版本: 在STM32CubeMX PinConfiguration 界面修改RCC选项,将Product Version设置为V: 此时时钟树界面已可以设置48

    2024年02月16日
    浏览(45)
  • STM32 Cubemx配置串口收发

    最近学到了串口收发,简单记录一下注意事项。 以使用USART1为例。 USART1需配置成 异步工作模式Asynchronous 。 并且 需要使能NVIC 。 我偏向于在stm32f1xx_it.c文件中对printf进行重定向,重定向函数如下。 同时需包含头文件路径#include “stdio.h” 在工程属性Target下, 勾选Use MicroLIB

    2024年02月10日
    浏览(51)
  • STM32 cubeMX配置OLED

    本篇文章主要介绍OLED的操作和使用。 OLED一共有四根线这里我使用的是IIC的OLED显示屏。 VCC----3.3V或者5V GND-----GND SDA-----PB7 SCL-----PB6 开启IIC1的IIC功能。基础的配置在这里就不讲了,还不懂的可以看我前面的文章。 OLED cubemx的配置只需要这样设置一下即可。 这里只展示几个比较

    2023年04月20日
    浏览(32)
  • STM32硬件IIC实验(STM32CubeMx配置)

    IIC:Inter Integrated Circuit,集成电路总线,是一种 同步 串行 半双工 通信总线。 在这里贴一下硬件IIC和软件IIC的区别: 从图中可以看出两者的区别,硬件IIC比软件IIC的用法会比较复杂,但是这里如果不关注底层的实现去使用STM32CubeMx进行IIC的配置,再使用特定函数就能够实现

    2024年02月12日
    浏览(37)
  • STM32CubeMX——定时器配置

    本文将会以STM32F103C8T6为例配置定时器2定时5 ms SMT32F1系列共有8个定时器: 基本定时器(TIM6、TIM7) 通用定时器(TIM2、TIM3、TIM4、TIM5) 高级定时器(TIM1、TIM8) 16位向上、向下、向上/下自动装载计数器 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为 1~6553

    2023年04月10日
    浏览(55)
  • 基于STM32F407实现快速傅里叶变化(FFT),计算指定频率的幅值

    前言: 本人的课题是关于EIT采集系统设计,所谓的EIT,简单的说就是往人体注入特定频率的电流信号,通过采集反馈的电压信号,进而使用成像算法重构人体内部的阻抗分布。由于采集到的电压包含其它频率的热噪声,为了只保留注入频率的信号成分,需要对采集到的电压信

    2024年02月12日
    浏览(42)
  • STM32开发(18)----CubeMX配置RTC

    本章介绍使用STM32CubeMX对RTC进行配置的方法,RTC的原理、概念和特点,配置各个步骤的功能,并通过实验方式验证。 RTC (Real Time Clock),实质是一个 掉电后还继续运行的定时器。从定时器的角度来说,相对于通用定时器 TIM 外设,它十分简单,只有很纯粹的计时和触发中断的

    2023年04月27日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包