IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32F407 DSP+FPU进行FFT变换(2) -> 正文阅读

[嵌入式]STM32F407 DSP+FPU进行FFT变换(2)

STM32F407 DSP+FPU进行FFT变换

接着上一篇继续,要用FFT运算的话,F4有FPU和DSP库,可以很方便让我们去对数据进行傅氏变换。首先得配置好DSP库和FPU。

配置DPS库和FPU

cubeMX一般是默认配置开启FPU,但是DSP库需要自己去添加。这里添加方法是我和老师摸索出来的,可能不适用所有人。

FPU开启:点仙女棒在这里插入图片描述
,然后可以看到在这里插入图片描述
然后选择Single Precision,就开启了FPU。

添加DSP库:点小绿标在这里插入图片描述
再展开CMSIS勾选DSP在这里插入图片描述
,添加三个头文件 #include <math.h>#include “arm_math.h”#include “arm_const_structs.h”,最后点击仙女棒选择C/C++,在预处理符号定义栏添加宏ARM_MATH_CM4,不同信号使用不同的宏,至此软硬件配置完毕。

查看DSP库

在使用前我们需要DSP库里面有什么东西,所以这里要用到上一篇的推荐cubeMX官方文档。我的DSP库索引文档在C:\Users\Administrator\STM32Cube\Repository\STM32Cube_FW_F4_V1.24.2\Drivers\CMSIS\docs\DSP\html\index.html
在这里插入图片描述

这里我们查找到需要FFT变换函数和复数点积函数,函数名为

在这里插入图片描述

             --------------------------------分隔符------------------------------

在这里插入图片描述

简单说明ARM_CFFT_F32函数,需要输入4个参数,第一个参数是输入需要转换多少数据仅限于

在这里插入图片描述

第二个是FFT输入数组,大小为第一个参数数量的两倍,两个数据组成一个复数,前一个为实数部分,后一个为虚数部分;

第三个是选择正逆向变换,参考输入0;

第四个是否位反转输出,参靠输入1;

注:该函数只有一个输入数组,FFT运算完后会将运算后数据按设定顺序放入输入数组。

简单说明ARM_CMPLX_MAG_F32函数,需要输入三个参数。

第一个是输入数组,结构与FFT数组一样,两个数据组成一个复数,前一个为实数部分,后一个为虚数部分;

第二个参数是输出数组,将复数的模按输入顺序放入输出数组,因为复数有占个数据,而复数模只占一个数据,所以输出数据应该为输入数据1/2;

第三个参数是需要转换多少个复数数据;

使用DSP库

首先使用ADC捕获一段信号,我使用的是10Khz、1Vpp、1V偏置的正弦信号

uint16_t buf[1024]={0};//ADC采样数组
float buf_Value[1024] = {0};//ADC采样电压数组
float testInput_f32_10khz[2048] = {0};//FFT输入数组
HAL_ADC_Start_DMA(&hadc1,(uint32_t *)buf,1024);//捕获完1024个值停止ADC和DMA
HAL_Delay(50);//等待DMA传输完毕
for(int i=0;i<1024;i++)
{
buf_Value[i]=(float)(buf[i])*3.3/4069;//ADC电压转换
printf("%02f\r\n",buf_Value[i]);//打印电压值
}

将打印的电压值放入Excel表格曲线连接

在这里插入图片描述

确定ADC采集处理正常,再进行FFT运算

for(int i=0;i<1024;i++)
{
testInput_f32_10khz[i*2]=buf_Value[i];
}
arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, 0, 1);//FFT变换
arm_cmplx_mag_f32(testInput_f32_10khz, testOutput, 1024);//求复数模
testOutput[0]/=1024;//直流分量除以采样点数
for(int i=1;i<1024;i++)
testOutput[i]/=512;//其他分量除以(采样点数/2)
for(int i=0;i<1024;i++)
printf("%02f\r\n",testOutput[i]);//打印数据

数据如上图;

分析FFT求模后的数据

现在我们成功得到了一组FFT数据,可是不知道怎么去看我们需要的信息,所以现在对数据进行分析

横轴分析

因为FFT变换之后是将信号时域变化,变成了信号频域变化,所以横轴的量纲是HZ,而且每两个点之间的频率是等差的,所以需要计算FFT数据的频率分辨率,

频率分辨率=ADC采样频率/采样点数,按我们之前配置是ADC采样频率为21MHZ,我采了1024个点,所以这里频率分辨率=1367.1875HZ,可以得到两个点之间差1367.1875HZ。

纵轴分析

FFT变换之后纵轴量纲不变

假设原始信号的峰值为A,那么FFT的结果的每个点(除了第一个点直流分量之外)的模值就是A 的N/2倍。

所以只需要把0HZ分量点除以采样点数,其他分量除以(采样点/2),就是其他真实电压值。注:输出的值均为幅值。

结尾

至此我们已经会了FFT的函数使用和数据分析,但有的时候会数据对不上,可能的误差原因有:

1.ADC采样时间被其他语句延时了。

2.根据采样定理,采样频率应为被采样频率的2.56~4倍频。

PS:如果有所帮助可以点个赞?( ???? )?

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 12:54:10  更:2021-07-30 12:55:12 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:46:24-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码