北邮信号与信息处理DSP实验二.docx

上传人:b****5 文档编号:7896251 上传时间:2023-01-27 格式:DOCX 页数:17 大小:666.46KB
下载 相关 举报
北邮信号与信息处理DSP实验二.docx_第1页
第1页 / 共17页
北邮信号与信息处理DSP实验二.docx_第2页
第2页 / 共17页
北邮信号与信息处理DSP实验二.docx_第3页
第3页 / 共17页
北邮信号与信息处理DSP实验二.docx_第4页
第4页 / 共17页
北邮信号与信息处理DSP实验二.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

北邮信号与信息处理DSP实验二.docx

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

北邮信号与信息处理DSP实验二.docx

北邮信号与信息处理DSP实验二

信号与信息综合处理

实验报告

 

学院:

班级:

姓名:

学号:

实验二FFT实现

1.实验目的

进一步熟悉CCSv5的开发环境,掌握调试的要素,并理解FFT的过程。

2.实验原理

2.1FFT变换

(1)FFT算法:

(2)蝶形运算图:

(3)实现函数:

DSP_fft(w,N,x,y)。

2.2IFFT变换

(1)算法实现:

(2)实现流程:

2.3SDRAM

(1)EMIFA_Config:

在csl_emifa.h中声明了一个结构体EMIFA_Config,用来配置EMIFA。

结构体中声明的12个32位无符号整形变量为EMIFA总线的12个接口寄存器;

(2)指定SDRAM数据空间:

#pragmaDATA_SECTION(sdram_data,".off_ram");

unsignedintsdram_data[0x10000];

上述代码含义为定义一个全局变量sdram_data[0x10000],将它指定到自定义的数据空间段off_ram中,其中函数具体用法为#pragmaDATA_SECTION(函数名或全局变量名,"用户自定义在数据空间的段名";

(3)CMD文件:

DSP系统中存在大量的存储器,CMD文件描述物理存储器的管理、分配和使用情况,用于DSP代码的定位。

3.程序功能

2

3

3.1FFT变换

通过给定的旋转因子,利用DSP_fft(w,N,x,y)函数,对给定64点序列进行FFT变换,其中N为变换点数,具体说明如下:

(1)w[64]为64点FFT的旋转因子,由tw_fft16x16.exe生成;

(2)x[128]内存放原序列,即输入时域信号的实部虚部按顺序排列;

(3)y[128]内存放FFT变换后的序列,实部虚部按顺序排列;

(4)m[64]内存放FFT变换后64点模值的平方。

3.2IFFT变换

利用FFT变换的相关性质,对FFT变换后的序列进行IFFT反变换,并将IFFT后结果存入x2[128]序列中。

3.3SDRAM内数据读写

实现指定序列的读写功能,具体说明如下:

(1)x[128],y[128]写入SDRAM,以备后续使用;

(2)从SDRAM内读取x[128],与x2[128]进行比较;

(3)通过DIP按键控制LED灯实现不同灯型的变化。

3.4变换前后数据验证

比对x[128]和x2[128]序列内各数据,若满足误差在允许范围内,则说明原序列与经历FFT和IFFT后得到的序列一致,点亮LED0~2,证明此次实验的正确性。

4.程序基本信息

4

4.1程序模块

(1)FFT模块:

功能:

对给定序列进行64点FFT变换,并将原序列及变换后序列写入SDRAM中;

输入接口:

无;

输出接口:

SDRAM,将原序列及变换后序列内各数据写入SDRAM中,以备后续使用。

(2)IFFT模块:

功能:

通过FFT变换相关性质,对变换后的序列进行IFFT反变换;

输入接口:

无;

输出接口:

无。

(3)SDRAM模块:

功能:

通过从SDRAM内读出原序列,并与IFFT变换后的是序列进行逐个比较,若误差在一定范围内,则点亮三个LED灯以示正确,否则只有一个LED灯亮;

输入接口:

SDRAM,读出原始序列,以供后续比较使用;

输出接口:

LED灯,判断IFFT后结果是否与原序列一致,如果误差在允许范围内,则LED0~2被点亮,否则LED0被点亮。

4.2代码

1#include"dsp_fft.h"

2//#include"dsp_fft16x32.h"

3#include"math.h"

4#defineN64

5

6//64点FFT的旋转因子,由tw_fft16x16.exe生成

7constshortw[2*N]=

8{

90x0000,0x7FFF,0x0C8B,0x7F61,0x0000,0x7FFF,0x18F8,0x7D89,

100x0000,0x7FFF,0x2527,0x7A7C,0x18F8,0x7D89,0x2527,0x7A7C,

110x30FB,0x7641,0x471C,0x6A6D,0x471C,0x6A6D,0x62F1,0x5133,

120x30FB,0x7641,0x3C56,0x70E2,0x5A82,0x5A82,0x6A6D,0x471C,

130x7641,0x30FB,0x7F61,0x0C8B,0x471C,0x6A6D,0x5133,0x62F1,

140x7641,0x30FB,0x7D89,0x18F8,0x7D89,-0x18F8,0x70E2,-0x3C56,

150x5A82,0x5A82,0x62F1,0x5133,0x7FFF,0x0000,0x7D89,-0x18F8,

160x5A82,-0x5A82,0x3C56,-0x70E2,0x6A6D,0x471C,0x70E2,0x3C56,

170x7641,-0x30FB,0x6A6D,-0x471C,0x18F8,-0x7D89,-0x0C8B,-0x7F61,

180x7641,0x30FB,0x7A7C,0x2527,0x5A82,-0x5A82,0x471C,-0x6A6D,

19-0x30FB,-0x7641,-0x5133,-0x62F1,0x7D89,0x18F8,0x7F61,0x0C8B,

200x30FB,-0x7641,0x18F8,-0x7D89,-0x6A6D,-0x471C,-0x7A7C,-0x2527,

210x0000,0x7FFF,0x30FB,0x7641,0x0000,0x7FFF,0x5A82,0x5A82,

220x0000,0x7FFF,0x7641,0x30FB,0x5A82,0x5A82,0x7641,0x30FB,

230x7FFF,0x0000,0x5A82,-0x5A82,0x5A82,-0x5A82,-0x30FB,-0x7641,

240x0000,0x0000,0x0000,0x7FFF,0x0000,0x7FFF,0x0000,0x7FFF

25

26};

27

28//输入时域信号,i=[0:

63],x=1000*cos(i*pi/32)+1000*cos(i*pi/16)

29//实部虚部顺序排列

30shortx[2*N]=

31{

322000,0,1975,0,1904,0,1788,0,1631,0,1437,0,1214,0,968,0,707,0,439,0,173,0,

33-84,0,-324,0,-541,0,-729,0,-883,0,-1000,0,-1079,0,-1119,0,-1122,0,-1090,0,-1027,0,

34-938,0,-829,0,-707,0,-578,0,-449,0,-326,0,-217,0,-125,0,-57,0,-14,0,0,0,

35-14,0,-57,0,-125,0,-217,0,-326,0,-449,0,-578,0,-707,0,-829,0,-938,0,-1027,0,

36-1090,0,-1122,0,-1119,0,-1079,0,-1000,0,-883,0,-729,0,-541,0,-324,0,-84,0,

37173,0,439,0,707,0,968,0,1214,0,1437,0,1631,0,1788,0,1904,0,1976,0

38};

39

40shortx1[2*N]={0};

41shortx2[2*N]={0};

42

43//存储FFT之后的结果

44shorty[2*N]=

45{

460,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,

470,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,

480,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,

490,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

50};

51

52#include

53#include

54#include

55#include

56#include

57#include"dsk6416.h"

58#include"dsk6416_led.h"

59

60staticEMIFA_ConfigMyEmifaConfig=

61{

62EMIFA_GBLCTL_RMK

63(

64EMIFA_GBLCTL_EK2RATE_FULLCLK,//1XEMIFinputclock

65EMIFA_GBLCTL_EK2HZ_CLK,//eclkout2continueoutputduringhold

66EMIFA_GBLCTL_EK2EN_ENABLE,//eclkout2enableoutput

67EMIFA_GBLCTL_BRMODE_MRSTATUS,//busrequestismemoryaccessorrefreshpending/inprogress

68EMIFA_GBLCTL_NOHOLD_DISABLE,

69EMIFA_GBLCTL_EK1HZ_CLK,//eclkout1continueoutputduringhold

70EMIFA_GBLCTL_EK1EN_ENABLE,//eclkout1enableoutput

71EMIFA_GBLCTL_CLK4EN_ENABLE,//clkout4outputenable

72EMIFA_GBLCTL_CLK6EN_ENABLE//clkout6outputenable

73),

740xffffffd3,//64BITSDRAM

75//0xffffff33,//32BITSDRAM

76//0xffffff93,//16bitSDRAM

77//0xffffff83,//8bitSDRAM

780xffffffe3,

790x22a28a22,

800x22a28a22,

81EMIFA_SDCTL_RMK

82(

83EMIFA_SDCTL_SDBSZ_4BANKS,//SDRAMbanksize4banks

84EMIFA_SDCTL_SDRSZ_11ROW,//rownumber=11

85EMIFA_SDCTL_SDCSZ_8COL,//columnnumber=8

86EMIFA_SDCTL_RFEN_ENABLE,//SDRAMrefreshenable

87//EMIFA_SDCTL_INIT_NO,//SDRAM配置完每个CE空间后,不初始化

88EMIFA_SDCTL_INIT_YES,//SDRAM配置完每个CE空间后,初始化

89EMIFA_SDCTL_TRCD_OF

(2),//TRCD=(Trcd/Tcyc)-1

90EMIFA_SDCTL_TRP_OF

(2),//TRP=(Trp/Tcyc)-1,3个

91EMIFA_SDCTL_TRC_OF(8),

92EMIFA_SDCTL_SLFRFR_DISABLE//selfrefreshmodedisable

93),

94EMIFA_SDTIM_RMK

95(

96EMIFA_SDTIM_XRFR_DEFAULT,//EXTTIMERdefault

97EMIFA_SDTIM_PERIOD_OF(2083)//refreshperiod,clockout1=10ns

98),

99EMIFA_SDEXT_RMK

100(

101EMIFA_SDEXT_WR2RD_OF(0),//cyclesbetweenwritetoreadcommand=1,subtract1is0

102EMIFA_SDEXT_WR2DEAC_OF

(1),//cyclesbetweenwritetoprecharge=2

103EMIFA_SDEXT_WR2WR_OF

(1),//cyclesbetweenwritetowrite=2

104EMIFA_SDEXT_R2WDQM_OF

(1),//cyclesbetweenreadtobex=2

105EMIFA_SDEXT_RD2WR_OF(0),//cyclesbetweenreadtowrite=1

106EMIFA_SDEXT_RD2DEAC_OF

(1),//

107EMIFA_SDEXT_RD2RD_OF(0),//

108EMIFA_SDEXT_THZP_OF

(2),//Troh=3cycle

109EMIFA_SDEXT_TWR_OF

(1),//Twr=1clock+6ns

110EMIFA_SDEXT_TRRD_OF(0),//Trrd=12ns

111EMIFA_SDEXT_TRAS_OF(5),//Tras=42ns

112EMIFA_SDEXT_TCL_OF

(1)//caslatency=3clock

113),

1140x00000002,

1150x00000002,

1160x00000002,

1170x00000002

118};

119

120#pragmaDATA_SECTION(sdram_data,".off_ram");

121unsignedintsdram_data[0x400000];

122

123voidmain()

124{

125inti,m[N];

126Uint32good_flag;

127good_flag=0;

128

129DSK6416_init();

130DSK6416_LED_init();

131

132//初始化CSL

133CSL_init();

134

135//配置EMIFA

136EMIFA_config(&MyEmifaConfig);

137

138for(i=0;i<0x400000;i++)

139{

140sdram_data[i]=0;

141}

142

143//FFT会改变x[i]的值,故先将其存入SDRAM

144printf("x[i]:

");

145for(i=0;i<2*N;i++)

146{

147sdram_data[i]=x[i];

148printf("%d",x[i]);

149}

150printf("\n");

151

152//FFT

153DSP_fft(w,N,x,y);

154

155//FFT结果y[i]的值,存入SDRAM

156printf("y[i]:

");

157for(i=0;i<2*N;i++)

158{

159sdram_data[i+2*N]=y[i];

160printf("%d",y[i]);

161}

162printf("\n");

163

164//FFT结果y[i]的模值平方

165printf("m[i]:

");

166for(i=0;i

167{

168m[i]=y[2*i]*y[2*i]+y[2*i+1]*y[2*i+1];

169printf("%d",m[i]);

170}

171printf("\n");

172

173//IFFT将y[i]共轭除以增益系数N(即FFT点数)

174for(i=0;i<2*N;i++)

175{

176

177if(i%2==1)y[i]=-y[i];

178y[i]=y[i]/N;

179}

180

181//IFFT利用FFT进行IFFT

182DSP_fft(w,N,y,x2);

183

184//IFFTFFT会修改y[i]重新把y[i]从SDRAM中读出

185printf("y[i]fromSDRAM:

");

186for(i=0;i<2*N;i++)

187{

188y[i]=sdram_data[i+2*N];

189printf("%d",y[i]);

190}

191printf("\n");

192

193//IFFT将FFT的结果共轭即为IFFT结果

194printf("x2[i]:

");

195for(i=0;i<2*N;i++)

196{

197if(i%2==1)x2[i]=-x2[i];

198printf("%d",x2[i]);

199}

200printf("\n");

201

202//FFT将x[i]的值从SDRAM中读出赋给x1[i]

203printf("x1[i]:

");

204for(i=0;i<2*N;i++)

205{

206x1[i]=sdram_data[i];

207printf("%d",x1[i]);

208}

209printf("\n");

210

211//将IFFT的结果x2[i]与FFT前的数据x1[i]进行比较

212for(i=0;i<2*N;i++)

213{

214if(abs(x2[i]-x1[i])>10)

215{

216good_flag=0;

217break;

218}

219good_flag=1;

220}

221

222if(good_flag==1)

223{

224DSK6416_LED_on(0);

225DSK6416_LED_on

(1);

226DSK6416_LED_on

(2);

227DSK6416_LED_off(3);

228printf("IFFTRESULTISOK!

\n");

229}

230else

231{

232DSK6416_LED_on(0);

233DSK6416_LED_off

(1);

234DSK6416_LED_off

(2);

235DSK6416_LED_off(3);

236printf("IFFTRESULTISFAILED!

\n");

237}

238

4.3流程图

(1)SDRAM配置流程图

(2)SDRAM配置流程图

5.组内分工

6.功能测试

239

240

2

3

4

5

6

6.1软件平台

(1)查看变量:

通过View->Variables可以查看各个变量的值。

(2)图形显示工具:

CCSv5中提供了一个高级图形和图像可视化工具。

它可通过图形形式显示数组,并且可采用多种格式。

查看m序列中的数值,即观测FFT变换后各点模值的平方。

(3)Console控制台显示:

x[i]:

初始序列,即需要进行FFT变换的64点的实部、虚部按序排列;

y[i]:

FFT的结果,即变换后64点的实部、虚部按序排列;

m[i]:

FFT变换所得各点模值平方;

x2[i]:

IFFT变换结果,即反变换后64点实部、虚部按序排列;

x1[i]:

从SDRAM读出的x[i]原始序列;

结论:

“IFFTRESULTISOK!

”代表变换前后数据一致,否则显示“IFFTRESULTISFAILED!

”。

(4)代码优化:

如果没有进行软件流水,程序运行结束时,clock显示为:

17736121,即程序共需要17736121个时钟周期。

优化后,程序运行结束时,clock显示为:

52753,即程序共需要52753个时钟周期。

6.2DSP

执行程序后,LED测试效果为LED0~2均被点亮,即变换前后一致。

7.重点、难点

(1)断点调试问题

在不同行设置断点,运行结果不同。

在本次实验的调试过程中,应注意将断点设置在最后一行以上,以免出现灰断点,保证单次运行的正常进行。

此外,通过View->Variables查看各个变量的值,有时会出现原程序执行时不能显示出变量对应值的情况。

经过尝试,发现在只需加入单次运行的断点即可解决这一问题。

(2)IFFT及其验证

在进行IFFT拓展功能时,考虑使用现有函数实现IFFT反变换,但出现错误。

调试无果后决定弃用现有函数库中的函数,利用FFT变换的性质进行IFFT。

虽然简化了对代码的理解,但是仍会有部分误差,无法保证变换前后数据完全一致,因而设置误差范围设定为10,在误差范围内的误差视为可被忽略

(3)SDRAM配置及数据读写

之前没有接触过SDRAM的配置,因而在按照实验指导书中的步骤添加代码段和配置时,花了较长时间理解。

起初按部就班地建立了两个工程,在链接过程中出现了问题,最后尝试将代码合并,但是数据读写的逻辑顺序仍需注意。

FFT可能会改变原序列的值,因为应在FFT变换之前就将x序列写入SDRAM,以备之后读出存入x1中,并与IFFT结果进行比较。

8.心得体会

本次实验是基于DSP中FFT及IFFT进行的,虽然对相关内容的细节稍有

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

当前位置:首页 > IT计算机 > 互联网

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

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