| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 嵌入式 -> 基于STM32的ADC采样序列频谱分析 -> 正文阅读 |
|
[嵌入式]基于STM32的ADC采样序列频谱分析 |
??本文主要介绍对ADC采集得到的数字序列进行FFT频谱分析。 确定采样率??确定采样率除了要遵守奈奎斯特采样定律意外还需要考虑一些问题。在数字系统中,我们只能进行一些有限的离散的运算,对于有限长的序列,我们不可能拿它去做DTFT,只能做DFT。这就需要把有限长序列也当作一个周期序列来看待。 归一化角频率??已知采样率为 f s f_s fs?,那么一个频率为 f 0 f_0 f0?( f 0 < f s / 2 f_0<f_s/2 f0?<fs?/2)的理想余弦信号被采样后得到的序列应该是: x [ n ] = A cos ? ( 2 π f 0 ? n T 0 ) = A cos ? ( 2 π f 0 ? n f s ) ???? n ∈ Z x[n] = A\cos \left( {2\pi {f_0} \cdot n{T_0} } \right) = A\cos \left( {2\pi {f_0} \cdot {n \over { {f_s} } } } \right)\;\;n \in {\rm{Z} } x[n]=Acos(2πf0??nT0?)=Acos(2πf0??fs?n?)n∈Z ??从上面的式子可以看出,我们实际得到的序列和具体的采样率或信号频率无关,而是由它们俩的比值
f
0
/
f
s
f_0/f_s
f0?/fs?决定的,就像是信号频率
f
0
f_0
f0?被采样频率
f
s
f_s
fs?归一化了。 有限长序列??前面的分析都是在“理想”的条件下进行了,“理想”指的是这个余弦信号得一直存在,从宇宙诞生之初到遥远的未来始终都存在。这样的信号现实生活中是没有的,实际的信号总有开始和结束。 矩形窗??直接从理想序列中截取几个周期的点构成一个有限长序列,相当于是理想序列在时域上与一个矩形窗相乘,也就是它们在频域的卷积。理想余弦序列的频域的表示已经在上面进行分析了,剩下的只需要关注窗函数的频谱。 X ( e j ω ) = ∑ n = 0 N ? 1 e j ω n = 1 ? e j ω N 1 ? e j ω X\left( { {e^{j\omega } } } \right) = \sum\nolimits_{n = 0}^{N - 1} { {e^{j\omega n} } } = { {1 - {e^{j\omega N} } } \over {1 - {e^{j\omega } } } } X(ejω)=∑n=0N?1?ejωn=1?ejω1?ejωN? 然后可以用下面这个公式进一步化简, 1 ? e j 2 θ = 1 ? ( cos ? ( 2 θ ) + j sin ? ( 2 θ ) ) = ? j 2 sin ? ( θ ) e j θ 1 - {e^{j2\theta } } = 1 - \left( {\cos \left( {2\theta } \right) + j\sin \left( {2\theta } \right)} \right) = - j2\sin \left( \theta \right){e^{j\theta } } 1?ej2θ=1?(cos(2θ)+jsin(2θ))=?j2sin(θ)ejθ 最后得到: X ( e j ω ) = e ? j ω ( N ? 1 ) / 2 sin ? ( ω N / 2 ) sin ? ( ω / 2 ) X\left( { {e^{j\omega } } } \right) = {e^{ - j\omega (N - 1)/2} }{ {\sin \left( {\omega N/2} \right)} \over {\sin \left( {\omega /2} \right)} } X(ejω)=e?jω(N?1)/2sin(ω/2)sin(ωN/2)? ??在 ω = 0 \omega=0 ω=0的位置, X ( e j ω ) = 1 X\left( { {e^{j\omega } } } \right) = 1 X(ejω)=1,而在 ω \omega ω是 2 π / N 2\pi/N 2π/N的整数倍时, X ( e j ω ) = 0 X\left( { {e^{j\omega } } } \right)=0 X(ejω)=0。因此当信号的周期正好为 N N N的时候,就不会有频谱泄露(请自行脑补卷积的过程)。 升余弦窗(Hann窗)??升余弦窗也叫Hann窗,可以表示为: w [ n ] = 1 2 ( 1 ? cos ? ( 2 π n N ) ) , ???????? n ∈ [ 0 , N ? 1 ] w[n] = {1 \over 2}\left( {1 - \cos \left( {2\pi {n \over N} } \right)} \right),\;\;\;\;n \in \left[ {0,N - 1} \right] w[n]=21?(1?cos(2πNn?)),n∈[0,N?1] 计算它的DTFT: X ( e j ω ) = 1 2 ∑ n = 0 N ? 1 ( 1 ? cos ? ( 2 π n / N ) ) e ? j ω n X\left( { {e^{j\omega } } } \right) = {1 \over 2}\sum\nolimits_{n = 0}^{N - 1} {\left( {1 - \cos \left( {2\pi n/N} \right)} \right){e^{ - j\omega n} } } X(ejω)=21?∑n=0N?1?(1?cos(2πn/N))e?jωn ??我没能显式地求出解,但是可以代入一些特殊值观察一下。当
ω
=
0
\omega=0
ω=0时,
X
(
e
j
ω
)
=
1
/
2
X\left( { {e^{j\omega } } } \right) = 1/2
X(ejω)=1/2,而当
ω
=
±
2
π
/
N
\omega=\pm2\pi/N
ω=±2π/N时,
X
(
e
j
ω
)
=
1
/
4
X\left( { {e^{j\omega } } } \right) = 1/4
X(ejω)=1/4。 采样率与序列长度??DFT得到的频谱能够分辨的最小频率称为频率分辨力,N点序列做DFT能够得到N点的频谱,因此频率分辨力为 f s / N f_s/N fs?/N。最好选取合适的采样率和序列长度使得待测信号的频率正好是频率分辨力的整数倍。如果待测信号的频率正好是频率分辨力的整数倍,那就可以直接用矩形窗;反之,如果待测信号频率不是频率分辨力的整数倍,那就要根据需求加窗。 模拟前端??在确定ADC的采样率之后,ADC前面的抗混叠滤波器的截止频率也要设置在
f
s
/
2
f_s/2
fs?/2以内。但也要大于你关心的信号的频率。 仿真信号??在ADC还没调通,或者有时候想自己生成一个单频的仿真序列时,可以直接写出在采样率 f s f_s fs?下,频率 f 0 f_0 f0?的余弦序列: x [ n ] = cos ? ( 2 π f 0 f s n ) x[n] = \cos \left( {2\pi { { {f_0} } \over { {f_s} } }n} \right) x[n]=cos(2πfs?f0??n) DSP库函数??在之前的一篇文章中,我提到了用CubeMX生成工程后,在Drivers/CMSIS/Lib目录下就有DSP库文件,所以觉得不用另外从外部导入库DSP库了。 实数FFT??实数FFT计算快,是我们的首选!它能够处理长度为32, 64, 128, 256, 512, 1024, 2048, 4096的实数FFT。
??在调用RFFT之前,需要先初始化一个实例,主要是设置旋转因子的查找表。RFFT一直都会进行bit reverse,这样输入和输出都是我们习惯的顺序,而CFFT是可以选择是否要bit reverse。arm_rfft_fast_f32中的最后一个参数是选择进行FFT还是IFFT。 复数FFT
??复数FFT要求输入的数据就是实部和虚部交替存放的,而且是同址运算,输出结果会覆盖输入的数据。相比于RFFT,它不需要初始化,只需要include arm_const_structs.h这个头文件,就能找到现成的实例。 Hann窗??Hann窗的系数可以用Matlab计算,可以把这些系数存成常量,方便加窗的时候直接调用。
??我是用Matlab Coder把上面这个函数转成C代码,但是也挺麻烦的,感觉还不如直接从工作区复制出来自己写到源文件里去。 |
|
嵌入式 最新文章 |
基于高精度单片机开发红外测温仪方案 |
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 0:48:15- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |