2N点实序列的FFT, MATLAB CODE

2N点实序列的FFT

  • 空间

function X = fft_2N(x)

% 计算长度为2N的实序列的FFT

% John G.Proakis,数字信号处理,第四版


% Define variables:

%   x       --- Input real vector of length 2*N(power of 2)

%   X       --- Output vector,FFT result

% Record of revisions:

%       Date          Programmer        Description of change

%       ====          ==========        =====================

%      2014/0421        GOU DH           Original code

%


% test

clear,clc

x = randn(64,1);

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

x = x(:);

nx = length(x);

t = reshape(x,2,nx/2);

x1 = t(1,:)';

x2 = t(2,:)';            % 时域抽取,奇偶分离

[X1,X2] = fft_2_N(x1,x2,nx/2);

k = [0:nx/2-1]';

W2Nk = exp(-j*2*pi*k/(nx));

T = X2.*W2Nk;

G1 = X1 + T;

G2 = X1 - T;

X = [G1;G2];


% test

sum(abs(X - fft(x,nx)))

return;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Subfunction

function [X1,X2] = fft_2_N(x1,x2,N)

% 计算2个N点实序列的FFT


if ~isreal(x1) | ~isreal(x2)

    return;

end

x = x1 + j*x2;

X = fft_dif2(x,-1);

T = [X(1); flipud(X(2:end))];

T = conj(T);

X1 = (X + T)/2;

X2 = (X - T)/(2*j);


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% Subfunction

function [X]=fft_dif2(x,f)

% 频域抽取基2-FFT(基2-DIF-FFT)


nx = length(x);

M = fix(log2(nx));

if 2^M < nx, M = M + 1; end       % 级数M

x = [x(:);zeros(2^M-nx,1)];

N = length(x);

%

C = j*pi*f;

for m = 0:1:M-1          % 级循环序号

    B = 2^(M-1-m);       % 蝶形因子序号间距=蝶形因子个数=2^(M-1-m)

    for r = 0:1:B-1      % 蝶形因子循环序号

        Wnp = exp(C*r/B);

        for k = r:2*B:N-1

            tmp1 = x(k+1);

            tmp2 = x(k+B+1);

            x(k+1) = tmp1+tmp2;

            x(k+B+1) = (tmp1-tmp2)*Wnp;

        end

    end

end


% 倒位序

% X = x;

LH = N/2;

J = LH;

N1 = N-2;

for I = 1:1:N1

    if I < J

        T = x(I+1);

        x(I+1) = x(J+1);

        x(J+1) = T;

    end

    K = LH;

    while J >= K

        J = J-K;

        K = K/2;

    end

    J = J+K;

end


if f == 1

    x = x/N;

end

X = x;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ECG,SPO2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值