调用DSP库函数实现FFT的运算.docx

上传人:b****1 文档编号:1092771 上传时间:2023-04-30 格式:DOCX 页数:18 大小:665.69KB
下载 相关 举报
调用DSP库函数实现FFT的运算.docx_第1页
第1页 / 共18页
调用DSP库函数实现FFT的运算.docx_第2页
第2页 / 共18页
调用DSP库函数实现FFT的运算.docx_第3页
第3页 / 共18页
调用DSP库函数实现FFT的运算.docx_第4页
第4页 / 共18页
调用DSP库函数实现FFT的运算.docx_第5页
第5页 / 共18页
调用DSP库函数实现FFT的运算.docx_第6页
第6页 / 共18页
调用DSP库函数实现FFT的运算.docx_第7页
第7页 / 共18页
调用DSP库函数实现FFT的运算.docx_第8页
第8页 / 共18页
调用DSP库函数实现FFT的运算.docx_第9页
第9页 / 共18页
调用DSP库函数实现FFT的运算.docx_第10页
第10页 / 共18页
调用DSP库函数实现FFT的运算.docx_第11页
第11页 / 共18页
调用DSP库函数实现FFT的运算.docx_第12页
第12页 / 共18页
调用DSP库函数实现FFT的运算.docx_第13页
第13页 / 共18页
调用DSP库函数实现FFT的运算.docx_第14页
第14页 / 共18页
调用DSP库函数实现FFT的运算.docx_第15页
第15页 / 共18页
调用DSP库函数实现FFT的运算.docx_第16页
第16页 / 共18页
调用DSP库函数实现FFT的运算.docx_第17页
第17页 / 共18页
调用DSP库函数实现FFT的运算.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

调用DSP库函数实现FFT的运算.docx

《调用DSP库函数实现FFT的运算.docx》由会员分享,可在线阅读,更多相关《调用DSP库函数实现FFT的运算.docx(18页珍藏版)》请在冰点文库上搜索。

调用DSP库函数实现FFT的运算.docx

调用DSP库函数实现FFT的运算

通信与信息工程学院

2013/2014学年第二学期

软件设计实验报告

模块名称调用DSP库函数实现FFT的运算

专业通信工程

学生班级B110107

学生学号

学生姓名

指导教师王奇

设计题目

调用DSP库函数实现FFT运算

任务要求

利用CCS库函数CFFT对sin(40*PI*t)进行64点的FFT运算,要求回显结果图形并对其进行分析。

实验设备及软件

硬件:

计算机

软件:

WINDOWS操作系统、CCS软件和MATLAB(含SIMULINK工具包)软件。

同组人员学号及姓名

顾源源B110108

参考文献

[1]ICETEK–VC5509-A-USB-EDU教学实验系统软件实验指导(电子版)

[2]CodeComposerStudioProjectManagementandEditingTools(电子版)

[3]TMS320C55xAssemblyLanguageToolsUser’sGuide(电子版)

[4]TMS320C55xOptimizingC/C++CompilerUser’sGuide(电子版)

[5]彭启琮等.TMS320VC55x系列DSP的CPU与外设.北京:

清华大学出版社,2005

[6]尹勇、欧光军.DSP集成开发环境CCS开发指南.北京:

北京航空航天大学出版社,2004

[7]TMS320C55xDSPProgrammer’sGuide(电子版)

[8]TMS320C55xDSPAlgebraicInstructionSetReferenceGuide(电子版)

报告内容

一、实验目的

(1)了解FFT的原理;

(2)了解在DSP中FFT的设计及编程方法;

(3)了解在DSP中CFFT的设计及编程方法;

(4)熟悉对FFT的调试方法;

(5)了解用窗函数法设计FFT快速傅里叶的原理和方法;

(6)熟悉FFT快速傅里叶特性;

(7)了解各种窗函数对快速傅里叶特性的影响。

2、实验原理

如果利用上式直接计算DFT,对于每一个固定的m,需要计算N次复数乘法,N-1次加法,对于N个不同的m,共需计算N的2次方复数乘法,N*(N-1)次复数加法.显然,随着N的增加,运算量将急剧增加,快速傅里叶算法有效提高计算速度,利用FFT算法只需(N/2)logN次运算。

FFT并不是一种新的变换,它是离散傅立叶变换(DFT)的一种快速算法。

由于我们在计算DFT时一次复数乘法需用四次实数乘法和二次实数加法;一次复数加法则需二次实数加法。

每运算一个X(k)需要4N次复数乘法及2N+2(N-1)=2(2N-1)次实数加法。

所以整个DFT运算总共需要4N^2次实数乘法和N*2(2N-1)=2N(2N-1)次实数加法。

如此一来,计算时乘法次数和加法次数都是和N^2成正比的,当N很大时,运算量是可观的,因而需要改进对DFT的算法减少运算速度。

根据傅立叶变换的对称性和周期性,我们可以将DFT运算中有些项合并。

我们先设序列长度为N=2^L,L为整数。

将N=2^L的序列x(n)(n=0,1,……,N-1),按N的奇偶分成两组,也就是说我们将一个N点的DFT分解成两个N/2点的DFT,一般来说,输入被假定为连续的。

当输入为纯粹的实数的时候,我们就可以利用左右对称的特性更好的计算DFT。

我们称这样的RFFT优化算法是包装算法:

首先2N点实数的连续输入称为“进包”。

其次N点的FFT被连续运行。

最后作为结果产生的N点的合成输出是“打开”成为最初的与DFT相符合的2N点输入。

使用这战略,我们可以划分FFT的大小,它有一半花费在包装输入O(N)的操作和打开输出上。

这样的RFFT算法和一般的FFT算法同样迅速,计算速度几乎都达到了两次DFT的连续输入。

TMS320c5402有专门的FFT指令,使得FFT算法在DSP芯片上实现的速度更快,更简单。

查库函数,使用rfft或cfft可快速实现FFT运算。

rfft函数原型为voidrfft(DATAx,nx,shortscale)其中DATAx为数据存放数组,nx为数组长度,运算完毕后DATAx中原先数据被冲掉,存进运算完FFT的数据。

cfft与rfft不同之处在于cfft可对复数进行FFT运算。

rifft和cifft分别为rfft和cfft进行逆运算。

在这个实验中我们需要调用cfft库函数对其进行FFT运算。

3、CCS实现

1、各个函数的说明

(1)voidcbrev(DATA*x,DATA*r,unshortn)

功能:

为了FFT/IFFT得到一个正确顺序的变换结果,对他们的输入数据进行倒序。

入口参数:

x[2*n]x是一个2*n项的一维数组,数组中数据定义为短整型(16位有符号整型)。

数组x是作为输入数据,函数对他的数据进行倒序。

r[2*n]r是一个2*n项的一维数组,数组中数据定义为短整型(16位有符号整形)。

数组r是作为输出数据,函数对x倒序后的结果存到r中。

n定义为数组中复数的个数(两个实数表示一个复数),即为数组大小的1/2。

函数的使用:

函数是对复数进行倒序的,即把数组x中的数据认为是复数。

有两个相邻的实数表示一个复数,偶地址为复数的实部,奇地址为复数的虚部。

如下式,函数对

X[0]+j*X[1],X[2]+j*X[3],………X[2n]+j*X[2n+1]…………X[2*N-2]+j*X[2*N-1]

这些数据进行倒序。

倒序后的结果也是按复数的实部、虚部依次存到r数组中的。

注意:

数组中的元素个数必须为偶数。

倒序时采用间接寻址,所以数组的首地址的末log(n)+1必须为0。

(2)voidcfft(x,n,scale)

原理及源程序说明:

功能:

对复数进行FFT变换。

各项参数:

x[2*n]x是一个2*n项的一维数组,数组中数据定义为短整形(16位有符号整形)。

数组x既作为输入数据,又存放变换后的输出数据。

n定义为数组中复数的个数(两个实数表示一个复数),即为数组大小的1/2。

Scale变换系数,如果为0,变换后结果乘以1/nx;否则结果乘以1。

函数的使用:

函数cfft(x,n,scale)是经过以下俩个宏定义而来的:

#definedummy(x,n,scale)cfft##n(x,scale)

#definecfft(x,n,scale)dummy(x,n,scale)

原始函数为cfft##n(x,scale),n可取值为16,32,64,128,256,512,1024。

函数Cfft()要求输入数据为倒序,即经过cbrev()处理之后的数据。

同cbrev()一样,cfft()也是对X[0]+j*X[1],X[2]+j*X[3],………X[2n]+j*X[2n+1]…………X[2*N-2]+j*X[2*N-1]进行的FFT变换,结果按实部/虚部存放。

注意:

数组中的元素个数必须为偶数。

数组的首地址的末log(n)+1必须为0。

(3)cifft(x,n,scale)

功能:

对复数进行IFFT变换。

各项参数:

x[2*n]x是一个2*n项的一维数组,数组中数据定义为短整型(16位有符号整形)。

数组x既作为输入数据,又存放变换后的输出数据。

n定义为数组中复数的个数(两个实数表示一个复数),,即为数组大小的1/2。

Scale变换系数,如果为0,变换后结果乘以1/nx;否则结果乘以1。

函数的使用:

函数cifft(x,n,scale)与函数rifft(x,2*n,scale)其实是一个函数,实现同样的功能,使用同cfft()一样。

如果要进行实数fft变换(变换结果实数),则还需调用一个unpacki(x,n)函数。

(4)unpacki(x,n)函数

功能:

对rfft变换后的结果进行变换,为了rifft()得到原始实数的值。

各项参数:

x[n]x是一个n(n必须为偶数)项的一维数组,数组中数据定义为短整型(16位有符号整形)。

数组x既作为输入数据,又存放变换后的输出数据。

n定义为数组中实数的个数,即等于数组大小。

函数的使用:

可以把这个函数看成unpack()函数的逆变换,具体原理同上。

2、库函数的调用

(1)DSPLIB库函数功能

TMS320C54X系列函数库(DSPLIB)是对C语言编程可调用优化的DSP函数库,它含有50个通用目的的信号处理程序,全部由汇编语言编写,并可由C语言调用,方便C语言与汇编语言混合编程。

这些程序用在计算强度大、执行速度重要的实时运算中。

通过使用这些程序,可以取得较用C语言编写的相关程序快的多的运行速度,另外通过使用现成的程序可以使开发速度大大加快。

DSPLIB可进行的运算有:

FFT运算、滤波与卷积运算、自适应滤波运算、相关运算、数学函数运算、三角函数运算、矩阵运算等。

(2)DSPLIB库函数的FFT运算

DSPLIB库函数提供的FFT运算程序全部由汇编语言编写,充分发挥DSP的硬件特性,运算速度很快。

下面以复数FFT运算程序为例进行介绍。

快速傅立叶变换在作N点傅立叶变换运算时,输入数据常常是一连串的复数。

不过在许多实际应用上,这些需要被处理的数据都属于实数,即便如此,我们还是可以利用复数运算的DFT。

因为一个简单的方法就可以将实数数据转换成复数数据,原本的实数数据成为复数的实部,而属于复数虚部的部分则全部填上零,如此一来我们就可以直接应用复数FFT了。

DSPLIB库函数提供的FFT运算程序可进行8~1024点的FFT运算。

输入数据的存放以自然顺序依次排放,实部在前虚部在后。

数进行码位倒序运算形式为:

cbrev(X,X,256),即可将采样数据转换成码位倒序形式,并放入X[2N]数组实数部分。

为进行实数FFT运算输入数据虚部需置零。

(3)FFT运算的归一化

除非输入信号幅度非常小,否则FFT运算结果可能导致溢出,为防止溢出的发生,FFT运算提供了归一化功能(可选择),就是输出结果被运算长度N所除。

在FFT运算进行归一化后,进行FFT逆运算就不需要归一化了。

3、采样波形的产生

voidInputWave()

{

inti;

floatsample_step=1.0/SAMPLEF;

floatj=0.0;

for(i=0;i

{

fInput[i]=sin(PI*2*j*SIGNAL1F)*128+sin(PI*2*j*SIGNAL2F)*32;

j=j+sample_step;

}

}

四、主程序

#include//数学函数的头文件,如sqrt.

#include//定义数据类型的头文件

#include//DSPLIB库文件

#include"t4_SCALE.h"//#include"t6_NOSCALE.h"

#defineSIGNAL1F20

#defineSAMPLEF64

#definePI3.1415926

#defineSAMPLENUMBER128

shortINPUT[SAMPLENUMBER],x[SAMPLENUMBER];

floatOUTPUT[SAMPLENUMBER];

voidMakeWave();

voidMakeWave()

{

inti;

floatsample_step=1.0/SAMPLEF;

floatj=0.0;

for(i=0;i

{

INPUT[i]=sin(PI*2*j*SIGNAL1F)*1024;

j=j+sample_step;

}

}

voidmain()

{inti;

MakeWave();

for(i=0;i

{

x[i]=INPUT[i/2];

}

for(i=1;i

x[i]=0.0;

}

cbrev(x,x,SAMPLENUMBER/2);

cfft(x,SAMPLENUMBER/2,SCALE);

//unpacki(x,SAMPLENUMBER/2);

//cbrev(x,x,SAMPLENUMBER/2);

//cifft(x,SAMPLENUMBER/2,SCALE);

for(i=0;i

{OUTPUT[i]=x[i];}

while

(1);//breakpoint

}

五、实验步骤

1.实验准备

设置软件仿真模式

2.启动CCS,打开工程,浏览程序

3.编译程序

4.导入.out文件并运行

5.分别设置窗口,并出图

六、实验结果

1、正弦输入波形(时域)

分析:

由于采样频率为64HZ,相对于正弦函数频率他的采样频率较小,所以产生的时域图片会有失真。

输入波形(频域)

分析:

有图可得峰值所在点为20π符合题目要求

经过FFT处理后的波

分析:

出现峰值和谷值的地方为20和44且相对称,出现负值的原因是没有取模。

另外在出图时设置grath的采样频率为2HZ,因为x[i]中有实数和虚数。

三个图放在一起比较

六、调试过程中遇到的问题和解决办法

1.在程序运行的过程中会出现dsplib.h和tms320.h文件不存在的现象,这是由于DSPLIB安装在固定的子目录上,而应用程序在桌面上,程序编译连接时,找不到DSPLIB中相应的程序。

所以需要对工程的bulidoptions选项中的两个地方经行设置。

首先是找不到dsplib.h、tms320.h文件时,在compiler标签下选中preprocessor选项,在IncludeSearchPath栏中填入dsplib.h、tms320.h所在子目录,此处为下图所示:

当出现连接时找不到FFT运算相应的汇编程序,此时可在linker标签下选中basic选项,在LibrarySearchPath栏中填入55xdsp.lib库文件所在路径,本次试验示例如下:

此时完成设置,编译连接时可将应用程序及DSPLIB中的程序连接起来,程序可以正常编译。

2.出图的时候,通过view栏进行了出图窗口编辑,但是仍然出不了图,此时需要通过debug栏中的Animate使程序运行出图。

七、心得体会

通过本次实验我理解了FFT快速傅里叶变化算法和CFFT算法,同时对DSP课程我也有了更深入的了解,这一段时间的程序设计经历增加了我自主学习的能力。

虽然有参考案例,但是对于第一次接触CCS软件的我来说并不简单,首先对于程序我需要看懂案例中的内容,然后在相应的地方进行改动,以符合我的实验案例。

经过不断的摸索,现在终于能熟练的掌握CCS仿真软件的使用,同时也能就简单的dap问题进行编程运行模拟。

八、参考程序

参考程序:

G:

\0f8d8f144f82e50a01dfc89984afbe02\c5500\dsplib\EXAMPLES\CFFT

设计成绩评定

评分内容

具体要求

总分

评分

上机时间

上机时间是否达到要求的学时,按照实际情况给与一定的成绩。

10分

报告审阅结果

报告结构严谨,文字通顺,用语符合技术规范,图表清楚,书写格式规范,不与别人雷同。

30分

验收结果

原理

原理清楚,能较好地理解课题任务并提出实施方案。

20分

完成情况

独立完成规定设计任务,论证、分析、设计、计算、结构、建模、实验正确合理,有一定的创新。

30分

操作

能熟练操作相关工具软件,并利用工具软件完成设计任务。

10分

总成绩(五分制)

100分

指导教师评阅意见

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

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2