- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验二 FFT实现
一、实验目的
进一步熟悉CCS
程序功能
本程序的基本要求是:
(1)其他点数的FFTFFT后再进行IFFT,验证是否与原数据一致
三、程序基本信息
(一)、程序模块描述:
1、FFT程序(实现基本功能):
(1)FFT部分:
主函数(main):初始化输入序列、旋转因子、FFT点数,负责其它功能函数的调用,并完成一些基本操作。
void DSP_radix2(int n, short *restrict xy, const short *restrict w):完成FFT运算(基2频域抽选)。
参数说明:
n是输入序列的长度,short xy是输入序列(复数),const short w为旋转因子。
void bitrev_index(short *index, int n):计算得到重新排序表,n 为序列长度。
void DSP_bitrev_cplx(int *x, short *index, int nx):根据bitrev_index计算的排序表,把FFT输出的复数序列x重新排序为自然顺序。
DSP_bitrev_cplx:
(2)SDRAM配置与写入部分:
主函数(main):负责其它功能的调用,执行SDRAM写入、读取和检测,并点亮对应的LED。
EMIFA_config(MyEmifaConfig):实现对EMIFA总线的12个接口寄存器的配置。具体配置信息在MyEmifaConfig结构体中。
#pragma DATA_SECTION(sdram_data,.off_ram);数据段定义,定义要写入的数据位置,需要在CMD文件中建立对应的section。
C641x_SDRAM.cmd文件;描述物理存储器的管理、分配和使用情况,用于DSP 代码的定位。
2、拓展功能:
拓展功能包括任意点数FFT和IFFT,它们都是基于FFT程序(FFT部分)修改的,以下只列出拓展(修改)的部分。
任意点数FFT:
要实现任意点数FFT,则输入序列和旋转因子都要根据点数N自动生成。下面就是实现这一功能的代码段:
for (i=0;iN/2;i++)
{
w1[2*i] = 32767*(-cos((double)i*delta));
w1[2*i+1] = 32767*(-sin((double)i*delta));
}
for (i=0;iN;i++)
{
x1[2*i] = (short)((cos(PI*i/20.0)+cos(PI*i/10.0)+cos(PI*i/5.0))*0x80);
x1[2*i+1] = 0;
}
接下来调用DSP_radix2函数进行FFT即可。
IFFT:
IFFT的实现基于如下算法:
流程:
对应代码段:
for(i=0;i16;i++)
{
x[i*2+1]=(-x[i*2+1]);
}
DSP_radix2(nx,x,w);
for(i=0;i32;i++)
{
x[i]=x[i]/nx;
}
DSP_bitrev_cplx(x,index,nx);
注:输入序列均为实数,为了节省执行时间,该程序没有进行第二次共轭。另外输出为乱序,需要第二次重排。
2、程序流程:
(1)FFT(任意点数FFT、IFFT):
某些流程只会在拓展功能中出现,会加以标注,另IFFT具体流程上面已给出,这里不再重复。
(2)SDRAM配置、写入与检测
四、功能测试记录
1、FFT:
任意点数的FFT由于变化较多,这里无法给出执行结果。
输入序列:0, 0, 10, 0, 20, 0, 10, 0, 0, 0, -10, 0, -20, 0, -10, 0, 0, 0, 10, 0, 20, 0, 10, 0, 0, 0, -10, 0, -20, 0, -10, 0
FFT结果(序列):
FFT结果(图象):
IFFT结果:
由上图可见,和原始输入序列相比,IFFT的结果略有误差。
2、SDRAM:
正确执行的结果:
检测错误时的结果(如把写入的结果与全0数组比较):
五、调试过程中的主要问题及难点
1、FFT无法得到正确结果。
解决:原先的输入数据可能产生溢出,更换新数据后解决。
2、编译SDRAM程序时出错。
为了实现把FFT结果写入SDRAM中,FFT程序必须嵌入到SDRAM程序中,否则执行后获得的FFT结果会丢失。但是由于FFT程序中包含了对C64xDSPLIB的函数调用,因此需要在属性窗口中添加库文件dsp64x.lib。
3、执行IFFT时,结果出错。
出现这一错误的原因是选择了错误的IFFT函数,因为许多DS
原创力文档


文档评论(0)