窗函數(shù)是頻譜分析中一個重要的部分,窗函數(shù)修正了由于信號的非周期性并減小了頻譜中由于泄露而帶來的測量不準(zhǔn)確性。
快速傅里葉變換假定了時間信號是周期無限的。但在分析時,我們往往只截取其中的一部分,因此需要加窗以減小泄露。窗函數(shù)可以加在時域,也可以加在頻域上,但在時域上加窗更為普遍。截斷效應(yīng)帶來了泄漏,窗函數(shù)是為了減小這個截斷效應(yīng),其設(shè)計成一組加權(quán)系數(shù)。例如,一個窗函數(shù)可以定義為:
w(t)=g(t) -T/2<t<T/2
w(t)=0 其他
g(t)是窗函數(shù),T是窗函數(shù)的時間.
待分析的數(shù)據(jù)x(t)則表示為:
x(t)=w(t)*x(t)'
x(t)'表示原始信號,x(t)表示待分析信號。
加窗在時域上表現(xiàn)的是點乘,因此在頻域上則表現(xiàn)為卷積。卷積可以被看成是一個平滑的過程。這個平滑過程可以被看出是由一組具有特定函數(shù)形狀的濾波器,因此,原始信號中在某一頻率點上的能量會結(jié)合濾波器的形狀表現(xiàn)出來,從而減小泄漏。基于這個原理,人們通常在時域上直接加窗。
大多數(shù)的信號分析儀一般使用矩形窗(rectangular),漢寧(hann),flattop和其他的一些窗函數(shù)。
矩形窗函數(shù):
w(k)=1
漢寧窗:
w(k)=0.5*(1-cos(2*pi*k/(N-1))) 0<=k<=N-1
由于加窗計算中衰減了原始信號的部分能量,因此對于最后的結(jié)果還需要加上修正系數(shù)。在線性譜分析中,一般使用幅度系數(shù)(amplitude correction),在功率譜中,一般使用能量系數(shù)(energy correction)。(這段不清楚在實際中如何用)
matlab中提供了很多窗函數(shù),如下
還提供了顯示窗函數(shù)的GUI工具,如wvtool可以顯示用來顯示窗的形狀和頻域圖形,wintool可以打開窗設(shè)計和分析工具,如運行
wvtool(hamming(64),hann(64),gausswin(64))
可以對比漢明窗、漢寧窗和高斯窗

簡單測試一下加窗的效果如下


可以看到加窗后,頻譜泄露確實減少了,但同時信號能量也減小了,這也許就是所說的要使用能量系數(shù)吧,如下,這樣一來,對比就更明顯了,加窗可以有效的減少頻譜泄露。

測試代碼如下
%% 窗函數(shù)測試
function main
clc
close all
Ts = 0.001;
Fs = 1/Ts;
%% 原始信號
t = 0:Ts:pi/2;
yt = sin(2*pi*5*t) + sin(2*pi*10*t) + sin(2*pi*15*t);
[Yf, f] = Spectrum_Calc(yt, Fs);
figure
subplot(211)
plot(t, yt)
xlabel('t')
ylabel('y')
title('原始信號')
subplot(212)
plot(f, Yf)
xlabel('f')
ylabel('|Yf|')
xlim([0 100])
ylim([0 1])
title('原始信號頻譜')
%% 加窗信號
win = hann(length(t));
yt1 = yt.*win';
[Yf1, f1] = Spectrum_Calc(yt1, Fs);
figure
subplot(211)
plot(t, yt1)
xlabel('t')
ylabel('y')
title('加窗信號')
subplot(212)
plot(f1, 2*Yf1) % 2表示能量系數(shù)
xlabel('f')
ylabel('|Yf|')
xlim([0 100])
ylim([0 1])
title('加窗信號頻譜')
end
%% 求取頻譜
function [Yf, f] = Spectrum_Calc(yt, Fs)
L = length(yt);
NFFT = 2^nextpow2(L);
Yf = fft(yt,NFFT)/L;
Yf = 2*abs(Yf(1:NFFT/2+1));
f = Fs/2*linspace(0,1,NFFT/2+1);
end