www.gusucode.com > FIR滤波器设计源码程序 > FIR滤波器设计源码程序/FIRDF_design.m

    %【设计分析】首先利用remezord 函数估算滤波器
%的可能阶数n ,然后利用remez 函数来实现该滤波
%器。最后判断所得的滤波器指标是否满足阻带衰减
%的要求。若是,则获解;若否,则需提高滤波器的阶
%数n 直到其技术指标满足设计要求为止。
%程序源代码如下:

clear; 
clc;

%function FIRDF_design

Wp = 0.4*pi; %input ('请输入通带截止频率:') ;
Ws = 0.6*pi; %input ('请输入阻带截止频率:') ;
delta1 = 0.01; %input ('请输入通带容许偏差:') ;
delta2 = 0.001; %input ('请输入阻带容许偏差:') ;

Ap = 20 * log10 (2/ (1 - delta1) - 1)
%设计要求的通带最大衰减(db)
As = - 20 * log10 (delta2/ (delta1 + 1) )
%设计要求的阻带最小衰减(db)
delta_w = 2 * pi/ 1000 ;
Wsi =Ws/delta_w + 1; Wpi =Wp/delta_w;
f = [Wp/pi ,Ws/pi ]; m = [ 1 ,0 ]; dev = [ delta1 ,delta2 ] ;
[ n ,fo ,ao ,weights ] = remezord (f ,m ,dev) 
h = remez(n ,fo ,ao ,weights) ;
[ H ,w] =freqz (h ,1 ,1000,'whole') ;

H = (H(1 :1 :501) )'; w = (w(1 :1 :501) )'; mag = abs (H) ;
db = 20 * log10 ( (mag + eps) / max(mag) ) ;
Asd = - max(db (Wsi :1 :501) )
while Asd < As   %判断阻带衰减指标是否满足设计要求,以完成对n 的调整。
    n = n + 1 ;
    h = remez (n ,fo ,ao ,weights) ;
    [ H ,w] =freqz (h ,1 ,1000,'whole') ;
    H = ( H(1 :1 :501) )'; w = ( w(1 :1 :501) )'; mag = abs (H) ;
    db = 20 * log10 ( (mag + eps) / max(mag) ) ;
    Asd = - max(db (Wsi :1 :501) ) ;
end

M = n;
h = remez (M,fo ,ao ,weights) ;
[ H ,w] =freqz (h ,1 ,1000,'whole') ;
H = (H(1 :1 :501) )'; w = (w(1 :1 :501) )'; mag = abs (H) ;
db = 20 * log10 ( (mag + eps) / max(mag) ) ;
Apd = - (min (db (1 :1 :Wp/ delta_w + 1) ) )
%实际得到的最大通带衰减
Asd = - round(max(db (Wsi :1 :501) ) )
%实际得到的最小阻带衰减

figure ; %画图
subplot (2, 1, 1) ;
stem( 0:1:M , h) ;
title( '实际的脉冲响应', 'fontsize', 8)
axis ( [0, M, -0.1, 0.5 ]) ;
xlabel ('n','fontsize',8);  
ylabel ('h(n) ','fontsize',8)
set( gca, 'XTickMode', 'manual', 'XTick', [ 0 M])
set( gca, 'YTickMode', 'manual', 'YTick', ( -0.1:0.1:0.5 )) 

subplot (2 ,1 ,2) ; 
plot (w/pi ,db)
title ('以分贝形式表示的幅度响应','fontsize',8) ;
axis ( [0 ,1 , -100 ,10 ]) ;
Xlabel( 'frequency( * pi) ', 'fontsize',8) ;
Ylabel( 'db', 'fontsize',8) ;
set (gca ,'XTickMode','manual','XTick', [ 0 ,0.4 ,0.6 ,1 ])
set (gca ,'YTickMode','manual','YTick', [ -60 0 ])
set (gca ,'YTickLabelMode','manual','YTickLabel',{'60', '0'}) 
grid