www.pudn.com > 精通Matlab综合辅导与指南-源程序.zip > fswindow.m


function w = fswindow(N,wt,a)
%FSWINDOW Generate Window Functions.
% FSWINDOW(N,TYPE) creates a window vector of type TYPE having
% a length equal to the scalar N.
% FSWINDOW(X,TYPE) creates a window vector of type TYPE having
% a length and orientation the same as the vector X.
% FSWINDOW(.,TYPE,alpha) provides a parameter alpha as required
% for some window types.
% FSWINDOW with no input arguments returns a string matrix whose
% i-th row is the i-th TYPE given below.
%
% TYPE is a string designating the window type desired:
% 'rec' = Rectangular or Boxcar
% 'tri' = Triangular or Bartlet
% 'han' = Hann or Hanning
% 'ham' = Hamming
% 'bla' = Blackman common coefs.
% 'blx' = Blackman exact coefs.
% 'rie' = Riemann {sin(x)/x}
% 'tuk' = Tukey,  0< alpha < 1; alpha = 0.5 is default
% 'poi' = Poisson, 0< alpha < inf; alpha = 1 is default
% 'cau' = Cauchy, 1< alpha < inf; alpha = 1 is default
% 'gau' = Gaussian, 1< alpha < inf; alpha = 1 is default
%
% Reference: F.J. Harris,"On the Use of Windows for Harmonic Analysis with the
% Discrete Fourier Transform," IEEE Proc., vol 66, no 1, Jan 1978, pp 51-83.

% D.C. Hanselman, University of Maine, Orono, ME  04469
% 1/10/95
% Copyright (c) 1996 by Prentice-Hall, Inc. 

if nargin==0
	w=['rec';'tri';'han';'ham';'bla';'blx';'rie';'tuk';'poi';'cau';'gau'];
	return
end
[r,c]=size(N);
n=max(r,c);
if n>1,N=n;end
wt=[wt(:)' '   '];
wt=wt(1:3);
if strcmp(wt,'rec')				% rectangular
	w = ones(1,N);
elseif strcmp(wt,'tri')			% triangular
	m=(N-1)/2;
	w=(0:m)/m;
	w=[w w(ceil(m):-1:1)];
elseif strcmp(wt,'han')			% hanning
	m=linspace(-pi,pi,N);
	w=0.5*(1 + cos(m));
elseif strcmp(wt,'ham')			% hamming
	m=linspace(-pi,pi,N);
	w=.54 + .46*cos(m);
elseif strcmp(wt,'bla')			% blackman
	m=linspace(-pi,pi,N);
	w=.42 +.5*cos(m) + .08*cos(2*m);
elseif strcmp(wt,'blx')			% blackman exact
	m=linspace(-pi,pi,N);
	w=(7938 + 9240*cos(m) + 1430*cos(2*m))/18608;
elseif strcmp(wt,'rie')			% riemann
	m=linspace(-pi,pi,N)+eps;
	w=sin(m)./(m);
elseif strcmp(wt,'tuk')			% tukey
	if nargin<3,a=0.5;end
	m=fix((a+1)*N/2);
	w=ones(1,N);
	if a>0&a<1
		w(m:N)=0.5*(1 + cos(pi*((m:N)-m)/(N-m)));
		w(1:N-m+1)=w(N:-1:m);
	end
elseif strcmp(wt,'poi')			% poisson
	if nargin<3,a=1;end
	m=round(N/2)-1;
	w=[(m:-1:0) (rem(N,2):m)]/m;
	w=exp(-abs(a)*w);
elseif strcmp(wt,'cau')			% cauchy
	if nargin<3,a=1;end
	m=round(N/2)-1;
	w=[(m:-1:0) (rem(N,2):m)]/m;
	w=(1+(a*w).^2).^(-1);
elseif strcmp(wt,'gau')			% gaussian
	if nargin<3,a=1;end
	m=round(N/2)-1;
	w=[(m:-1:0) (rem(N,2):m)]/m;
	w=exp(-0.5*(a*w).^2);
else
	error('Incorrect Window type requested');
end
if r>1,w=w.';end