FFT算法实现

使用Rader算法进行二进制倒序

function x = rader(x)
    lengthx = length(x);
    j = lengthx/2;
    
    for i=1 : lengthx/2-1
                      
        if i<j
            t = x(j+1);
            x(j+1) = x(i+1);
            x(i+1) = t;
        end
       
            k = lengthx / 2;
            while(j >= k)
                j = j - k;
                k = k/ 2;
            end
            if j < k
                j = j + k;
            end
    end

FFT算法实现

function H = newfft(x)
    y = rader(x);
    n = length(x);
    m =  log2(n);
    wn = exp(-j * (2 * pi / n));
    H = zeros(1, n);
    for nnum = 1 : m
        delta = 2 ^ (nnum -1);
        L = 2 ^ nnum;
        for i = 1 : n * (1/2) ^ nnum
            for k2 = 1 : L
                k1 = mod(k2 - 1, delta) + 1;
                alpha = 2 * (k1 -1);
                if k2 <= (L / 2)
                    H(L * (i - 1) + k2) = y(L/2 * (2 * i - 1 - 1) + k1) + y(L/2 * (2 * i - 1) + k1) * (wn ^ alpha);
                else
                    H(L * (i - 1) + k2) = y(L/2 * (2 * i - 1 - 1) + k1) - y(L/2 * (2 * i - 1) + k1) * (wn ^ alpha);
                end
            end
        end
        y = H;
    end
end
% H(L * (i - 1) + k2)把H序列拆分成几个长为L的子序列,然后选择第i个子序列的第k2个元素

结果分析,与官方FFT对比

clear;clc;
x = [1, 2, 3, 1, 4, 1, 10, 1];
H1 = newfft(x);
H2 = fft(x);
n = 0 : length(x) - 1;
error = sum((abs(H1) - abs(H2)).^2)/length(x);
mean = sum(abs(H2))/length(x);
com_e = error/mean;
subplot(2, 1, 1);stem(n, abs(H1));
subplot(2, 1, 2);stem(n, abs(H2));

频谱采样点均方误差为1.1022

相对误差为0.1067

FFT频谱结果(只考虑幅度谱)

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值