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