對數碼訊號進行快速傅利葉變換,可得到數碼訊號的分析頻譜。分析頻譜是實際頻譜的近似。傅利葉變換是對延拓後的週期離散訊號進行頻譜分析。如果取樣不合適,某一頻率的訊號能量會擴散到相鄰頻率點上,出現頻譜洩漏現象。
為了減少頻譜洩漏,通常在取樣後對訊號加窗。常見的窗函式有矩形窗(即不加窗)、三角窗、漢寧窗、漢明窗、高斯窗等。除了矩形窗外,其他的窗在時域上體現為中間高,兩端低。
傅利葉分析的頻率解析度主要是受窗函式的主瓣寬度影響,而洩漏的程度則依賴於主瓣和旁瓣的相對幅值大小。矩形窗有最小的主瓣寬度,但是在這些最常見的窗中,矩形窗的旁瓣最大。因此,矩形窗的頻率解析度最高,而頻譜洩漏則最大。不同的窗函式就是在頻率解析度和頻譜洩漏中作乙個折中選擇。
在電機故障診斷領域,需同時考慮頻率解析度和頻譜洩漏。應用最廣泛的窗函式是漢寧窗。
漢寧窗的英文寫法有兩種: hann 窗和 hanning 窗。正確寫法是 hann,但是在實際使用過程中和漢明窗 (hamming)混淆而慢慢變成了 hanning (參見維基百科 hann function 條目)。目前,這兩種表述都可以。在 matlab 中,也存在 hann 和 hanning 兩個函式。每乙個窗函式都可以選擇 『symmetric』 或 『periodic』 型別。』symmetric』 型別表示窗函式是對稱的,對稱的窗函式主要用於濾波器的設計。』periodic』 型別表示窗函式是週期性的,常用於頻譜分析。因此,這裡只比較 『periodic』 型別的 hann 和 hanning。
在 matlab 中, 可通過w = hann(n,'periodic')
和w = hanning(n,'periodic')
來獲得長度為 n 的窗函式。實際上,上述兩個函式得到的窗函式是完全一樣的,均等價於ω(
n)=1
2[1−
cos(2π
(n−1
)n)]
其驗證過程如下:
n = 20;%窗函式的長度
w1 = hann(n,'periodic');
w2=zeros(n,1);
for n=1:n
w2(n) = 0.5*(1-cos(2*pi*(n-1)/n));
endfigure(1);
subplot(2,1,1);
plot(w2);
title(['hann(n,','periodic',')']);
subplot(2,1,2);
plot(w1-w2);
w3 = hanning(n,'periodic');
figure(2);
subplot(2,1,1);
plot(w3);
title(['hanning(n,','periodic',')']);
subplot(2,1,2);
plot(w3-w1);
ylim([-2e-16, 2e-16]);
title(['hann(n,','periodic',') 和 ', 'hanning(n,','periodic',') 的誤差'])
其輸出的波形如下:
值得注意的是,w = hann(n,'symmetric')
和w = hanning(n,'symmetric')
並不是一回事。前者等價於ω(
n)=1
2[1−
cos(2π
(n−1
)n−1
)]而後者則等價於ω(
n)=1
2[1−
cos(2π
nn+1
)]
%% 訊號
% 訊號引數
fs = 2500; %取樣頻率
n=fs*10;
t=(1:n)/fs;
w1=49.85*2*pi;
w2=w1+2*pi*1;
w3=w1-2*pi*1;
x = 10*cos(w1*t) + 0.005*cos(w2*t)+0.03*cos(w3*t);
%% 窗函式對訊號頻譜的影響
% 矩形窗
x1 = x;
myplotf=(0:(n-1))*fs/n;
ff1=fft(x1,n);
y1=abs(ff1)*2/n;%fft幅值
y1(1)=y1(1)/2;
figure(3);
plot(myplotf,20*log10(y1));
xlim([40 60]);
title('矩形窗後的頻譜');
% 漢寧窗
w = hanning (n,'periodic');
x2 = w'.*x;%加窗
ff2=fft(x2,n);
y2=abs(ff2)*2/n;%fft幅值
y2(1)=y2(1)/2;
figure(4);
plot(myplotf,20*log10(y2));
xlim([40 60]);
title('漢寧窗後的頻譜');
不加窗(矩形窗)時的頻譜為
加漢寧窗時的頻譜為
從上述兩個圖可以看到,加入漢寧窗後,頻譜洩露減小。原來被洩露的能量所掩蓋而看不到的頻率分量也可以清晰地看到。
波形為 x=
asin(2
πft)
的訊號,加漢寧窗後進行傅利葉分析,其傅利葉頻譜中頻率為
f 的分量幅值為 a2
(不考慮頻譜洩露問題)。
例:
fs = 1000;%取樣頻率
t = 1/fs:1/fs:0.2;%分析時間0.2s
a = 10; %幅值
f = 50; %頻率
x = a * sin(2*pi* f*t);
n = numel(t);
w = hann(n,'periodic');%生成窗函式
x_window = w'.*x;
myplotf=(0:(n-1))*fs/n;
ff=fft(x,n);
y=abs(ff)*2/n;%fft幅值
ff=fft(x_window,n);
y_window=abs(ff)*2/n;%加窗後fft幅值
figure(5);
plot(myplotf,y,'r',myplotf,y_window,'k');
legend('不加窗(矩形窗)','加漢寧窗');
title('加漢寧窗對訊號頻譜頻譜幅值的影響');
xlim([0 100]);
得到的結果如下圖所示:
從圖上可以看到,幅值為 10 的訊號,不加窗時得到的幅值也為 10 (由於恰好能取到50 hz 這個頻率點,所以不存在頻譜洩露), 加入漢寧窗後的幅值變為了原來的一半。但是,會在該頻率點兩側各引入乙個本不存在的頻率點,且這些點的幅值為中心點幅值的一半。這是由漢寧窗本身的頻譜決定的。
上述結果表明:
matlab 中,w = hann(n,'periodic')
和w = hanning(n,'periodic')
是完全一樣的;
加窗後頻譜洩漏減小;
加漢寧窗後,其幅值減為原來的一半,且會在改頻率點兩旁各引入乙個本不存在的點,且這兩個點的幅值為中心點幅值的一半。
申明:本博文來自 xinhuasz 的部落格,位址為
FFT 頻域漢寧窗
legend fft fft加窗 hold off title 不對fft結果進行log運算 figure hold on plot freq,20 log10 abs y ori r plot freq,20 log10 abs y new b legend fft fft加窗 hold off ...
語音識別 漢明窗
首先,hamming 函式的作用是返回乙個l點的對稱海明窗列向量w。語音頻號一般在10ms到30ms之間,我們可以把它看成是平穩的。為了處理語音頻號,我們要對語音頻號進行加窗,也就是一次僅處理窗中的資料。因為實際的語音頻號是很長的,我們不能也不必對非常長的資料進行一次性處理。明智的解決辦法就是每次取...
不同組織的窗寬窗位
頭顱,腦組織 窗寬設定為80 hu 100 hu,窗位為30 hu 40 hu,垂體及蝶鞍區病 變窗寬宜設在200 hu 250 hu,窗位45 hu 50 hu,腦出血患者可改變 窗寬位80 hu 140 hu,窗位30 hu 50 hu,腦梗死患者 常用窄窗60 hu,能提高病灶的檢出率,清楚顯...