《DSP技术及其应用实习报告.doc》由会员分享,可在线阅读,更多相关《DSP技术及其应用实习报告.doc(24页珍藏版)》请在三一办公上搜索。
1、 DSP技术及其应用实习报告 学校:北华大学学院:电气信息工程学院专业:电子信息工程专业班级: 姓名: 学号: 实习题目:FFT算法的实现 指导教师:刘柏生 实习日期:2014-6-3至2014-6-13 目 录1绪论21.1实习题目21.2课题研究的目的21.3 DSP简介22开发运行环境CCS33实验原理44软件设计84.1程序流程图84.2源程序84.3设计步骤85实习心得196参考文献19附录20 1. 绪论1.1实习题目傅立叶变换是一种将信号从时域变换到频域的变换形式,是声学,语音,电信和信号处理等领域中一种重要的分析工具。快速傅立叶变换(FFT)是快速计算DFT的一种高效方法,FF
2、T的出现使DFT的运算大大简化,运算时间缩短一至两个数量级之多,DSP芯片的出现使FFT的实现变得更加方便。1.2课题研究的目的随着电子技术和集成电路技术的飞速发展,数字信号处理已经广泛地应用于通信、信号处理、生物医学以及自动控制等领域中。离散傅立叶变换(DFT)及其快速算法FFT作为数字信号处理的基本变换,有着广泛的应用。特别是近年来,基于FFT的ODFM技术的兴起,进一步推动了对高速FFT处理器的研究。FFT算法从出现到现在已有四十多年代历史,算法理论已经趋于成熟,但是其具体实现方法却值得研究。面向高速、大容量数据流的FFT实时处理,可以通过数据并行处理或者采用多级流水线结构来实现。特别是
3、流水线结构使得FFT处理器在进行不同点数的FFT计算时可以通过对模板级数的控制很容易的实现。分析和比较了各种FFT算法后,选择基2和基4混合频域抽取算法作为FFT处理器的而实现算法,一种高速、处理点数可变的流水线结构FFT处理器的实现方法。1.3 DSP简介数字信号处理(Digital Signal Processing,简称DSP)是一门涉及许多学科而又广泛应用于许多领域的新兴学科。DSP有两种含义:Digital Signal Processing(数字信号处理)、Digital Signal Processor (数字信号处理器)。我们常说的DSP指的是数字信号处理器。数字信号处理器是一
4、种适合完成数字信号处理运算的处理器。20世纪60年代以来,随着计算机和信息技术的飞速发展,数字信号处理技术应运而生并得到迅速的发展。在过去的二十多年时间里,数字信号处理已经在通信等领域得到极为广泛的应用。数字信号处理是利用计算机或专用处理设备,以数字形式对信号进行采集、变换、滤波、估值、增强、压缩、识别等处理,以得到符合人们需要的信号形式。数字信号处理是以众多学科为理论基础的,它所涉及的范围及其广泛。例如,在数学领域,微积分、概率统计、随机过程、数值分析等都是数字信号处理的基本工具,与网络理论、信号与系统、控制论、通信理论、故障诊断等也密切相关。近来新兴的一些学科,如人工智能、模式识别、神经网
5、络等,都与数字信号处理密不可分。可以说,数字信号处理是把许多经典的理论体系作为自己的理论基础,同时又使自己成为一系列新兴学科的理论基础。DSP主要应用在数字信号处理中,目的是为了能够满足实时信号处理的要求,因此需要将数字信号处理中的常用运算执行得尽可能快,这就决定了DSP的特点和关键技术。适合数字信号处理的关键技术:DSP包含乘法器、累加器、特殊地址产生器、领开销循环的等;提高处理速度的关键技术:流水线技术、并行处理技术、超常指令(VLIW)、超标量技术、DMA等。从广义上讲,DSP、微处理器和微控制器(单片机)等都属于处理器,可以说DSP是一种CPU。DSP和一般的CPU又不同,最大的区别在
6、于:CPU是冯.诺伊曼结构的;DSP是数据和地址空间分开的哈佛结构。2.开发运行环境CCSTI Code Composer Studio (CCStudio) 是 TIeXpressDSPTM 实时软件技术的重要组成部分 , 它可以使开发人员充分应用 DSP 的强大功能。随着 TI 的 TMS 320C 5000 ( C5K ) 和 TMS 320C 6000 ( C6K ) DSP 平台的应用范围不断扩大 , 已经由其应用于下载视频流的手持因特网接入产品扩展到蜂窝通信网络和光网络的通信基础设施 ,eXpressDSPTM 也便获得了越来越多软件工程师的青睐。 eXpressDSP 还包含了
7、DSP/BIOS 可伸缩内核 ,TMS320TMDSP 标准算法的应用互操作性和可重复使用性以及 400 多家第三方厂商支持。大部分厂商提供 eXpressDSP 兼容算法、即插式应用以及种类繁多的硬件配件和咨询服务。 Code Composer Studio 3.1 能够使开发人员编制出更多面向高级 DSP 应用的、紧凑的高性能代码。通过实时接入的 DSP 开发者之家网站 , 内置 Update Advisor 对最新的工具、驱动程序及其技术进行自动的流线式管理。只要确保代码和功能调用的正确输入 , 凭借编辑器程序中的 Dynamic CodeMaestro 技术即可快速生成 C 和 C+
8、编码。 TI 的 eXpressDSP产品市场营销经理 Mike Trujillo 说:通过充分利用CCS的工具与功能,编程人员能够大大缩短应用开发的时间。使用 CCStudio 生成的高度优化代码,工程师能够最大限度地发挥高性能 DSP 的全部功能,或者,在其它情况下能够以成本更低的器件来满足其应用需求。 Code Composer Studio v3.1 使开发人员能够无缝管理任何复杂程度的项目 , 其项目管理器通过一个集成版本的控制接口与通用资源控制器连接 , 管理着成千上万的文件。同时支持外部“文件制作”功能 , 使项目能够在 PC 和 UNIX 平台上交叉运行。他们可以通过采用一个改
9、进的产品开发流程 , 就可实现同一组项目文件的共享。于是可以使他们的开发周期缩短数周 , 并获得时间上提前于竞争对手推向市场的优势。 对于那些希望把业界领先的 C6000 TM DSP 平台的高性能与 C5000 TM DSP 平台的低功耗相结合的系统开发者来说 ,Code Composer Studio v3.1 为使其同时调试混合多处理器成为了可能。 Code Composer Studio v3.1 还增加了实时数据交换 (RTDX TM ) 仿真功能 , 可支持来自任何地方的 2 至 50 个 C5000 和 C6000 DSP 器件同时运行。此外 , 支持 RTDX 的仿真器还实现了
10、实时 DSP/BIOS TM 仿真调试 , 该高级调试功能可以使开发人员更深入地了解 DSP 代码在硬件或仿真状态中的运行情况。 N越大,DIT-FFT运算量就减少得越多,FFT的优越性就更加突出。例如,当N=256时,直接计算中复数乘法次数为65 536,FFT算法中复数乘法次数为1024,速度提高倍数为64。3.实验原理3.1设计原理3.1.1离散傅里叶变换DFT对于长度为N的有限长序列x(n),它的离散傅里叶变换(DFT)为X(k)= N-nk (1)式中,WN=e-j*2/N ,称为旋转因子或蝶形因子。从DFT的定义可以看出,在x(n)为复数序列的情况下,对某个k值,直接按(1)式计算
11、X(k) 只需要N次复数乘法和(N-1)次复数加法。因此,对所有N个k值,共需要N2次复数乘法和N(N-1)次复数加法。对于一些相当大有N值(如1024点)来说,直接计算它的DFT所需要的计算量是很大的,因此DFT运算的应用受到了很大的限制。3.1.2快速傅里叶变换FFTFFT 并不是一种新的变换,它是离散傅立叶变换(DFT)的一种快速算法。由于我们在计算DFT 时一次复数乘法需用四次实数乘法和二次实数加法;一次复数加法则需二次实数加法。每运算一个X(k)需要4N 次复数乘法及2N+2(N-1)=2(2N-1)次实数加法。所以整个DFT运算总共需要4N2 次实数乘法和N*2(2N-1)=2N(
12、2N-1)次实数加法。如此一来,计算时乘法次数和加法次数都是和N2 成正比的,当N 很大时,运算量是可观的,因而需要改进对DFT 的算法减少运算速度。直接计算DFT需要N2次复数乘法,N(N-1)次复数加法,直接计算DFT与DIT-FFT复数乘法的运算量之比为:旋转因子WN 有如下的特性。对称性:WNk+N/2=-WNk (2)周期性:WNn(N-k)=WNk(N-n)=WN-nk (3)利用这些特性,既可以使DFT中有些项合并,减少了乘法积项,又可以将长序列的DFT分解成几个短序列的DFT。FFT就是利用了旋转因子的对称性和周期性来减少运算量的。FFT的算法是将长序列的DFT分解成短序列的D
13、FT。例如:N为偶数时,先将N点的DFT分解为两个N/2点的DFT,使复数乘法减少一半:再将每个N/2点的DFT分解成N/4点的DFT,使复数乘又减少一半,继续进行分解可以大大减少计算量。最小变换的点数称为基数,对于基数为2的FFT算法,它的最小变换是2点DFT。一般而言,FFT算法分为按时间抽取的FFT(DIT FFT)和按频率抽取的FFT(DIF FFT)两大类。DIF FFT算法是在时域内将每一级输入序列依次按奇偶分成2个短序列进行计算。而DIF FFT算法是在频域内将每一级输入序列依次奇偶分成2个短序列进行计算。两者的区别是旋转因子出现的位置不同,得算法是一样的。在DIF FFT算法中
14、,旋转因子WN出现在输入端,而在DIF FFT算法中它出现在输入端。假定序列x(n)的点数N是2的幂,按照DIF FFT算法可将其分为偶序列和奇序列。偶序列:x(2r)=x1(r)奇序列:x(2r+1)=x2(r)其中:r=0,1,2,N/2-1,则x(n)的DFT表示为 式中,X1 (k)和X2(k)分别为X1(r)和X2(r)的N/2的DFT。 由于对称性,WNk+N/2=-WNk。因此,N点DFT可分为两部分:前半部分:x(k)=x1(k)+WkNx2(k) (4)后半部分:x(N/2+k)=x1(k)-WkNx2(k) k=0,1,N/2-1 (5)从式(4)和式(5)可以看出,只要求
15、出0N/2-1区间x1(k)和x2(k)的值,就可求出0N-1区间x(k)的N点值。以同样的方式进行抽取,可以求得N/4点的DFT,重复抽取过程,就可以使N点的DFT用上组2点的DFT来计算,这样就可以大减少运算量。基2 DIF FFT的蝶形运算如图3.1所示。设蝶形输入为x1(k)和x2(k),输出为x(k)和x(N/2+K),则有 x(k)=x1(k)+WkNx2(k) (6)x(N/2+k)=x1(k)-WkNx2(k) (7)在基数为2的FFT中,设N=2M,共有M级运算,每级有N/2个2点FFT蝶形运算,因此,N点FFT总共有MN/2个蝶形运算。 图3.1 基2 DIF FFT的蝶形
16、运算例如:基数为2的FFT,当N=8时,共需要3级,12个基2 DIT FFT的蝶形运算。其信号流程如图3.2所示。图3.2 8点基2 DIF FFT蝶形运算从图(b)可以看出,输入是经过比特反转的倒位序列,称为位码倒置,其排列顺序为x(0),x(4),x(2),x(6),x(1),x(5),x(3),x(7),输出是按自然顺序排列,其顺序为x(0),x(1),x(2),x(3),x(4),x(5),x(6),x(7).整个过程共有log2N次,每次分组间隔为2(L-1)-1=L=log2N(1)如上图第一次蝶形运算间隔为一,如第一个和第二个,第三个和第四个,以此类推;第二次间隔为二,如第一个
17、和第三个,第二个和第四个等(2)基本运算单元以下面的蝶形运算为主:计算公式如下: (3)在FFT运算中,旋转因子WmN=cos(2m/N)-jsin(2m/N),求正弦和余弦函数值的计算量是很大的。1. 函数库DSPLIB介绍TI公司TMS320C55x DSP函数库DSPLIB的内部函数库一般包括八种类型:快速傅立叶变换(FFT)、滤波和卷积、自适应滤波、相关运算、数学运算、三角运算、混合运算和矩阵运算。2DSPLIB的组成DSPLIB函数库由四个部分组成:(1) dsplib.h由C程序组成的头文件。(2) 55xdsp.lib由目标代码组成的库文件。(3) 55xdsp.src允许用户增
18、添和修改的库源文件。(4) 在“55x_test”子目录下的程序范例和链接命令文件。3使用DSPLIB的一般方法调用DSPLIB函数库方法如下:(1) 在用户应用程序中添加dsplib.h包含文件。语法:#include (2) 将用户应用程序与DSPLIB函数库的目标文件相连接,即添加55xdsp.lib或55xdspx.lib。语法:#include 或 #include (3) 使用正确的链接命令文件,描述用户C55x目标板上可用的存储器空间配置。4软件设计4.1程序流程图 图4.1 程序流程图4.2源程序见附录。4.3设计步骤(1)启动CCS,在CCS中建立一个C源文件和一个命令文件,
19、并将这两个文件添加到工程,再编译并装载程序:阅读DSP原理及应用中FFT用DSP实现的有关程序。双击,启动CCS的仿真平台的配着选项。选择C5502 Simulator。图4.2 CCS环境仿真器选择界面(2)启动CCS2后建立工程文件zhefft.pjt图4.3创建新工程的界面(3)建立源文件FFT.c与链接文件FFT.cmd图4.4创建新程序的界面(4)将这两个文件加到zhefft.pjt这个工程中。图4.5添加工程所需文件的界面图4.6程序编译的界面(5)设置断点(6)(7)加载out文件图4.7加载.out文件的界面图4.8加载数据的界面(8)观察输入输出波形1) 查看输入信号波形在主
20、菜单中选择ViewGraphTime/Frequency命令,出现如图8-1所示的图形属性对话框,按照图8-1所示进行相应属性修改,修改好后,单击OK确认。将程序运行到第二个断点处,得到输入信号波形,如图8-2所示。图8-1图8-2输入波形(时域)2) 使用CCS提供的工具,观察输入信号FFT变换结果在主菜单中选择ViewGraphTime/Frequency命令,出现如图8-3所示的图形属性对话框,按照图8-3所示进行相应属性修改,修改好后,单击OK确认。可以看到使用CCS提供的工具,对输入信号进行FFT变换的结果如图8-4所示。图8-3 图8-4对输入信号进行FFT变换(频域)3) 使用C
21、语言程序,计算FFT变换结果在主菜单中选择ViewGraphTime/Frequency命令,出现如图8-5所示的图形属性对话框,按照图8-5所示进行相应属性修改,修改好后,单击OK确认。将程序运行到第三个断点处,可以看到如图8-6所示的C语言程序计算FFT变换结果。图8-5 图8-6输出图形(频域)改变输入函数INPUTi=sin(PI*2*i/SAMPLENUMBER*3)*1024改变输入函数INPUTi=(sin(PI*2*i/SAMPLENUMBER*3)+sin(PI*2*i/SAMPLENUMBER*4+sin(PI*2*i/SAMPLENUMBER*8)*1024;图8(5)改
22、变输入函数INPUTi=(sin(PI*2*i/SAMPLENUMBER*3)+sin(PI*2*i/SAMPLENUMBER*10)+sin(PI*2*i/SAMPLENUMBER*20)*1024; 5. 实习心得 通过这次DSP课程设计,加深对DFT算法原理和基本性质的理解,熟悉了FFT的算法原理和FFT子程序的算法流程和应用,掌握了DSP中FFT的设计和编程思想,以及用FFT对连续信号和时域信号进行频谱分析的方法,和使用CCS的波形观察器观察波形和频谱情况。这次课程设计,使我增长了知识,同时也增强了我动手解决问题的能力,锻炼我做事细心、用心、耐心的能力。同时也让我意识到平时的课程文化的
23、学习固然非常重要,但是在与实际相联系的过程中还是有许多问题的,所以在以后的学习生活中,我要努力学习,培养自己独立思考的能力,要加强理论文化与实际操作的联系。积极参加各种设计活动,培养自己的综合能力,使自己得到全面的提高。6.参考文献1戴明桢等编著TMS320C54X DSP 结构原理及应用北京:航空航天大学出版社,第2版,2007;2彭启琮编著DSP技术的发展与应用北京:高等教育出版社,2002;3胡广书编著数字信号处理理论、算法与实现北京:清华大学出版社,2005;4黄席椿 高顺良编著滤波器综合法设计原理北京:人民邮电出版社,1978.309-316,261-270;5沈永欢 梁在中等编著实
24、用数学手册北京:科学出版社,2001.726-732;6程佩青编著数字滤波与快速傅里叶变换北京:清华大学出版社,1990;7北京合众达电子技术有限公司编著SEED-DTK系列实验手册北京合众达电子技术有限公司出版,2007。附录Cmd源文件代码:-f 0-w-stack 500-sysstack 500-l rts55.libMEMORY DARAM: o=0x100, l=0x7f00 VECT:o=0x8000, l=0x100 DARAM2:o=0x8100,l=0x7f00 SARAM: o=0x10000,l=0x30000 SDRAM:o=0x40000,l=0x3e0000 SE
25、CTIONS .text: DARAM .vectors: VECT .trcinit:DARAM .gblinit:DARAM .frt:DARAM .cinit:DARAM .pinit:DARAM .sysinit:DARAM2 .far:DARAM2 .const:DARAM2 .switch:DARAM2 .sysmem:DARAM2 .cio:DARAM2 .MEM$obj:DARAM2 .sysheap:DARAM2 .sysstack:DARAM2 .stack:DARAM2 .input:DARAM2 .fftcode:DARAM2 C文件源码:#include math.h
26、#define sample_1 256/256点基2 FFT(N值)#define signal_1_f 60#define signal_2_f 200#define signal_sample_f 512/采样长度#define pi 3.1415926int inputsample_1;float fwaversample_1,fwaveisample_1,wsample_1;float sin_tabsample_1;float cos_tabsample_1;void init_fft_tab();void input_data();void fft(float datarsamp
27、le_1,float dataisample_1);void main() int i; init_fft_tab(); input_data(); for (i=0;isample_1;i+) fwaveri=inputi; fwaveii=0.0f; wi=0.0f;fft(fwaver,fwavei);while(1); void init_fft_tab()/初始输入信号,对输入信号进行采样 float wt1; float wt2; int i; for (i=0;isample_1;i+) wt1=2*pi*i*signal_1_f; wt1=wt1/signal_sample_f
28、; wt2=2*pi*i*signal_2_f; wt2=wt2/signal_sample_f; inputi=(cos(wt1)+cos(wt2)/2*32768; void input_data()/分开计算cos(2*pi/N)及sin(2*pi/N),合成蝶形运算的系数 int i;for(i=0;isample_1;i+) sin_tabi=sin(2*pi*i/sample_1); cos_tabi=cos(2*pi*i/sample_1); void fft(float datarsample_1,float dataisample_1)/实现FFT算法 int x0,x1,x
29、2,x3,x4,x5,x6,x7,xx; int i,j,k,b,p,L; float TR,TI,temp;/*/实现比特反转,改变输入信号的顺序,以方便使输出信号按自然顺序输出 for(i=0;isample_1;i+)/实现倒序 x0=x1=x2=x3=x4=x5=x6=0; x0=i&0x01;x1=(i/2)&0x01;x2=(i/4)&0x01;x3=(i/8)&0x01; x4=(i/16)&0x01;x5=(i/32)&0x01;x6=(i/64)&0x01;x7=(i/128)&0x01;/十进制转二进制 xx=x0*128+x1*64+x2*32+x3*16+x4*8+x5
30、*4+x6*2+x7; dataixx=datari; for(i=0;isample_1;i+)/传递倒序结束的采样值 datari=dataii;dataii=0;/*/基2fft算法,蝶形运算为核心,p为旋转因子的指数p=J*2(8-L) M级数 for(L=1;L0) b=b*2;i-;/确定b的取值,b= 2(L-1) for(j=0;j0)/P=2(8-L) p=p*2;i-; p=p*j;/p=J*2(8-L) WpN=cos(2p/N)-jsin(2p/N) for(k=j;k256;k=k+2*b) TR=datark;TI=dataik;temp=datark+b; /蝶形
31、运算的两个输入数据相距b个点 datark=datark+datark+b*cos_tabp+dataik+b*sin_tabp; /AL(J)=AL-1(J)+AL-1(J+B)WpN dataik=dataik-datark+b*sin_tabp+dataik+b*cos_tabp; /AL(J)=AL-1(J)-AL-1(J+B)WpN datark+b=TR-datark+b*cos_tabp-dataik+b*sin_tabp; dataik+b=TI+temp*sin_tabp-dataik+b*cos_tabp; /频域振幅平方和计算,计算功率谱for(i=0;isample_1/2;i+)wi=sqrt(datari*datari+dataii*dataii); /实部、虚部的平方和再开方