1. 程式人生 > 實用技巧 >Hamming(漢明)窗的原理介紹及例項解析

Hamming(漢明)窗的原理介紹及例項解析

概念

  在數字訊號處理過程中,每次FFT變換隻能對有限長度的時域資料進行變換,因此,需要對時域訊號進行訊號截斷。即使是週期訊號,如果截斷的時間長度不是週期的整數倍(週期截斷),那麼,擷取後的訊號將會存在洩漏。為了將這個洩漏誤差減少到最小程度(注意我說是的減少,而不是消除),我們需要使用加權函式,也叫窗函式。加窗主要是為了使時域訊號似乎更好地滿足FFT處理的週期性要求,減少洩漏。這裡面,有很多窗函式可以使用,不過,每種窗函式的使用場景是不同的。由於直接對訊號(加矩形窗)截斷會產生頻率洩露,為了改善頻率洩露的情況,加非矩形窗,一般都是加漢明窗,因為漢明窗的幅頻特性是旁瓣衰減較大,主瓣峰值與第一個旁瓣峰值衰減可達40db。

原理

  hamming窗函式其實很簡單。可以使用一個公式來表示:


當 a0=0.53836 ,稱作 Hamming窗;當 a0=0.5 則叫作 Hann窗。

Hann窗又稱升餘弦窗。Hann窗可以看作是3個矩形時間窗的頻譜之和,或者說是 3個 sinc(t) 型函式之和,而括號中的兩項相對於第一個譜窗向左、右各移動了π/T,從而使旁瓣互相抵消,消去高頻干擾和漏能。

從減小洩漏觀點出發,Hann窗優於矩形窗。但Hann窗主瓣加寬,相當於分析頻寬加寬,頻率分辨力下降。

如果我們將a0設為接近 0.53836 的數值,或是更精確來說是 25/46,便會得到Hamming窗,而設定這個數值的用意,是在頻率為 5π/(N − 1) 處產生零交會處(zero-crossing),使原先Hann窗的第一個旁瓣(sidelobe)可以被大幅消除,產生只有Hann窗 1/5 高度的旁瓣。

一般來說,為了減少運算量,可以把公式精簡為:

在matlab中,這個是非常容易實現的,只需要一個語句,就可以把漢明窗的數值求出來:

L = 64;

wvtool(hamming(L))

順便可以看到它的頻響曲線:

例項分析

  這裡給出一個matlab的音訊處理例子,給大家一個直觀的印象:

[x, fs] = audioread('mic1_data.wav');


N=256;                               %設定短時傅立葉變換的長度,同時也是漢明窗的長度
h=hamming(N);                   %設定漢明窗
sprintf("
%d",h); for m=1:N %用漢明窗擷取訊號,長度為N,主要是為了減少截斷引起的柵欄效應等 b(m)=x(m)*h(m) end for mm=1:N y1(mm)=x(mm) end ya=20*log(abs(fft(y1))) %做傅立葉變換,取其模值,即幅頻特性,然後用分貝(dB)表示 subplot(2,1,1), %分配畫布,一幅圖上共兩個圖,這是第一個 plot(ya);title('original signal'); %畫出原始訊號,即前面這個音訊訊號的原始波形 grid %新增網格線 y=20*log(abs(fft(b))) %做傅立葉變換,取其模值,即幅頻特性,然後用分貝(dB)表示 subplot(2,1,2) %分配畫布,第二副圖 plot(y);title('hamming added signal'); %畫出短時譜 grid

運算結果:

備忘

  在音訊處理領域,漢明窗應用十分廣泛,希望這裡能給大家一些解惑。