信号与信息处理综合实验(DSP部分)学院:信息与通信工程学院班级:2013211125姓名:商晴庆学号:班内序号:组号:2016年4月实验二 FFT的实现一、实验目的(1)进一步熟悉DSK6416开发平台,掌握调试功能;(2)充分理解FFT过程,并编码实现功能。
二、程序功能(1)基础:将FFT结果写入SDRAM中,并读取出来。
(2)提高:其他点数的FFT三、模块描述(1)GBLCTL寄存器配置部分:static EMIFA_Config MyEmifaConfig ={EMIFA_GBLCTL_RMK(EMIFA_GBLCTL_EK2RATE_FULLCLK, //1 X EMIF input clockEMIFA_GBLCTL_EK2HZ_CLK, //eclkout2 continue output during holdEMIFA_GBLCTL_EK2EN_ENABLE, //eclkout2 enable outputEMIFA_GBLCTL_BRMODE_MRSTATUS, //bus request is memory access or refresh pending/in progressEMIFA_GBLCTL_NOHOLD_DISABLE,EMIFA_GBLCTL_EK1HZ_CLK, //eclkout1 continue output during holdEMIFA_GBLCTL_EK1EN_ENABLE, //eclkout1 enable outputEMIFA_GBLCTL_CLK4EN_ENABLE, //clkout4 output enableEMIFA_GBLCTL_CLK6EN_ENABLE //clkout6 output enable),(2)CECTL0-3寄存器配置部分0xffffffd3, //64BIT SDRAM0xffffffe3,0x22a28a22,0x22a28a22,(3)SDCTL寄存器配置部分EMIFA_SDCTL_RMK(EMIFA_SDCTL_SDBSZ_4BANKS, //SDRAM bank size 4 banksEMIFA_SDCTL_SDRSZ_11ROW, //row number = 11EMIFA_SDCTL_SDCSZ_8COL, //column number = 8EMIFA_SDCTL_RFEN_ENABLE, //SDRAM refresh enable//EMIFA_SDCTL_INIT_NO, //SDRAM 配置完每个CE空间后,不初始化EMIFA_SDCTL_INIT_YES, //SDRAM 配置完每个CE空间后,初始化EMIFA_SDCTL_TRCD_OF(2), //TRCD = (Trcd / Tcyc) - 1EMIFA_SDCTL_TRP_OF(2), //TRP = (Trp / Tcyc) - 1,3个EMIFA_SDCTL_TRC_OF(8),EMIFA_SDCTL_SLFRFR_DISABLE //self refresh mode disable),(4)SDTIM寄存器配置部分EMIFA_SDTIM_RMK(EMIFA_SDTIM_XRFR_DEFAULT, //EXT TIMER defaultEMIFA_SDTIM_PERIOD_OF(2083) //refresh period,clockout1 = 10ns),EMIFA_SDEXT_RMK(EMIFA_SDEXT_WR2RD_OF(0), //cycles between write to read command = 1,subtract 1 is 0EMIFA_SDEXT_WR2DEAC_OF(1), //cycles between write to precharge = 2EMIFA_SDEXT_WR2WR_OF(1), //cycles between write to write = 2EMIFA_SDEXT_R2WDQM_OF(1), //cycles between read to bex = 2EMIFA_SDEXT_RD2WR_OF(0), //cycles between read to write = 1EMIFA_SDEXT_RD2DEAC_OF(1), //EMIFA_SDEXT_RD2RD_OF(0), //EMIFA_SDEXT_THZP_OF(2), //Troh = 3 cycleEMIFA_SDEXT_TWR_OF(1), //Twr = 1 clock +6 nsEMIFA_SDEXT_TRRD_OF(0), //Trrd = 12nsEMIFA_SDEXT_TRAS_OF(5), //Tras = 42nsEMIFA_SDEXT_TCL_OF(1) //cas latency = 3 clock),(5)CE0SEC~CE3SEC寄存器配置部分0x00000002,0x00000002,0x00000002,0x00000002(6)数据空间分配部分#pragma DATA_SECTION(sdram_data,".off_ram");unsigned int sdram_data[0x10000];//extern far void vectors();(7)主函数部分void main(){//int out[NUMSAMPLES];DSK6416_init();CSL_init(); //初始化CSLEMIFA_config(&MyEmifaConfig);//配置EMIFAint i;i = 0;short w[2*N] = {0};int x[2*N];int y[2*N] = {0};int m[N];double scale = 32767.5;gen_twiddle(w, N, scale);for(i=0; i<N; i++){x[2*i] = 1000 * cos(i*PI/32) + 1000*cos(i*PI/16);x[2*i + 1] = 0;sdram_data[2*i] = x[2*i];sdram_data[2*i + 1] = x[2*i +1];}// fftDSP_fft16x32(w,N,x,y);// 存储幅值for(i = 0; i < N; i++){m[i] = y[2*i] * y[2*i] + y[2*i + 1] * y[2*i + 1];sdram_data[i + 2*N] = m[i];}// 检测写入是否成功for(i=0; i<N; i++){if(sdram_data[i+ 2*N]!=m[i])break;}if(i == N){DSK6416_LED_on(0);DSK6416_LED_on(2);DSK6416_LED_on(1);}}static short d2s(double d){if (d >= 32767.0) return 32767;if (d <= -32768.0) return -32768;return (short)d;}int gen_twiddle(short *w, int n, double scale){int i, j, k;for (j = 1, k = 0; j < n >> 2; j = j << 2){for (i = 0; i < n >> 2; i += j){w[k + 5] = d2s(scale * cos(6.0 * PI * i / n));w[k + 4] = d2s(scale * sin(6.0 * PI * i / n));w[k + 3] = d2s(scale * cos(4.0 * PI * i / n));w[k + 2] = d2s(scale * sin(4.0 * PI * i / n));w[k + 1] = d2s(scale * cos(2.0 * PI * i / n));w[k + 0] = d2s(scale * sin(2.0 * PI * i / n));k += 6;}}return k;}四、程序流程图(1)FFT流程图(2)SDRAM写入和检测五、功能测试FFT结果:六、组内分工(1)商晴庆主要负责基础工程的搭建,并且完成了各种寄存器的配置;(2)赵建博主要负责分析FFT功能实现部分;(3)对于实验中出现的问题,两人共同分析解决。
七、问题分析(1)预计出现FFT结果时,图像显示为空。
解决方法:同时设置了两个断点,使运行时,两次都走到第一断点处停止,故没有得到正确的FFT结果,后来先设置一个断点运行一次,再设置另一断点后运行一次,顺利得到FFT的结果。
(2)运行后LED灯不亮。
解决方法:同样是因为断点设置的问题,后先后设置两个断点后,问题顺利解决。
八、心得体会通过本次实验,对CCS软件的使用和功能有了更进一步的了解。
由于有了第一次DSP实验的练习,对前期整个工程的路径配置就熟练了很多,很快就完成了前期操作。
这次实验要求我们明确掌握FFT的基本原理和具体实现。
由于对课本知识复习的不够,在具体实现时遇到了一点困难,觉得无从下手,实验过程中通过仔细研究FFT的原理,顺利完成了实验要求。
另外,实验中CCS软件断点设置部分的小插曲拉慢了我们实验过程,导致最后的结果迟迟出不来,我们要从中吸取教训,不能急,要一步一步来,另外要更加了解CCS功能的正确使用。
作为小组实验,我的队友在解决问题的过程中发挥了很大的作用,不慌不忙,有问题及时请教身边的同学。
在这种小组合作的实验中,我的综合素质有了提高,希望在今后的实验中可以学到更多。