加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

FFT_dit,dif的matlab仿真学习

(2010-04-26 20:02:41)
标签:

蝶形

fft

matlab

杂谈

频率抽取(DIF)基2FFT算法和时间抽取(DIT)基2FFT算法是两种等价的FFT算法,其相同之处:

(1)DIF与DIT两种算法均为原位运算。

(2)DIF与DIT运算量相同。

不同之处:

(1)DIF的算法结构是将DIT算法结构倒过来。

·        DIF为输入顺序,输出乱序。运算完毕再运行“二进制倒读”程序。

·        DIT为输入乱序,输出顺序。先运行“二进制倒读”程序,再进行求DFT。

(2)DIF与DIT根本区别:在于蝶形结不同。

·        DIT的复数相乘出现在减法之前。

·        DIF的复数相乘出现在减法之后。

下图[REF1]是在N=8时,频率抽取(DIT)基2FFT算法的流图。

 

http://s1/middle/674f55f94852295dcb820&690

最后给出MATLAB实现的代码:

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,注:12为同址运算

        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


 

 

 

%DIT_FFT_2 @ 091211

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,注:12为同址运算
        end
    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

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有