在通常的信号采集应用中,肯定是需要对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用的正弦表,为64点FFT做准备。该函数在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代码下载或见百度云盘/01、项目设计/10、单片机算法/02、FFT算法/AD采集数据的FFT变换分析。