实验1FFT算法分析实验.doc

  1. 1、本文档共13页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
实验1FFT算法分析实验

实验1 FFT算法分析实验 2010271052 一、 实验目的 1 加深对FFT的理解,自己动手编写一个基2的DIF--FFT函数ditfft。 2 进一步掌握卷积定理,用ditfft实现卷积。 二、 实验原理 对于有限长离散数字信号{x[n]},0 ? n ? N-1,其离散谱{x[k]}可以由离 离散傅氏变换(DFT)求得。可以方便的把它改写为如下形式: WN是周期性的,且周期为N,常用表达式WN取代W以便明确其周期是N。 由DFT的定义可以看出,在x[n]为复数序列的情况下,完全直接运算N点DFT需要(N-1)2次复数乘法和N(N-1)次加法。因此,对于一些相当大的N值(如1024)来说,直接计算它的DFT所作的计算量是很大的。FFT的基本思想在于,将原有的N点序列序列分成两个较短的序列,这些序列的DFT可以很简单的组合起来得到原序列的DFT。例如,若N为偶数,将原有的N点序列分成两个(N/2)点序列,那么计算N点DFT将只需要约[(N/2)2 ?2]=N2/2次???数乘法。即比直接计算少作一半乘法。因子(N/2)2表示直接计算(N/2)点DFT所需要的乘法次数,而乘数2代表必须完成两个DFT。上述处理方法可以反复使用,即(N/2)点的DFT计算也可以化成两个(N/4)点的DFT(假定N/2为偶数),从而又少作一半的乘法。这样一级一级的划分下去一直到最后就划分成两点的FFT运算的情况。比如,一个N = 8点的FFT运算按照这种方法来计算FFT可以用下面的流程图来表示: 三、实验步骤 1、在在Matlab中运行下面的仿真程序,程序中定义两个正弦信号,F1为100Hz/1v,F2为6kHz/1v,将两个信号叠加后作FFT: plot(S); title(原始信号); figure; Y = fft( S, N ); %做FFT变换 Ayy = ( abs( Y ) ); %取模 plot( Ayy(1:N) ); %显示原始的FFT模值结果 title( FFT 模值 ); figure; Ayy = Ayy/(N/2); %换算成实际的幅度 Ayy(1)=Ayy(1)/2; % 直流分量的幅值单独处理 F=([1:N]-1)*Fs/N; %换算成实际的频率值 plot(F(1:N/2),Ayy(1:N/2)); %显示换算后的FFT模值结果 title(幅度-频率曲线图); 2、在实验箱中通过编程实现FFT: (1)实验箱上电,启动CCS,此时仿真器上的“绿色灯”应点亮; (2)点击菜单Project中的Open菜单项,选中E:\FFT\ExpFFT01下的ExpFFT01.pjt ,打开源程序; (3)单击“+”号,展开源程序,双击打开文件ExpFFT01.c; (4)main中0x3000是A/D转换数据存放的起始地址,0x3080是FFT变换结果的写入地址; extern void InitC5402(void); extern void OpenMcBSP(void); extern void CloseMcBSP(void); extern void READAD50(void); extern void WRITEAD50(void); /*********************************************************************** Main Function Program ***********************************************************************/ #include stdio.h #include math.h void kfft(pr,pi,n,k,fr,fi,l,il) int n,k,l,il; double pr[],pi[],fr[],fi[]; { int it,m,is,i,j,nv,l0; double p,q,s,vr,vi,poddr,poddi; for (it=0; it=n-1; it++) { m=it; is=0; for (i=0; i=k-1; i++) { j=m/2; is=2*is+(m-2*j); m=j;} fr[it]=pr[is]; fi[it]=pi[is]; } pr[0]=1.0; pi[0]=0.0; p=6.283185306/(1.0*n); pr[1]=cos(p); pi[1]=-sin(p); if (l!=0) pi[1

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档