1、江苏大学dsp课程设计 JIANGSU UNIVERSITY 本 科 生 课 程 设 计基于CCS和ICETEK5509实验箱FFT算法的C语言实现与验证学院名称: 计算机科学与通信工程学院 专业班级: 学生姓名: 指导教师姓名: 2014年 7月1、设计目的与意义 1、本课程设计与理论课、实验课一起构成DSP芯片原理与应用完整课程 体系; 2、针对理论课、实验课中无时间和不方便提及内容和需强调重点进行补充与 完善; 3、以原理算法的实现与验证体会DSP技术的系统性,并加深基本原理的体会。2、设计要求 1、系统设计要求: .设计一个以ICETEK5509为硬件主体,FFT为核心算法的频谱分析系
2、统 方案; .用C语言编写系统软件的核心部分,熟悉CCS调试环境的使用方法, 在CCS IDE中仿真实现方案功能; .在实验箱上由硬件实现频谱分析。 2、具体要求: .FFT算法C语言实现与验证 1) 参考教材14.3节FFT核心算法在CCS软件仿真环境中建立FFT工 程:添加main()函数,更改教材中个别语法错误,添加相应的库文 件,建立正确的FFT工程; 2) 设计检测信号,验证FFT算法的正确性及FFT的部分性质; 3) 运用FFT完成IFFT的计算。 .单路、多路数模转换(A/D) 1) 回顾CCS的基本操作流程,尤其是开发环境的使用; 2) 参考实验指导和示例工程掌握5509芯片A
3、/D的C语言基本控制流 程; 3) 仔细阅读工程的源程序,做好注释,为后期开发做好系统采集前端 设计的准备。 .系统集成,实现硬件频谱分析 1) 整合前两个工程,实现连续信号的频谱分析工程的构建; 2) 参考A/D转换示例和DSP系统功能自检示例完成硬件连接,并测试 开发系统运行效果; 3) 基于现有系统,对于实时频谱分析给出进一步开发设计和系统改良 方案。三、课程设计原理1、DSP应用系统构成: 注:一般的输入信号首先进行带限滤波和抽样,然后进行模数(A/D)转换,将信号变成数字比特流。根据奈奎斯特抽样定理,对低通信号模拟,为保持信号的不丢失,抽样频率必须至少是输入带限信号的最高频率的2倍,
4、工程上为带限信号最高频率的3-5倍。 2、快速离散傅里叶变换(FFT)的基本原理:频谱分析系统FFT是一种快速有效地计算离散傅里叶变换(DFT)的方法。它是根据离散傅里叶变换的奇、偶、虚、实等特性,对离散傅里叶变换的算法进行改进获得的。因为需要N次复数乘法和N-1次复数加法,所以计算全部X(k),共需要次复数乘法和N(N-1)次复数加法。实现一次复数乘法需要四次实数乘法和两次实数加法,一次复数加法需要两次实数加法,因此直接计算全部X(k)共需要4次实数乘法和2N(2N-1)次实数加法。为减少运算量,提高运算速度,就必须改进算法。FFT算法就是不断地把长序列的DFT分解成几个短序列的DFT,并利
5、用的周期性和对称性来减少DFT的运算次数。具有以下固有特性:(1)的周期性: (2)的对称性: (3)的可约性: 另外,。利用的上述特性,将x(n)或X(k)序列按一定规律分解成短序列进行运算,这样可以避免大量的重复运算,提高计算DFT的运算速度。算法形式有很多种,但基本上可以分为两大类,即按时间抽取(Decimation In Time,DIT)FFT算法和按频率抽取(Decimation In Frequency,DIF)FFT算法。 N=8的按时间抽取FFT3、单路、多路模数转换实验原理(AD) TMS320VC5509A模数转换模块特性: 带内置采样和保持的10位模数转换模块ADC,最
6、小转换时间为500ns, 最大采样率为21.5KHz。 2个模拟输入通道(AIN0-AIN1)。 采样和保持获取时间窗口有单独的预定标控制。 模数转换工作过程: 模数转换模块接到启动转换模块后,开始转换第一通道的数据。 经过一个采样时间的延迟后,将采样结果放入转换结果寄存器保存。 转换结束,设置标志。 等待下一个启动信号。 模数转换的程序控制:模数转换相对于计算机来说是一个较为缓慢的过程。一般采用中断方式启动转换或保存结果,这样在CPU忙于其它工作时可以少占用处理时间。设计转换程序应首先考虑处理过程如何与模数转换的时间相匹配,根据实际需要选择适当的触发转换手段,也要能及时地保存结果。由于TMS
7、320VC5509A DSP芯片内的A/D转换精度是10位,转换结果的低10位为所需数值,所以在保留时应注意将结果的高6位去除,取出低10位有效数字。 实验程序流程图: 实验程序流程图 四.实验程序和流程图 1、FFT FFT程序:#include #define pi 3.1415926typedef struct float real; float imag; COMPX;/*两个复数相乘*/COMPX EE(COMPX b1,COMPX b2) COMPX b3; b3.real = b1.real*b2.real-b1.imag*b2.imag; b3.imag = b1.real*b
8、2.imag+b1.imag*b2.real; return(b3);/*变址运算*/void bit_reverse(COMPX* xin, int N) int i, j, term; COMPX tmp; for (i=0,j=0;jN-1;i+) /实现位反转 if (i=term) j-=term; term/=2; j+=term; /* fft */void FFT(COMPX* x,int N) int i,j=0,k; /k表示第k级蝶形 int stage,le,lei,ip; /FFT运算核,使用蝶形运算完成FFT运算 COMPX t; COMPX u,w; /*变址运算
9、*/ 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=
10、lei-1;j+) /控制计算不同种蝶形结,即计算系数不同的蝶形结 for(i=j;i=N-1;i+=le) /控制同一蝶形结运算,即计算系数相同蝶形结 ip=i+lei; /i,ip分别表示参加蝶形运算的两个节点 t=EE(xip,u); /蝶形运算 xip.real=xi.real-t.real; xip.imag=xi.imag-t.imag; xi.real=xi.real+t.real; xi.imag=xi.imag+t.imag; u=EE(u,w); /改变系数,进行下一个蝶形运算 FFT流程图2.主函数和AD#include myapp.h#include ICETEK-VC
11、5509-EDU.h#include scancode.h#include math.htypedef struct /创建复数结构体 float real; float imag; COMPX;void InitADC(); void wait( unsigned int cycles );void EnableAPLL( );/struct compx float real,imag;float nADC0256,nADC1256;float input0256,input1256,output0256,output1256;COMPX s0256,s1256;#define N 256#
12、define pi 3.1415926void FFT(COMPX* x, int);main() int i; unsigned int uWork; EnableAPLL(); SDRAM_init(); InitADC(); PLL_Init(132); while ( 1 ) for ( i=0;i256;i+ ) ADCCTL=0x8000; / 启动AD转换,通道0 do uWork=ADCDATA; /ADCDATA见ICETEK-VC5509-EDU.h while ( uWork&0x8000 ); nADC0i=uWork&0x0fff; input0i=nADC0i; /
13、通道0输入信号 s0i.real=nADC0i; s0i.imag=0; FFT(s0,256); for ( i=0;i256;i+ ) ADCCTL=0x9000; / 启动AD转换,通道1 do uWork=ADCDATA; while ( uWork&0x8000 ); nADC1i=uWork&0x0fff; input1i=nADC1i; s1i.real=nADC1i; s1i.imag=0; FFT(s1,256); for (i=0;i256;i+) output0i=sqrt(s0i.real*s0i.real+s0i.imag*s0i.imag); output1i=sq
14、rt(s1i.real*s1i.real+s1i.imag*s1i.imag); asm( nop); / break point void InitADC() ADCCLKCTL=0x23; / 4MHz ADCLK ADCCLKDIV=0x4f00;void wait( unsigned int cycles ) int i; for ( i = 0 ; i cycles ; i+ ) void EnableAPLL( ) /* Enusre DPLL is running */ *( ioport volatile unsigned short* )0x1f00 = 4; wait( 2
15、5 ); *( ioport volatile unsigned short* )0x1f00 = 0; / MULITPLY *( ioport volatile unsigned short* )0x1f00 = 0x3000; / COUNT *( ioport volatile unsigned short* )0x1f00 |= 0x4F8; wait( 25 ); /*( ioport volatile unsigned short* )0x1f00 |= 0x800 / MODE *( ioport volatile unsigned short* )0x1f00 |= 2; w
16、ait( 30000 ); / APLL Select *( ioport volatile unsigned short* )0x1e80 = 1; / DELAY wait( 60000 );AD流程图 图5-2 AD流程图五、实验步骤及结果分析实验步骤及结果分析 1、FFT验证的步骤和分析:实验步骤: 参考教材中的FFT核心算法在CCS软件仿真中建立FFT工程:首先更改FFT算法中的个别语法错误,初步理解程序,其次编写main()函数使系统能够找到程序入口地址,由于正余弦信号的频谱为脉冲信号,因此这里采用正余弦及其线性组合作为检测信号,编写检测信号程序时,应注意将采样点放入结构体数组s2
17、57中。然后添加rts55.lib库文件到工程中,编译、下载,用viewgraphTime/Frequency观察波形,设置观察窗口为: 实验结果截图(软仿真):检测信号为inputi = sin(2*pi*(i%N)/N);FFT输出上图为编码生成的,下图为DSP实验箱自带的FFT算法生成的。可以看到他们的图形是一样的,可证明编码程序的正确性。 2、两通道模数转换(A/D)在开发环境中的调试 通道波形的产生(硬仿真)根据实验指导书中的操作步骤调试出两通道相同的正弦波,使图像在CCS界面中动态变化,调节实验板上的频率、波形控制按钮,图形界面输出相应的波形,图6-2-1为0通道在10KHZ100
18、KHZ、1通道在10100HZ事的正弦波,图6-2-2为对应生成的频域图:图6-2-1图6-2-2六、实验中遇到的问题1、出现下图问题没开实验箱电源。2、出现下图问题解决方法:重启开发板,重新安装驱动后可以运行。七、课程设计心得本次DSP课程设计针对理论课、实验课中无时间和不方便提及内容和需强调重点进行补充与完善,以原理算法的实现与验证体会DSP技术的系统性,并加深了我对基本原理的体会。在这几天中,我学到了如下几点: 通过对FFT算法进行分析研究,从基础深入研究和学习,掌握FFT 算法的关键; 通过对DSP芯片工作原理以及开发环境的回顾,在DSP芯片上实现对信 号的实时频谱分析; 这次课程设计,虽然不能做到完全理解掌握,但依然让我加深了对各门专 业课之间的联系; 通过与同组成员的互相沟通,不仅使各自的知识得到了扩充,而且从中得 到了很多的启示,增强了团队合作能力;