您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 咨询培训 > 江苏大学dsp课程设计
JIANGSUUNIVERSITY本科生课程设计基于CCS和ICETEK5509实验箱FFT算法的C语言实现与验证学院名称:计算机科学与通信工程学院专业班级:学生姓名:指导教师姓名:2014年7月2一、设计目的与意义1、本课程设计与理论课、实验课一起构成《DSP芯片原理与应用》完整课程体系;2、针对理论课、实验课中无时间和不方便提及内容和需强调重点进行补充与完善;3、以原理算法的实现与验证体会DSP技术的系统性,并加深基本原理的体会。二、设计要求1、系统设计要求:⑴.设计一个以ICETEK5509为硬件主体,FFT为核心算法的频谱分析系统方案;⑵.用C语言编写系统软件的核心部分,熟悉CCS调试环境的使用方法,在CCSIDE中仿真实现方案功能;⑶.在实验箱上由硬件实现频谱分析。2、具体要求:⑴.FFT算法C语言实现与验证1)参考教材14.3节FFT核心算法在CCS软件仿真环境中建立FFT工程:添加main()函数,更改教材中个别语法错误,添加相应的库文件,建立正确的FFT工程;2)设计检测信号,验证FFT算法的正确性及FFT的部分性质;3)运用FFT完成IFFT的计算。⑵.单路、多路数模转换(A/D)1)回顾CCS的基本操作流程,尤其是开发环境的使用;2)参考实验指导和示例工程掌握5509芯片A/D的C语言基本控制流程;3)仔细阅读工程的源程序,做好注释,为后期开发做好系统采集前端设计的准备。⑶.系统集成,实现硬件频谱分析1)整合前两个工程,实现连续信号的频谱分析工程的构建;2)参考A/D转换示例和DSP系统功能自检示例完成硬件连接,并测试3开发系统运行效果;3)基于现有系统,对于实时频谱分析给出进一步开发设计和系统改良方案。三、课程设计原理1、DSP应用系统构成:注:一般的输入信号首先进行带限滤波和抽样,然后进行模数(A/D)转换,将信号变成数字比特流。根据奈奎斯特抽样定理,对低通信号模拟,为保持信号的不丢失,抽样频率必须至少是输入带限信号的最高频率的2倍,工程上为带限信号最高频率的3-5倍。2、快速离散傅里叶变换(FFT)的基本原理:频谱分析系统FFT是一种快速有效地计算离散傅里叶变换(DFT)的方法。它是根据离散傅里叶变换的奇、偶、虚、实等特性,对离散傅里叶变换的算法进行改进获得的。因为需要N次复数乘法和N-1次复数加法,所以计算全部X(k)01kN(),共需要2N次复数乘法和N(N-1)次复数加法。实现一次复数乘法需要四次实数乘法和两次实数加法,一次复数加法需要两次实数加法,因此直接计算全部X(k)共需要42N次实数乘法和2N(2N-1)次实数加法。为减少运算量,提高运算速度,就必须改进算法。FFT算法就是不断地把长序列的DFT分解成几个短序列的DFT,并利用mNW的周期性和对称性来减少DFT的运算次数。nkNW具有以下固有特性:(1)nkNW的周期性:()(NnknNknkNNN)(2)nkNW的对称性:()nknknnNkNNN()(3)nkNW的可约性:/,nnNNnNNn4另外,/2(/2)1,NkNkNNN。利用nkNW的上述特性,将x(n)或X(k)序列按一定规律分解成短序列进行运算,这样可以避免大量的重复运算,提高计算DFT的运算速度。算法形式有很多种,但基本上可以分为两大类,即按时间抽取(DecimationInTime,DIT)FFT算法和按频率抽取(DecimationInFrequency,DIF)FFT算法。N=8的按时间抽取FFT3、单路、多路模数转换实验原理(AD)⑴TMS320VC5509A模数转换模块特性:—带内置采样和保持的10位模数转换模块ADC,最小转换时间为500ns,最大采样率为21.5KHz。—2个模拟输入通道(AIN0-AIN1)。—采样和保持获取时间窗口有单独的预定标控制。⑵模数转换工作过程:—模数转换模块接到启动转换模块后,开始转换第一通道的数据。—经过一个采样时间的延迟后,将采样结果放入转换结果寄存器保存。—转换结束,设置标志。—等待下一个启动信号。⑶模数转换的程序控制:5模数转换相对于计算机来说是一个较为缓慢的过程。一般采用中断方式启动转换或保存结果,这样在CPU忙于其它工作时可以少占用处理时间。设计转换程序应首先考虑处理过程如何与模数转换的时间相匹配,根据实际需要选择适当的触发转换手段,也要能及时地保存结果。由于TMS320VC5509ADSP芯片内的A/D转换精度是10位,转换结果的低10位为所需数值,所以在保留时应注意将结果的高6位去除,取出低10位有效数字。⑷实验程序流程图:实验程序流程图四.实验程序和流程图1、FFT⑴FFT程序:#includemath.h#definepi3.1415926typedefstruct{开始初始化CPU时钟、EMIF、AD采样时钟启动AD0通道采集(连续256次)存入缓冲区nADC0启动AD1通道采集(连续256次)存入缓冲区nADC16floatreal;floatimag;}COMPX;/*两个复数相乘*/COMPXEE(COMPXb1,COMPXb2){COMPXb3;b3.real=b1.real*b2.real-b1.imag*b2.imag;b3.imag=b1.real*b2.imag+b1.imag*b2.real;return(b3);}/*变址运算*/voidbit_reverse(COMPX*xin,intN){inti,j,term;COMPXtmp;for(i=0,j=0;jN-1;i++)//实现位反转{if(ij){tmp=xin[i];xin[i]=xin[j];xin[j]=tmp;}term=N/2;while(j=term){j-=term;term/=2;7}j+=term;}}/*fft*/voidFFT(COMPX*x,intN){inti,j=0,k;//k表示第k级蝶形intstage,le,lei,ip;//FFT运算核,使用蝶形运算完成FFT运算COMPXt;COMPXu,w;/*变址运算*/bit_reverse(x,N);j=N;//N点蝶形运算for(stage=1;(j=j/2)!=1;stage++);//蝶形运算级数for(k=1;k=stage;k++){//控制蝶形结级数//stage为蝶形级总数stage=log(2)Nle=2(k-1);//le蝶形结距离,即第k级蝶形的蝶形结相距le点lei=le/2;//同一蝶形结中参加运算的两点的距离u.real=1.0;//第一级蝶形运算的因子u.imag=0.0;w.real=cos(pi/lei);//用于改变蝶形运算因子的中间变量w.imag=sin(pi/lei);for(j=0;j=lei-1;j++){//控制计算不同种蝶形结,即计算系数不同的蝶形结8for(i=j;i=N-1;i+=le){//控制同一蝶形结运算,即计算系数相同蝶形结ip=i+lei;//i,ip分别表示参加蝶形运算的两个节点t=EE(x[ip],u);//蝶形运算x[ip].real=x[i].real-t.real;x[ip].imag=x[i].imag-t.imag;x[i].real=x[i].real+t.real;x[i].imag=x[i].imag+t.imag;}u=EE(u,w);//改变系数,进行下一个蝶形运算}}}⑵FFT流程图开始输入xin,Nm=log2N变址运算l=1结束输出频谱图l++第l次蝶形运算l=m92.主函数和AD#includemyapp.h#includeICETEK-VC5509-EDU.h#includescancode.h#includemath.htypedefstruct{//创建复数结构体floatreal;floatimag;}COMPX;voidInitADC();voidwait(unsignedintcycles);voidEnableAPLL();//structcompx{floatreal,imag;};floatnADC0[256],nADC1[256];floatinput0[256],input1[256],output0[256],output1[256];COMPXs0[256],s1[256];#defineN256#definepi3.1415926voidFFT(COMPX*x,int);main(){inti;unsignedintuWork;EnableAPLL();SDRAM_init();InitADC();10PLL_Init(132);while(1){for(i=0;i256;i++){ADCCTL=0x8000;//启动AD转换,通道0do{uWork=ADCDATA;//ADCDATA见ICETEK-VC5509-EDU.h}while(uWork&0x8000);nADC0[i]=uWork&0x0fff;input0[i]=nADC0[i];//通道0输入信号s0[i].real=nADC0[i];s0[i].imag=0;}FFT(s0,256);for(i=0;i256;i++){ADCCTL=0x9000;//启动AD转换,通道1do{uWork=ADCDATA;}while(uWork&0x8000);nADC1[i]=uWork&0x0fff;input1[i]=nADC1[i];s1[i].real=nADC1[i];s1[i].imag=0;}11FFT(s1,256);for(i=0;i256;i++){output0[i]=sqrt(s0[i].real*s0[i].real+s0[i].imag*s0[i].imag);output1[i]=sqrt(s1[i].real*s1[i].real+s1[i].imag*s1[i].imag);}asm(nop);//breakpoint}}voidInitADC(){ADCCLKCTL=0x23;//4MHzADCLKADCCLKDIV=0x4f00;}voidwait(unsignedintcycles){inti;for(i=0;icycles;i++){}}voidEnableAPLL(){/*EnusreDPLLisrunning*/*(ioportvolatileunsignedshort*)0x1f00=4;wait(25);*(ioportvolatileunsignedshort*)0x1f00=0;12//MULITPLY*(ioportvolatileunsignedshort*)0x1f00=0x3000;//COUNT*(ioportvolatileunsignedshort*)0x1f00|=0x4F8;wait(25);//*(ioportvolatileunsignedshort*)0x1f00|=0x800//MODE*(ioportvolatileunsignedshort*)0x1f00|=2;wait(30000);//APLLSelect*(ioportvolatileunsignedshort*)0x1e80=1;//DELAYwait(60000);}13⑵AD流程图图5-2AD流程图五、实验步骤及结果分析实验步骤及结果分析1、FFT验证的步骤和分析:⑴实验步骤:开始初始化CPU时钟、EMIF、AD采样时钟启动AD0通道采集(连续256次)存入缓冲区nADC0将nADC0数据赋值给s0结构体中的实部,虚部为0启动AD1通道采集(连续256次)存入缓冲区nADC1将nADC1数据赋值给s1结构体中的实部,虚部为0FFT(s0,256)FFT(s1,256)14参考教材中的FFT核心算法在CCS软件仿真中建立FFT工程:首先更改FFT算法中的个别语法错误,初步理解程序,其次编写main()函数使系统能够找到程序
本文标题:江苏大学dsp课程设计
链接地址:https://www.777doc.com/doc-2279996 .html