实验八 快速傅立叶变换(FFT)实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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
#include
#include
五实验程序说明
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。