FFT的MATLAB实现

很荣幸能够加入到CSDN的大家庭,在之前做项目中在CSDN中学习到了很多,之后自己也要去试着把自己做的项目心得或代码放在这里作为记录,如果能帮助到大家就更好啦!
在学习了数字信号处理的课程后,想自己试着编一编FFT的程序。

代码实现及注释

function y = testfft(x)
%FFT算法
%自己按照FFT定义编写,输入行向量x
m = nextpow2(length(x));%求x长度对应的2的最低次幂
N = 2^m;
if(length(x) < N)
x = [x,zeros(1,length(x))];%FFT算法补零
end
change = bin2dec(fliplr(dec2bin([1:N]-1,m))) + 1;%求1:2^m数列的倒序
y = x(change);
for s = 1:m %m次基2分解,对每次分解做DFT运算
Nr = 2^s; %每个蝶形中的行号差
u = 1; %旋转因子,初始为WN^0等于1
WN = exp(-(1i)2pi/Nr);%分解的基本DFT因子
for j = 1:Nr/2
for k = j:Nr:N
kp = k + Nr/2;
g = y(kp) * u;
y(kp) = y(k) - g;
y(k) = y(k) + g;
end
u = u * WN;
end
end
end

比较

在matlab中测试原有fft()函数和自己编写的testfft()函数对相同向量的运行时间,可以看出,原有的用机器语言编写的FFT程序运行速度快。
k = 1:2^10;
x = 0.998.^k;
tic,X = fft(x);toc
tic,X = testfft(x);toc
1024点向量运行时间比较

应用

在matlab中,有已经完成的FFT函数,并且运算速度最快,但是可以把程序改为C/C++语言,可能会在以后的项目中用到。

你可能感兴趣的:(FFT的MATLAB实现)