收藏 分享(赏)

DSP课程设计——FFT的DSP实现.doc

上传人:精品资料 文档编号:10769081 上传时间:2020-01-08 格式:DOC 页数:27 大小:540.55KB
下载 相关 举报
DSP课程设计——FFT的DSP实现.doc_第1页
第1页 / 共27页
DSP课程设计——FFT的DSP实现.doc_第2页
第2页 / 共27页
DSP课程设计——FFT的DSP实现.doc_第3页
第3页 / 共27页
DSP课程设计——FFT的DSP实现.doc_第4页
第4页 / 共27页
DSP课程设计——FFT的DSP实现.doc_第5页
第5页 / 共27页
点击查看更多>>
资源描述

1、1FFT 的 DSP 实现简介:快速傅里叶变换是一种高效实现离散傅里叶变换的的快速算法 ,是数字信号处理中最为重要的工具之一,它在声学、语音、电信和信号处理等领域有着广泛的应用。一设计目的:1.加深对 DFT 算法原理和基本性质的理解;2.熟悉 FFT 的算法原理和 FFT 子程序的算法流程和应用;3.学习用 FFT 对连续信号和时域信号进行频谱分析的方法;4.学习 DSP 中 FFT 的设计和编程思想;5.学习使用 CCS 的波形观察窗口观察信号波形和频谱情况。二设计内容:用 DSP 汇编语言及 C 语言进行编程,实现 FFT 运算,对输入信号进行频谱分析。三设计原理:1 离散傅里叶变换 D

2、FT:对于长度为 N 的有限长序列 x(n),它的离散傅里叶变换(DFT)为2X(k)= N-nk ,k=0,1,2N-1 (1)0*)(nWx式中,W N=e-j*2/N ,称为旋转因子或蝶形因子。从 DFT 的定义可以看出,在 x(n)为复数序列的情况下,对某个k 值,直接按(1)式计算 X(k) 只需要 N 次复数乘法和(N-1)次复数加法。因此,对所有 N 个 k 值,共需要 N2次复数乘法和 N(N-1)次复数加法。对于一些相当大有 N 值(如 1024 点)来说,直接计算它的 DFT 所需要的计算量是很大的,因此 DFT 运算的应用受到了很大的限制。2快速傅里叶变换 FFT旋转因子

3、 WN 有如下的特性。对称性: W Nk+N/2=-WNk周期性:W Nn(N-k)=WNk(N-n)=WN-nk利用这些特性,既可以使 DFT 中有些项合并,减少了乘法积项,又可以将长序列的 DFT 分解成几个短序列的 DFT。FFT 就是利用了旋转因子的对称性和周期性来减少运算量的。FFT 的算法是将长序列的 DFT 分解成短序列的 DFT。例如:N 为偶数时,先将 N 点的 DFT 分解为两个 N/2 点的 DFT,使复数乘法减少一半:再将每个 N/2 点的 DFT 分解成 N/4 点的 DFT,使复数乘又3减少一半,继续进行分解可以大大减少计算量。最小变换的点数称为基数,对于基数为 2

4、 的 FFT 算法,它的最小变换是 2 点 DFT。一般而言,FFT 算法分为按时间抽取的 FFT(DIT )和按频率抽取的(DIF FFT)两大类。IF FFT 算法是在时域内将每一级输入序列依次按奇偶分成个短序列进行计算。而DIF FFT 算法是在频域内将每一级输入序列依次奇偶分成个短序列进行计算。两者的区别是旋转因子出现的位置不同,得算法是一样的。在 DIF FFT 算法中,旋转因子出现在输入端,而在 DIF FFT 算法中它出现在输入端。假定序列 x(n)的点数 N 是 2 的幂,按照 DIF FFT 算法可将其分为偶序列和奇序列。偶序列:x(2r)=x 1(r)奇序列:x(2r+1)

5、=x 2(r)其中:r=0,1,2,N/2-1 则 x(n)的 DFT 表示为4式中,x 1(k)和 x2(k)分别为 x1(r)和 x2(r)的 N/2 的 DFT式中,x 1(k)和 x2(k)分别为 x1(r)和 x2(r)的 N/2 的 DFT。由于对称性,W Nk+N/2=-WNk。因此,N 点 DFT 可分为两部分:前半部分:x(k)=x 1(k)+WkNx2(k) k=0,1,N/2-1 (4)后半部分:x(N/2+k)=x 1(k)-WkNx2(k) k=0,1,N/2-1 (5)从式(4)和式(5)可以看出,只要求出 0N/2-1 区间 x1(k)和 x2(k)的值,就可求出

6、 0N-1 区间 x(k)的 N 点值。以同样的方式进行抽取,可以求得 N/4 点的 DFT,重复抽取过程,就可以使 N 点的 DFT 用上组 2 点的 DFT 来计算,这样就可以大减少运算量。基 2 DIF FFT 的蝶形运算如图(a)所示。设蝶形输入为 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 个蝶形运算。CABA BCA-

7、 BC5图(a) 基 2 DIF FFT 的蝶形运算例如:基数为 2 的 FFT,当 N=8 时,共需要 3 级,12 个基 2 DIT FFT 的蝶形运算。其信号流程如图(b)所示。x(0) x(0)1. WN0x(4) x(1)-1 WN0x(2) x(2)-1WN0 WN2x(6) x(3)-1 -1WN0x(1) x(4)-1WN0 WN1x(5) x(5)-1 -1WN0 WN26x(3) x(6)-1 -1WN0 WN2 WN3x(7) x(7)-1 -1 -1图(b) 8 点基 2 DIF FFT 蝶形运算从图(b)可以看出,输入是经过比特反转的倒位序列,称为位码倒置,其排列顺序

8、为 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).四FFT 算法的 DSP 实现过程:DSP 芯片的出现使 FFT 的实现方法变得更为方便。由于大多数DSP 芯片都具有在单指令周期内完成乘法 累加操作,并且提供了专门的 FFT 指令,使得 FFT 算法在 DSP 芯片实现的速度更快。FFT 算法可以分为按时间抽取 FFT 和按频率抽取 FFT 两大类,输入也有实数和复数之分,一般情况下,都假定输入序列为复数。(一)FFT 运算序列的存储分配FFT

9、运算时间是衡量 DSP 芯片性能的一个重要指标,因此提高FFT 的运算速度是非常重要的。在用 DSP 芯片实现 FFT 算法时,应允许利用 DSP 芯片所提供的各种软、硬件资源。如何利用 DSP 芯片的有限资源,合理地安排好所使用的存储空间是十分重要的。7(二)FFT 运算的实现用 TMS320C54x 的汇编程序实现 FFT 算法主要分为四步:1.实现输入数据的比特反转输入数据的比特反转实际上就是将输入数据进行码位倒置,以便在整个运算后的输出序列是一个自然序列。在用汇编指令进行码位倒置时,使用码位倒置可以大大提高程序执行速度和使用存储器的效率。在这种寻址方式下,AR0 存放的整数 N 是 F

10、FT 点的一半,一个辅助寄存器指向一个数据存放的单元。当使用位码倒置寻址将AR0 加到辅助寄存器时,地址将以位码倒置的方式产生。2.实现 N 点复数 FFTN 点复数 FFT 算法的实现可分为三个功能块,即第一级蝶形运算、第二级蝶形运算、第三级至级蝶形运算。对于任何一个 2 的整数幂,总可以通过 M 次分解最后成为 2 点的DFT 计算。通过这样的 M 次分解,可构成 M(即)级迭代计算,每级由 N/2 个蝶形运算组成。3.功率谱的计算用 FFT 计算想 x(n)的频谱,即计算X(k)=8X(k)一般是由实部(k) 和虚部(k) 组成的复数,即X(k)=(k)+j(k)因此,计算功率谱时只需将

11、 FFT 变换好的数据,按照实部实部(k)和虚部 (k)求它们的平方和,然后对平方和进行开平方运算。但是考虑到编程的难度,对于求 FFT 变换后数据的最大值,不开平方也可以找到最大值,并对功率谱的结果没有影响,所以在实际的 DSP编程中省去了开方运算。4.输出 FFT 结果(三) 汇编语言程序程序主体由 rfft-task、bit-rev、fft 和 power 四个子程序组成。rfft-task:主调用子程序,用来调用其他子程序,实现统一的接口。bit-rev:位码倒置子程序,用来实现输入数据的比特反转。fft:FFT 算法子程序,用来完成 N 点 FFT 运算。在运算过程中,为避免运算结果

12、的溢出,对每个蝶形的运算结果右移一位。fft 子程序分为三个功能块:第一级蝶形运算、第二级蝶形运算、第三级至至级蝶形运算。(四)正弦系数表和余弦系数表:正弦系数表和余弦系数表可以由数据文件 coeff.inc 给出,主程9序通过.copy 汇编命令将正弦和余弦系数表与程序代码汇编在一起。在本例中,数据文件 coeff.inc 给出 1024 复数点 FFT 的正弦、余弦系数各 512 个。利用此系数表可完成 81024 点 FFT 的运算。(五)FFT 算法的模拟信号输入:FFT 算法的模拟信号输入可以采用 C 语言编程来生成一个文本文件 sindata,然后在 rfft-task 汇编程序中

13、,通过.copy 汇编命令将生成的数据文件复制到数据存储器中,作为 FFT 算法的输入数据参与FFT 运算。这种方法的优点是程序的可读性强,缺点是当输入数据修改后,必须重新编译、汇编和链接。五设计步骤:1.启动 CCS,在 CCS 中建立一个 C 源文件和一个命令文件,并将这两个文件添加到工程,再编译并装载程序:阅读 Dsp 原理及应用中 fft 用 dsp 实现的有关程序。2.双击 ,启动 CCS 的仿真平台的配着选项。选择 C5502 Simulator。103.启动 ccs2 后建立工程文件 FFT.pjt4.建立源文件 FFT.c 与链接文件 FFT.cmd5.将这两个文件加到 FFT

14、.pjt 这个工程中。116.创建 out 文件7.加载 out 文件128.加载数据9.观察输入输出波形输入波形(时域)13输出图形(频域)10.改变信号的频率可以再做次实验。也可作 512 点或更多点的 FFT.六实验程序:.title “rfft_task.asm“.mmregs.copy “coeff.inc“.def rfft_tasksine: .usect “sine“, 512cosine: .usect “cosine“, 512fft_data: .usect “fft_data“, 2048d_input: .usect “fft_data“, 204814fft_out

15、: .usect “fft_out“, 1024;d_input: .copy sindataSTACK: .usect “STACK“, 10K_DATA_IDX_1 .set 2K_DATA_IDX_2 .set 4K_DATA_IDX_3 .set 8K_FLY_COUNT_3 .set 4K_TWID_TBL_SIZE .set 512K_TWID_IDX_3 .set 128K_FFT_SIZE .set 32K_LOGN .set 5.bss d_twid_idx, 1.bss d_data_idx, 1.bss d_grps_cnt, 1.sect “rfft_prg“rfft_

16、rask:15SSBX FRCTSTM #STACK+10, SPSTM #sine, AR1RPT #K_TWID_TBL_SIZE-1MVPD sine1, *AR1+STM #cosine, AR1RPT #K_TWID_TBL_SIZE-1MVPD cosine1, *AR1+CALL bit_revCALL fftCALL powerRET* 位码倒置程序 bit_rev *.asg AR2, REORDERED.asg AR3,ORIGINAL_INPUT.asg AR7, DATA_PROC_BUF16.sect “rfft_prg“;bit_rev:STM #d_input,

17、ORIGINAL_INPUTSTM #fft_data, DATA_PROC_BUFMVMM DATA_PROC_BUF, REORDEREDSTM #K_FFT_SIZE-1, BRCRPTBD bit_rev_end-1STM #K_FFT_SIZE, AR0MVDD *ORIGINAL_INPUT+, *REORDERED+MVDD *ORIGINAL_INPUT-, *REORDERED+MAR *ORIGINAL_INPUT+0B;bit_rev_end:RET;* FFT 算法子程序 fft *;.asg AR1, GROUP_COUNTER.asg AR2, PX17.asg A

18、R3, QX.asg AR4, WR.asg AR5, WI.asg AR6, BUTTERFLY_COUNTER.asg AR7, STAGE_COUNTER.sect “rfft_prg“fft:;*第 1 级蝶形运算 stage1*:STM #0, BKLD #-1, ASMSTM #fft_data, PXLD *PX, 16, ASTM #fft_data+K_DATA_IDX_1,QXSTM #K_FFT_SIZE/2-1, BRCRPTBD stage_end-1STM #K_DATA_IDX_1+1, AR018SUB *QX, 16, A, BADD *QX, 16, AST

19、H A, ASM, *PX+ST B, *QX+|LD *PX, ASUB *QX, 16, A, BADD *QX, 16, ASTH A, ASM, *PX+0ST B, *QX+0%|LD *PX, A;stage1_end:;*第 2 级蝶形运算 stage2*;STM #fft_data, PXSTM #fft_data+K_DATA_IDX_2, QXSTM #K_FFT_SIZE/4-1, BRCLD *PX, 16, A19RPTBD stage2_end-1STM #K_DATA_IDX_2+1, AR0SUB *QX, 16, A, BADD *QX, 16, ASTH A

20、, ASM, *PX+ST B, *QX+|LD *PX, ASUB *QX, 16, A, BADD *QX, 16, ASTH A, ASM, *PX+STH B, ASM, *QX+MAR *QX+ADD *PX, *QX, ASUB *PX, *QX-, BSTH A, ASM, *PX+SUB *PX, *QX, A20ST B, *QX|LD *QX+, BST A, *PX|ADD *PX+0%, AST A, *QX+0%|LD *PX, A;stage2_end:;*第 3 级蝶形运算 stage3*;STM #K_TWID_TBL_SIZE, BKST #K_TWID_ID

21、X_3, d_twid_idxSTM #K_TWID_IDX_3, AR0STM #cosine, WRSTM #sine, WISTM #K_LOGN-2-1, STAGE_COUNTERST #K_FFT_SIZE/8-1, d_grps_cntSTM #K_FLY_COUNT_3-1, BUTTERFLY_COUNTER21ST #K_DATA_IDX_3, d_data_idx;stage:STM #fft_data, PXLD d_data_idx, AADD *(PX), ASTLM A, QXMVDK d_grps_cnt, GROUP_COUNTER;group:MVMD BU

22、TTERFLY_COUNTER, BRCRPTBD butterfly_end-1LD *WR, TMPY *QX+, AMACR *WI+0%, *QX-, AADD *PX, 16, A, BST B, *PX|SUB *PX+, B22ST B, *QX|MPY *QX+, AMASR *QX, *WR+0%, AADD *PX, 16, A, BST B, *QX+|SUB *PX+, BLD *WR, TST B, *PX+|MPY *QX, A;butterfly_end:PSHM AR0MVDK d_data_idx, AR0MAR *PX+0MAR *QX+0BANZD gro

23、up, *GROUP_COUNTER-POPM AR023MAR *QX-LD d_data_idx, ASUB #1, A, BSTLM B, BUTTERFLY_COUNTERSTL A, 1, d_data_idxLD d_group_cnt, ASTL A, ASM, d_group_cntLD d_twid_idx, ASTL A, ASM, d_twid_idxBANZD stage, *STAGE_COUNTER-MVDK d_twid_idx, AR0;fft_end:RET;*/功率谱计算子程序 power /*;.sect “rfft_prg“;power:24STM #f

24、ft_data, AR2STM #fft_out, AR4STM #K_FFT_SIZE*2-1, BRCRPTB power_end-1SQUR *AR2+, ASQURA *AR2+, ASTH A, *AR4+;power_end:RET.end链接命令文件 rfft_task.cmd 清单:vector.objrfft_task.obj-o rfft_task.obj-m rfft_task.map25-e rfft_taskMEMORY PAGE0:EPROM: org=0E000H len=1000HVECS: org=0FF80H len=0080HPAGE1:SPRAM: or

25、g=0060H len=0020HDARAM: org=0400H len=0600HRAM: org=8000H len=1400HSECTIONS sine1 : EPROM PAGE0cosine1 : EPROM PAGE0fft_prg : EPROM PAGE0.bss : SPRAM PAGE1sine : align(512)DARAM PAGE126cosine : align(512)DARAM PAGE1d_input : RAM PAGE1fft_data : RAM PAGE1fft_out : RAM PAGE1STACK : SPRAM PAGE1.vectors

26、 : VECS PAGE0七心得体会:通过这次 DSP 课程设计,加深对 DFT 算法原理和基本性质的理解,熟悉了 FFT 的算法原理和 FFT 子程序的算法流程和应用,掌握了 DSP 中 FFT 的设计和编程思想,以及用 FFT 对连续信号和时域信号进行频谱分析的方法,和使用 CCS 的波形观察器观察波形和频谱情况。这次课程设计,使我增长了知识,同时也增强了我动手解决问题的能力,锻炼我做事细心、用心、耐心的能力。同时也让我意识到平时的课程文化的学习固然非常重要,但是在与实际相联系的过程中还是有许多问题的,所以在以后的学习生活中,我要努力学习,培养自己独立思考的能力,要加强理论文27化与实际操作的联系。积极参加各种设计活动,培养自己的综合能力,使自己得到全面的提高。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报