FFT变换的两种方式,作业final

http://blog.sina.com.cn/s/blog_674f55f90100if2i.html

照着这个博客的内容作的,后面dit函数缺一个end自己加上就可以了

 

结果非常好,dit和dif这两种fft变换的结果是一样的没有bug,一次运行就过了

开心

function [Xk]=DIF_FFT_2(xn,N);

%蝶形运算开始
M=log2(N);%“级”的数量
for m=0:M-1 %“级”循环开始
   Num_of_Group=2^m;%每一级中组的个数
   Interval_of_Group=N/2^m;%每一级中组与组之间的间距
   Interval_of_Unit=N/2^(m+1);%每一组中相关运算单元之间的间距
   Cycle_Count= Interval_of_Unit -1;%每一组内的循环次数
   Wn=exp(-j*2*pi/Interval_of_Group);%旋转因子
    for g=1:Num_of_Group %“组”循环开始
       Interval_1=(g-1)*Interval_of_Group;%第g组中蝶形运算变量1的偏移量
       Interval_2=(g-1)*Interval_of_Group+Interval_of_Unit;%第g组中蝶形运算变量2的偏移量
       for r=0:Cycle_Count;%“组内”循环开始
           k=r+1;%“组内”序列的下标
           xn(k+Interval_1)=xn(k+Interval_1)+xn(k+Interval_2);%第m级,第g组的蝶形运算式1
           xn(k+Interval_2)=[xn(k+Interval_1)-xn(k+Interval_2)-xn(k+Interval_2)]*Wn^r;%第m级,第g组的蝶形运算式2,注:1和2为同址运算
       end
    end
end

%序列排序开始
n1=fliplr(dec2bin([0:N-1]));%码位倒置步骤1:将码位转换为二进制,再进行倒序
n2=[bin2dec(n1)];%码位倒置步骤2:将码位转换为十进制后翻转
for i=1:N
   Xk(i)=xn(n2(i)+1);%根据码位倒置的结果,将xn重新排序,存入Xk中
end

  

function [Xk]=DIT_FFT_2(xn,N);

%序列排序开始
n1=fliplr(dec2bin([0:N-1]));%码位倒置步骤1:将码位转换为二进制,再进行倒序
n2=[bin2dec(n1)];%码位倒置步骤2:将码位转换为十进制后翻转
for i=1:N
   Xk(i)=xn(n2(i)+1);%根据码位倒置的结果,将xn重新排序,存入Xk中
end

%蝶形运算开始
M=log2(N);%“级”的数量
for m=0:M-1 %“级”循环开始
   Num_of_Group=N/2^(m+1);%每一级中组的个数
   Interval_of_Group=2^(m+1);%每一级中组与组之间的间距
   Interval_of_Unit=2^m;%每一组中相关运算单元之间的间距
   Cycle_Count=2^m-1;%每一组内的循环次数
   Wn=exp(-j*2*pi/Interval_of_Group);%旋转因子
    for g=1:Num_of_Group %“组”循环开始
       Interval_1=(g-1)*Interval_of_Group;%第g组中蝶形运算变量1的偏移量
       Interval_2=(g-1)*Interval_of_Group+Interval_of_Unit;%第g组中蝶形运算%变量2的偏移量
       for r=0:Cycle_Count;%“组内”循环开始
           k=r+1;%“组内”序列的下标
           Xk(k+Interval_1)=Xk(k+Interval_1)+Wn^r*Xk(k+Interval_2);%第m%级,第g组的蝶形运算式1
  Xk(k+Interval_2)=Xk(k+Interval_1)-Wn^r*Xk(k+Interval_2)-Wn^r*Xk(k+Interval_2);%

%第m级,第g组的蝶形运算式2,注:1和2为同址运算
       end
    end
end

  

%测试程序
clear;                      
clc;
xn=wgn(1,500,0.6);              

H=DIF_FFT_2(xn,32);            
subplot(2,1,1);             
[a1,b2]=size(H);
o2=1:b2;                    
% stem(o2,abs(H),'.')        
plot(o2,abs(H)) 
axis([0 32 -inf inf])

H=DIT_FFT_2(xn,32);            
subplot(2,1,2);             
[a1,b2]=size(H);
o2=1:b2;                    
% stem(o2,abs(H),'.')         
plot(o2,abs(H)) 
axis([0 32 -inf inf])

  

运行结果如上,需要注意的是我用了白噪声函数,每一次运行的结果是不一样的,只要上下两个结果一样就对了

posted @ 2020-08-09 15:12  追猎  阅读(458)  评论(0)    收藏  举报