江苏大学dsp课程设计.docx
- 文档编号:8206950
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:16
- 大小:363.58KB
江苏大学dsp课程设计.docx
《江苏大学dsp课程设计.docx》由会员分享,可在线阅读,更多相关《江苏大学dsp课程设计.docx(16页珍藏版)》请在冰豆网上搜索。
江苏大学dsp课程设计
JIANGSUUNIVERSITY
本科生课程设计
基于CCS和ICETEK5509实验箱FFT算法的C语言实现与验证
学院名称:
计算机科学与通信工程学院
专业班级:
学生姓名:
指导教师姓名:
2014年7月
1、设计目的与意义
1、本课程设计与理论课、实验课一起构成《DSP芯片原理与应用》完整课程
体系;
2、针对理论课、实验课中无时间和不方便提及内容和需强调重点进行补充与
完善;
3、以原理算法的实现与验证体会DSP技术的系统性,并加深基本原理的体会。
2、设计要求
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)基于现有系统,对于实时频谱分析给出进一步开发设计和系统改良
方案。
三、课程设计原理
1、DSP应用系统构成:
注:
一般的输入信号首先进行带限滤波和抽样,然后进行模数(A/D)转换,将信号变成数字比特流。
根据奈奎斯特抽样定理,对低通信号模拟,为保持信号的不丢失,抽样频率必须至少是输入带限信号的最高频率的2倍,工程上为带限信号最高频率的3-5倍。
2、快速离散傅里叶变换(FFT)的基本原理:
频谱分析系统
FFT是一种快速有效地计算离散傅里叶变换(DFT)的方法。
它是根据离散傅里叶变换的奇、偶、虚、实等特性,对离散傅里叶变换的算法进行改进获得的。
因为需要N次复数乘法和N-1次复数加法,所以计算全部X(k)
,共需要
次复数乘法和N(N-1)次复数加法。
实现一次复数乘法需要四次实数乘法和两次实数加法,一次复数加法需要两次实数加法,因此直接计算全部X(k)共需要4
次实数乘法和2N(2N-1)次实数加法。
为减少运算量,提高运算速度,就必须改进算法。
FFT算法就是不断地把长序列的DFT分解成几个短序列的DFT,并利用
的周期性和对称性来减少DFT的运算次数。
具有以下固有特性:
(1)
的周期性:
(2)
的对称性:
(3)
的可约性:
另外,
。
利用
的上述特性,将x(n)或X(k)序列按一定规律分解成短序列进行运算,这样可以避免大量的重复运算,提高计算DFT的运算速度。
算法形式有很多种,但基本上可以分为两大类,即按时间抽取(DecimationInTime,DIT)FFT算法和按频率抽取(DecimationInFrequency,DIF)FFT算法。
N=8的按时间抽取FFT
3、单路、多路模数转换实验原理(AD)
⑴TMS320VC5509A模数转换模块特性:
—带内置采样和保持的10位模数转换模块ADC,最小转换时间为500ns,
最大采样率为21.5KHz。
—2个模拟输入通道(AIN0-AIN1)。
—采样和保持获取时间窗口有单独的预定标控制。
⑵模数转换工作过程:
—模数转换模块接到启动转换模块后,开始转换第一通道的数据。
—经过一个采样时间的延迟后,将采样结果放入转换结果寄存器保存。
—转换结束,设置标志。
—等待下一个启动信号。
⑶模数转换的程序控制:
模数转换相对于计算机来说是一个较为缓慢的过程。
一般采用中断方式启动转换或保存结果,这样在CPU忙于其它工作时可以少占用处理时间。
设计转换程序应首先考虑处理过程如何与模数转换的时间相匹配,根据实际需要选择适当的触发转换手段,也要能及时地保存结果。
由于TMS320VC5509ADSP芯片内的A/D转换精度是10位,转换结果的低10位为所需数值,所以在保留时应注意将结果的高6位去除,取出低10位有效数字。
⑷实验程序流程图:
实验程序流程图
四.实验程序和流程图
1、FFT
⑴FFT程序:
#include
#definepi3.1415926
typedefstruct{
floatreal;
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;j { if(i { tmp=xin[i]; xin[i]=xin[j]; xin[j]=tmp; } term=N/2; while(j>=term) { j-=term; term/=2; } 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)N le=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++){//控制计算不同种蝶形结,即计算系数不同的蝶形结 for(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流程图 2.主函数和AD #include"myapp.h" #include"ICETEK-VC5509-EDU.h" #include"scancode.h" #include"math.h" typedefstruct{//创建复数结构体 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.1415926 voidFFT(COMPX*x,int); main() { inti; unsignedintuWork; EnableAPLL(); SDRAM_init(); InitADC(); PLL_Init(132); while (1) { for(i=0;i<256;i++) { ADCCTL=0x8000;//启动AD转换,通道0 do { 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;i<256;i++) { ADCCTL=0x9000;//启动AD转换,通道1 do { uWork=ADCDATA; }while(uWork&0x8000); nADC1[i]=uWork&0x0fff; input1[i]=nADC1[i]; s1[i].real=nADC1[i]; s1[i].imag=0; } FFT(s1,256); for(i=0;i<256;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;//4MHzADCLK ADCCLKDIV=0x4f00; } voidwait(unsignedintcycles) { inti; for(i=0;i } voidEnableAPLL() { /*EnusreDPLLisrunning*/ *(ioportvolatileunsignedshort*)0x1f00=4; wait(25); *(ioportvolatileunsignedshort*)0x1f00=0; //MULITPLY *(ioportvolatileunsignedshort*)0x1f00=0x3000; //COUNT *(ioportvolatileunsignedshort*)0x1f00|=0x4F8; wait(25); //*(ioportvolatileunsignedshort*)0x1f00|=0x800 //MODE *(ioportvolatileunsignedshort*)0x1f00|=2; wait(30000); //APLLSelect *(ioportvolatileunsignedshort*)0x1e80=1; //DELAY wait(60000); } ⑵AD流程图 图5-2AD流程图 五、实验步骤及结果分析 实验步骤及结果分析 1、FFT验证的步骤和分析: ⑴实验步骤: 参考教材中的FFT核心算法在CCS软件仿真中建立FFT工程: 首先更改FFT算法中的个别语法错误,初步理解程序,其次编写main()函数使系统能够找到程序入口地址,由于正余弦信号的频谱为脉冲信号,因此这里采用正余弦及其线性组合作为检测信号,编写检测信号程序时,应注意将采样点放入结构体数组s[257]中。 然后添加rts55.lib库文件到工程中,编译、下载,用viewgraphTime/Frequency…观察波形,设置观察窗口为: ⑵实验结果截图(软仿真): 检测信号为input[i]=sin(2*pi*(i%N)/N); FFT输出上图为编码生成的,下图为DSP实验箱自带的FFT算法生成的。 可以看到他们的图形是一样的,可证明编码程序的正确性。 2、两通道模数转换(A/D)在开发环境中的调试 ⑴通道波形的产生(硬仿真) 根据实验指导书中的操作步骤调试出两通道相同的正弦波,使图像在CCS界面中动态变化,调节实验板上的频率、波形控制按钮,图形界面输出相应的波形,图6-2-1为0通道在10KHZ—100KHZ、1通道在10—100HZ事的正弦波,图6-2-2为对应生成的频域图: 图6-2-1 图6-2-2 六、实验中遇到的问题 1、出现下图问题 ①没开实验箱电源。 2、出现下图问题 解决方法: 重启开发板,重新安装驱动后可以运行。 七、课程设计心得 本次DSP课程设计针对理论课、实验课中无时间和不方便提及内容和需强调重点进行补充与完善,以原理算法的实现与验证体会DSP技术的系统性,并加深了我对基本原理的体会。 在这几天中,我学到了如下几点: ⑴通过对FFT算法进行分析研究,从基础深入研究和学习,掌握FFT 算法的关键; ⑵通过对DSP芯片工作原理以及开发环境的回顾,在DSP芯片上实现对信 号的实时频谱分析; ⑶这次课程设计,虽然不能做到完全理解掌握,但依然让我加深了对各门专 业课之间的联系; ⑷通过与同组成员的互相沟通,不仅使各自的知识得到了扩充,而且从中得 到了很多的启示,增强了团队合作能力;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 江苏 大学 dsp 课程设计