Matlab中fft的正确简单理解
我们在用matlab进行频谱分析时,fft是最常用的函数。但是fft函数设计到复杂的数学知识,要真正搞懂并非易事。作者也花了很多时间在网上找各种分析说明,今天终于搞懂自己需要用到的部分,在这里也和小伙伴们分享一下!
一:Matlab对fft的官方解释:
fft(X) is the discrete Fourier transform (DFT) of vector
X. For
matrices, the fft operation is applied to each column. For
N-D
arrays, the fft operation operates on the first non-singleton
dimension.
fft(X,N) is the N-point fft, padded with zeros if X has less
than N points and truncated if it has more.
通过matlab的help文件可知,fft的输入为信号X和采样点数N。
二:对于N值的确定
N决定了频率采样的点数(注意不是时域的)。因为时域的采样频率决定了频域的最大值(fmax=fs),所以在
已知道信号的时域采样率后我们就可是确认频率域的分辨率fs,即ff=fs/N.
所以N可以根据分辨率的需要来自
行设定,在没有输入N的情况下系统默认为信号时域的采样点数!但是注意设定的N值要产生的最小分辨率要
小于被分析信号频率间的最小差值,要不然会失真!后面的例子有详细的说明!
三:频率轴的真确处理
由傅里叶变化
N
X(k)
=
sum x(n)*exp(-j*2*pi*(k-1)*(n-1)/N), 1<
= k <= N.
n=1
可知,采样得到的频率被分成了N份,范围是[0,fs],也就是[0,N]。所以fft得到的频域不是真实的频域,二是基
于采样点数得到的,那么采样点的不同取值会不会影响到频谱图呢?除了频率轴的取值有变化外,傅里叶变换
的形状完全没有变化,当然是在N的取值不会使得频谱失真的情况下的!所以在满足不失真的情况下,不管N
为多少,我们都可以得到真确的傅里叶变换图形,只是分辨率不同罢了!但是要获得真正的频率轴,需要对频
率周进行归一化处理。我们知道在满足采样定律的情况下傅里叶变换得到的谱的最大频率为fs/2,所以fft得到的
图是关于fs/2对称的,只需要对频率轴做一个简单的变化即可,即频率周除以N值,然后截取前一半即可!
四:详细matlab程序说明
首先创建一个采样率为fs=100Hz,长度为K=1000,时长t=fs*K,所以时间轴n为n=linspace(dt,t,K);
%% 定义信号的时间轴和采样频率
dt=0.01;
fs=1/dt;
K=1000;
t=dt*K;
n=linspace(dt,t,K);%% 组合信号
x1=5*sin(2*pi*5*n);
x2=10*sin(2*pi*10*n);
x3=5*sin(2*pi*15*n);
x=x1+x2+x3;
plot(x);
xlabel(‘时间轴’);
ylabel(‘y轴’);
legend(‘时域信号’)
得到的原始信号图
对原图进行fft变化,不输入N的值(此时默认为N=K=1000)
%% fft变换
N=K;
a=fft(x,N);
a=abs(a);
figure,
plot(a);
legend(‘fft变换后的原始频谱’);
%% 对fft变换的频率轴做归一化处理
f=(1:N/2)*fs/N;
figure,plot(f,a(1:N/2));
xlabel(‘f/Hz’);
ylabel(‘功率P’);
legend(‘fft变换后对频率进行正确化后的频谱图’);
上面是整个小实验的原始程序和相关的plot图
五、在修改一下N的值我们来看看频谱图会发生什么变化!原始信号的频率点为5Hz,10Hz,15Hz。
K=5000
K=500
K=200
K=100
K=50
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/94039.html