北邮DSP实验二.docx
- 文档编号:5415038
- 上传时间:2023-05-08
- 格式:DOCX
- 页数:28
- 大小:1.47MB
北邮DSP实验二.docx
《北邮DSP实验二.docx》由会员分享,可在线阅读,更多相关《北邮DSP实验二.docx(28页珍藏版)》请在冰点文库上搜索。
北邮DSP实验二
2015-2016学年第二学期
信号与信息处理综合实验(DSP)
实验二
学院:
信息与通信工程学院
班级:
学号:
姓名:
班内序号:
一.实验目的
进一步熟悉CCSv5的开发环境,掌握调试的要素,并理解FFT的过程。
二.实验环境
CodeComposerStudiov5,WindowsXP,DSP开发板
三.实验要求
3.1基本要求
将FFT结果写入SDRAM后,并读取出来。
3.2提高要求
1)有创意的设计;
2)采用改进程序性能的其他方法(如执行效率、内存占用量、灵活性、可移植性等);
3)功能扩展:
如其他点数的FFT等;
如FFT后再进行IFFT,验证是否与原数据一致等。
四.实验原理
4.1DFT简介
对于N点序列
,它的离散傅里叶变换(DFT)为
通常以符号
表示这一变换,即
4.2FFT简介
1)DFT(离散傅里叶变换)是信号处理中的一种变换,可以将一个时域信号变换到频域。
2)有些信号在时域上是很难看出什么特征的,但是如果变换到频域之后,就很容易看出特征了,而且更容易处理。
3)直接计算DFT的计算量与变换区间长度N的平方成正比,当N较大时,计算量太大,直接用DFT算法进行谱分析和信号的实时处理是不切实际的。
4)FFT(快速傅里叶变换)是DFT的快速算法,FFT的发现使得信号实时的谱分析和处理成为了可能。
4.3基2FFT算法
直接计算DFT:
长度为N的有限长序列
的DFT为:
考虑
为复数序列的一般情况,对某一个
值,直接按上式计算
值,需要
次复数乘法以及
次复数加法。
FFT算法是不断地把长序列的DFT分解成几个短序列的DFT,并利用旋转因子的周期性和对称性来减少DFT的运算次数。
在基2快速算法中,频域抽取法FFT是一种常用的快速算法。
设序列
长度为
,将序列
前后对半分为
以及
两组序列,用2个
点DFT来完成一个
点DFT的计算。
令:
根据下图有
即可将一个
点DFT分解为两个
点DFT来计算,反复迭代可降低运算复杂度。
蝶形运算单元:
4.4IDFT原理
离散傅里叶变换的逆变换(IDFT)为:
通常以符号
表示这一变换,即
4.5IFFT原理
利用FFT计算IFFT原理如下:
即:
4.6寄存器及配置
1)GBLCTL寄存器
图GBLCTL寄存器配置
EMIFA_GBLCTL_RMK
(
EMIFA_GBLCTL_EK2RATE_FULLCLK,//1XEMIFinputclock
EMIFA_GBLCTL_EK2HZ_CLK,//eclkout2continueoutputduringhold
EMIFA_GBLCTL_EK2EN_ENABLE,//eclkout2enableoutput
EMIFA_GBLCTL_BRMODE_MRSTATUS,
//busrequestismemoryaccessorrefreshpending/inprogress
EMIFA_GBLCTL_NOHOLD_DISABLE,
EMIFA_GBLCTL_EK1HZ_CLK,//eclkout1continueoutputduringhold
EMIFA_GBLCTL_EK1EN_ENABLE,//eclkout1enableoutput
EMIFA_GBLCTL_CLK4EN_ENABLE,//clkout4outputenable
EMIFA_GBLCTL_CLK6EN_ENABLE//clkout6outputenable
)
2)CECTL0-3寄存器配置
图CECTL寄存器配置
0xffffffd3为64BITSDRAM的配置,32BITSDRAM的相应配置为0xffffff33,16BITSDRAM的相应配置为0xffffff93,8BITSDRAM的相应配置为0xffffff83。
其余位为对CE空间对外设的读写建立时间、选通和保持时间参数等等的配置,可以参照TMS320C6000DSPExternalMemoryInterface(EMIF)中的“CECTLRegisterFieldDescriptions”来确定各个位置的值。
//CECTL0配置
0xffffffd3,
//CECTL1配置
0xffffffe3,
//CECTL2配置
0x22a28a22,
//CECTL3配置
0x22a28a22,
3)SDCTL寄存器配置
图SDCTL寄存器配置
EMIFA_SDCTL_RMK
(
EMIFA_SDCTL_SDBSZ_4BANKS,//SDRAMbanksize4banks
EMIFA_SDCTL_SDRSZ_11ROW,//rownumber=11
EMIFA_SDCTL_SDCSZ_8COL,//columnnumber=8
EMIFA_SDCTL_RFEN_ENABLE,//SDRAMrefreshenable
EMIFA_SDCTL_INIT_YES,//SDRAM配置完每个CE空间后,初始化
EMIFA_SDCTL_TRCD_OF
(2),//TRCD=(Trcd/Tcyc)-1
EMIFA_SDCTL_TRP_OF
(2),//TRP=(Trp/Tcyc)-1,3个
EMIFA_SDCTL_TRC_OF(8),
EMIFA_SDCTL_SLFRFR_DISABLE//selfrefreshmodedisable
)
4)SDTIM寄存器
图SDTIM寄存器值
EMIFA_SDTIM_RMK
(
EMIFA_SDTIM_XRFR_DEFAULT,//EXTTIMERdefault
EMIFA_SDTIM_PERIOD_OF(2083)//refreshperiod,clockout1=10ns
)
5)SDEXT寄存器配置
图SDEXT寄存器配置
EMIFA_SDEXT_RMK
(
EMIFA_SDEXT_WR2RD_OF(0),//cyclesbetweenwritetoreadcommand=1,subtract1is0
EMIFA_SDEXT_WR2DEAC_OF
(1),//cyclesbetweenwritetoprecharge=2
EMIFA_SDEXT_WR2WR_OF
(1),//cyclesbetweenwritetowrite=2
EMIFA_SDEXT_R2WDQM_OF
(1),//cyclesbetweenreadtobex=2
EMIFA_SDEXT_RD2WR_OF(0),//cyclesbetweenreadtowrite=1
EMIFA_SDEXT_RD2DEAC_OF
(1),//
EMIFA_SDEXT_RD2RD_OF(0),//
EMIFA_SDEXT_THZP_OF
(2),//Troh=3cycle
EMIFA_SDEXT_TWR_OF
(1),//Twr=1clock+6ns
EMIFA_SDEXT_TRRD_OF(0),//Trrd=12ns
EMIFA_SDEXT_TRAS_OF(5),//Tras=42ns
EMIFA_SDEXT_TCL_OF
(1)//caslatency=3clock
)
6)CE0SEC~CE3SEC寄存器配置
图CE0SEC~CE3SEC寄存器配置
设置同步接口数据读延时,可以设置0~3个时钟周期的延时。
0x00000002,
0x00000002,
0x00000002,
0x00000002
五.功能描述
1)对时域信号进行64点的FFT,绘图观测频域结果;
2)对频域信号进行64点的IFFT并查看结果;
3)进行FFT之前先把时域信号写入SDRAM,之后再从SDRAM中读出,并将IFFT的结果与之进行比较,根据对错情况点亮LED;
4)使用软件流水技术对代码进行优化。
六.程序模块描述
6.1FFT模块
对时域信号进行64点的FFT,其中参数以及关键函数说明如下:
1)shortw[2*N]:
N点FFT的旋转因子,由tw_fft16x16.exe生成;
2)shortx[2*N]:
输入的N点时域信号,其中实部和虚部按顺序排列;
3)shorty[2*N]:
用来存储FFT计算之后的结果;
4)DSP_fft(w,N,x,y):
对输入信号x进行N点Radix-4FFT,并将结果存放在y中,其中w为N点FFT旋转因子。
6.2SDRAM模块
使用SDRAM写入以及读取数据,其中参数、关键函数以及文件说明如下:
1)staticEMIFA_ConfigMyEmifaConfig:
在csl_emifa.h中声明一个结构体EMIFA_Config,用来配置EMIFA,实现对EMIFA总线的12个接口寄存器的配置,具体配置信息在MyEmifaConfig结构体中;
2)#pragmaDATA_SECTION(sdram_data,".off_ram"):
数据段定义,定义要写入的数据位置,需要在CMD文件中建立对应的section;
3)C641x_SDRAM.cmd:
描述物理寄存器的管理,分配和使用情况,用于DSP代码的定位。
6.3IFFT模块
对频域信号进行64点的IFFT,其中参数以及关键函数说明如下:
1)shortw[2*N]:
N点FFT的旋转因子,由tw_fft16x16.exe生成;
2)shortx1[2*N]:
存储输入的N点时域信号,其中实部和虚部按顺序排列;
3)shortx2[2*N]:
存储IFFT计算之后的结果;
4)DSP_fft(w,N,x,y):
对输入信号x进行N点Radix-4FFT,并将结果存放在y中,其中w为N点FFT旋转因子(在本程序中我们使用FFT函数实现IFFT)。
七.程序流程图
八.各种功能的测试记录、结果及说明
8.1功能分析
本实验所设计的功能都顺利实现:
1)对时域信号进行64点的FFT,绘图观测频域结果;
2)对频域信号进行64点的IFFT并查看结果;
3)进行FFT之前先把时域信号写入SDRAM,之后再从SDRAM中读出,并将IFFT的结果与之进行比较,根据对错情况点亮LED;
4)使用软件流水技术对代码进行优化。
8.2截图分析
1)FFT部分
FFT的结果储存在y序列中(64个点按实部虚部的顺序依次存储),通过View->Variable,可以查看y序列的值,如下图所示:
为了更形象地表示出FFT的结果,我们使用绘图工具绘制FFT的输出结果即m序列(m序列为64点FFT的复数结果)如下图所示,可以看出FFT的输出图像在
点处出现峰值。
2)IFFT部分
FFT的结果储存在x2序列中(64个点按实部虚部的顺序依次存储),通过View->Variable,可以查看x2序列的值,如下图所示:
3)SDRAM读写部分
将初始序列x从SDRAM中读出并赋值给x1序列,如下图所示:
将IFFT的结果x2序列与进行FFT之前的x1序列进行比较,控制台输出信息表明SDRAM的读写以及FFT、IFFT是正确的,如下图所示:
在板子上观测到0,1,2的LED灯被点亮,说明结果正确,如下图所示:
改变x2序列并再次x1序列进行比较,此时在板子上观测到只有0的LED灯被点亮,如下图所示:
4)优化部分
在优化前,运行程序所需时间为177219576个时钟周期,进行流水线优化之后,运行程序所需时间为72377859个时钟周期,如下图所示:
九.调试过程中的主要问题及难点
这次实验在操作部分比较简单,没有遇到太大的问题,因此只花了一节课的时间就顺利完成实验,所遇到的问题主要是一些理论性的问题,如下:
1)FFT结果图为什么会在这些位置出现峰值,它满足奈奎斯特抽样定律吗?
答:
输入信号为
与下式比较
得到
因此输出图像在
以及
处有峰值,又因为以
进行周期延拓,所以在
以及
处有峰值,满足奈奎斯特抽样定律。
2)旋转因子是怎么计算得到的?
答:
旋转因子为FFT公式
中的矩阵
,具体的形式如下:
十.心得体会
本次实验操作难度不是很大,有了第一次实验的经验,我们对CC5开发环境已经比较熟悉了,所以,我们在教师资源中给出的例程的基础上,逐步按照实验指导书来操作,就很容易地完成基本的实验要求。
但在实现IFFT以及整合代码的过程中,由于对相关的理论知识掌握不牢固、对开发板理解不足等原因,我们遇到了一些阻碍。
在重新认真复习DSP课本之后,我们进一步加深了对FFT和IFFT算法的理解,查找资料并反复对代码进行修改和完善,最终顺利实现了IFFT功能。
另外还有一些问题,是我们在与周围同学一起讨论之后商量出解决办法的。
比如,在查看变量的过程中,我们发现按照实验指导书中步骤给出的View->Variables步骤,并不能查看所有变量,后来发现通过Expressions窗口可以添加并观察所有变量结果。
这个过程让我们对FFT、IFFT原理以及SDRAM读写操作等知识有了系统的了解和掌握,因为花费了较长时间,因此收获比仅完成基本实验要求要大得多。
在验收过程中,助教学长提问我的问题比较简单,提问同组另一个同学的问题则有一些难度,而他完美回答了学长提出的问题,并得到了学长的表扬和赞许,让我意识到自己需要再加强理论知识的理解和学习。
通过这次实验,我把以前学过的理论知识又复习了一遍,同时初步学会将它应用于实践,但这是远远不够的,我仍需要在接下来的实验以认真的态度对待,以便能在今后所剩不多的实验里学到更多东西。
十一.程序源代码
#include"dsp_fft.h"
#include"math.h"
#defineN64
//64点FFT的旋转因子,由tw_fft16x16.exe生成
constshortw[2*N]=
{
0x0000,0x7FFF,0x0C8B,0x7F61,0x0000,0x7FFF,0x18F8,0x7D89,
0x0000,0x7FFF,0x2527,0x7A7C,0x18F8,0x7D89,0x2527,0x7A7C,
0x30FB,0x7641,0x471C,0x6A6D,0x471C,0x6A6D,0x62F1,0x5133,
0x30FB,0x7641,0x3C56,0x70E2,0x5A82,0x5A82,0x6A6D,0x471C,
0x7641,0x30FB,0x7F61,0x0C8B,0x471C,0x6A6D,0x5133,0x62F1,
0x7641,0x30FB,0x7D89,0x18F8,0x7D89,-0x18F8,0x70E2,-0x3C56,
0x5A82,0x5A82,0x62F1,0x5133,0x7FFF,0x0000,0x7D89,-0x18F8,
0x5A82,-0x5A82,0x3C56,-0x70E2,0x6A6D,0x471C,0x70E2,0x3C56,
0x7641,-0x30FB,0x6A6D,-0x471C,0x18F8,-0x7D89,-0x0C8B,-0x7F61,
0x7641,0x30FB,0x7A7C,0x2527,0x5A82,-0x5A82,0x471C,-0x6A6D,
-0x30FB,-0x7641,-0x5133,-0x62F1,0x7D89,0x18F8,0x7F61,0x0C8B,
0x30FB,-0x7641,0x18F8,-0x7D89,-0x6A6D,-0x471C,-0x7A7C,-0x2527,
0x0000,0x7FFF,0x30FB,0x7641,0x0000,0x7FFF,0x5A82,0x5A82,
0x0000,0x7FFF,0x7641,0x30FB,0x5A82,0x5A82,0x7641,0x30FB,
0x7FFF,0x0000,0x5A82,-0x5A82,0x5A82,-0x5A82,-0x30FB,-0x7641,
0x0000,0x0000,0x0000,0x7FFF,0x0000,0x7FFF,0x0000,0x7FFF
};
//输入时域信号,i=[0:
63],x=1000*cos(i*pi/32)+1000*cos(i*pi/16)
//实部虚部顺序排列
shortx[2*N]=
{
2000,0,1975,0,1904,0,1788,0,1631,0,1437,0,1214,0,968,0,707,0,439,0,173,0,
-84,0,-324,0,-541,0,-729,0,-883,0,-1000,0,-1079,0,-1119,0,-1122,0,-1090,0,-1027,0,
-938,0,-829,0,-707,0,-578,0,-449,0,-326,0,-217,0,-125,0,-57,0,-14,0,0,0,
-14,0,-57,0,-125,0,-217,0,-326,0,-449,0,-578,0,-707,0,-829,0,-938,0,-1027,0,
-1090,0,-1122,0,-1119,0,-1079,0,-1000,0,-883,0,-729,0,-541,0,-324,0,-84,0,
173,0,439,0,707,0,968,0,1214,0,1437,0,1631,0,1788,0,1904,0,1976,0
};
shortx1[2*N]={0};
shortx2[2*N]={0};
//存储FFT之后的结果
shorty[2*N]=
{
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
};
intm[N]={0};
#include
#include
#include
#include
#include
#include"dsk6416.h"
#include"dsk6416_led.h"
staticEMIFA_ConfigMyEmifaConfig=
{
EMIFA_GBLCTL_RMK
(
EMIFA_GBLCTL_EK2RATE_FULLCLK,//1XEMIFinputclock
EMIFA_GBLCTL_EK2HZ_CLK,//eclkout2continueoutputduringhold
EMIFA_GBLCTL_EK2EN_ENABLE,//eclkout2enableoutput
EMIFA_GBLCTL_BRMODE_MRSTATUS,//busrequestismemoryaccessorrefreshpending/inprogress
EMIFA_GBLCTL_NOHOLD_DISABLE,
EMIFA_GBLCTL_EK1HZ_CLK,//eclkout1continueoutputduringhold
EMIFA_GBLCTL_EK1EN_ENABLE,//eclkout1enableoutput
EMIFA_GBLCTL_CLK4EN_ENABLE,//clkout4outputenable
EMIFA_GBLCTL_CLK6EN_ENABLE//clkout6outputenable
),
0xffffffd3,//64BITSDRAM
//0xffffff33,//32BITSDRAM
//0xffffff93,//16bitSDRAM
//0xffffff83,//8bitSDRAM
0xffffffe3,
0x22a28a22,
0x22a28a22,
EMIFA_SDCTL_RMK
(
EMIFA_SDCTL_SDBSZ_4BANKS,//SDRAMbanksize4banks
EMIFA_SDCTL_SDRSZ_11ROW,//rownumber=11
EMIFA_SDCTL_SDCSZ_8COL,//columnnumber=8
EMIFA_SDCTL_RFEN_ENABLE,//SDRAMrefreshenable
//EMIFA_SDCTL_INIT_NO,//SDRAM配置完每个CE空间后,不初始化
EMIFA_SDCTL_INIT_YES,//SDRAM配置完每个CE空间后,初始化
EMIFA_SDCTL_TRCD_OF
(2),//TRCD=(Trcd/Tcyc)-1
EMIFA_SDCTL_TRP_OF
(2),//TRP=(Trp/Tcyc)-1,3个
EMIFA_SDCTL_TRC_OF(8),
EMIFA_SDCTL_SLFRFR_DISABLE//selfrefreshmodedisable
),
EMIFA_SDTIM_RMK
(
EMIFA_SDTIM_XRFR_DEFAULT,//EXTTIMERdefault
EMIFA_SDTIM_PERIOD_OF(2083)//refre
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北邮 DSP 实验