实验八 快速傅立叶变换(FFT)实验

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验七 快速傅立叶变换(FFT )实验

一 实验目的

1. 熟悉CCS 集成开发环境;

2. 了解FFT 的算法原理和基本性质;

3. 熟悉DSP 中cmd 文件的作用及对它的修改;

4. 学习用FFT 对连续信号和时域信号进行频谱分析的方法;

5. 利用DSPLIB 中现有的库函数;

6. 了解DSP 处理FFT 算法的特殊寻址方式;

7. 熟悉对FFT 的调试方法。

二 实验内容

本实验要求使用FFT 变换对一个时域信号进行频谱分析,同时进行IFFT 。这里用到时域信号可以是来源于信号发生器输入到CODEC 输入端,也可以是通过其他工具计算获取的数据表。本实验使用Matlab 语言实现对FFT 算法的仿真,然后将结果和DSP 分析的结果进行比较,其中原始数据也直接来自Matlab 。

三 实验原理

一个N 点序列][k x 的DFT ][m X ,以及IDFT 分别定义为:

1,,1,0,][][1

0-==∑-=N m W k x m X km N

N k 1,,1,0,][1][10-==--=∑N k W m X N k x km N N m

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

四 知识要点 .

1、 CMD 文件的功能及编写

2、 一种特殊的寻址方式:间接寻址

间接寻址是按照存放在某个辅助寄存器的16位地址寻址的。C54x 的8个辅助寄存器 (AR0—AR7)都可以用来寻址64K 字数据存储空间中的任何一个存储单元。

3、 TMS320C54x DSPLIB 中关于FFT 变换的一些函数的调用(SPRA480B.pdf ) 利用DSPLIB 库时,在主程序中要包含头文件:54xdsp.lib

4、 FFT 在CCS 集成开发环境下的相关头文件

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

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

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

#include // DSPLIB 库文件

五实验程序说明

1、实验主要函数

/***************************正变换*************************************/

cbrev(x,x,NX/2); //倒序

rfft(x,64,0); //实数FFT变换

//求频谱

由于FFT程序计算得到的数据只是频谱的实部和虚部,不包含计算幅度谱的//成分(所以描述DSP的参数中给出计算N点FFT的时间,是指不含计算幅度谱的时间),//因此要得

到幅度频谱,必须另外增加程序语句来实现。

for(i=0;i

{

p=x[i]; //实部

q=x[i+1]; //虚部

n=p*p+q*q; //实部平方加虚部平方

f[m]=sqrt(n); //开方后存到f数组中

m++;

}

/**************************反变换************************************/

unpacki(x,NX); //还原

cbrev(x,x,NX/2); //倒序

rifft(x,NX,1); //实数IFFT变换

2、各个函数的说明(详情见SPRA480B.pdf)

(1)void cbrev(DATA *x,DATA*r,unshort n)

功能:

为了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)void cfft(x,n,scale)

原理及源程序说明:

功能:

对复数进行FFT变换。

各项参数:

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

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

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

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

函数的使用:

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

#define dummy(x,n,scale) cfft##n(x,scale)

#define cfft(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。

相关文档
最新文档