| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> STM32实现FFT,求取幅度频谱 -> 正文阅读 |
|
[嵌入式]STM32实现FFT,求取幅度频谱 |
STM32实现FFT,求取幅度频谱FFT不太对劲的理解
? FFT可以将一个信号从时域变换到频域,比如一个1VPP的1k的正弦信号,它的时域和频域的示意图如下: ? 频域为我们观察信号提供了一个新的视角。比如下面是1k和2k信号的叠加。 ? 从时域上看,1k+2k的波形不容易进行处理,也不好猜出来这个波形到底有什么特性(当然这个例子其实还是比较好猜测的,复杂情况就不好看了)。可是变换到频域后,特性非常的明显,处理起来就方便了。 STM32实现FFT添加DSP库STM32 DSP库的快速添加 基于cubemx 调用,使用DSP库_四臂西瓜的博客-CSDN博客_cubemx dsp 要采用第二种方法添加DSP,第一种方式添加的DSP库比较老,支持的FFT函数用起来不方便,这篇文章介绍的FFT函数老版本不支持。 设置ADC采集交流+串口重定向STM32HAL ADC+TIM+DMA采集交流信号 基于cubemx_四臂西瓜的博客-CSDN博客 代码编写DSP库里面的FFT支持32-4096,同时是 2 n 2^n 2n个整数的傅里叶变换。首先定义下面这些变量。其中只有fft_inputbuf,fft_outputbuf是用来进行FFT的。
? 定义完成变量后进行服务内容的书写。首先是ADC进行数据的采集,这一部分再赘述:
? 傅里叶变换分实数和虚数两种,使用最为频繁的是虚数。我们需要把ADC采集到的数据以虚数的形式存放到傅里叶变换的输入数组fft_inputbuf。虚数的存放方式如下
? 比如ADC采集到的第二个数据adcBuff[1],它的数据存入到fft_inputbuf[2],它的虚部是fft_inputbuf[3],补零。 ? 我们调用arm_cfft_f32(&arm_cfft_sR_f32_len1024, fft_inputbuf, 0, 1);来对输入数据进行傅里叶变换。它的输入参数含义如下
? 经过傅里叶变换后的结果仍然为复数,虚部和实部的比可以计算出频率点的相位,这个在这里不进行考虑。我们直接对复数取模。 ? 取模是实部和虚部的平方和取平均来算,不过我们没必要自己去这样写,因为DSP库为我们提供了取模函数:arm_cmplx_mag_f32(fft_inputbuf, fft_outputbuf, FFT_LENGTH);参数含义如下:
? 他们背后的运算是: f f t o u t p u t b u f [ i ] = f f t i n p u t b u f [ i ? 2 ] 2 + f f t i n p u t b u f [ i ? 2 + 1 ] 2 fftoutputbuf[i]=\sqrt{fftinputbuf[i*2]^2+fftinputbuf[i*2+1]^2} fftoutputbuf[i]=fftinputbuf[i?2]2+fftinputbuf[i?2+1]2?
? 运算完成的结果还需要进行下面的处理,背后的原理就跟FFT算法有关了,这里不做解释。 ? 我们进行的是1024个点的FFT变换,那么fft_outputbuf下标0需要除以1024,其余的数除以512。
最后再把运算结果打印出来即可。
总的代码如下图 运行结果? ADC以100k的频率去采集信号发生器产生的976hz的正弦信号,信号VPP=2v,直流偏置为2V。(注意别超过内部ADC的测量范围0-3.3V)
结果分析? FFT计算出来的数据是对称,我们只取前一半的数据,此时的前一半数据是512个。 ? FFT输出数组的下标表示的频率,计算关系为: 精度问题不知道读者有没有注意到待测频率为976hz,而不是我们平时常见的1k,2k?这是为了这个频率正好落在数组下标10点上。10对应的是
100
k
1024
?
10
≈
976.5
h
z
\frac{100k}{1024}*10\approx976.5hz
1024100k??10≈976.5hz,11对应的
100
k
1024
?
11
≈
107.5
h
z
\frac{100k}{1024}*11\approx107.5hz
1024100k??11≈107.5hz,落在了两点中间,这样就引起了
可以看到10,11,9等下标都分到了电压(能量)。实际应用中应尽可能避免栅栏效应。 后记本文章收录于:
配套程序: |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
89C51单片机与DAC0832 |
基于51单片机宠物自动投料喂食器控制系统仿 |
《痞子衡嵌入式半月刊》 第 68 期 |
多思计组实验实验七 简单模型机实验 |
CSC7720 |
启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
STM32初探 |
STM32 总结 |
【STM32】CubeMX例程四---定时器中断(附工 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
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/26 8:25:29- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |