DFT學習筆記,是關於DFT的變換公式以及其的一些特性
DFT之洩露,關於洩露的現象以及產生的原因;
今天這篇,主要是關於窗函數。
窗函數
為了減小DFT的洩露,需要減小主瓣寬度和旁瓣幅度;理想的窗函數是主瓣寬度窄,旁瓣幅度小。
矩形窗函數首尾值的突變,是其產生旁瓣的原因。所以,可以通過將輸入序列的首尾數據平緩連接,以減小旁瓣的幅度,進而減小DFT的洩露。
所以,各種各樣的窗函數就被發明了,常用的窗函數有:矩形窗函數、Hanning、Hamming窗函數、Blackman等。
上圖是上面四種窗函數的時域和頻域的表示。
從頻域可以看到,主瓣幅度rect>hamming>hann>blackman,這在時域也比較好理解。
因為Hanning、Hamming和Blackman函數都減小了用於DFT運算的時域信號幅度,所以其主瓣幅度低於矩形窗函數的主瓣幅度,這個幅度損失,稱之為處理增益或者處理損耗(processing gain/processing loss)。
將上圖中的右圖的幅度歸一化,可以得到:
可以看到:
(1) 從主瓣寬度來看:rect<hamming<hann<blackman;
(2) 從旁瓣大小來看:rect>hamming>hann>balckman
對信號加窗函數,有助於我們識別大信號旁邊的小信號。
比如,我們對xn=sin(2*pi*1800*n/fs)+0.0001*sin(2*pi*1950*n/fs)做加窗操作,並作2048點的DFT變換,其中fs=8000.
Matlab程序如下:
clc;
clear all;
close all;
K=2048;
n=0:1:K-1;
fs=8000;
xn=sin(2*pi*1800*n/fs)+0.0001*sin(2*pi*1950*n/fs);
figure (1);
plot(n,xn);
figure (2);
subplot(2,2,1);
m=0:1:K/2;
Y=fft(xn'.*rectwin(K),K);
plot(m*fs/K,20*log10(abs(Y(1:(K/2+1)))/max(abs(Y(1:(K/2+1))))),'Linewidth',1)
title('rect')
subplot(2,2,2);
Y1=fft(xn'.*hamming(K),K);
plot(m*fs/K,20*log10(abs(Y1(1:(K/2+1)))/max(abs(Y1(1:(K/2+1))))),'Linewidth',1)
title('hamming')
subplot(2,2,3);
Y2=fft(xn'.*hann(K),K);
plot(m*fs/K,20*log10(abs(Y2(1:(K/2+1)))/max(abs(Y2(1:(K/2+1))))),'Linewidth',1)
title('hann')
subplot(2,2,4);
Y3=fft(xn'.*blackman(K),K);
plot(m*fs/K,20*log10(abs(Y3(1:(K/2+1)))/max(abs(Y3(1:(K/2+1))))),'Linewidth',1)
title('blackman')
運行結果如下圖所示:
可以看到,如果使用rect和hamming這兩種窗函數的話,則不能識別出小信號;但如果用hann或者blackman這兩種窗函數的話,則能識別出大信號旁邊的小信號。
選擇窗函數,需要根據應用情況,在主瓣寬度、第一旁瓣幅度、旁瓣的衰減速度之間的折衷。
參考文獻:
[1]RICHARD G. LYONS Understanding digital signal processing
[2]J. Fessler, chapter 5, The Discrete Fourier Transform
部分圖片及文字來源於網絡,如有侵權,麻煩後臺留言,立馬刪除,謝謝!