本文主要是介绍Matlab FFT参数设置研究,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
写在前面的废话
近期要对一款高速ADC进行测试,用到Matlab的fft函数分析其动态性能,为了对Matlab 的fft有一个全方位立体的认识,对其参数进行了小实验,记录如下。
使用Matlab生成采样数据
clear;
fs = 1000;
ts = 1/fs;
L = 2400;
t = (0:L-1)*ts;
x = 0.7*sin(2*pi*50*t) + sin(2*pi*120*t);
该采样数据中不包含噪声,对其进行fft变换,代码如下
NFFT = 2^nextpow2(L); //一般进行fft变换的点数参数为2的正数次幂
Y = fft(x,NFFT)/L;
Ya = 2*abs(Y(1:NFFT/2+1));
f = fs/2*linspace(0,1,NFFT/2+1);
plot(f,Ya)
结果如下
可以看到频率有偏移,幅值亦有衰减
人为提高NFFT的点数,重新做fft,结果如下
可以发现,频率准了,而且幅值衰减亦减小,可以真实反映模拟生成的数据的实际情况。
FFT之后是如何还原幅值信息的
这个问题可能要好好研究下DFFT的计算过程,在这里我就不多说了,因为!我也不会……不过可以给你看个fft返回的原始数据,直观感受下。
给原始数据添加高斯白噪声
y = x + 2*randn(size(t));
再做fft,结果如下
发现幅值又变得有衰减,按理说这不应该的……于是我把时域波形画出来看了下,已经成这鸟样子了……那这一点点衰减应该是能够接受的。
时域波形
划重点了
好吧,我承认我上面说的比较乱,下面直接说结论了!!!
fft(data,NFFT)/n,
1、其中NFFT为计算fft的点数,可以人为设置较大的值,这样可以提高FFT之后的频率分辨率,fft函数会自动在计算的时候进行插值。
2、NFFT也最好是2的整数次幂,这样可以防止频谱泄露。
3、n是你实际采样的点数。
4、频率分辨率 = 采样率/NFFT
这篇关于Matlab FFT参数设置研究的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!