chenningpo的个人空间 https://www.eechina.com/space-uid-73326.html [收藏] [复制] [RSS]

博客

AD采集数据的FFT变换分析

热度 1已有 2087 次阅读2013-4-5 09:54

 在通常的信号采集应用中,肯定是需要对AD数据进行数字处理后,才将数据作为计算的有效值,且在绝大多数的有波形数据存在的情况下,FFT数据变换的应用,则是一个极为有用的工具。现在的大学课本中也都会也信号分析作为电子类工科的主要课程,但学习以,对它的概念及使用方法也模糊不清,而更多的人是不清楚FFT的原理。因此,联合嵌入式中心的工程师专门针对最终的应用,进行一点说明,希望能起到一点穿针引线的作用。数据分析的基本处理流程是:

       数据采集、数据倒位序处理、FFT变换、数据取模运算、FFT反变换、波形重绘

       常常不需要绘制所采集的信号波形的情况下,最后两步是不需要的过程。该文就如何处理前面4个过程进行说明,所使用的数据是使用软件仿真生成可用数据进行测试。

测试代码如下:

#define        PI (3.1415926)

#define       PI2 (2*PI)

Complex     SinTab[64],VialCode1[64];//定义复数数组,complex定义在FFT.H

float             SineValue[64],PIdot;

int                VialCode[64];

 

PIdot = PI2/8;       // 确定一个周期内产生8个点的数据

initW(SinTab,64);    //产生FFT用的正弦表,为64FFT做准备。该函数在FFT.H中定义

for(i1=0;i1<64;i1++) //产生正弦信号数据
{

SineValue[i1] = 2.3+0.283*cos(PIdot*(i1%8)); //使用cos函数模拟生成每周期8个采集点的数据源,产生的波形如图一所示

 VialCode[i1] = SineValue[i1]/0.00122;//假设AD的分辨率为1.22mV,将上面产生的模拟信号,编码成AD采集到的数据。即通常从AD读出来的就是这个数据,产生的波形如图二所示

}

for(i1=0;i1<64;i1++)  //将模拟的AD编码数据组装为复数,即模拟的A/D值放实部,虚部放0

{

VialCode1[i1].real=VialCode[i1];
VialCode1[i1].img=0;

}

fft(VialCode1,64,SinTab,1);//64点的FFT运算,在FFT.H中定义的

for(i1=0;i1<64;i1++)//FFT后的数据进行取模,即实部的平方+虚部的平方后再开方

{

VialCode[i1]=sqrt(VialCode1[i1].real*VialCode1[i1].real+VialCode1[i1].img*VialCode1[i1].img ); //波形图中办取了第0和第9点的数据,如图三所示

}

 

图一

 

图二

 

图三

图三中第一个数据是直流分量,值为:120640   那两个小尖尖的数据是50Hz的交流分量(第8点和倒数第7点):7422(因为是对称的),如按上述的AD分辨率=1.22mV来计算:

0点直流:120640/64=1885    直流幅值=1885*1.22=2.299V

8点交流:7422/(64/2)=232.56   交流幅值=232.56*1.22=0.284V

AD采集频率为400Hz,则频率的分辩率为:400/64=6.25HZ。如果要看50Hz的信号,则50/6.25=8,即交流分量的第八个点上。

所以在使用FFT分析数据时,有两个参数:采集频率、采集点数是很重要的。对于AD所采集到的数据,无论是单极性数据,还是双极性数据,均可以直接进行FFT运算,结果都会是一样的。我们应用FFT的典型应用就是利用STM32F103C8T6所设计的一个12通道50Hz交流电流信号采集的终端设备。


路过

鸡蛋

鲜花

握手

雷人

发表评论 评论 (1 个评论)

回复 wccd1 2013-4-5 23:37
用程序解决数模转换问题。

facelist

您需要登录后才可以评论 登录 | 立即注册

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
返回顶部