【Matlab】时域基2FFT

本文介绍了一个针对序列的2019b版本MatlabFFT函数,强调了输入规格并演示了核心的倒序和蝶形运算过程。

时域基2FFT

程序较为简陋,需要进一步编写加强灵活性。
要求:输入的序列和N的点数必须为2的幂。
Matlab:2019b


function [y_n] = MyFFT(x_n,N)
%MYFFT 时域基2的快速傅里叶变换
%   x_n:需要进行fft的序列
%   N  :做N点DFT,应当为2的指数幂
%   y_n:输出序列

M = log2(N);    %   M级蝶形运算
L = length(x_n);%   输入序列长度
x_input = 1:L;  %   倒序后的实际输入序列,建议直接赋值,用zeros之类的函数会定义为矩阵
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   倒序
last_index = 0;
x_input(1) = x_n(1);
for k=1:L-1       %   进行L-1次运算
    index = last_index;%   序列下标
    div = 2;    %   分母
    while 1
        if index<(N/div)
            index = index + N/div;
            x_input(k+1) = x_n(index+1);
            last_index = index;
            break
        else
            index = index - N/div;
            div = div * 2;
            continue
        end 
    end
end 
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%   蝶形运算
for k=1:M        %  进行M次蝶形运算,第k级运算
   J = 0:2^(k-1)-1;
   ro = exp(-j .* J .* 2^(M-k)*2*pi/N);   %   每级的旋转因子
   ro_index = 0;
   x_input_index = 1;   
   
   for conter = 1:N/2 %   每级应当进行N/2次蝶形计算
       stable = x_input(x_input_index);
       change = x_input(x_input_index+2^(k-1));
       temp1 = stable + change .* ro(rem(ro_index,2^(k-1))+1);
       temp2 = stable - change .* ro(rem(ro_index,2^(k-1))+1);
       x_input(x_input_index) = temp1;
       x_input(x_input_index+2^(k-1)) = temp2;
       
       if rem(conter,2^(k-1))==0
          x_input_index = x_input_index +2^(k-1)+1; % 蝶形运算满2^(k-1)次后加2^(k-1)+1个,否则加1
       else
          x_input_index = x_input_index + 1; 
       end
       ro_index = ro_index + 1;
   end
end

y_n = x_input;
end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值