⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fft_self.m

📁 OFDM系统
💻 M
字号:
%自己定义的FFT函数,算法采用的就是课本上讲的雷德算法

function y = FFT_self(x,M)

%--------------------------------------------------------------------------
%下面这部分是当输入序列的长度不为2的指数幂时在序列后补零达到2的指数幂的长度
q = nextpow2(M);                          %返回第一个q使得 2^q >= abs(M)
N = 2^q;
if M<N
    x=[x,zeros(1,N-M)];                   %在序列后面补零
end
%--------------------------------------------------------------------------
%实际的FFT算法
%--------------------------------------------------------------------------
%这一部分是用于变址
nv2=N/2;
nm1=N-1;
i=0;                                      %用于表示自然顺序的输入数据
p=0;                                      %用于表示倒位序的数据
while i<nm1                        
    if i<p                                %当i<p时要进行变址,在i>p时不需要变址,可以避免重复换址
        t=x(p+1);
        x(p+1)=x(i+1);
        x(i+1)=t;
    end
    k=nv2;                                %nv2二进制的高位为1,其他位为0
%---------------------------------已知某个倒位序数,求下一个倒位序数
    while k<=p                            %P的高位为1,减去N/2将高位变为0
        p=p-k;
        k=k/2;                            %用于次高位的处理
    end
    p=p+k;                                %当P的高位为0时,直接加N/2变为1
    i=i+1;
end
%--------------------------------------------------------------------------
%L级递推计算
l=1;                              
m=log2(N);                                %蝶形运算的级数
while l<=m                        
    le=2^l;                               %各蝶形结依次的距离
    le1=le/2;                             %同一种蝶形结构中参加运算的两节点的间距
    u=1;                                  %开始的exp(-j*2*pi*0/N)
    w=exp(-j*2*pi/le);                    %每一级的系数
    p=0;
    while p<le1;                          %这层循环控制不同旋转因子的碟形结
        i=p;
        while i<N                         %这层循环控制同一种蝶形结的运算
            ip=i +le1;                    %i为蝶形结中一个点,ip是另一个点
            t=u*x(ip+1);                  %下面三句就是进行相应的蝶形运算
            x(ip+1)=x(i+1)-t;
            x(i+1)=t+x(i+1);
            i=i+le;                       
        end
        u=u*w;                            %改变不同蝶形结的旋转因子
        p=p+1;
    end
    l=l+1;
end
y = x;                                    %把经过FFT处理后的输入序列x传递给输出序列y

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -