%my firwindow
function [b]=firwindow(f_pass,f_stop,fs,A_stop)
TW=(f_stop-f_pass);%过渡带宽度
f1=f_pass+TW/2;%第一步计算出f1
w=2*pi*f1/fs;%第二步计算Ω,带入h1[n]中
range=[0,21,44,55,64,75,81,100];
label={'Rectangular','Hanning','Hamming','Kaiser1','Blackman','Kaiser2','Kaiser3','Kaiser3'};
f_choice=label{find(A_stop>range,1,'last')};%根据输入A_stop选择使用哪个窗口函数
switch f_choice
case 'Rectangular' %以矩形窗函数为例
N=round(0.91*fs/TW);%取最近的整数 ceil(x):向上取整
if mod(N,2)==0 %偶数+1
N=N+1;
end
b=zeros(1,N);
n=-round((N-1)/2):1:round((N-1)/2);%确定n区间|n|<=(N-1)/2
for i=1:N%在循环过程中相当于完成非因果响应向右移动
h1=sin(n(i)*w)/(n(i)*pi);%h1取值区间仍为|n|<=(N-1)/2
w1=1;
b(i)=h1.*w1;%b取值区间仍为|n|<=(N-1)/2
if n(i)==0 %此时h1分母为0,matlab无法计算,实则有值。
b(i)=w/pi.*w1;%得到h[n],即x[n]的系数。
end
end
case 'Hanning'
N=round(3.32*fs/TW);
if mod(N,2)==0 %偶数+1
N=N+1;
end
b=zeros(1,N);
n=-round((N-1)/2):1:round((N-1)/2);
for i=1:N
h1=sin(n(i)*w)/(n(i)*pi);
w1=0.5+0.5*cos(2*pi*n(i)/(N-1));
b(i)=h1.*w1;
if n(i)==0
b(i)=w/pi.*w1;
end
end
case 'Hamming'
N=round(3.44*fs/TW);
if mod(N,2)==0 %偶数+1
N=N+1;
end
b=zeros(1,N);
n=-round((N-1)/2):1:round((N-1)/2);
for i=1:N
h1=sin(n(i)*w)/(n(i)*pi);
w1=0.5+0.46*cos(2*pi*n(i)/(N-1));
b(i)=h1.*w1;
if n(i)==0
b(i)=w/pi.*w1;
end
end
case 'Kaiser1'
N=round(4.33*fs/TW);
if mod(N,2)==0 %偶数+1
N=N+1;
end
B=6;
b=zeros(1,N);
n=-round((N-1)/2):1:round((N-1)/2);
for i=1:N
h1=sin(n(i)*w)/(n(i)*pi);
sq=sqrt(1-(2*n(i)/(N-1)).*(2*n(i)/(N-1)));
w1=besselj(0,B*sq)/besselj(0,B);
b(i)=h1.*w1;
if n(i)==0
b(i)=w/pi.*w1;
end
end
case 'Blackman'
N=round(5.98*fs/TW);
if mod(N,2)==0 %偶数+1
N=N+1;
end
b=zeros(1,N);
n=-round((N-1)/2):1:round((N-1)/2);
for i=1:N
h1=sin(n(i)*w)/(n(i)*pi);
w1=0.42+0.5*cos(2*pi*n(i)/(N-1))+0.08*cos(4*pi*n(i)/(N-1));
b(i)=h1.*w1;
if n(i)==0
b(i)=w/pi.*w1;
end
end
case 'Kaiser2'
N=round(5.25*fs/TW);
if mod(N,2)==0 %偶数+1
N=N+1;
end
B=8;
b=zeros(1,N);
n=-round((N-1)/2):1:round((N-1)/2);
for i=1:N
h1=sin(n(i)*w)/(n(i)*pi);
sq=sqrt(1-(2*n(i)/(N-1)).*(2*n(i)/(N-1)));
w1=besselj(0,B*sq)/besselj(0,B);
b(i)=h1.*w1;
if n(i)==0
b(i)=w/pi.*w1;
end
end
case 'Kaiser3'
N=round(6.36*fs/TW);
if mod(N,2)==0 %偶数+1
N=N+1;
end
B=10;
b=zeros(1,N);
n=-round((N-1)/2):1:round((N-1)/2);
for i=1:N
h1=sin(n(i)*w)/(n(i)*pi);
sq=sqrt(1-(2*n(i)/(N-1)).*(2*n(i)/(N-1)));
w1=besselj(0,B*sq)/besselj(0,B);
b(i)=h1.*w1;
if n(i)==0
b(i)=w/pi.*w1;
end
end
end
end
评论0