现代信号通信课程设计_第1页
现代信号通信课程设计_第2页
现代信号通信课程设计_第3页
现代信号通信课程设计_第4页
现代信号通信课程设计_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目 录第 1 章引言.2第 2 章 fft 算法简介 .62.1 离散傅里叶变换 dft.62.2 快速傅里叶变换 fft.6第 3章 fft算法的 dsp实现.53.1 实现数据的比特反转 .53.2 实现 n点复数 fft .5 3.3 输出 fft结果.6第 4 章 系统开发平台与环境 .64.1 ccs 开发环境 .64.2seed-dec2812 开发试验箱 .错误! 未定义书签。第 5 章 软件设计 .错误! 未定义书签。5.1 流程图 .75.2 源程序 .8第 6 章 系统仿真 .14 第七章 总结 . .19 参考文献 .191. 引言傅里叶变换是将信号从时域变换到频域的一种

2、变换形式,是信号处理领域中一种重要的分析工具。离散傅里叶变换(dft )是连续傅里叶变换在离散系统中的表现形式。 由于 dft的计算量很大, 因此在很长一段时间内使其应用受到很大的限制。20 世纪 60 年代由 cooley 和 tukey 提出了快速傅里叶变换( fft )算法,它是快速计算 dft的一种高效方法, 可以明显地降低运算量, 大大地提高 dft的运算速度,从而使 dft在实际中得到了广泛的应用, 已成为数字信号处理最为重要的工具之一。dsp芯片的出现使 fft的实现变得更加方便。由于多数的dsp芯片都能在单指令周期内完成乘法累加运算,而且还提供了专门的fft 指令(如实现fft

3、算法所必需的比特反转等) ,使得 fft算法在 dsp芯片上实现的速度更快。 本节首先简要介绍 fft算法的基本原理,然后介绍fft算法的 dsp实现。2.fft 算法的简介快速傅里叶变换 (fft )是一种高效实现离散傅里叶变换(dft )的快速算法,是数字信号处理中最为重要的工具之一,它在声学, 语音,电信和信号处理等领域有着广泛的应用。2.1 离散傅里叶变换 dft 对于长度为 n的有限长序列 x(n) ,它的离散傅里叶变换(dft )为1, 1 ,0,)()(10nkwnxkxnnnkn(1)式中,njnew/2,称为旋转因子或蝶形因子。从 dft的定义可以看出, 在 x(n) 为复数

4、序列的情况下, 对某个 k 值,直接按(1)式计算 x(k) 只需要 n次复数乘法和( n-1)次复数加法。因此,对所有 n个 k 值,共需要 n2次复数乘法和 n(n-1) 次复数加法。对于一些相当大有n值(如 1024 点)来说,直接计算它的dft所需要的计算量是很大的,因此dft运算的应用受到了很大的限制。2.2 快速傅里叶变换 fft 旋转因子 wn有如下的特性。对称性:2/nknknww周期性:nknknww利用这些特性,既可以使dft中有些项合并,减少了乘法积项,又可以将长序列的 dft分解成几个短序列的dft 。fft就是利用了旋转因子的对称性和周期性来减少运算量的。fft的算法

5、是将长序列的dft分解成短序列的 dft 。例如:n为偶数时, 先将n点的 dft分解为两个 n/2 点的 dft ,使复数乘法减少一半:再将每个n/2 点的dft分解成 n/4 点的 dft ,使复数乘又减少一半,继续进行分解可以大大减少计算量。最小变换的点数称为基数,对于基数为2 的 fft算法,它的最小变换是2点 dft 。一般而言,fft算法分为按时间抽取的fft (dit ) 和按频率抽取的( dif fft)两大类。 if fft 算法是在时域内将每一级输入序列依次按奇偶分成个短序列进行计算。而 dif fft算法是在频域内将每一级输入序列依次奇偶分成个短序列进行计算。两者的区别是

6、旋转因子出现的位置不同,得算法是一样的。在dif fft算法中,旋转因子knw出现在输入端,而在dif fft算法中它出现在输入端。假定序列 x(n) 的点数 n 是 2 的幂,按照 dif fft 算法可将其分为偶序列和奇序列。偶序列:12/, 1 , 0),2(2),-(n(4),(2),(0),1nrrxxxxxx即奇序列:12/, 1 , 0),12(1),-(n(5),(3),(1),2nrrxxxxxx即则 x(n) 的 dft表示为)2()()() 12()2()()()(12/02212/02112/0) 12(12/021010nrrknknnrrknnrkrnnrrknnn

7、nknnnnknwrxwwrxwrxwrxnnwnxwnxkx为奇数为偶数由于2/)2/(22)/2(2nnjnjnweew,则(3)式可表示为)3(12/, 1 ,0)()()()()(2112/02/212/02/1nkkxwkxwrxwwrxkxknnrrknknnrrkn式中,)(1kx和)(2kx分别为)(1nx和)(2nx的 n/2 的 dft 。由于对称性,,2/knnknww则)()()2/(21kxwkxnkxkn。因此, n 点)(kx可分为两部分:前半部分:12/, 1 , 0)()()(21nkkxwkxkxkn(4)后半部分:12/, 1 , 0)()()2/(21n

8、kkxwkxnkxkn(5)从式(4)和式(5)可以看出,只要求出 0n/2-1 区间)(1kx和)(2kx的值,就可求出 0n-1 区间)(kx的 n点值。以同样的方式进行抽取,可以求得n/4 点的 dft ,重复抽取过程,就可以使n点的 dft用上组 2 点的 dft 来计算,这样就可以大减少运算量。基 2 dif fft的蝶形运算如图 (a) 所示。设蝶形输入为)(1pxm和)(1qxm,输出为)(pxm和)(qxm,则有knmmmwqxpxpx)()()(11(6)knmmmwqxpxqx)()()(11(7)在基数为 2 的 fft中,设 n=2m,共有 m级运算,每级有 n/2 个

9、 2 点 fft蝶形运算,因此, n点 fft总共有nn2log)2/(个蝶形运算。)(1qxm)(pxm)(1qxm)(qxm -1 图(a) 基 2 dif fft 的蝶形运算例如:基数为 2 的 fft ,当 n=8时,共需要 3 级,12 个基 2 dit fft的蝶形运算。其信号流程如图 (b) 所示。x(0) x(0) wn0 x(4) x(1) -1 wn0 x(2) x(2) -1 wn0 wn2x(6) x(3) -1 -1 wn0 x(1) x(4) -1 wn0 wn1x(5) x(5) -1 -1 wn0 wn2x(3) x(6) -1 -1 wn0 wn2 wn3x(

10、7) x(7) -1 -1 -1 图(b) 8点基 2 dif fft 蝶形运算从图(b) 可以看出,输入是经过比特反转的倒位序列,称为位码倒置,其排列顺序为)7(),3(),5(),1(),6(),2(),4(),0(xxxxxxxx。输出是按自然顺序排列,其顺序为)7(),6(,),1 (),0(xxxx。3.fft 算法的 dsp实现dsp 芯片的出现使 fft的实现方法变得更为方便。 由于大多数 dsp芯片都具有在单指令周期内完成乘法累加操作,并且提供了专门的fft指令,使得 fft算法在 dsp芯片实现的速度更快。fft算法可以分为按时间抽取fft (dif fft) 和按频率抽取f

11、ft (dif fft)两大类,输入也有实数和复数之分,一般情况下,都假定输入序列为复数。下面以 n复数点 fft算法为例,介绍用 dsp芯片实现的方法。实现 fft算法主要分为三步 : 3.1 实现输入数据的比特反转输入数据的比特反转实际上就是将输入数据进行位码倒置, 以便在整个运算后的输出序列是一个自然序列。 在用汇编指令进行位码倒置是, 使用位码倒置寻址可以大大担高程序执行速度和使用存储器的效率。在这种寻址方式下,ar0存放的整数 n是 fft点的一半,一个辅助寄存器指向一个数据存放的章元。当使用位码倒置寻址将 ar0加到辅助寄存器时,地址将以位码倒置的方式产生。3.2 实现 n点复数

12、fft n点复数 fft算法的实现可分为三个功能块,即第一级蝶形运算,第二蝶形运算,第三级至n2log级蝶形运算。对于任何一个 2 的整数幂 n=2m ,总可以通过 m次分解最后成为2 点的 dft计算。通过这样的m次分解,可构成 m (即n2log)级迭代运算完成。3.3 输出 fft结果四. 系统开发平台与环境4.1 ccs 开发环境ccs 提供了配置、建立、调试、跟踪和分析程序的工具,它便于实时、嵌入式信号处理程序的编制和测试,它能够加速开发进程,提高工作效率。ccs提供了基本的代码生成工具,它们具有一系列的调试、分析能力。ccs支持如下图 1.1 所示的开发周期的所有阶段。图 1.1

13、4.2 seed-dec2812开发实验箱设计概念性规划编程和编译创建工程文件、编写源代码和配置文件调试语法检查、探测点设置和日志保存等分析实时调试、统计和跟踪 seed-decxxxx 系列嵌入式 dsp开发板本着模块化、总线型、开放式、系列化的设计思想, 采用统一的系统结构、 模块结构和机械结构, 以多种典型 dsp处理器构成具有标准总线和相同物理尺寸的高性能嵌入式dsp开发板。seed-dec2812 嵌入式 dsp开发板原理框图如图1.2 所示:图 1.2五. 软件设计5.1 程序流程图开始初始化工作变量调用波形发生子程序产生波形(3个正弦波)调用 fft 子程序计算功率谱波形发生计算

14、步长用标准的 c 的 sin 函数计算当前波形值结束5.2 源程序#include dsp281x_device.h / dsp281x headerfile include file #include dsp281x_examples.h / dsp281x examples include file #include f2812a.h #includemath.h #define pi 3.1415926 #define samplenumber 128 #include dsp281x_device.h / dsp281x headerfile include file #include

15、 dsp281x_examples.h / dsp281x examples include file / prototype statements for functions found within this file. interrupt void adc_isr(void); / global variables used in this example: void admain(); void initforfft(); 开始按照编码逆序排列输入序列用蝶形算法计算计算功率谱返回计算结果void makewave(); /void fft(float datarsamplenumber

16、,float dataisamplenumber); uint16 loopcount; uint16 conversioncount; uint16 voltage11024; uint16 voltage21024; uint16 nmixing1024; int inputsamplenumber,datasamplenumber; float fwaversamplenumber,fwaveisamplenumber,wsamplenumber; float sin_tabsamplenumber,cos_tabsamplenumber; admain(void) initsysctr

17、l();/初始化 cpu dint;/关中断 initpiectrl();/初始化 pie 寄存器 ier = 0 x0000;/禁止所有的中断 ifr = 0 x0000; initpievecttable();/初始化 pie 中断向量表/ interrupts that are used in this example are re-mapped to / isr functions found within this file. eallow; / this is needed to write to eallow protected register pievecttable.adc

18、int = &adc_isr; edis; / this is needed to disable write to eallow protected registers adcregs.adctrl1.bit.reset = 1; / reset the adc module asm( rpt #10 | nop); / must wait 12-cycles (worst-case) adcregs.adctrl3.all = 0 x00c8; / first power-up ref and bandgap circuits adcregs.adctrl3.bit.adcbgrf

19、dn = 0 x3; / power up bandgap/reference circuitry adcregs.adctrl3.bit.adcpwdn = 1; / power up rest of adc / enable adcint in pie piectrlregs.pieier1.bit.intx6 = 1; ier |= m_int1; / enable cpu interrupt 1 eint; / enable global interrupt intm ertm; / enable global realtime interrupt dbgm loopcount = 0

20、; conversioncount = 0; / configure adc adcregs.adcmaxconv.all = 0 x0001; / setup 2 convs on seq1 adcregs.adcchselseq1.bit.conv00 = 0 x0; / setup adcina3 as 1st seq1 conv. adcregs.adcchselseq1.bit.conv01 = 0 x1; / setup adcina2 as 2nd seq1 conv. adcregs.adctrl2.bit.eva_soc_seq1 = 1; / enable evasoc t

21、o start seq1 adcregs.adctrl2.bit.int_ena_seq1 = 1; / enable seq1 interrupt (every eos) / configure eva / assumes eva clock is already enabled in initsysctrl(); evaregs.t1cmpr = 0 x0080; / setup t1 compare value evaregs.t1pr = 0 x10; / setup period register evaregs.gptcona.bit.t1toadc = 1; / enable e

22、vasoc in eva evaregs.t1con.all = 0 x1042; / enable timer 1 compare (upcount mode) / wait for adc interrupt while(1) loopcount+; interrupt void adc_isr(void) voltage1conversioncount = adcregs.adcresult0 4; voltage2conversioncount = adcregs.adcresult1 4; nmixingconversioncount=voltage1conversioncount+

23、voltage2conversioncount; / if 40 conversions have been logged, start over if(conversioncount = 1023) conversioncount = 0; else conversioncount+; / reinitialize for next adc sequence adcregs.adctrl2.bit.rst_seq1 = 1; / reset seq1 adcregs.adcst.bit.int_seq1_clr = 1; / clear int seq1 bit piectrlregs.pi

24、eack.all = pieack_group1; / acknowledge interrupt to pie return; void fft(float datarsamplenumber,float dataisamplenumber) int x0,x1,x2,x3,x4,x5,x6,xx; int i,j,k,b,p,l; float tr,ti,temp; /* following code invert sequence */ for ( i=0;isamplenumber;i+ ) x0=x1=x2=x3=x4=x5=x6=0; x0=i&0 x01; x1=(i/2

25、)&0 x01; x2=(i/4)&0 x01; x3=(i/8)&0 x01;x4=(i/16)&0 x01; x5=(i/32)&0 x01; x6=(i/64)&0 x01; xx=x0*64+x1*32+x2*16+x3*8+x4*4+x5*2+x6; dataixx=datari; for ( i=0;isamplenumber;i+ ) datari=dataii; dataii=0; /* following code fft */ for ( l=1;l0 ) b=b*2; i-; /* b= 2(l-1) */ for ( j=

26、0;j0 ) /* p=pow(2,7-l)*j; */ p=p*2; i-; p=p*j; for ( k=j;k128;k=k+2*b ) /* for (3) */ tr=datark; ti=dataik; temp=datark+b; datark=datark+datark+b*cos_tabp+dataik+b*sin_tabp; dataik=dataik-datark+b*sin_tabp+dataik+b*cos_tabp; datark+b=tr-datark+b*cos_tabp-dataik+b*sin_tabp; dataik+b=ti+temp*sin_tabp-

27、dataik+b*cos_tabp; /* end for (3) */ /* end for (2) */ /* end for (1) */ for ( i=0;isamplenumber/2;i+ ) wi=sqrt(datari*datari+dataii*dataii); /* end fft */ main() int i; initforfft(); makewave(); for ( i=0;isamplenumber;i+ ) fwaveri=inputi; fwaveii=0.0f; wi=0.0f; fft(fwaver,fwavei); for ( i=0;isamplenumber;i+ ) datai=wi; while ( 1 ); / break point void initforfft() int i; for ( i=0;isamplenumber;i+ ) sin_tabi=sin(pi*2*i/samplenumber); cos_tabi=cos(pi*2*i/samplenumber); void makewave() int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论