FFT算法实现实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
FFT算法实现实验报告
辛旸 PB10210006
实验目的
1、加深对快速傅里叶变换的理解。
2、掌握FFT 算法及其程序的编写。
3、掌握算法性能评测的方法。
实验内容
1.编写自己的FFT算法:
代码如下:
function [ X ] = Sampling( x,N )
%myFFT 实现FFT时域取样算法
% 输出:生成FFT序列X(k),输入:欲变换序列x(n),FFT变换长度N(可缺省)
(1) if ~exist('N','var'); %检查是否有变换长度N输入
(2) N=length(x); %若无,则令N等于序列长度
(3) end
(4) if N (5) x=x(:,1:N); (6) else (7) x=[x,zeros(1,N-length(x))]; %如果N大于序列长度,对序列补零进行延长 (8) end; (9) for i=1:1:length(x)/2+1; %判断N是2的多少次方 (10) if 2^i>=length(x); %若N不是2的整数幂 (11) N=2^i; %增大N为2的整数幂 (12) break; (13) end (14) end (15) x=[x,zeros(1,N-length(x))]; %确保要变换的序列长度为2^i (16) k1=zeros(1,N); (17) X=zeros(1,N); (18) w=zeros(1,N); (19) for m=0:1:N-1; %确定反序序列k1和正序序列k的关系 (20) k=m; (21) for n=i-1:-1:0; %从高位开始依次将各位移至反序位 (22) k1(m+1)=k1(m+1)+fix(k/(2^n))*(2^(i-1-n)); (23) k=rem(k,2^n); (24) end; (25) end (26) for l=1:1:N; (27) X(k1(l)+1)=x(l); %生成反序序列 (28) w(l)=exp(-1i*2*pi/N*(l-1)); %生成旋转因子 (29) end (30) for l=0:1:i-1; %控制FFT运算级数 (31) for m=1:1:N; %每一级中有N/2个蝶形运算 (32) if rem((m-1),2^(l+1))<2^l; %找到蝶形运算的上半部分(33) b=X(m)+X(m+2^l)*w(2^(i-1-l)*rem((m-1),2^l)+1); %将结果暂存至b (34) X(m+2^l)=a(m)-X(m+2^l)*w(2^(i-1-l)*rem((m-1),2^l)+1); (35) X(m)=b; %实现原位运算 (36) end (37) end (38) end 2.选择实验1中的典型信号序列验证算法的有效性: 为方便比较两个算法,编写了myCompare函数计算两种算法的运行时间,并绘制频谱曲线 代码如下: function [ t1,t2,e ] = myCompare( x,N ) %myCompare函数:比较自己编写的算法与系统自带算法的差异 % 输入:与变换信号序列x(n)和欲变换长度N % 输出:自己编写的函数的执行时间t1,系统自带函数的执行时间t2,两者计算序列的差异平方和e tic; X1=myFFT(x,N); t1=toc; tic; X2=fft(x,N); t2=toc; subplot(1,2,1);plot(abs(X1));xlabel('k');ylabel('X(k');title('ÓÃ×Ô¼º±àдµÄº¯ÊýµÃµ½µÄ±ä»»ÐòÁÐƵÆ×'); subplot(1,2,2);plot(abs(X2));xlabel('k');ylabel('X(k');title('ϵͳ×Ô´øFFTº¯ÊýµÃµ½µÄ±ä»»ÐòÁÐƵÆ×'); e=sum((X1-X2).^2); end 对理想采样信号A=444.128,α=50*2^(1/2)*π,Ω=50*2^(1/2)*π,T=1/1000,序列长度50,用自己编写的FFT算法和系统自带算法做64点FFT变换后绘制频域序列,如下: 对高斯序列,p=8,q=8,序列长度16,用自己编写的FFT算法和系统自带算法做16点FFT变换后绘制频域序列,如下: 对衰减正弦序列α=0.01,f=0.05,序列长度100,用自己编写的FFT算法和系统自带算法做128点FFT变换后绘制频域序列,如下: 由以上结果可知,自己编写的算法运行结果与系统自带算法一致,且可以对信号进行截断或补零后再做变换。 3.对所编制FFT算法进行性能评估: 与自己编写的DFT算法进行性能比较: 对N点序列进行DFT变换需要N²/2次复乘,而对N点序列做基2-FFT只需N/2*log2(N)次复乘,因此运算量减少了很多,且随着序列长度增加,运算量差异变大。 与系统自带FFT算法进行性能比较: 由于系统自带FFT函数用C语言实现,无法查看源代码,只知道效率更高,而且在计算任意点的DFT(不指定变换长度N)时,系统自带函数无需采取补零操作,而自己编写的函数会先补零再变换,改变了频域取样密度,会得到与系统自