北邮 DSP 实验二.docx

上传人:b****6 文档编号:4713092 上传时间:2022-12-07 格式:DOCX 页数:23 大小:1.47MB
下载 相关 举报
北邮 DSP 实验二.docx_第1页
第1页 / 共23页
北邮 DSP 实验二.docx_第2页
第2页 / 共23页
北邮 DSP 实验二.docx_第3页
第3页 / 共23页
北邮 DSP 实验二.docx_第4页
第4页 / 共23页
北邮 DSP 实验二.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

北邮 DSP 实验二.docx

《北邮 DSP 实验二.docx》由会员分享,可在线阅读,更多相关《北邮 DSP 实验二.docx(23页珍藏版)》请在冰豆网上搜索。

北邮 DSP 实验二.docx

北邮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)//ref

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

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1