实验六 FFT算法实验.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验六 FFT算法实验

实验六 FFT算法实验 实验目的 了解快速傅立叶算法在BF537上的实现; 学习编写Blackfin汇编代码; 掌握Blackfin系列中C与汇编混合编程的规则; 初步了解ADSP-BF53X中的硬件循环,bit位取反和循环寻址等硬件架构支持的编程资源。 实验要求 用Blackfin汇编语言实现快速傅立叶算法; 实验原理 1. FFT原理和应用 为了便于在计算机上实现,我们需要一种时域和频域上都是离散的傅里叶变换,这就是离散傅里叶变换,简称DFT。关于DFT的详细介绍大家可以参考[1],这里就不加详细介绍了。而FFT是J.W.Cooley和J.W.Tukey与1965年在《计算数学》杂志上发表了“机器计算傅里叶级数的一种算法”,此论文是最早提出快速傅里叶变换算法的。FFT主要应用了DFT计算的某些对称性,大大加快了DFT的计算速度,并且减小了所需的资源。 FFT在工程和理论中有着广泛的应用。FFT实质上是一种对信号进行频域分析的手段。有些信号在时域看起来杂乱无章难于描述,而把它变换到频域就便于分析和处理,比如两种信号的分离等。再比如我们可以利用FFT对信号的细节特征进行提取,进而可以提高对图像信号的分辨率,可以对数十公里外的目标进行成像(如合成孔径雷达),借助MP3算法对音乐进行压缩等等。FFT还可以看作一种梳状滤波器,同时对信号进行分离和提取。另外,许多算法实质上都是用FFT提高算法速度的。 2. 定点处理器BF53X的数据格式 信号处理和数据处理中,首先应该确定输入数据的类型,包括选择定/浮点数、数据存储格式、数据表示等。 BF53X是定点处理器,支持整数类型和定点小数类型。C语言编程中,支持浮点类型,但浮点数的支持是利用软件支持定点运算实现浮点运算,运算速度慢。因此,在算法精度许可的情况下,我们选择定点数作为处理的数据类型。在本次实验中,我们输入输出数据均选择fract16型。这里详细介绍实验中将使用到的fract16型定点小数。该类型数据为16bit有符号小数,为“1.15”型。具体的各位表示如下。 可以看到,该类型保存系数的最大误差为2-15,表示范围为。 下面简单介绍处理器对fract16类型数据操作的误差情况。乘法 a = b*c,两个15bit(除符号位)的数相乘为30bit,而a也为fract16型,即结果需要截断30bit中的15位。因此,乘法会带来截断误差。在进行累加和a=中,减小这个误差通常的方法将中间结果放在MAC累加寄存去中A0或A1中,A0有40bit,其中32bit为寄存器宽度,高八位为溢出保护最后在输出给a。注意,乘法产生截断误差主要影响结果的精度。 而加法a = b+c中,结果为17bit,范围为,因此在加法可能造成了结果溢出错误。一般为了防止这种错误,在运算中,一般采用控制输入的动态范围的方法,即b,c在加之前右移一位。这些技巧在BF53X定点处理器上编写FFT中需要处理。通常,N点的FFT输出结果。BF53X的库函数cfft_fr16的结果就是这样处理的,本次实验要求编写的cfft_fract16也这样要求。 VDSP提供了C语言的fract16数据类型的许多算术计算函数,具体查阅VDP Help,搜索fract16关键字。 3. BF53X的汇编语言编程相关问题 (1) BF53X的C/汇编混合编程 关于BF53X中C和汇编混合编程的问题,前面已经提到。一般开发硬件DSP处理器中运行的信号处理程序时,采用的策略是:关键的核心算法用汇编语言实现函数供C语言调用,提高效率,以满足实时性要求;而主程序、其他初始化、逻辑控制等不会占用DSP较多处理时间的程序用高级语言实现,以缩短开发周期,并提高可维护性。 因此,通常运行的主函数main函数都用C语言写。调用的函数根据其上面的划分采用相应的C或汇编实现。为了在C语言可以调用这些汇编的子函数,BF533的规定如下。 C语言中声明函数原型为: extern void myfunc(aug1,aug2,aug3,agu4,agu5); 对应的汇编语言实现为: 上面代码中,C语言声明的函数名myfunc,是汇编子程序的入口,程序执行到该处,将调用汇编源程序_myfunc标号的子函数代码。注意,汇编语言子函数对应的全局标号为C函数名前加一下划线。 函数的入口参数传递规则为:前三个参数分别传到寄存器R0-R2,即aug1-R0,aug2-R1,aug3-R2,其他参数,则顺序存放在堆栈内,即aug4-SP+20,aug5-SP+24。这个过程编译器完成。 汇编语言的子函数调用过程中,硬件完成部分寄存器的保护以保护调用环境,但以下寄存器不再其中,如果汇编子函数中改变了它们,我们就需要自己利用堆栈保护这些寄存器。这些寄存器是P3–P

文档评论(0)

shenlan118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档