stem(n,sf);title('滤波后的信号'); subplot(313);
stem(n,s4);title('想要保留的信号'); 程序运行的结果为:
图10 采用filter函数进行数字滤波前后信号比较示意图 由图可以看出,滤波后的信号与想要保留的信号基本一致(相位有些许偏差,但基本一致),所以我们可以说该滤波器基本满足了以上所提出的滤波要求。
(2)FIR的直接程序设计法
例如欲设计一个线性相位数字(FIR)带通滤波器,其数字域指标为:数字通带边界频率为0.35?和0.65?,数字阻带边界频率为0.2?和0.8?,通带波动为1db,最小阻带衰减为60db。
① FIR数字滤波器的窗函数法 此题的MATLAB程序为:
ws1=0.2*pi; wp1=0.35*pi; wp2=0.65*pi; ws2=0.8*pi; as=60;
tr=min((wp1-ws1),(ws2-wp2));
M=ceil(11*pi/tr)+1;
%滤波器的阶数,程序运行后M=75 n=[0:1:M-1]; r=(M-1)/2; %r为群时延
wc1=(ws1+wp1)/2; wc2=(wp2+ws2)/2;
hd=sin(wc2*((n-r)+eps))./(pi*((n-r)+eps))-sin(wc1*((n-r)+eps))./(pi
*((n-r)+eps));
%hd为理想滤波器的脉冲响应 w_bla=(blackman(M))'; %长度为M的blackman窗 h=hd.*w_bla;
%h为滤波器的实际脉冲响应 stem(n,h);
title('滤波器的实际单位脉冲响应'); freqz(h,1,512);
title('幅度响应和相位响应');
图11 所设计的滤波器的实际单位脉冲响应
由上图可知滤波器的实际脉冲响应h是偶对称的,即
h(n)=h(M-1-n),故该滤波器满足FIR线性相位的条件,该滤波器是线性相位的FIR滤波器。
图12 所设计的带通滤波器的幅度和相位响应
由滤波器的相位特性也可以看出该滤波器是线性相位的FIR滤波器。接下来我们来看看此题所设计的滤波器的滤波效果:S为含有3个频率成分的信号(归一化频率(w/2?)分别为0.05、0.2、0.45),用所设计的滤波器滤除归一化频率为0.05和0.45的成分。
l=0:100;
s1=sin(0.1*pi*l);s2=sin(0.4*pi*l);s3=sin(pi*0.9*l); s=s1+s2+s3; sf=filter(h,1,s); subplot(311)
stem(l,s);title('滤波前的信号'); subplot(312);
stem(l,sf);title('滤波后的信号'); subplot(313);
stem(l,s2);title('想要保留的信号');
图13 采用filter函数进行数字滤波前后信号比较示意图
由上图可知滤波后的信号和想要保留的信号的幅度和频率基本一致(滤波后的信号相对于想要保的信号有一个相位延迟,这是线性相位FIR滤波器的群延迟引起的,此滤波器留的群延迟r=(M-1)/2=37),所以我们可以说该滤波器基本满足了以上所提出的滤波要求。 ② FIR数字滤波器的频率采样法 此题的MATLAB程序为:
M=40;
%取滤波器的阶数为40 al=(M-1)/2; %群时延 n=0:M-1;
T2=0.59417456; T1=0.109021;
Hrs=[zeros(1,5),T1,T2,ones(1,7),T2,T1,zeros(1,9),T1,T2,ones(1,7),T2,T1,zeros(1,4)]; %采样值的幅值
k1=0:floor((M-1)/2);k2=floor((M-1)/2)+1:M-1;
angH=[-al*(2*pi)/M*k1,al*(2*pi)/M*(M-k2)]; %采样值的相位 H=Hrs.*exp(j*angH); h=real(ifft(H,M));
%长度为M的单位脉冲响应 stem(n,h);
title('滤波器的实际单位脉冲响应'); freqz(h,1,512);
title('幅度响应和相位响应');
图14 所设计的滤波器的实际单位脉冲响应
由图14可知滤波器的实际脉冲响应h是偶对称的,即h(n)=h(M-1-n),故该滤波器满足FIR线性相位的条件,该滤波器是线性相位的FIR滤波器。