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

上传人:re****.1 文档编号:505470099 上传时间:2022-10-05 格式:DOCX 页数:11 大小:146.48KB
返回 下载 相关 举报
实验八 快速傅立叶变换(FFT)实验_第1页
第1页 / 共11页
实验八 快速傅立叶变换(FFT)实验_第2页
第2页 / 共11页
实验八 快速傅立叶变换(FFT)实验_第3页
第3页 / 共11页
实验八 快速傅立叶变换(FFT)实验_第4页
第4页 / 共11页
实验八 快速傅立叶变换(FFT)实验_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《实验八 快速傅立叶变换(FFT)实验》由会员分享,可在线阅读,更多相关《实验八 快速傅立叶变换(FFT)实验(11页珍藏版)》请在金锄头文库上搜索。

1、实验七快速傅立叶变换(FFT)实验一 实验目的1 熟悉 CCS 集成开发环境;2. 了解FFT的算法原理和基本性质;3. 熟悉DSP中cmd文件的作用及对它的修改;4. 学习用 FFT 对连续信号和时域信号进行频谱分析的方法;5. 利用DSPLIB中现有的库函数;6. 了解 DSP 处理 FFT 算法的特殊寻址方式;7. 熟悉对 FFT 的调试方法。二 实验内容本实验要求使用FFT变换对一个时域信号进行频谱分析,同时进行IFFT。这里用到时 域信号可以是来源于信号发生器输入到CODEC输入端,也可以是通过其他工具计算获取的 数据表。本实验使用Mat lab语言实现对FFT算法的仿真,然后将结果

2、和DSP分析的结果 进行比较,其中原始数据也直接来自Mat lab。三 实验原理一个N点序列xk的DFT Xm,以及IDFT分别定义为:Xm=戈 xkWkm, m = 0,1,N 一 1Nk=0xk=七一 X mW 一km, k = 0,1,N -1NN m=0如果利用上式直接计算DFT,对于每一个固定的m,需要计算N次复数乘法,N-1次加法, 对于N个不同的m,共需计算N的2次方复数乘法,N*(N-1)次复数加法.显然,随着N的增加,运 算量将急剧增加,快速傅里叶算法有效提高计算速度(本例使用基2 FFT快速算法),利用 FFT算法只需(N/2)logN次运算。四 知识要点.1、CMD文件的

3、功能及编写2、一种特殊的寻址方式:间接寻址间接寻址是按照存放在某个辅助寄存器的16位地址寻址的。C54x的8个辅助寄存器(AROAR7 )都可以用来寻址64K字数据存储空间中的任何一个存储单元。3、TMS320C54x DSPLIB中关于FFT变换的一些函数的调用(SPRA480B.pdf) 利用DSPLIB库时,在主程序中要包含头文件:54xdsp.lib4、FFT在CCS集成开发环境下的相关头文件 #include /定义数据类型的头文件 #include ma th.h/数学函数的头文件,如sqr t. #include /定义数据类型的头文件 #includedsplib.h/ DSP

4、LIB 库文件五 实验程序说明1、实验主要函数/*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X*X* r ” /II、jrn *x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x*x* /I I jf *f-UJ* *T*/cbrev(x,x,NX/2);rfft(x,64,0);/倒序/实数 FFT 变换/求频谱由于FFT程序计算得到的数据只是频谱的实部和虚部,不包含计算幅度谱的/成分(所 以描述DSP的参数中给出计算N点FFT的时间,是指不含计算幅度谱的时间),/因此要得 到幅度频

5、谱,必须另外增加程序语句来实现。for(i=0;iNX;i=i+2)p=xi;q=xi+1;n=p*p+q*q;fm=sqrt(n); m+;/实部/虚部/实部平方加虚部平方 /开方后存到f数组中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得到一个正确顺序的变换结果,对他们的输入数据进行倒序。 入口参数:x2*n x是一个2*n项的一维数组,数组中数据定义为短整型

6、(16位有符号整型)。 数组 x 是作为输入数据,函数对他的数据进行倒序。r2*n r是一个2*n项的一维数组,数组中数据定义为短整型(16位有符号整形)。 数组r是作为输出数据,函数对x倒序后的结果存到r中。n 定义为数组中复数的个数(两个实数表示一个复数),即为数组大小的1/2。 函数的使用:函数是对复数进行倒序的,即把数组x中的数据认为是复数。有两个相邻的实数表示 一个复数,偶地址为复数的实部,奇地址为复数的虚部。如下式,函数对X0+j*X1, X2+j*X3, X2n+j*X2n+1X2*N-2+j*X2*N-1这些数据进行倒序。倒序后的结果也是按复数的实部、虚部依次存到r数组中的。注

7、意: 数组中的元素个数必须为偶数。倒序时采用间接寻址,所以数组的首地址的末log (n) +1必须为0。(2) void cfft(x,n,scale) 原理及源程序说明:CfftForward Complex FFTvoid cfft (DATA x, nx. short scale):Algorithm:FT)厭一yfk = 1/(scale factor)T 工刈(cos2 * pi H nx j + j sin(2 1 pi * i * k /.nx)i = DscaleFlag to indicate whethsr or not scaling should be implemen

8、ted duringcomputation.If (scale = 0)scale factor = nx:elsescale factor = 1:end功能:对复数进行FFT变换。各项参数:x2*n x是一个2*n项的一维数组,数组中数据定义为短整形(16位有符号整形)。 数组 x 既作为输入数据,又存放变换后的输出数据。n 定义为数组中复数的个数(两个实数表示一个复数),即为数组大小的1/2。 Scale变换系数,如果为0,变换后结果乘以1/nx;否则结果乘以1。函数的使用:函数cfft(x,n,scale)是经过以下俩个宏定义而来的:#define dummy(x,n,scale)cf

9、ft#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 ( ) 也 是 对 X0+j*X1 , X2+j*X3 , X2n+j*X2n+1X2*N-2+j*X2*N-1进行的FFT变换,结果按实部/虚部存放。注意:数组中的元素个数必须为偶数。数组的首地址的末log (n) +1必须为0。(3) rfft

10、(x,n,scale);实数 FFT 变换:原理及源程序说明:rfftForward RQat EFT (tn-placo)void rfft (DATA x. ns. short scalei实数FFT变换涉及到下面两个算法。(1 )、利用N点复序列的FFT算法计算两个N点实序列FFT 设xk和yk都是N点实序列,Xm和Ym分别表示他们对应的N点DFT。设 hk=xk+ j yk ,已知求得hk的DFT为Hk,根据DFT的性质可得Xm=1/2 Hm+H*(-m)N Y m=1/(2j) Hm-H*(-m)N (2)、利用N点复序列计算2N点是序列FFT。(如rfft) 设yk是一个长度为2N

11、的实序列,YM是DFT。定义如下两个数组xk=y2k, hk=y2k+1,由上一个算法可以得到Ym=Xm+W2NmHm Ym+N=Xm-W2NmHm 功能:对实数进行FFT变换。各项参数:xn x是一个n (n必须为偶数)项的一维数组,数组中数据定义为短整型(16位有 符号整型)。数组x既作为输入数据,又存放变换后的输出数据。n 定义为数组中实数的个数,即等于数组大小。Scale变换系数,如果为0变换后结果乘以1/nx;否则结果乘以1。函数的使用:实数fft变换实际上也是把数组中的数据当成n/2个复数进行cfft变换,之后再调 用一个调整的函数unpack()。所以可以把rfft(x,n,sc

12、ale)看成cfft (x, n/2, scale) + unpack (x, n )。其它与 cfft () 一样。N点实序列的频谱是N点复序列,需要2N个存储空间(实部、虚部分别占相邻两个存 储空间),但由于实序列的频谱存在共轭对称的关系,已知前 N/2 点复序列,就可以通过 共轭对称性求的后N/2点复序列,因此只要求N个存储空间(存放前N/2个复序列)就可 以存放频谱。(4) cifft(x,n,scale) / rifft(x,2*n,scale);复数 iFFT/riFFT 变换: 功能:对复数进行 IFFT 变换。各项参数:x2*n x是一个2*n项的一维数组,数组中数据定义为短整

13、型(16位有符号整形)。 数组 x 既作为输入数据,又存放变换后的输出数据。n定义为数组中复数的个数(两个实数表示一个复数),即为数组大小的 1/2。Scale变换系数,如果为0变换后结果乘以1/nx;否则结果乘以1。函数的使用:函数cifft(x,n,scale)与函数rifft(x,2*n,scale)其实是一个函数,实现同样的功 能,使用同cfft()一样。如果要进行实数fft变换(变换结果实数),则还需调用一个unpacki(x,n)函数。(5)unpacki(x,n)函数功能:对rfft变换后的结果进行变换,为了 rifft ()得到原始实数的值。 各项参数:xn x是一个n(n必须

14、为偶数)项的一维数组,数组中数据定义为短整型(16位有 符号整形)。数组x既作为输入数据,又存放变换后的输出数据。n 定义为数组中实数的个数,即等于数组大小。函数的使用:可以把这个函数看成unpack ()函数的逆变换,具体原理同上。五、数据测试与实验调试原始数据:为了便于观察,我们对已知信号或已知频谱进行分析。可以利用mat lab算出一个63阶 低通滤波器单位脉冲响应hk的64点值存放到数组x。利用N点复序列计算2N点实序列频谱(rfft)之前,2N (即64)点实序列被认为是N 点复序列。例如:表示一个复数:13 + j* (-32)13, -32,-31, 22,52, -16,-84, -9,117,55,-142, -128,147, 225,-115, -339,30, 455,123, -551,-359, 597,691, -549,-1143, 341,1775,176,-2825, -1578,5900, 13543,13543, 5900,-1578, -2825,176,1775,341,-1143,-549, 691,597, -359,-551,123,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 学术论文 > 其它学术论文

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号