几种常见窗函数及其MATLAB程序实现.docx
《几种常见窗函数及其MATLAB程序实现.docx》由会员分享,可在线阅读,更多相关《几种常见窗函数及其MATLAB程序实现.docx(11页珍藏版)》请在冰豆网上搜索。
几种常见窗函数及其MATLAB程序实现
几种常见窗函数及其MATLAB程序实现
2013-12-1613:
58 2296人阅读 评论(0) 收藏 举报
分类:
Matlab(15)
数字信号处理中通常是取其有限的时间片段进行分析,而不是对无限长的信号进行测量和运算。
具体做法是从信号中截取一个时间片段,然后对信号进行傅里叶变换、相关分析等数学处理。
信号的截断产生了能量泄漏,而用FFT算法计算频谱又产生了栅栏效应,从原理上讲这两种误差都是不能消除的。
在FFT分析中为了减少或消除频谱能量泄漏及栅栏效应,可采用不同的截取函数对信号进行截短,截短函数称为窗函数,简称为窗。
泄漏与窗函数频谱的两侧旁瓣有关,对于窗函数的选用总的原则是,要从保持最大信息和消除旁瓣的综合效果出发来考虑问题,尽可能使窗函数频谱中的主瓣宽度应尽量窄,以获得较陡的过渡带;旁瓣衰减应尽量大,以提高阻带的衰减,但通常都不能同时满足这两个要求。
频谱中的如果两侧瓣的高度趋于零,而使能量相对集中在主瓣,就可以较为接近于真实的频谱。
不同的窗函数对信号频谱的影响是不一样的,这主要是因为不同的窗函数,产生泄漏的大小不一样,频率分辨能力也不一样。
信号的加窗处理,重要的问题是在于根据信号的性质和研究目的来选用窗函数。
图1是几种常用的窗函数的时域和频域波形,其中矩形窗主瓣窄,旁瓣大,频率识别精度最高,幅值识别精度最低,如果仅要求精确读出主瓣频率,而不考虑幅值精度,则可选用矩形窗,例如测量物体的自振频率等;布莱克曼窗主瓣宽,旁瓣小,频率识别精度最低,但幅值识别精度最高;如果分析窄带信号,且有较强的干扰噪声,则应选用旁瓣幅度小的窗函数,如汉宁窗、三角窗等;对于随时间按指数衰减的函数,可采用指数窗来提高信噪比。
表1是几种常用的窗函数的比较。
如果被测信号是随机或者未知的,或者是一般使用者对窗函数不大了解,要求也不是特别高时,可以选择汉宁窗,因为它的泄漏、波动都较小,并且选择性也较高。
但在用于校准时选用平顶窗较好,因为它的通带波动非常小,幅度误差也较小。
表1 几种常用的窗函数的比较
名称
特点
应用
矩形窗
Rectangle
矩形窗使用最多,习惯上不加窗就是使信号通过了矩形窗。
这种窗的优点是主瓣比较集中,缺点是旁瓣较高,并有负旁瓣,导致变换中带进了高频干扰和泄漏,甚至出现负谱现象。
频率识别精度最高,幅值识别精度最低,所以矩形窗不是一个理想的窗。
如果仅要求精确读出主瓣频率,而不考虑幅值精度,则可选用矩形窗,例如测量物体的自振频率等,也可以用在阶次分析中。
汉宁窗
Hanning
又称升余弦窗。
主瓣加宽并降低,旁瓣则显著减小,从减小泄漏观点出发,汉宁窗优于矩形窗.但汉宁窗主瓣加宽,相当于分析带宽加宽,频率分辨力下降。
它与矩形窗相比,泄漏、波动都减小了,并且选择性也提高。
是很有用的窗函数。
如果测试信号有多个频率分量,频谱表现的十分复杂,且测试的目的更多关注频率点而非能量的大小,需要选择汉宁窗。
如果被测信号是随机或者未知的,选择汉宁窗。
海明窗
(汉明窗)
Hamming
与汉宁窗都是余弦窗,又称改进的升余弦窗,只是加权系数不同,使旁瓣达到更小。
但其旁瓣衰减速度比汉宁窗衰减速度慢。
与汉明窗类似,也是很有用的窗函数。
平顶窗
FlapTop
平顶窗在频域时的表现就象它的名称一样有非常小的通带波动。
由于在幅度上有较小的误差,所以这个窗可以用在校准上。
凯塞窗
Kaiser
定义了一组可调的由零阶贝塞尔Bessel函数构成的窗函数,通过调整参数β可以在主瓣宽度和旁瓣衰减之间自由选择它们的比重。
对于某一长度的Kaiser窗,给定β,则旁瓣高度也就固定了。
布莱克曼窗
Blackman
二阶升余弦窗,主瓣宽,旁瓣比较低,但等效噪声带宽比汉宁窗要大一点,波动却小一点。
频率识别精度最低,但幅值识别精度最高,有更好的选择性。
常用来检测两个频率相近幅度不同的信号。
高斯窗
Gaussian
是一种指数窗。
主瓣较宽,故而频率分辨力低;无负的旁瓣,第一旁瓣衰减达一55dB。
常被用来截短一些非周期信号,如指数衰减信号等。
对于随时间按指数衰减的函数,可采用指数窗来提高信噪比。
三角窗
(费杰窗)
Fejer
是幂窗的一次方形式。
与矩形窗比较,主瓣宽约等于矩形窗的两倍,但旁瓣小,而且无负旁瓣。
如果分析窄带信号,且有较强的干扰噪声,则应选用旁瓣幅度小的窗函数,如汉宁窗、三角窗等;
切比雪夫窗(Chebyshev)
在给定旁瓣高度下,Chebyshev窗的主瓣宽度最小,具有等波动性,也就是说,其所有的旁瓣都具有相等的高度。
下面是几种窗函数归一化DTFT幅度的MATLAB程序:
附上DTFT函数(dtft.m):
function[X]=dtft(x,n,w)
% ComputesDiscrete-timeFourierTransform
% [X]=dtft(x,n,w)
% X=DTFTvaluescomputedatw.frequencies
% x=finitedurationsequenceovern
% n=samplepositionvector
% w=frequencylocationvector
X=x*exp(-j*n'*w);
%
end
矩形窗:
%DTFTofaRectangularWindow,M=10,25,50,101
clc;closeall;
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([-1101.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([-1101.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([-1101.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([-1101.1]);
xlabel('\omega/\pi');ylabel('|X|');
title(['M=101']);
三角窗:
%TriangularWindow:
%DTFTofaTriangularWindow,M=10,25,50,101
clc;closeall;
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([-1101.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([-1101.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([-1101.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([-1101.1]);
xlabel('\omega/\pi');title(['M=101']);
set(gca,'XTick',wtick,'YTick',magtick);
海宁窗:
%HannWindow
%DTFTofaHannWindow,M=10,25,50,101
clc;closeall;
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([-1101.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([-1101.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([-1101.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([-1101.1]);
xlabel('\omega/\pi');title(['M=101']);
set(gca,'XTick',wtick,'YTick',magtick);
哈明窗:
%HammingWindow:
clc;closeall;
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([-1101.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([-1101.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([-1101.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([-1101.1]);
xlabel('\omega/\pi');title(['M=101']);
set(gca,'XTick',wtick,'YTick',magtick);