t=0:1/100:2; % 时间序列
x=sin(2*pi*f1*t)+0.5*cos(2*pi*f2*t); %输入信号 y=fftfilt(b,x); %对输入信号进行滤波 figure(2)
subplot(2,1,1), plot(t,x),title('输入信号') %绘制输入信号 subplot(2,1,2),plot(t,y) %绘制输出信号 hold on;plot(Order/2/100*ones(1,2),ylim, 'r') %绘制延迟到的时刻 title('输出信号'),xlabel('时间/s')
程序输出结果见图7-12和图7-13。由该例可知,只有取100阶时,实际滤波器的幅频响应才逼近理想滤波器的幅频响应。与第6章例6-12的输出比较可知,相同性能的FIR滤波器阶数比IIR滤波器要高得多。另外,该例中,信号含有两种频率成分,12Hz和36Hz,由于信号的采样频率为100Hz,因此Nyquist频率为50Hz,则归一化频率的0.2对应于10Hz,0.3对应于15Hz,因此,0.2~0.3的通带对应于10~15Hz。同理,归一化频率中的0.6~0.8的通带对应于30~40Hz。可见12Hz和36Hz的波均在通带的范围内,因此均可通过。该例的输出结果与例6-12的输出结果比较可知,FIR滤波器的相位延迟比IIR滤波器的相位延迟大得多。
图 7-12 例7-9所设计滤波器的幅频特性 上图:阶数为10;下图:阶数为100
图 7-13 例7-9所设计滤波器的输入和输出信号
7.3 最优FIR滤波器设计
MATLAB信号处理工具箱提供了比基于窗函数法FIR滤波器设计工具函数fir1和fir2更为通用的函数firls和remez。它们采用不同的优化方法设计最优的标准多频带FIR数字滤波器。
函数remez实现Park-McClellan算法,这种算法利用Remez交换算法和Chebyshev近似理论来设计滤波器,使实际频率响应拟合期望频率响应达到最优。从实际和理想频响之间最大误差最小化的观点来看,函数remez设计的滤波器是最优的,因此,又称之为最优滤波器。在频率域内,滤波器呈现等波纹特点,因此又称之为等波纹滤波器。Park-McClellan滤波器设计方法是FIR滤波器设计中最流行的,应用最广的设计方法。
函数firls和remez的调用格式语法规则相同,只是优化算法不同。
7.3.1 基本形式最优滤波器
函数基本调用格式为:
b=firls(n,f,a)
b=remez(n,f,a)
式中,n为滤波器阶数;f为滤波器期望频率特性归一化频率向量,范围为0~1,为递增向量,允许定义重复频率点;a为滤波器期望频率特性的幅值向量,向量a和f必须为同长度,且为偶数;b为返回的滤波器系数,长度为n+1,且具有偶对称的关系,即b(k)=b(n+2-k)。若滤波器的阶数为奇数,则在Nyquist频率处(对应于归一化频率1),幅频响应必须为0。滤波器的阶数为偶数则无此限制。 【例7-10】分别用firls和函数remez设计一个20阶FIR低通滤波器,通带边界频率为0.4,幅值为1,阻带边界频率为0.5,幅值为零。输入一个采样频率为50Hz,频率为5Hz和15Hz的合成振动,比较运用两种设计方法的输出的差异。
%Samp7_10
clf;n=20; %滤波器阶数 f=[0 0.4 0.5 1]; %频率向量 a=[1 1 0 0]; %振幅向量
b=firls(n,f,a); %采用firls设计滤波器 [h,w1]=freqz(b); %计算其频率响应 bb=remez(n,f,a); %采用remez设计滤波器 [hh,w2]=freqz(bb); %计算滤波器的频率响应 figure(1)
plot(w1/pi,abs(h),w2/pi,abs(hh),'r:'); %绘制滤波器的幅频响应 xlabel('归一化频率');ylabel('振幅');
legend('firls','remez'); %给出图例 grid on; figure(2)
fs=50;t=0:1/fs:2; %采样频率和时间序列 f1=5;f2=15; %输入信号频率
x1=sin(2*pi*f1*t)+8.*cos(2*pi*f2*t); subplot(2,1,1),plot(t,x1) title('原始信号') y1=filter(b,1,x1); y2=filter(bb,1,x1);
subplot(2,1,2),plot(t,y1,t,y2,'r:')
legend('firls','remez'); %给出图例 title('输出信号')
xlabel('时间/s') 图 7-14 例 7-10 所设计滤波器的幅频响应
图 7-15 例 7-10 所设计滤波器的输入和输出信号的比较
程序运行结果见图7-14和图7-15。比较两种设计方法所设计的滤波器幅频响应可见,用firls设计的滤波器在整个频率范围内(包括通带和阻带)均具有较好的响应,但理想频率响应和实际频率响应的误差在带区内不均匀,且在边界频率处误差较大;而函数remez设计的滤波器在通带内具有等波纹特性,在边界频率0.4和0.5处及过渡带内更接近于理想频响。由图7-15可见,输入5Hz和15Hz的两个频率的振动信号,5Hz的信号对应的采样频率为50Hz的归一化频率为0.2(5/(50/2)),15Hz的信号对应的归一化频率为0.6(15/(50/2)),对应于该滤波器的幅频响应,归一化频率为0.2的振动能通过滤波器,而归一化为0.6的振动不能通过该滤波器,输出结果也看到这一点,只有5Hz的振动通过了滤波器。但通过两种类型的滤波器滤波,输出结果略有不同,这是由于两种滤波器的幅频特性的略微不同造成的。运用firls函数设计幅频响应在归一化为0.2的频率处略小于remez函数的设计,因此运用firls函数设计滤波器的输出的归一化频率为0.2的振幅也略小于remez函数设计的输出。运用firls函数设计幅频响应在归一化为0.6的频率处比remez函数设计的振幅响应衰减更大,因此运用firls函数设计滤波器的输出更为平滑,即高频成分更小,而remez函数设计的滤波器的输出具有较多的高频成分,使得输出结果不对称。这完全可以根据滤波器的幅频响应分析出来。
函数firls和remez可用于设计低通,高通,带通和带阻等一般类型的滤波器,这可由函数中给定的理想幅频响应的频率向量f和幅值向量确定。
如设计一个带通滤波器,幅频响应定义为:
f=[0 0.3 0.4 0.7 0.8 1], a=[0 0 1 1 0 0];
则,该理想滤波器幅频响应定义为:阻带频率0~0.3,0.8~1,通带频率0.4~0.7,过渡带:0.3~0.4,0.7~0.8。
设计一个高通滤波器,如理想幅频响应向量对的给定形式为: f=[0 0.7 0.8 1],a=[0 0 1 1],则,该理想滤波器的幅频响应定义为:阻带频率0~0.7,通带频率:0.8~1.0,过渡带 0.7~0.8。
设计一个带阻滤波器,如理想幅频响应向量对的给定形式为:f=[0 0.3 0.4 0.5 0.6 1],a=[1 1 0 0 1 1],则,该阻带频率:0.4~0.5,通带频率:0~0.3,0.6~1.0,过渡带:0.3~0.4,0.5~0.6
此外,函数firls和remez还可以设计多带滤波器,下面给出一个例子。 【例7-11】用函数firls和remez设计一个50阶多通带滤波器,滤波器理想频率响应对为:f=[0 0.1 0.15 0.25 0.3 0.4 0.45 0.55 0.6 0.7 0.75 0.85 0.9 1],a=[1 1 0 0 1 1 0 0 1 1 0 0 1 1];将设计的滤波器的幅频响应和理想滤波器幅频响应进行比较,绘制remez函数设计滤波器的脉冲响应。
%Samp7_11
clf;n=50; % 滤波器的阶数
f=[0 0.1 0.15 0.25 0.3 0.4 0.45 0.55 0.6 0.7 0.75 0.85 0.9 1];% 频率向量
a=[1 1 0 0 1 1 0 0 1 1 0 0 1 1]; %振幅向量
b=firls(n, f,a); % 采用 firls 设计滤波器
[h,w1]=freqz(b); % 计算滤波器的频率响应 bb=remez(n, f,a); %采用 remez 设计滤波器 [hh,w2]=freqz(bb); %计算滤波器的频率响应 figure(1)
plot (w1/pi,abs(h),'b.',w2/pi, abs(hh),'r:',f,a,'m');%绘滤波器幅频响应 xlabel('归一化频率');ylabel('振幅');
legend('firls','remez','理想特性'); %给出图例 figure(2)
impz(bb,1),title ('脉冲响应') %给出滤波器的脉冲响应 xlabel('样本数');ylabel('幅度')
程序的输出结果为图7-16和图7-17。可见,firls所设计的滤波器的通带和阻带具有较小波纹,但在整个频带内不一致。而remez函数设计的滤波器具有较大的通带和阻带波纹,但在整个频带内较为一致。图7-17给出了remez函数设计滤波器的脉冲响应,且具有偶对称的关系,即b(k)=b(n+2-k)。大家还可以观看firls函数设计滤波器的脉冲响应是否具有偶对称的关系。
图 7-16例 7-11所设计滤波器的幅频响应与理想滤波器幅频响应的比较
图 7-17 例7-11所设计滤波器的脉冲响应
函数firls和remez还能设计具有任意线性过渡带连接阻带和通带,使过渡带具有更广阔平滑的过渡区间。如理想幅频响应按如下频响对给出:f=[0 0.4 0.42 0.48 0.5 1], a=[1 1 0.8 0.2 0 0]; 这里,过渡带0.4~0.5给出多个响应值设计出的具有线性过渡带FIR滤波器的频率响应。大家可在课下练习。
7.3.2 加权最优滤波器
函数firls和remez还可以增加输入参数设置权向量w。在不同频段设置不同权值,使不同频段的误差值最小化得到不同程度的重视。具有权向量输入的函数firls和remez实现滤波器每个频率段加权处理。其调用格式为:
b=firls(n,f,a,w) b=remez(n,f,a,w)
式中,w为权向量,为f和a向量长度的一半,一个频带必须对应一个权值。
【例7-12】设计一个30阶的低通等波纹滤波器,通带边界频率0.4,阻带边界频率0.5,均为归一化频率,阻带波纹约为通带波纹的1/10。
%Samp7_12
clf;n=30; %滤波器的阶数 f=[0 0.4 0.5 1]; a=[1 1 0 0];
相关推荐: