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

上传人:b****1 文档编号:626269 上传时间:2022-10-11 格式:DOCX 页数:16 大小:650.05KB
下载 相关 举报
调用DSP库函数实现FFT的运算.docx_第1页
第1页 / 共16页
调用DSP库函数实现FFT的运算.docx_第2页
第2页 / 共16页
调用DSP库函数实现FFT的运算.docx_第3页
第3页 / 共16页
调用DSP库函数实现FFT的运算.docx_第4页
第4页 / 共16页
调用DSP库函数实现FFT的运算.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

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

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

调用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[SAMPLENUM

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

当前位置:首页 > 党团工作 > 入党转正申请

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

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