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; %

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





