STM32 DSP库CUBEMX配置+FFT频率计算 |
您所在的位置:网站首页 › 如何确定欠采样输出的频率 › STM32 DSP库CUBEMX配置+FFT频率计算 |
文章目录
前言一、DSP库添加1.1 加一个define1.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 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |