幾種常見窗函式及其MATLAB實現
洩漏與窗函式頻譜的兩側旁瓣有關,對於窗函式的選用總的原則是,要從保持最大資訊和消除旁瓣的綜合效果出發來考慮問題,儘可能使窗函式頻譜中的主瓣寬度應儘量窄,以獲得較陡的過渡帶;旁瓣衰減應儘量大,以提高阻帶的衰減,但通常都不能同時滿足這兩個要求。頻譜中的如果兩側瓣的高度趨於零,而使能量相對集中在主瓣,就可以較為接近於真實的頻譜。不同的窗函式對訊號頻譜的影響是不一樣的,這主要是因為不同的窗函式,產生洩漏的大小不一樣,頻率分辨能力也不一樣。訊號的加窗處理,重要的問題是在於根據訊號的性質和研究目的來選用窗函式。圖1是幾種常用的窗函式的時域和頻域波形,其中矩形窗主瓣窄,旁瓣大,頻率識別精度最高,幅值識別精度最低,如果僅要求精確讀出主瓣頻率,而不考慮幅值精度,則可選用矩形窗,例如測量物體的自振頻率等;布萊克曼窗主瓣寬,旁瓣小,頻率識別精度最低,但幅值識別精度最高;如果分析窄帶訊號,且有較強的干擾噪聲,則應選用旁瓣幅度小的窗函式,如漢寧窗、三角窗等;對於隨時間按指數衰減的函式,可採用指數窗來提高訊雜比。表1 是幾種常用的窗函式的比較。
如果被測訊號是隨機或者未知的,或者是一般使用者對窗函式不大瞭解,要求也不是特別高時,可以選擇漢寧窗,因為它的洩漏、波動都較小,並且選擇性也較高。但在用於校準時選用平頂窗較好,因為它的通帶波動非常小,幅度誤差也較小。
表1 幾種常用的窗函式的比較
名稱 |
特點 |
應用 |
矩形窗 Rectangle |
矩形窗使用最多,習慣上不加窗就是使訊號通過了矩形窗。這種窗的優點是主瓣比較集中,缺點是旁瓣較高,並有負旁瓣,導致變換中帶進了高頻干擾和洩漏,甚至出現負譜現象。頻率識別精度最高,幅值識別精度最低,所以矩形窗不是一個理想的窗。 |
如果僅要求精確讀出主瓣頻率,而不考慮幅值精度,則可選用矩形窗,例如測量物體的自振頻率等,也可以用在階次分析中。 |
漢寧窗 Hanning |
又稱升餘弦窗。主瓣加寬並降低,旁瓣則顯著減小,從減小洩漏觀點出發,漢寧窗優於矩形窗.但漢寧窗主瓣加寬,相當於分析頻寬加寬,頻率分辨力下降。它與矩形窗相比,洩漏、波動都減小了,並且選擇性也提高。 |
是很有用的窗函式。如果測試訊號有多個頻率分量,頻譜表現的十分複雜,且測試的目的更多關注頻率點而非能量的大小,需要選擇漢寧窗。如果被測訊號是隨機或者未知的,選擇漢寧窗。 |
海明窗 (漢明窗) Hamming |
與漢寧窗都是餘弦窗,又稱改進的升餘弦窗,只是加權係數不同,使旁瓣達到更小。但其旁瓣衰減速度比漢寧窗衰減速度慢。 |
與漢明窗類似,也是很有用的窗函式。 |
平頂窗 Flap Top |
平頂窗在頻域時的表現就象它的名稱一樣有非常小的通帶波動。 |
由於在幅度上有較小的誤差,所以這個窗可以用在校準上。 |
凱塞窗 Kaiser |
定義了一組可調的由零階貝塞爾Bessel函式構成的窗函式,通過調整引數β可以在主瓣寬度和旁瓣衰減之間自由選擇它們的比重。對於某一長度的Kaiser窗,給定β,則旁瓣高度也就固定了。 |
|
布萊克曼窗 Blackman |
二階升餘弦窗,主瓣寬,旁瓣比較低,但等效噪聲頻寬比漢寧窗要大一點,波動卻小一點。頻率識別精度最低,但幅值識別精度最高,有更好的選擇性。 |
常用來檢測兩個頻率相近幅度不同的訊號。 |
高斯窗 Gaussian |
是一種指數窗。主瓣較寬,故而頻率分辨力低;無負的旁瓣,第一旁瓣衰減達一55dB。常被用來截短一些非週期訊號,如指數衰減訊號等。 |
對於隨時間按指數衰減的函式,可採用指數窗來提高訊雜比。 |
三角窗 (費傑窗) Fejer |
是冪窗的一次方形式。與矩形窗比較,主瓣寬約等於矩形窗的兩倍,但旁瓣小,而且無負旁瓣。 |
如果分析窄帶訊號,且有較強的干擾噪聲,則應選用旁瓣幅度小的窗函式,如漢寧窗、三角窗等。 |
切比雪夫窗Chebyshev |
在給定旁瓣高度下,Chebyshev窗的主瓣寬度最小,具有等波動性,也就是說,其所有的旁瓣都具有相等的高度。 |
|
下面是幾種窗函式歸一化DTFT幅度的MATLAB程式:
附上DTFT函式(dtft.m):
function [ X ] = dtft( x,n,w )
% Computes Discrete-time Fourier Transform
% [X] = dtft(x,n,w)
% X = DTFT values computed at w.frequencies
% x = finite duration sequence over n
% n = sample position vector
% w = frequency location vector
X = x*exp(-j*n'*w);
%
end
矩形窗:
%DTFT of a Rectangular Window, M=10,25,50,101
clc; close all;
Hf_1=figure; set(Hf_1,'NumberTitle','off','Name','P0304a');
w=linspace(-pi,pi,501); wtick=[-1:0.5:1]; magtick=[0:0.5:1.1];
% M=10
M=10; n=0:M; x=ones(1,length(n));
X=dtft(x,n,w); magX=abs(X); magX=magX/max(magX);
subplot(2,2,1); plot(w/pi,magX,'LineWidth',1.5); axis([-1 1 0 1.1]);
ylabel('|X|'); title(['M=10']);
set(gca,'XTick',wtick,'YTick',magtick);
% M=25
M=25; n=0:M; x=ones(1,length(n));
X=dtft(x,n,w); magX=abs(X); magX=magX/max(magX);
subplot(2,2,2); plot(w/pi,magX,'LineWidth',1.5); axis([-1 1 0 1.1]);
title(['M=25']); set(gca,'XTick',wtick,'YTick',magtick);
% M=50
M=50; n=0:M; x=ones(1,length(n));
X=dtft(x,n,w); magX=abs(X); magX=magX/max(magX);
subplot(2,2,3); plot(w/pi,magX,'LineWidth',1.5); axis([-1 1 0 1.1]);
xlabel('\omega/\pi'); ylabel('|X|');
title('M=50'); set(gca,'XTick',wtick,'YTick',magtick);
% M=101
M=101; n=0:M; x=ones(1,length(n));
X=dtft(x,n,w); magX=abs(X); magX=magX/max(magX);
subplot(2,2,4); plot(w/pi,magX,'LineWidth',1.5); axis([-1 1 0 1.1]);
xlabel('\omega/\pi'); ylabel('|X|');
title(['M=101']);
三角窗:
% Triangular Window:
% DTFT of a Triangular Window,M = 10,25,50,101
clc; close all;
Hf_1=figure; set(Hf_1,'NumberTitle','off','Name','P0304b');
w=linspace(-pi,pi,501); wtick=[-1:0.5:1]; magtick=[0:0.5:1.1];
% M = 10
M=10; n=0:M; x=(1-(abs(M-1-(2*n))/(M+1)));
x=dtft(x,n,w); magX=abs(X); magX=magX/max(magX);
subplot(2,2,1); plot(w/pi,magX,'LineWidth',1.5); axis([-1 1 0 1.1]);
ylabel('|X|'); title(['M = 10']);
set(gca,'XTick',wtick,'YTick',magtick);
% M = 25
M=25; n=0:M; x=(1-(abs(M-1-(2*n))/(M+1)));
X=dtft(x,n,w); magX=abs(X); magX=magX/max(magX);
subplot(2,2,2); plot(w/pi,magX,'LineWidth',1.5); axis([-1 1 0 1.1]);
title(['M = 25']); set(gca,'XTick',wtick,'YTick',magtick);
% M = 50
M=50; n=0:M; x=(1-(abs(M-1-(2*n))/(M+1)));
X=dtft(x,n,w); magX=abs(X); magX=magX/max(magX);
subplot(2,2,3); plot(w/pi,magX,'LineWidth',1.5); axis([-1 1 0 1.1]);
xlabel('\omega/\pi'); ylabel('|X|'); title(['M = 50']);
set(gca,'XTick',wtick,'YTick',magtick);
% M = 100
M=101;n=0:M; x=(1-(abs(M-1-(2*n))/(M+1)));
X=dtft(x,n,w); magX=abs(X); magX=magX/max(magX);
subplot(2,2,4); plot(w/pi,magX,'LineWidth',1.5); axis([-1 1 0 1.1]);
xlabel('\omega/\pi'); title(['M = 101']);
set(gca,'XTick',wtick,'YTick',magtick);
漢寧窗:
% Hann Window
% DTFT of a Hann Window, M = 10,25,50,101
clc;close all;
Hf_1 = figure; set(Hf_1,'NumberTitle','off','Name','P0304c');
w=linspace(-pi,pi,501); wtick=[-1:0.5:1]; magtick=[0:0.5:1.1];
% M = 10
M=10;n=0:M; x=0.5*(1-cos((2*pi*n)/(M-1)));
X=dtft(x,n,w); magX=abs(X); magX=magX/max(magX);
subplot(2,2,1); plot(w/pi,magX,'LineWidth',1.5); axis([-1 1 0 1.1]);
ylabel('|X|'); title(['M = 10']);
set(gca,'XTick',wtick,'YTick',magtick);
% M = 25
M=25;n=0:M; x=0.5*(1-cos((2*pi*n)/(M-1)));
X=dtft(x,n,w); magX=abs(X); magX=magX/max(magX);
subplot(2,2,2); plot(w/pi,magX,'LineWidth',1.5); axis([-1 1 0 1.1]);
title(['M = 25']);
set(gca,'XTick',wtick,'YTick',magtick);
% M = 50
M=50;n=0:M; x=0.5*(1-cos((2*pi*n)/(M-1)));
X=dtft(x,n,w); magX=abs(X); magX=magX/max(magX);
subplot(2,2,3); plot(w/pi,magX,'LineWidth',1.5); axis([-1 1 0 1.1]);
xlabel('\omega/\pi'); ylabel('|X|'); title(['M = 50']);
set(gca,'XTick',wtick,'YTick',magtick);
% M = 101
M=101;n=0:M; x=0.5*(1-cos((2*pi*n)/(M-1)));
X=dtft(x,n,w); magX=abs(X); magX=magX/max(magX);
subplot(2,2,4); plot(w/pi,magX,'LineWidth',1.5); axis([-1 1 0 1.1]);
xlabel('\omega/\pi'); title(['M = 101']);
set(gca,'XTick',wtick,'YTick',magtick);
漢明窗:
% Hamming Window:
clc; close all;
Hf_1=figure; set(Hf_1,'NumberTitle','off','Name','P0304d');
w=linspace(-pi,pi,501); wtick=[-1:0.5:1]; magtick=[0:0.5:1.1];
% M = 10
M=10; n=0:M; x=(0.54-0.46*cos((2*pi*n)/(M-1)));
X=dtft(x,n,w); magX=abs(X); magX=magX/max(magX);
subplot(2,2,1); plot(w/pi,magX,'LineWidth',1.5); axis([-1 1 0 1.1]);
ylabel('|X|'); title(['M = 10']);
set(gca,'XTick',wtick,'YTick',magtick);
% M = 25
M=25; n=0:M; x=(0.54-0.46*cos((2*pi*n)/(M-1)));
X=dtft(x,n,w); magX=abs(X); magX=magX/max(magX);
subplot(2,2,2); plot(w/pi,magX,'LineWidth',1.5); axis([-1 1 0 1.1]);
title(['M = 25']);
set(gca,'XTick',wtick,'YTick',magtick);
% M = 50
M=50; n=0:M; x=(0.54-0.46*cos((2*pi*n)/(M-1)));
X=dtft(x,n,w); magX=abs(X); magX=magX/max(magX);
subplot(2,2,3); plot(w/pi,magX,'LineWidth',1.5); axis([-1 1 0 1.1]);
xlabel('\omega/\pi'); ylabel('|X|'); title(['M=50']);
set(gca,'XTick',wtick,'YTick',magtick);
% M = 101
M=101; n=0:M; x=(0.54-0.46*cos((2*pi*n)/(M-1)));
X=dtft(x,n,w); magX=abs(X); magX=magX/max(magX);
subplot(2,2,4); plot(w/pi,magX,'LineWidth',1.5); axis([-1 1 0 1.1]);
xlabel('\omega/\pi');title(['M=101']);
set(gca,'XTick',wtick,'YTick',magtick);
相關文章
- javascript常見的幾種自執行函式形式JavaScript函式
- 幾個常見函式的非常見用法函式
- 用Flex實現常見的幾種佈局Flex
- 面試常見問題之實現bind函式面試函式
- Swap函式的寫法及其常見錯誤示例函式
- 常見的幾種IE6 BUG及其解決的方法
- mysql實現開窗函式MySql函式
- MATLAB中常用的幾種隨機數生成函式Matlab隨機函式
- 簡單實現幾種常見的前端效果,附程式碼!前端
- python語言幾個常見函式的使用Python函式
- 幾種常見的NO SQL DBSQL
- react常見幾種事件宣告React事件
- Vim常見模式有幾種?模式
- 最小二乘法擬合非線性函式及其Matlab/Excel 實現函式MatlabExcel
- python3實現幾種常見的排序演算法Python排序演算法
- MySql三種常見引擎及其區別MySql
- 常見函式之單行函式函式
- 常見python資料型別及其相對應的函式Python資料型別函式
- iOS常見的幾種加密方法iOS加密
- 幾種常見的CSS佈局CSS
- 常見的幾種設計模式設計模式
- C語言實現字串拷貝函式的幾種方法C語言字串函式
- 幾種函式呼叫方式函式
- hash函式的幾種函式
- 鴻蒙(HarmonyOS)常見的三種彈窗方式鴻蒙
- SparkSQL介紹並實現開窗函式SparkSQL函式
- 【綜合評價方法】常見綜合評價方法及其實現
- Oracle常見數字函式Oracle函式
- MySQL中幾種常見的日誌MySql
- 幾種常見取樣方法及原理
- redis常見的幾種使用場景Redis
- 主成分分析及其matlab實現Matlab
- 【JavaScript定時器小案例】常見的幾種定時器實現的案例JavaScript定時器
- 三種方法實現strlen函式函式
- 分散式鎖的幾種實現方式分散式
- 分散式鎖的幾種實現方式~分散式
- 分散式鎖的幾種實現思路分散式
- 開窗函式的另外一種方式函式