[转载]综合实验:滤波器的设计_Devin_新浪博客

一、要求:

要对一个波形文件进行滤波,得到低、中、高频分量的波形。

已知一个波形文件x.mat包含了低、中、高频三个波形,通过设计不同的滤波器,分离出这三个不同频率的波形。并比较用不同滤波器进行滤波的效果。

二、代码流程:

1、首先自定义一些滤波器的函数,可以用IIR滤波器进行滤波,也可以用FIR滤波器进行滤波,所以可以设计两种滤波器,每种滤波器设计三个,分别为低、带、高通。于是要写6个函数。

2、要写函数,得先知道将要过滤的信号所含的波形的频率各是多少,以确定将要设计的滤波器要过滤的范围

3、将信号分别通过滤波器,之后画出波形,观察是否过滤成功。

4、下面的代码都详细的注释了,不再赘述。

三、代码:

%%%自定义函数(1-3:FIR滤波器,4-6:IIR滤波器):
%%%%%(1)低通FIR滤波器%%%%%%%%%%%%%%%%
%function [y b]=lowpass_fir_filter(x)
%wp=0.22*pi; ws=0.46*pi; %指标
%wdelta=ws-wp;   %过渡带宽度
%M=ceil(3.32*pi/wdelta); %滤波器长度
%N=2*M+1;  %窗口长度
%wc=(ws+wp)/2;  %截止频率
%win=hamming(N); %汉宁窗的时域响应
%b=fir1(N-1,wc/pi,win);     
%y=filter(b,1,x);
%%%%%%%%%(2)带通FIR滤波器%%%%%%%%%%%%%%
%function [y b]=bandpass_fir_filter(x)
%w1=0.4*pi; w2=0.7*pi;
%wn=[w1 w2];
%wdelta=w2-w1;
%M=ceil(3.32*pi/wdelta);
%N=2*M+1;
%win=hamming(N); 
%b=fir1(N-1,wn/pi,'bandpass',win);     
%y=filter(b,1,x);
%%%%%%%%%%%(3)高通FIR滤波器%%%%%%%%%%%%%%%
%function [y b]=highpass_fir_filter(x)
%wp=0.6*pi; ws=0.9*pi;
%wdelta=ws-wp; 
%M=ceil(3.32*pi/wdelta);
%N=2*M+1;
%wc=(ws+wp)/2; 
%win=hamming(N);
%b=fir1(N-1,wc/pi,'high',win);     
%y=filter(b,1,x);
%%%%%%%%%%%%%%(4)低通IIR滤波器%%%%%%%%%%%%%%
%function [y bz az]=lowpass_iir_filter(x)
%rp=1; rs=15; wp=0.25*pi;  ws=0.4*pi;%指标
%wap=tan(wp/2); was=tan(ws/2); %预畸变
%[n,wn]=buttord(wap,was,rp,rs,'s') ;%阶数
%[z,p,k]=buttap(n); %零极点
%[bp,ap]=zp2tf(z,p,k); %滤波器传输函数            
%[bs,as]=lp2lp(bp,ap,wap); %低通到低通  
%[bz,az]=bilinear(bs,as,1/2);%双线性变换
%y=filter(bz,az,x);
%%%%%%%%%%%%%(5)带通IIR滤波器%%%%%%%%%%%%%%%
%function [y bz az]=bandpass_iir_filter(x)
%rp=1; rs=15;
%wp=0.35*pi;  ws=0.65*pi;  
%wap=tan(wp/2); was=tan(ws/2);
%[n,wn]=buttord(wap,was,rp,rs,'s') ;
%[z,p,k]=buttap(n);
%[bp,ap]=zp2tf(z,p,k);             
%[bs,as]=lp2bp(bp,ap,1,0.5);%低通到带通,1为中心频率,0.5为带宽
%[bz,az]=bilinear(bs,as,1/2);
%y=filter(bz,az,x);
%%%%%%%%%%%(6)高通IIR滤波器%%%%%%%%%%%%
%function [y bz az]=highpass_iir_filter(x)
%rp=1; rs=15;
%wp=0.7*pi;  ws=0.85*pi;  
%wap=tan(wp/2); was=tan(ws/2);
%[n,wn]=buttord(wap,was,rp,rs,'s') ;
%[z,p,k]=buttap(n);
%[bp,ap]=zp2tf(z,p,k);             
%[bs,as]=lp2hp(bp,ap,wap); %低通到高通  
%[bz,az]=bilinear(bs,as,1/2);
%y=filter(bz,az,x);
n=0:99;
load('e:x.mat');
%%%一、频谱分析:
%DFT
x_dft=fft(x);%fft是DFT的快速求法,得到的是时间和频率都离散变换
%DTFT
[x_dtft w]=freqz(x);%freqz后得到时间离散,频率连续的响应,即DTFT变换
figure (1);
% x 的时域响应
subplot(2,2,1);
stem(n,x); title('x');
% x的DFT变换结果
subplot(2,2,2);stem(n,abs(x_dft));
title('dft of x'); grid on;
axis([0 50 0 150]);
% x的DTFT变换结果的频率幅度响应
subplot(2,2,3); plot(w/pi,abs(x_dtft));
title('dtft(abs) of x');grid on;
% x的DTFT变换结果的频率相位响应
subplot(2,2,4);plot(w/pi,unwrap(angle(x_dtft)));
title('dtft(angle) of x');grid on;

[转载]综合实验:滤波器的设计

%%%二、用FIR滤波器进行滤波
[y_low b_low]=lowpass_fir_filter(x);%调用FIR低通滤波器函数
[y_band b_band]=bandpass_fir_filter(x);%调用FIR带通滤波器函数
[y_high b_high]=highpass_fir_filter(x);%调用FIR高通滤波器函数
%计算滤波器的频率响应,确定滤波器是否设计成功
[hh_low ww_low]=freqz(b_low,1,512);
[hh_band ww_band]=freqz(b_band,1,512);
[hh_high ww_high]=freqz(b_high,1,512);
%计算滤波之后各信号的频率响应,与(一)中的频谱结构比较,以确定是否得到期望信号
[h_low w_low]=freqz(y_low);
[h_band w_band]=freqz(y_band);
[h_high w_high]=freqz(y_high);

figure (2);%进行画图比较验证
%低通FIR滤波器幅度响应
subplot(3,3,1); plot(ww_low/pi,20*log10(abs(hh_low)));
xlabel('Frequency(Hz)'); ylabel('(dB)');
title('Magnitude Response');grid on;
% x通过滤波器后的时域响应,为了观察清晰,取前50个样本点
subplot(3,3,2);stem(n,y_low);
title('after FIR lowpass filter'); grid on;
axis([0 50 -5 5]);
% x通过滤波器后的频域响应
subplot(3,3,3); plot(w_low/pi,abs(h_low));
title('Magnitude Response');  grid on;

%带通FIR滤波器幅度响应
subplot(3,3,4); plot(ww_band/pi,20*log10(abs(hh_band)));
xlabel('Frequency(Hz)'); ylabel('(dB)');
title('Magnitude Response');  grid on;
% x通过滤波器后的时域响应,为了观察清晰,取前50个样本点
subplot(3,3,5); stem(n,y_band);
title('after FIR bandpass filter'); grid on;
axis([0 50 -5 5]);
% x通过滤波器后的频域响应
subplot(3,3,6); plot(w_band/pi,abs(h_band));
title('Magnitude Response');  grid on;

%高通FIR滤波器幅度响应
subplot(3,3,7); plot(ww_high/pi,20*log10(abs(hh_high)));
xlabel('Frequency(Hz)'); ylabel('(dB)');
title('Magnitude Response'); grid on;
% x通过滤波器后的时域响应,为了观察清晰,取前50个样本点
subplot(3,3,8); stem(n,y_high);
title('after FIR highpass filter'); grid on;
axis([0 50 -5 5]);
% x通过滤波器后的频域响应
subplot(3,3,9); plot(w_high/pi,abs(h_high));
title('Magnitude Response');  grid on;

[转载]综合实验:滤波器的设计

%%%三、用IIR滤波器进行滤波
[y_low bz_low az_low]=lowpass_iir_filter(x);%调用IIR低通滤波器函数
[y_band bz_band az_band]=bandpass_iir_filter(x);%调用IIR带通滤波器函数
[y_high bz_high az_high]=highpass_iir_filter(x);%调用IIR高通滤波器函数
%计算滤波器的频率响应,确定滤波器是否设计成功
[hh_low ww_low]=freqz(bz_low,az_low,256,1);
[hh_band ww_band]=freqz(bz_band,az_band,256,1);
[hh_high ww_high]=freqz(bz_high,az_high,256,1);
%计算滤波之后各信号的频谱,与(一)中的频谱结构比较,以确定是否得到期望信号
[h_low w_low]=freqz(y_low);
[h_band w_band]=freqz(y_band);
[h_high w_high]=freqz(y_high);

figure (3);%进行画图比较验证
%低通IIR滤波器幅度响应
subplot(3,3,1); plot(ww_low,abs(hh_low));
xlabel('Frequency(Hz)');
title('Magnitude Response');  grid on;
% x通过滤波器后的时域响应,为了观察清晰,取前50个样本点
subplot(3,3,2);stem(n,y_low);
title('after IIR lowpass filter'); grid on;
axis([0 50 -5 5]);
% x通过滤波器后的频域响应
subplot(3,3,3); plot(w_low/pi,abs(h_low));
title('Magnitude Response'); grid on;

%带通IIR滤波器幅度响应
subplot(3,3,4); plot(ww_band,abs(hh_band));
xlabel('Frequency(Hz)');
title('Magnitude Response'); grid on;
% x通过滤波器后的时域响应,为了观察清晰,取前50个样本点
subplot(3,3,5); stem(n,y_band);
title('after IIR bandpass filter'); grid on;
axis([0 50 -5 5]);
% x通过滤波器后的频域响应
subplot(3,3,6); plot(w_band/pi,abs(h_band));
title('Magnitude Response'); grid on;

%高通IIR滤波器幅度响应
subplot(3,3,7); plot(ww_high,abs(hh_high));
xlabel('Frequency(Hz)');
title('Magnitude Response');  grid on;
% x通过滤波器后的时域响应,为了观察清晰,取前50个样本点
subplot(3,3,8); stem(n,y_high);
title('after IIR highpass filter'); grid on;
axis([0 50 -5 5]);
% x通过滤波器后的频域响应
subplot(3,3,9); plot(w_high/pi,abs(h_high));
title('Magnitude Response');  grid on;

[转载]综合实验:滤波器的设计

四、小结

     从上面的IIR和FIR的滤波效果图可以看出,IIR的过滤效果比FIR的效果要好,也就是选择性较好,FIR出现了明显的群延时现象。

    原因是:

    IIR滤波器传输函数的零点可以在单位圆的任何地方,极点可以在单位圆内任何地方,因此可以用较低的阶数获得较高的选择性,但它是以相位的非线性为代价的。也就是选择性越好,相位非线性越严重。若要达到较为严格的线性要求,就要加全通网络进行相位矫正,但这时也是增大了滤波器的阶数和复杂度。

    而FIR滤波器可以得到严格的线性相位,但它的传输函数的零极点固定在了原点,所以只能要较高的阶数达到较高的选择性于是群延时也越严重。

   一开始我设计的FIR滤波器群延时非常严重,于是我就改变了截止频率的范围,使带宽变得窄一些,因为带宽和阶数成反比,于是增大了阶数,这样可以减小一定程度的群延时,但还是不能完全避免。

   综上,不论IIR和FIR,阶数越高,信号延迟越大;同时在IIR滤波器中,阶数越高,系数的精度要求越高,否则很容易造成有限字长的误差使极点移到单位园外。因此在阶数选择上,我们应该根据实际情况进行综合考虑的,设计符合要求和实际的滤波器。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值