自己实现FFT算法

本文介绍了FFT(快速傅里叶变换)算法的重要性和作用,它将DFT的时间复杂度从O(n^2)降低到O(nlog(n))。作者通过自定义的myfft函数来加强理解,该函数基于百度百科并进行了修改。经过与Matlab内置fft函数的对比验证,误差极小,表明算法正确,但myfft在效率上比fft慢了549倍,可能的原因包括解释型语言的特性、递归算法的使用以及编译型语言的优势。

FFT算法是20世纪最伟大的算法之一,它大幅度的提高了DFT的效率(时间复杂度从O(n^2)缩小到O(nlog(n)),促进了信号处理的大规模应用。

昨天看了FFT算法的实现方法,就想写一遍,加强理解。

自定义FFT函数(在百度百科的基础上修改得到):myfft

function X=myfft(x)
N=length(x);
if N==1
    X=x;
    return;
end
%myfft函数 用递归实现
t=log2(N);
t1=floor(t);
t2=ceil(t);
if t1~=t2; %若x的长度N不为2的整数次幂,则补0至最接近的2的整数次幂
    x=[x zeros(1,2^t2-N)];
    N=2^t2;
end
w0=exp(-1i*2*pi/N);
X=zeros(1,N);
n=1:N/2;
xo(n)=x(2*n-1);
xe(n)=x(2*n);
XO=myfft(xo); %递归调用
XE=myfft(xe);
for n=1:N/2
    X(n)=XO(n)+XE(n)*(w0^(n-1));
    X(n+N/2)=XO(n)-XE(n)*(w0^(n-1));
end

代码是很直观的,比较容易理解其中的思想。

检验这个函数是否正确:

cl;
%%
Fs = 1000;                    % Sampling frequency
T = 1/Fs;                     % Sample time
L = 1024;                     % Length of signal
t = (0:L-1)*T;                % 
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值