1. 程式人生 > >Matlab FFT引數設定研究

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是你實際取樣的點數。