MATLAB的FFT函数可直接调用,对应DFT离散傅里叶变换理解

	最近做仿真实验,有时需要用傅里叶变换时,老是需要先写写参数再经
过变换,为了解决这个麻烦事,就写个fft变换函数代码,下次直接带入
就方便多了,当然鉴于许多同志当然也包括我对fft这玩意百思不得其解,
不过现在我有点头绪了,也顺便分享下自己的理解。

首先,先说明下其实FFT就是DFT,只不过前者是后者的在计算机计算中的算法改良,所以可以直接以DFT去理解FFT。当然这里我们不去讲DFT怎么来的,我们直接贴上公式,因为FFT的理解就是要根据这个公式来理解(图百度找的有点模糊):
在这里插入图片描述
OK,直接贴上代码:

function Y=fft0(Fs,x)
%FS为采样频率,前提满足采样定理即Fs>2Wmax(信号最大频率),常取1024,当然前提
%要满足采样定理,如不满足时则增大,则采样周期T=1/FS,时域自变量t=(0:N-1)T;
%N为序列个数,当然(N-1)T要不小于信号的一个周期,一般都大于,当不满足时适当
%增大N(这是FS就不等于N),通常取FS=N,这样就能够使频域分辨率为1Hz,因为分辨率等于Fs/N;
%x为输入序列,尽量一周完整的周期就可以,其长度N取1024
%
%Fs=1024;
%N=1024;
%T=1/Fs;
%t=(0:N-1).*T;
%x=cos(2*pi*10*t);%%%一般主程序要写如上语句
T=1/Fs;%采样周期
N=length(x);%序列长度
t=(0:N-1).*T;%时域横轴,但应保证时域信号在一个周期内
Y=fft(x,N);%N一定到大于信号序列x的长度,不过一般等于,决不能小于
%因为若要小于时域就会发生混叠
Y=abs(Y);
Y=Y./N;
%Y=Y.*2./N;Y(1)=Y(1)./2;若考虑将负频率的幅度折算到正频率时应这样处理
%因为变换后有个N的乘积因子的影响,根据DFT公式可知,故消除其影响
f=(0:N-1)*Fs./N;
%频率正常化,因为变换后横坐标是每个点对应的个数,故应转化成实际的频率
%由于频谱是对称的,且周期的故常常只画一半如下
subplot(2,1,1);
plot(f(1:N/2),Y(1:N./2));
%当然也可以画平常我们见到的有对称的如下
f=f-Fs./2;
subplot(212);
plot(f,fftshift(Y));







OK,来个例子检验下,注意这是函数,到时候建立个M文件调用就好,注意上面的说明哦:

clear
>> Fs=1024;
>> N=1024;
>> T=1/Fs;
>> t=(0:N-1).*T;
>> x=cos(2*pi*10*t);
>> fft0(Fs,x);
>> grid on

在这里插入图片描述

Fs=1024;
N=1024;
T=1/Fs;
t=(0:N-1).*T;
x=cos(2*pi*10*t)+cos(2*pi*50*t);
fft0(Fs,x);
grid on

在这里插入图片描述
第二个图就应该和平常我们画的差不多吧;再来一个直流信号的

Fs=1024;
N=1024;
T=1/Fs;
t=(0:N-1).*T;
x=ones(1,length(t));
fft0(Fs,x);
grid on

在这里插入图片描述
总之,要注意的就是采样频率Fs的选择,原信号序列个数N的选择,这两者之间的(N-1)/Fs应尽可能>=能够完整表达原信号序列的一个周期
(由T=1/Fs;t=(0:N-1).*T;可知时域表达的的横轴t的取值范围,而其最大值为(N-1)/Fs),一般取N=Fs,并且为了计算速度,Fs常为2的幂次方如256,512,1024等,当然是在满足前述条件的基础上。
Anyway,可能还是无法很好理解,那就不管了吧,直接用就好,当然要注意上述所强调的重点。在函数也有说明。
其实这些都是数字信号处理的知识,但确实是挺抽象的,后续也会把一些自己更详细的见解表达下。
对于有错误的地方,欢迎指正,谢谢。
对于其中一些更详细的介绍请看
https://blog.csdn.net/qq_37335890/article/details/85040277

猜你喜欢

转载自blog.csdn.net/qq_37335890/article/details/84799741