[num,den]=lp2hp(b13,a13,wn13); [num13,den13]=bilinear(num,den,0.5); [h,w]=freqz(num13,den13); figure;
plot(w*21000*0.5/pi,abs(h));
legend(‘IIR高通滤波器’,’Location’,’NorthWest’); axis([0 11000 0 1.5]); grid;
程序结果如下图:
%======================IIR带通滤波器========================== Fp1=1200; Fp2=3000; Fs1=1000; Fs2=3200; Ft=8000;
wp1=tan(pi*Fp1/Ft); wp2=tan(pi*Fp2/Ft); ws1=tan(pi*Fs1/Ft); ws2=tan(pi*Fs2/Ft); w=wp1*wp2/ws2;
bw=wp2-wp1; %有效通带频率 wp=1;
ws=(wp1*wp2-w.^2)/(bw*w); [n12,wn12]=buttord(wp,ws,1,50,’s’); [b12,a12]=butter(n12,wn12,’s’);
[num2,den2]=lp2bp(b12,a12,sqrt(wp1*wp2),bw); [num12,den12]=bilinear(num2,den2,0.5); [h,w]=freqz(num12,den12); figure;
plot(w*8000*0.5/pi,abs(h)); axis([0 4500 0 1.5]);
legend(‘IIR带通滤波器’,’Location’,’NorthWest’); grid;
程序结果如下图:
附录(II)比较滤波前后语音信号的波形及频谱
% ======================双线性变换法======================= %*************************低通滤波器************************ [y,fs,nbits]=wavread (‘OriSound’); %IIR低通 n = length (y) ; %求出语音信号的长度 Noise=0.2*randn(n,2); %随机函数产生噪声 s=y+Noise; %语音信号加入噪声 S=fft(s); Ft=8000; Fp=1000; Fs=1200; wp=2*pi*Fp/Ft; ws=2*pi*Fs/Ft;
[n11,wn11]=buttord(wp,ws,1,50,’s’);%求低通滤波器的阶数和截止频率
[b11,a11]=butter(n11,wn11,’s’); %求S域的频率响应的参数
[num11,den11]=bilinear(b11,a11,0.5); %利用双线性变换实现频率响应S域到Z域的变换
z11=filter(num11,den11,s); sound(z11);
m11=fft(z11); %求滤波后的信号 figure; subplot(2,2,1); plot(abs(S),’g’);
title(‘滤波前信号的频谱’,’fontweight’,’bold’); axis([ 0 150000 0 4000]); grid; subplot(2,2,2); plot(abs(m11),’r’);
title(‘滤波后信号的频谱’,’fontweight’,’bold’); axis([ 0 150000 0 4000]); grid; subplot(2,2,3); plot(s);
title(‘滤波前信号的波形’,’fontweight’,’bold’); axis([95000 100000 -1 1]); grid; subplot(2,2,4); plot(z11);
title(‘滤波后的信号波形’,’fontweight’,’bold’); axis([95000 100000 -1 1]); grid;
程序结果如下图:
附II-1 双线性低通滤波器比较
%**********************高通滤波器***************************** [y,fs,nbits]=wavread (‘OriSound’); %IIR高通 n = length (y) ; %求出语音信号的长度 Noise=0.2*randn(n,2); %随机函数产生噪声 s=y+Noise; %语音信号加入噪声 S=fft(s); %傅里叶变换 Fp1=1200; Fs1=1000; Ft=8000;
wp1=tan(pi*Fp1/Ft); ws1=tan(pi*Fs1/Ft); wp=1;
ws=wp1*wp/ws1;