好文档就是一把金锄头!
欢迎来到金锄头文库![会员中心]
电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

现代信号通信课程设计.pdf

20页
  • 卖家[上传人]:汽***
  • 文档编号:571442575
  • 上传时间:2024-08-10
  • 文档格式:PDF
  • 文档大小:1.12MB
  • / 20 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 目 录 第 1 章 引言..............................................2 第 2 章 FFT 算法简介.......................................6 2.1 离散傅里叶变换 DFT...................................6 2.2 快速傅里叶变换 FFT...................................6 第3章FFT算法的DSP 实现...................................5 3.1 实现数据的比特反转...................................5 3.2 实现N点复数FFT…....................................5 3.3 输出 FFT 结果........................................6 第 4 章 系统开发平台与环境.................................6 4.1 CCS 开发环境..........................................6 4.2SEED-DEC2812 开发试验箱 ..................错误!未定义书签。

      第 5 章 软件设计...........................................错误!未定义书签 5.1 流程图...............................................7 5.2 源程序 ..............................................8 第 6 章 系统仿真..........................................14 第七章 总结…………………..……………………………...………..19 参考文献.................................................19 1.引言 傅里叶变换是将信号从时域变换到频域的一种变换形式, 是信号处理领域中一种重要的分析工具离散傅里叶变换(DFT)是连续傅里叶变换在离散系统中的表现形式 由于 DFT 的计算量很大, 因此在很长一段时间内使其应用受到很大的限制 20 世纪 60 年代由 Cooley 和 Tukey 提出了快速傅里叶变换(FFT)算法,它是快速计算 DFT 的一种高效方法,可以明显地降低运算量,大大地提高 DFT 的运算速度,从而使 DFT 在实际中得到了广泛的应用,已成为数字信号处理最为重要的工具之一。

      DSP 芯片的出现使 FFT 的实现变得更加方便由于多数的 DSP 芯片都能在单指令周期内完成乘法—累加运算,而且还提供了专门的 FFT 指令(如实现 FFT算法所必需的比特反转等),使得 FFT 算法在 DSP 芯片上实现的速度更快本节首先简要介绍 FFT 算法的基本原理,然后介绍 FFT 算法的 DSP 实现 2.FFT 算法的简介 快速傅里叶变换 (FFT)是一种高效实现离散傅里叶变换 (DFT)的快速算法,是数字信号处理中最为重要的工具之一,它在声学,语音,电信和信号处理等领域有着广泛的应用 2.1 离散傅里叶变换 DFT 对于长度为 N 的有限长序列 x(n),它的离散傅里叶变换(DFT)为 1, 1 , 0,)()(10NkWnxkXnnnkN (1) 式中, NjNeW/2 ,称为旋转因子或蝶形因子 从 DFT 的定义可以看出,在 x(n)为复数序列的情况下,对某个 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 分解成几个短序列的 DFTFFT 就是利用了旋转因子的对称性和周期性来减少运算量的 FFT 的算法是将长序列的 DFT 分解成短序列的 DFT例如: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 算法中,旋转因子kNW 出现在输入端,而在 DIF FFT 算法中它出现在输入端 假定序列 x(n)的点数 N 是 2 的幂,按照 DIF FFT 算法可将其分为偶序列和奇序列 偶序列: 12/, 1 , 0),2(2),-(N(4),(2),(0),1Nrrxxxxxx即 奇序列: 12/, 1 , 0),12(1),-(N(5),(3),(1),2Nrrxxxxxx即则 x(n)的 DFT表示为 )2()()() 12()2()()()(12/02212/02112/0)12(12/021010NrrkNkNNrrkNNrkrNNrrkNNnnkNNnnkNWrxWWrxWrxWrxnnWnxWnxkX为奇数为偶数 由于 2/)2//(22)/2(2NNjNjNWeeW ,则(3)式可表示为 ) 3(12/, 1 , 0)()()()()(2112/02/212/02/1NkkXWkXWrxWWrxkXkNNrrkNkNNrrkN 式中, )(1kX和)(2kX分别为)(1nx和)(2nx的 N/2 的 DFT。

      由于对称性, ,2/KNNkNWW则)()()2/(21kXWkXNkXkN因此,N 点)(kX可分为两部分: 前半部分:12/, 1 , 0)()()(21NkkXWkXkXkN (4) 后半部分:12/, 1 , 0)()()2/(21NkkXWkXNkXkN (5) 从式(4)和式(5)可以看出,只要求出 0~N/2-1 区间)(1kX和)(2kX的值,就可求出 0~N-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 个 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 WN2 x(6) x(3) -1 -1 WN0 x(1) x(4) -1 WN0 WN1 x(5) x(5) -1 -1 WN0 WN2 x(3) x(6) -1 -1 WN0 WN2 WN3 x(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) 和按频率抽取 FFT (DIF FFT)两大类,输入也有实数和复数之分,一般情况下,都假定输入序列为复数下面以 N 复数点 FFT 算法为例,介绍用 DSP 芯片实现的方法 实现 FFT 算法主要分为三步: 3.1 实现输入数据的比特反转 输入数据的比特反转实际上就是将输入数据进行位码倒置,以便在整个运算后的输出序列是一个自然序列 在用汇编指令进行位码倒置是, 使用位码倒置寻址可以大大担高程序执行速度和使用存储器的效率在这种寻址方式下,AR0 存放的整数 N 是 FFT 点的一半,一个辅助寄存器指向一个数据存放的章元当使用位码倒置寻址将 AR0 加到辅助寄存器时,地址将以位码倒置的方式产生 3.2 实现 N 点复数 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 4.2 SEED-DEC2812 开发实验箱 设计概念性规划编程和编译创建工程文件、编写源代码和配置文件调试语法检查、探测点设置和日志保存等分析实时调试、统计和跟踪 SEED-DECxxxx 系列嵌入式 DSP 开发板本着模块化、总线型、开放式、系列化的设计思想,采用统一的系统结构、模块结构和机械结构,以多种典型 DSP 处理器构成具有标准总线和相同物理尺寸的高性能嵌入式 DSP 开发板 SEED-DEC2812 嵌入式 DSP 开发板原理框图如图 1.2 所示: 图 1.2 五.软件设计 5.1 程序流程图 开始 初始化工作变量 调用波形发生子程序产生波形(3个正弦波) 调用 FFT 子程序计算功率谱 波形发生 计算步长 用标准的C的sin函数计算当前波形值 结束 5.2 源程序 #include "DSP281x_Device.h" // DSP281x Headerfile Include File #include "DSP281x_Examples.h" // DSP281x Examples Include File #include "f2812a.h" #include"math.h" #define PI 3.1415926 #define SAMPLENUMBER 128 #include "DSP281x_Device.h" // DSP281x Headerfile Include File #include "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 dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER]); Uint16 LoopCount; Uint16 ConversionCount; Uint16 Voltage1[1024]; Uint16 Voltage2[1024]; Uint16 nMixing[1024]; int INPUT[SAMPLENUMBER],DATA[SAMPLENUMBER]; float fWaveR[SAMPLENUMBER],fWaveI[SAMPLENUMBER],w[SAMPLENUMBER]; float sin_tab[SAMPLENUMBER],cos_tab[SAMPLENUMBER]; admain(void) { InitSysCtrl();//初始化 cpu DINT;//关中断 InitPieCtrl();//初始化 pie 寄存器 IER = 0x0000;//禁止所有的中断 IFR = 0x0000; 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.ADCINT = &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 = 0x00C8; // first power-up ref and bandgap circuits AdcRegs.ADCTRL3.bit.ADCBGRFDN = 0x3; // 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; ConversionCount = 0; // Configure ADC AdcRegs.ADCMAXCONV.all = 0x0001; // Setup 2 conv's on SEQ1 AdcRegs.ADCCHSELSEQ1.bit.CONV00 = 0x0; // Setup ADCINA3 as 1st SEQ1 conv. AdcRegs.ADCCHSELSEQ1.bit.CONV01 = 0x1; // Setup ADCINA2 as 2nd SEQ1 conv. AdcRegs.ADCTRL2.bit.EVA_SOC_SEQ1 = 1; // Enable EVASOC to 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 = 0x0080; // Setup T1 compare value EvaRegs.T1PR = 0x10; // Setup period register EvaRegs.GPTCONA.bit.T1TOADC = 1; // Enable EVASOC in EVA EvaRegs.T1CON.all = 0x1042; // Enable timer 1 compare (upcount mode) // Wait for ADC interrupt while(1) { LoopCount++; } } interrupt void adc_isr(void) { Voltage1[ConversionCount] = AdcRegs.ADCRESULT0 >>4; Voltage2[ConversionCount] = AdcRegs.ADCRESULT1 >>4; nMixing[ConversionCount]=Voltage1[ConversionCount]+Voltage2[ConversionCount]; // 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.PIEACK.all = PIEACK_GROUP1; // Acknowledge interrupt to PIE return; } void FFT(float dataR[SAMPLENUMBER],float dataI[SAMPLENUMBER]) { 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;i0 ) { b=b*2; i--; } /* b= 2^(L-1) */ for ( j=0;j<=b-1;j++ ) /* for (2) */ { p=1; i=7-L; while ( i>0 ) /* p=pow(2,7-L)*j; */ { p=p*2; i--; } p=p*j; for ( k=j;k<128;k=k+2*b ) /* for (3) */ { TR=dataR[k]; TI=dataI[k]; temp=dataR[k+b]; dataR[k]=dataR[k]+dataR[k+b]*cos_tab[p]+dataI[k+b]*sin_tab[p]; dataI[k]=dataI[k]-dataR[k+b]*sin_tab[p]+dataI[k+b]*cos_tab[p]; dataR[k+b]=TR-dataR[k+b]*cos_tab[p]-dataI[k+b]*sin_tab[p]; dataI[k+b]=TI+temp*sin_tab[p]-dataI[k+b]*cos_tab[p]; } /* END for (3) */ } /* END for (2) */ } /* END for (1) */ for ( i=0;i

      双击,启动 CCS 的仿真平台的配着选项 (3)启动 ccs2 后建立工程文件 FFT.pjt (4)建立源文件 FFT.c 与链接文件 FFT.cmd (5)将这两个文件加到 FFT.pjt 这个工程中 (6)创建 out 文件 (7)加载 out 文件 (8)加载数据 (9)观察输入输出波形 七. 总结 本实验通过学习快速傅里叶变换(FFT)的原理,然后在 CCS 平台下编程对其进行模拟仿真,对快速傅里叶变换(FFT)有个一个较深刻的理解并且熟悉了DSP,CCS平台,达到了课程教学的目的但由于初学 DSP,许多东西不明白,以后还需对 DSP 努力学习研究 通过这次 DSP 课程设计,加深对 DFT 算法原理和基本性质的理解,熟悉了FFT 的算法原理和 FFT 子程序的算法流程和应用,掌握了 DSP 中 FFT 的设计和编程思想,以及用 FFT 对连续信号和时域信号进行频谱分析的方法,和使用 CCS的波形观察器观察波形和频谱情况 这次课程设计,使我增长了知识,同时也增强了我动手解决问题的能力,锻炼我做事细心、用心、耐心的能力同时也让我意识到平时的课程文化的学习固然非常重要, 但是在与实际相联系的过程中还是有许多问题的, 所以在以后的学习生活中,我要努力学习,培养自己独立思考的能力,要加强理论文化与实际操作的联系。

      参考文献: 1.DSP 原理及应用其 邹彦,唐冬,宁志刚,王毓银 电子工业出版社 2.TMS320C5000 系列 DSP 系统设计与开发实例 汪春梅,孙洪波,任治刚 电子工业出版社 3.DSP 芯片的原理与开发应用(第三版) 张雄伟,陈亮,徐光辉 电子工业出版社 4.实时数字信号处理 SEN M.KUO.BOB H.LEE 中国铁道出版社 。

      点击阅读更多内容
      关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
      手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
      ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.