附录
EXPFFTAD50.C
extern void InitC5402(void); extern void OpenMcBSP(void); extern void CloseMcBSP(void); extern void READAD50(void); extern void WRITEAD50(void);
/*********************************************************************** ** Main Function Program
***********************************************************************/ #include \ #include \
void kfft(pr,pi,n,k,fr,fi,l,il) int n,k,l,il;
double pr[],pi[],fr[],fi[]; { int it,m,is,i,j,nv,l0;
double p,q,s,vr,vi,poddr,poddi; for (it=0; it<=n-1; it++) { m=it; is=0;
for (i=0; i<=k-1; i++)
{ j=m/2; is=2*is+(m-2*j); m=j;} fr[it]=pr[is]; fi[it]=pi[is]; }
pr[0]=1.0; pi[0]=0.0; p=6.283185306/(1.0*n); pr[1]=cos(p); pi[1]=-sin(p); if (l!=0) pi[1]=-pi[1]; for (i=2; i<=n-1; i++)
{ p=pr[i-1]*pr[1]; q=pi[i-1]*pi[1]; s=(pr[i-1]+pi[i-1])*(pr[1]+pi[1]); pr[i]=p-q; pi[i]=s-p-q; }
for (it=0; it<=n-2; it=it+2) { vr=fr[it]; vi=fi[it];
fr[it]=vr+fr[it+1]; fi[it]=vi+fi[it+1]; fr[it+1]=vr-fr[it+1]; fi[it+1]=vi-fi[it+1]; }
m=n/2; nv=2;
for (l0=k-2; l0>=0; l0--) { m=m/2; nv=2*nv;
for (it=0; it<=(m-1)*nv; it=it+nv) for (j=0; j<=(nv/2)-1; j++) { p=pr[m*j]*fr[it+j+nv/2]; q=pi[m*j]*fi[it+j+nv/2]; s=pr[m*j]+pi[m*j];
s=s*(fr[it+j+nv/2]+fi[it+j+nv/2]); poddr=p-q; poddi=s-p-q; fr[it+j+nv/2]=fr[it+j]-poddr; fi[it+j+nv/2]=fi[it+j]-poddi; fr[it+j]=fr[it+j]+poddr; fi[it+j]=fi[it+j]+poddi; } } if (l!=0)
for (i=0; i<=n-1; i++) { fr[i]=fr[i]/(1.0*n); fi[i]=fi[i]/(1.0*n); }
if (il!=0)
for (i=0; i<=n-1; i++)
{ pr[i]=sqrt(fr[i]*fr[i]+fi[i]*fi[i]); if (fabs(fr[i])<0.000001*fabs(fi[i])) { if ((fi[i]*fr[i])>0) pi[i]=90.0; else pi[i]=-90.0; } else
pi[i]=atan(fi[i]/fr[i])*360.0/6.283185306; } }
void main(void) {
int i,n,k=0;
double x[128],pr[128],pi[128],fr[128],fi[128],mo[128];
int xm,zm;
for (;;) {
px = (int*)0x3000; for (i=0; i<=n-1; i++) READAD50();
InitC5402(); /* initialize C5402 DSP */ OpenMcBSP();
int *px = (int*)0x3000; int *pz = (int*)0x3080; n=128;
{
xm=*px; x[i]=xm/32768.0; pr[i]=x[i]; pi[i]=0; px++;
}
kfft(pr,pi,128,7,fr,fi,0,1);
pz = (int*)0x3080; for (i=0;i<=n-1;i++) {
mo[i] = sqrt(fr[i]*fr[i]+fi[i]*fi[i]); zm = (int)(mo[i]*1000.0); *pz = zm; pz++;
}
k++;
} }
/*********************************************************************** ** End of File –– ExpFFTAD50.c
***********************************************************************/
结论
本论文学习和研究了离散傅里叶变换(DFT)和快速傅里叶变换(FFT)的算法,把重点放在了时间抽取法基-2FFT算法上。以及在DSP基础上用FFT变换对信号进行频谱分析。明确了FFT在DSP芯片上的实现的关键。基于DSP的快速傅里叶变换频谱分析的研究使FFT能够有效的在DSP芯片上实现,有助于我们能够更及时的了解信息,对我们的生活生产以及科技研究有很大的帮助。
自从快速傅里叶变换(FFT)出现以后,频谱分析技术便很快的发展起来,而且越来越贴近我们的生活生产,如医疗器械,无线电通信等等。但是我们对频谱分析技术的研究并未达到最高的层次,未来发展具有很广阔的空间。
参考文献
[1]方勇.数字信号处理—原理与实践[M].北京:清华大学出版社.2006. [2]丁康,张晓飞.频谱校正理论的发展[J].振动工程学报.2000
[3]高西全,丁玉美. 数字信号处理[M].西安:西安电子科技大学出版社. 2008 [4]孙仲康.快速傅里叶变换及其应用[M]. 北京:人民邮电出版社.1982. [5]郑阿奇.MATLAB实用教程[M].北京:电子工业出版社.2009.
[6]郭仕剑,王宝顺,贺志国,杨可心.MATLAB7.X数字信号处理[M]。北京:中国邮电出版社.2006 [7]赵桂芳等.基于DSP的快速傅立叶变换的实现[J].黄石理工学院学报.2007
[8]乔瑞萍,崔涛,张芳娟.TMS32054xDSP原理及应用[M].西安:西安电子科技大学出版社.2005: [9]杨宇,叶宇风,王洪.基于DSP的实时信号频谱分析模块设计[J].电子测量技术.2006年4月第二期
[10] 汪安民.TMS320C54x DSP实用技术[M].清华大学出版社,2002