快速傅立叶变换(FFT)的实现(DSP实验报告).docx

上传人:牧羊曲112 文档编号:4263781 上传时间:2023-04-12 格式:DOCX 页数:14 大小:252.84KB
返回 下载 相关 举报
快速傅立叶变换(FFT)的实现(DSP实验报告).docx_第1页
第1页 / 共14页
快速傅立叶变换(FFT)的实现(DSP实验报告).docx_第2页
第2页 / 共14页
快速傅立叶变换(FFT)的实现(DSP实验报告).docx_第3页
第3页 / 共14页
快速傅立叶变换(FFT)的实现(DSP实验报告).docx_第4页
第4页 / 共14页
快速傅立叶变换(FFT)的实现(DSP实验报告).docx_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《快速傅立叶变换(FFT)的实现(DSP实验报告).docx》由会员分享,可在线阅读,更多相关《快速傅立叶变换(FFT)的实现(DSP实验报告).docx(14页珍藏版)》请在三一办公上搜索。

1、快速傅立叶变换( FFT )的实现一、 实验目的在数字信号处理系统中, FFT 作为一个非常重要的工具经常使 用,甚至成为 DSP 运算能力的一个考核因素。 FFT 是一种高效实现 离散付氏变换的算法。 离散付氏变换的目的是把信号由时域变换到频 域,从而可以在频域分析处理信息, 得到的结果再由付氏逆变换到时 域。本实验的目的在于学习 FFT 算法, 及其在 TMS320C54X 上的 实现, 并通过编程掌握 C54X 的存储器管理、辅助寄存器的使用、 位倒序寻址方式等技巧,同时练习使用 CCS 的探针和图形工具。另 外在 BIOS 子目录下是一个使用 DSP/BIOS 工具实现 FFT 的程

2、序。通过该程序,你可以使用 DSP/BIOS 提供的分析工具评估 FFT 代码执行情况。二、 实验原理1)基 2 按时间抽取 FFT 算法 对于有限长离散数字信号 xn ,0 n -1 N,其离散谱 xk 可以由 离散付氏变换( DFT)求得。 DFT 的定义为:X(k) xne N k 0,1,.,N 1 n0可以方便的把它改写为如下形式:N1nkX(k)xnWnNk k 0,1,., N 1n0不难看出, WN 是周期性的,且周期为 N,即( n mN )(k lN )nkW NW N m,l 0, 1, 2.WN 的周期性是 DFT 的关键性质之一。为了强调起见,常用表达式 WN 取代

3、W 以便明确其周期是 N。2) 实数 FFT 运算对于离散傅立叶变换( DFT)的数字计算, FFT 是一种有效的方 法。一般假定输入序列是复数。当实际输入是实数时,利用对称性质 可以使计算 DFT 非常有效。一个优化的实数 FFT 算法是一个组合以后的算法。原始的 2N 个点的实输入序列组合成一个 N 点的复序列, 之后对复序列进行 N 点的 FFT 运算,最后再由 N 点的复数输出拆散成 2N 点的复数序 列,这 2N点的复数序列与原始的 2N点的实数输入序列的 DFT 输 出一致。使用这种方法,在组合输入和拆散输出的操作中, FFT 运算量减 半。这样利用实数 FFT 算法来计算实输入序

4、列的 DFT 的速度几乎 是一般复 FFT 算法的两倍。本实验就用这种方法实现了一个 256 点实数 FFT(2N = 256)运算。a. 实数 FFT 运算序列的存储分配如何利用有限的 DSP 系统资源, 合理的安排好算法使用的存储器是 一个比较要的问题。参见 FFT 实验程序的 CMD 文件:MEMORYPAGE 0: IPROG:origin= 0x3080,len= 0x1F80VECT:origin =0x3000,len =0x80EPROG:origin =0x38000,len =0x8000PAGE 1: USERREGS:origin= 0x60,len= 0x1cBIOS

5、REGS:origin =0x7c,len =0x4IDATA :origin =0x80,len =0xB80EDATA :origin =0xC00,len =0x1400SECTIONS.vectors: VECT PAGE 0.sysregs: BIOSREGS PAGE 1.trcinit : IPROG PAGE 0.gblinit : IPROG PAGE 0.bios: IPROG PAGE 0frt: IPROG PAGE 0.text: IPROG PAGE 0.cinit : IPROG PAGE 0.pinit: IPROG PAGE 0.sysinit: IPROG

6、PAGE 0.data EDATA PAGE 1.bss: IDATA PAGE 1.far: IDATA PAGE 1.const: IDATA PAGE 1.switch: IDATA PAGE 1.sysmem: IDATA PAGE 1.cio: IDATA PAGE 1.MEM$obj: IDATA PAGE 1.sysheap: IDATA PAGE 1从上面的连接定位 CMD 文件可以了解到,程序代码安排在 0x3000 开始的存储器中。其中 0x3000-0x3080 存放中断向量表。 FFT 程序使用的正弦表、余弦表数据( .data 段)安排在 0xc00 开始的地 方。变

7、量(.bss 段定义)存放在 0x80 开始的地址中。 另外,本 256 点 实数 FFT 程序的输入数据缓冲为 0x2300-0x23ff , FFT 后功率谱的 计算结果存放在 0x2200-0x22ff 中。b. 基二实数 FFT 运算的算法该算法主要分为四步:第一步,输入数据的组合和位倒序第二步, N 点复数 FFT第三步,分离复数 FFT 的输出为奇部分和偶部分第四步,产生最后的 N = 256 点的复数 FFT 结果3) 计算所求信号的功率由于最后所得的 FFT 数据是一个复数,为了能够方便的在虚拟频谱 仪上观察该信号的特征,我们通常对所得的 FFT 数据进行处理 取其实部和 虚部

8、的平方和,即求得该信号的功率。power: .asg AR2,AX.asg AR3,OUTPUT_BUFpshm st0;保存寄存器的值pshm ar0pshm bkSTM #d_output_addr,OUTPUT_BUF;AR3 指向输出缓冲地址STM #K_FFT_SIZE*2-1,BRC ;块循环计数器设置为255RPTBD power_end-4;带延迟方式的重复执行指令STM #fft_data,AX; AR2 指向 AR0SQUR *AX+,A; A : = AR2SQURA *AX+,A;A := AR2 + AI2STH A,7,*OUTPUT_BUF; 将 A 中的数据存入

9、输出缓冲中,ANDM #7FFFH,*OUTPUT_BUF+ ;避免输出数据过大在虚 拟示波器;中显示错误popm bk ;保存各个寄存器值popm ar0popm st0power_end:RET注意,在上面的程序中将数据放回输出缓冲准备输出时使用了指令:STH A,7,*OUTPUT_BUF对acc A左移 7 位是为了让显示的数据值在一个合适的范围内有利于 观察显示的图形,由于所有的数据都左移了 7 位,所以从总体上看 整个波形的性质还是一样的。同时,由于有的数据太大,为了避免显 示数据的溢出而导致在虚拟示波器中观察到的波形错误所以我们使 用了指令:ANDM #7FFFH,*OUTPUT

10、_BUF+来取出有效的数据位数。三、 实验内容1)启动 CCS,在 Project 菜单相项中打开 FFT 目录下的 fft.pjt 文 件。2)用鼠标展开左面项目栏,打开 fft.asm 源程序3) 使用 Bulid 命令完成编译、连接,并使用 Load Program 将生成的fft.out 装入 5402片内存储器。4) 将光标移动到“callg et_input 行”,并设置一个探针点。将光标移动 到下一行“nop语”句,使用工具设置一个断点。5) 在 File 菜单中打开选项“File I/O ,使”用 “Add File在”FFT 目录下 打开数据文件 fft.dat,然后修改“A

11、ddress参”数为 0x2300,修改 “ Length参”数为 256。这表示程序执行到探针点时,将从 fft.dat 文件 中读出 256 个数据,并将数据放入 0x2300 开始的存储器中。你可 以选择“Wrap Around”, 循环使用该数据文件。6) 选择“ Add Probe Point ,”将 探针点与数据文件连接起来。选择探 针点,然后在“Connect选”项中选择需要使用的数据文件名,再选择 “Replace,”按 确定键完成。这时将返回图 7 所示的对话框。你可以 看到“Probe项”被自动修改为 “Connected”, 表示探针已经与数据文 件成功相连。7) 完成探

12、针设置后,可以使用 F5 或“Run”命令启动程序运行。程 序执行到探针点时自动从数据文件读出 256 个点的数据放入输入缓 冲 0x2300。8) 在“View菜”单项下选择“Graph- Time/Frequency ,” 打开一个图 形工具以便显示输入数据波形。将 “StartA ddress”改为 0x2300,将 “ Acquisition Buffer Size 改”为 128,将“ DSPD ata Type ”改为“ 1-6bit signed integer ,这”样 即可显示 128 个输入点波形。9) 调整窗口显示大小,将光标移动到源程序的 “ b _c_int00 这”

13、行, 使用 Debug 中的 “Run to Cursor项”,程序将执行到这行并停下。这 时 FFT 程序已经计算完成。再打开一个波形显示窗口,这次仅仅将 “ Start Address改为”0x2200,便可以显示计算完成后的谱波形。10) 选择 “Debug下”的 “Animate运”行程序,这时程序将循环运行,不 断从数据文件 fft.dat 中读出数据,并计算其频谱。 这时你可以看到连 续的输入 /输出波形。11) 选择原始数据波形窗口,单击鼠标右键,进入 “Properties属性”对 话框。你可以将 “DisplayT ype”改为“FFTM agnitude ”, 这时输入数

14、据将显示其频谱,对比两个图形,看看谱线的位置一样吗?12) 清除所有断点、探针点,关闭 CCS 的源程序窗口和上面的工程 文件 fft.pjt ,然后在 Project 菜单下打开 BIOS 目录下 fft.pjt 文件。这时 一个 使用 DSP/BIOS 工 具 实 现 FFT 的 例子 。 为 了使 用 DSP/BIOS 的工具分析工具, 我们将 FFT 的源程序做了一点修改。 将 FFT 子程序做为一个中断函数, 并在 DSP/BIOS 的周期模块中调 用。所以在 DSP/BIOS 的配置文件中增加一个周期模块 PRD0, 并 且设置每 1ms 执行一次, 即每 1ms 执行一次 FFT

15、 子程序。这时 的主程序仅仅完成一次数据输入,然后返回DSP/BIOS 。以后DSP/BIOS 将每隔 1ms 启动一次周期函数,完成一次 FFT。13) 在 File 菜 单 中 用 Load Program 装 入 BIOS 目 录 下 的 demo5402.out 文件。 参照前面的函数中的 “ call wait_input 设”置一 个探针点,并建立数据文件连接。这时应该将输入数据读到 0x2900 开始的存储器中。在 FFT 子程序 process 中设置一个断点,启动程序运行。14) 程序将在第一次进入周期函数执行 FFT 子程序时停下来。使用图形工具观察输入信号波形(启始地址

16、0x2900 )。将 FFT 子程 序执行完,然后再使用图形工具观察 FFT 后的波形 (启始地址0x2800)。15)清除所有断点,以便程序连续运行。使用 Tools 菜单下的 DSP/BIOS 选项打开“RTAC ontrol Panel ”窗口,再打开 “Execution Graph”窗口。在“RTAControl Panel ”控制窗口中选择 “ enableS WI logging ”、 “ enable PRD logging和“”gobal host enable。恢复”程 序运 行,观察 FFT 程序执行情况。18) 在 Tools - DSP/BIOS - CPU Load Graph 窗口,观察CPU 占用情况。修改周期函数的周期,重新编译、连接、装入程序 并运行,看看 CPU 占用比有何变化?

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

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号