stm32F103RCT6使用FFT运算分析波形详解(非常新手)
最近学校电赛院队招新,出的招新题就是低频示波器的。之前一直没有弄懂FFT,借着这次机会实现了一下。
- FFT原理详解
FFT,就是快速傅里叶变换,这个操作能够将时域信号转化成频域信号,然后对信号进行分析
这样说可能有点抽象。讲细点就是指能够直观的看出来目标信号的频率是多少。x轴坐标本来是表示时间,FFT之后变成了表示频率,就是这个意思
对于信号处理,FFT之后的结果,波峰一般会出现在我们希望测得信号的频率附近(十分相近)
- 官方文件解释
stm32官方给了几个用于处理FFT的文件,如图所示:

其中有两个汇编文件两个头文件:汇编文件是定义了FFT的计算函数,我们直接调用即可
cr4_fft_1024_stm32.s是包含了计算1024个点的FFT的函数的汇编文件,另一个汇编文件同理
stm32_dsp.h里面有关于FFT处理函数的声明,我们包含了这个头文件之后直接调用函数即可
- 算法解释
1 //进行FFT运算等操作
2 void FFT_Wave(void)
3 {
4 u16 i;
5 float mid_value;
6 while(!ADC_flag)
7 {
8 LED1 = !LED1;
9 delay_ms(100);
10 }
11 ADC_flag = 0;
12
13 //获取最大值最小值
14 adc_value_max = adc_value_min = ADC_buff[1];
15 for(i = 0;i < NPT;i++)
16 {
17 //寻找最大值最小值
18 if(ADC_buff[i] >= adc_value_max)
19 {
20 adc_value_max = ADC_buff[i];
21 }
22 if(ADC_buff[i] <= adc_value_min)
23 {
24 adc_value_min = ADC_buff[i];
25 }
26 //先清空数组
27 fftin[i] = 0;
28 //移位,让后面16位为虚部
29 fftin[i] = ((s16)ADC_buff[i] << 16);
30 }
31 cr4_fft_1024_stm32(fftout,fftin,1024);//FFT
32 GetPowerMag();
33 //计算电压值
34 Vpp_true = (adc_value_max - adc_value_min) * 3.3 / 4096.0;//获得Vpp值
35 mid_value = (adc_value_max + adc_value_min) / 2;
36 for(int i = 0;i < NPT;i++)
37 {
38 if(ADC_buff[i] > mid_value)
39 {
40 rect_duty++;
41 }
42 }
43 rect_duty = rect_duty / 1024 * 100;
44 }
这是FFT的主体函数
第一步我们先要等待ADC采集完成,将数据存入数组当中准备进行处理
第二步是在采样值当中寻找最大值和最小值(遍历数组即可)
第三步是对数组进行移位处理(前面的是实部,后面的是虚部,由于我们采集到的电压都是实数,所以虚部都置0)
第四步是使用ST官方提供的函数进行FFT运算,得到运算之后的数组
第五步是根据频谱查找我们信号所对应的频率,也就是对频谱图当中所有的频率进行幅值的比较,找出幅值最大时所对应的频率,即为我们所需要测量的频率,其他的都可以看作噪声
在我们找到该频率之后,不能立刻输出,要与ADC的采样率相乘再除以1024,之后才能得到我们想要的信号频率
GetPowerMag函数定义如下:
1 void GetPowerMag(void)
2 {
3 s16 lX,lY;
4 u32 i;
5 float maxmag;
6 for(i = 0;i < NPT / 2;i++)
7 {
8 lX = (fftout[i] << 16) >> 16;
9 lY = (fftout[i] >> 16);
10 float X = 1024 * ((float)lX) / 32768;
11 float Y = 1024 * ((float)lY) / 32768;
12 float mag = sqrt(X * X + Y * Y) / 1024;
13 FFT_Mag[i] = (u32)(mag * 65536);
14 }
15 FFT_Mag[0] >>= 1;//频谱图第一个是直流分量,无需乘2
16 for(int i = 0;i < NPT / 2;i++)
17 {
18 if((maxmag < FFT_Mag[i]) && (i != 0))
19 {
20 maxmag = FFT_Mag[i];
21 temp = i;
22 }
23 }
24 F_hz = temp * sampling_rate / 1024.0;
25 }
至此,我们就得到了我们所需信号的频率
鉴于本小白能力有限,如果有纰漏或改进之处,欢迎指正
特别提醒:ADC采样率应遵循奈奎斯特采样定理!采样率不是越高越好!
stm32F103RCT6使用FFT运算分析波形详解(非常新手)的更多相关文章
- 【Java】HashMap源码分析——常用方法详解
上一篇介绍了HashMap的基本概念,这一篇着重介绍HasHMap中的一些常用方法:put()get()**resize()** 首先介绍resize()这个方法,在我看来这是HashMap中一个非常 ...
- valgrind和Kcachegrind性能分析工具详解
一.valgrind介绍 valgrind是运行在Linux上的一套基于仿真技术的程序调试和分析工具,用于构建动态分析工具的装备性框架.它包括一个工具集,每个工具执行某种类型的调试.分析或类似的任务, ...
- MATLAB实例:PCA(主成成分分析)详解
MATLAB实例:PCA(主成成分分析)详解 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 主成成分分析 2. MATLAB解释 详细信息请看: ...
- 16S 基础知识、分析工具和分析流程详解
工作中有个真理:如果你连自己所做的工作的来龙去脉都讲不清楚,那你是绝对不可能把这份工作做好的. 这适用于任何行业.如果你支支吾吾,讲不清楚,那么说难听点,你在混日子,没有静下心来工作. 检验标准:随时 ...
- JVM性能分析工具详解--MAT等
获得堆转储文件 巧妇难为无米之炊,我们首先需要获得一个堆转储文件.为了方便,本文采用的是 Sun JDK 6.通常来说,只要你设置了如下所示的 JVM 参数: -XX:+HeapDumpOnOutOf ...
- nmon分析与详解
1.命令安装 1.查看liunx版本版本x86_64_14i 目录:cd /nmon/logs/ 版本x86_64_14i [root@localhost u06]# cd / [root@local ...
- RTP协议分析和详解
一.RTP协议分析 第1章. RTP概述 1.1. RTP是什么 RTP全名是Real-time Transport Protocol(实时传输协议).它是IETF提出的一个标准,对应的RF ...
- webpack4配置详解之新手上路初探
前言 经常会有群友问起webpack.react.redux.甚至create-react-app配置等等方面的问题,有些是我也不懂的,慢慢从大家的相互交流中,也学到了不少. 今天就尝试着一起来聊 ...
- [拉格朗日反演][FFT][NTT][多项式大全]详解
1.多项式的两种表示法 1.系数表示法 我们最常用的多项式表示法就是系数表示法,一个次数界为\(n\)的多项式\(S(x)\)可以用一个向量\(s=(s_0,s_1,s_2,\cdots,s_n-1) ...
随机推荐
- 在 Spring 中如何注入一个 java 集合?
Spring 提供以下几种集合的配置元素:类型用于注入一列值,允许有相同的值.类型用于注入一组值,不允许有相同的值.类型用于注入一组键值对,键和值都可以为任意类型.类型用于注入一组键值对,键和值都只能 ...
- ACM - 动态规划 - P1282 多米诺骨牌
多米诺骨牌由上下 \(2\) 个方块组成,每个方块中有 \(1 \sim 6\) 个点.现有排成行的上方块中点数之和记为 \(S_1\),下方块中点数之和记为 \(S_2\),它们的差为 \(\lef ...
- String工具类之“四个判空方式”StringUtils.isNotBlank和StringUtils.isEmpty和StringUtils.isBlank和StringUtils.isNotEmpty
一.判断str字符串都不为空==>StringUtils.isNotBlank(String str); 1 /** 2 * <p>检查一个字符串是否非空("") ...
- SQL数据库之IFNULL函数和NULLIF函数
学习IFNULL()函数 非空判断 解析 IFNULL(expression1, expression2) 如果expression1为null, 在函数返回expression2,否则将返回expr ...
- 配置sublime text 3来编写Markdown
如何使用sublime text 3编写Markdown 编写markdown的编辑器无论客户端还是在线的都有很多,这里将sublime text3作为markdown的编辑器,需要进行一些配置. ...
- Altium design使用日常故障总结
1.altiumdesigner09如何将不同的板子拼在一起发给工厂?打开这两个图,其中一个图ctrl+a,ctrl+c,打开另一个图pastespecial.放置时选取一边对齐.制版时告诉厂家做个V ...
- 我试试这个昵称好使不队项目NABCD指路
我试试这个昵称好使不队项目NABCD指路:https://www.cnblogs.com/team-development/p/14617203.html
- 【uniapp 开发】工具类 -- MathUtil
获取随机数 /* ** randomWord 产生任意长度随机字母数字组合 ** randomFlag 是否任意长度 min 任意长度最小位[固定位数] max 任意长度最大位 ** ** 生成6-1 ...
- 【Weex笔记】-- Animate.css的使用
animate.css是一个使用CSS3的animation制作的动画效果的CSS集合,里面预设了很多种常用的动画,且使用非常简单.本文将详细介绍animate.css的使用. 一,安装辅助依赖 np ...
- 【小程序开发】文本text-overflow属性的使用
text-overflow原本是CSS3的一个属性,在微信小程序中也支持. text-overflow文本溢出显示省略号~ 注:使用text-overflow时,需要设置固定的宽度才起作用,所以该元素 ...