[Matlab]FIR滤波器设计:(线性相位FIR滤波器的特性)
FIR滤波器能够在保证幅度特性满足技术要求的同时,容易实现严格的线性相位特性,且FIR滤波器的单位抽样响应是有限长的,因而滤波器一定是稳定的,而且可以用快速傅里叶变换算法实现,大大提高了运算速率。
同时只要经过一定的延时,任何非因果有限长序列都能变成因果的有限长序列,所以系统总能用因果系统来实现。但是FIR滤波器必须用很长的冲击响应滤波器才能很好的逼近瑞截至的滤波器,需要很大的运算量:而且要取得很好的衰减特性,需要较高的阶次。
线性相位FIR滤波器相位条件:
-
FIR滤波器具有第一类线性相位的充分必要条件如下:
单位抽样响应 h ( n ) h(n) h(n)关于群延时 τ偶称对,即满足:
h ( n ) = h ( N − 1 − n ) ( 0 < = n < = N − 1 ) h(n) = h(N-1-n) (0<=n<=N-1) h(n)=h(N−1−n)(0<=n<=N−1)
τ = ( N − 1 ) / 2 τ = (N-1)/2 τ=(N−1)/2
满足偶对称条件的FIR滤波器分别为I型线性相位滤波器和II型线性相位滤波器。
-
FIR滤波器具有第二类线性相位的充分必要条件如下:
单位抽样响应 h ( n ) h(n) h(n)关于群延时 τ偶对称,即满足:
h ( n ) = h ( N − 1 − n ) ( 0 < = n < = N − 1 ) h(n) = h(N-1-n) (0<=n<=N-1) h(n)=h(N−1−n)(0<=n<=N−1)
β = ± ( π / 2 ) β= ±(π/2) β=±(π/2)
τ = ( N − 1 ) / 2 τ = (N-1)/2 τ=(N−1)/2
把满足奇对称条件的FIR滤波器分别为III型线性相位滤波器和IV型线性相位滤波器。
线性相位滤波器的分类:
-
I型线性相位滤波器
I型线性相位滤波器幅度函数和相位函数的特点:
- 幅度函数对 τ = ( N − 1 ) / 2 τ = (N-1)/2 τ=(N−1)/2偶对称,同时对 w = 0 , π , 2 π w= 0,π,2π w=0,π,2π也呈现出偶对称。
- 相位函数为准确的线性相位。
-
II型线性相位滤波器
II型线性相位滤波器幅度函数和相位函数的特点:
- 当 w = π w= π w=π时, H ( π ) = 0 H(π)=0 H(π)=0,也就是说 H ( z ) H(z) H(z)在 z = − 1 z=-1 z=−1处有必然一个零点。
- H ( w ) H(w) H(w)对 w = π w=π w=π呈现奇对称,对 w = 0 , 2 π w= 0,2π w=0,2π成偶对称。
- 相位函数的特点同I型线性相位滤波器
-
III型线性相位滤波器
III型线性相位滤波器幅度函数和相位函数的特点:
- 当 w = 0 , π , 2 π w= 0,π,2π w=0,π,2π时, H ( π ) = 0 H(π)=0 H(π)=0,也就是说 H ( z ) H(z) H(z)在 z = ± 1 z=±1 z=±1处有必然一个零点。
- H ( w ) H(w) H(w)对 w = 0 , π , 2 π w= 0,π,2π w=0,π,2π呈现奇对称。
- 相位函数的特点:既是准确的线性相位,有包括 π / 2 π/2 π/2的相移,所以又称为 π / 2 π/2 π/2移相器或者称正交变换网络。
-
IV型线性相位滤波器
IV型线性相位滤波器幅度函数和相位函数的特点:
- 当 w = 0 , π w= 0,π w=0,π时, H ( π ) = 0 H(π)=0 H(π)=0,也就是说 H ( z ) H(z) H(z)在 z = ± 1 z=±1 z=±1处有必然一个零点。
- H ( w ) H(w) H(w)对 w = π w=π w=π呈现偶对称,对 w = 0 , 2 π w= 0,2π w=0,2π成奇对称。
- 相位函数的特点:既是准确的线性相位,有包括 π / 2 π/2 π/2的相移,所以又称为 π / 2 π/2 π/2移相器或者称正交变换网络。
- 相位函数的特点同III型线性相位滤波器
I型线性相位滤波器设计:
上述滤波器可以通过下面的matlab程序设计实现:
function [Hr,w,a,L]=hr_type1(h);
%计算所设计的1型滤波器的振幅响应
%Hr=振幅响应
%a=1型滤波器的系数
%L=Hr的阶次
%h=1型滤波器的单位冲击响应
M=length(h);
L=(M-1)/2;
a=[h(L+1) 2*h(L:-1:1)];
n=[0:1:L];
w=[0:1:500]'*2*pi/500;
Hr=cos(w*n)*a';
设计I型线性相位滤波器:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%I型线性相位滤波器设计:
clear;
close all;
clc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
h=[-4 3 -5 -2 5 7 5 -2 -1 8 -3]
M=length(h);
n=0:M-1;
[Hr,w,a,L]=hr_type1(h);
subplot(2,2,1);
stem(n,h);
xlabel('n');
ylabel('h(n)');
title('脉冲响应')
grid on
subplot(2,2,3);
stem(0:L,a);
xlabel('n');
ylabel('a(n)');
title('a(n)系数')
grid on
subplot(2,2,2);
plot(w/pi,Hr);
xlabel('频率单位pi');ylabel('Hr');
title('I型幅度响应')
grid on
subplot(2,2,4);
pzplotz(h,1);
grid on
%在z平面上画出零极点分布图生产m文件存放当前文件夹
function pzplotz(b,a)
%pzplotz(b,a)按给定系数向量b,a在z平面上画出零极点分布图
% b - 分子多项式系数向量
% a - 分母多项式系数向量
% a,b向量可从z的最高幂降幂排至z^0,也可由z^0开始,按z^-1的升幂排至z的最负幂.
N = length(a);
M = length(b);
pz = []; zz = [];
if (N > M)
zz = zeros((N-M),1);
elseif (M > N)
pz = zeros((M-N),1);
end
pz = [pz;roots(a)];
zz = [zz;roots(b)];
pzr = real(pz)';
pzi = imag(pz)';
zzr = real(zz)';
zzi = imag(zz)';
rzmin = min([pzr,zzr,-1])-0.5;
rzmax = max([pzr,zzr,1])+0.5;
izmin = min([pzi,zzi,-1])-0.5;
izmax = max([pzi,zzi,1])+0.5;
zmin = min([rzmin,izmin]);
zmax = max([rzmax,izmax]);
zmm=max(abs([zmin,zmax]));
uc=exp(j*2*pi*[0:1:500]/500);
plot(real(uc),imag(uc),'b',[-zmm,zmm],[0,0],'b',[0,0],[-zmm,zmm],'b');
axis([-zmm,zmm,-zmm,zmm]);
axis('square');
hold on
plot(zzr,zzi,'bo',pzr,pzi,'rx');
hold on
text(zmm*1.1,zmm*0.95,'z-平面')
xlabel('实轴');ylabel('虚轴');title('零极点图')
II型线性相位滤波器设计:
上述滤波器可以通过下面的matlab程序设计实现:
function [Hr,w,b,L]=hr_type2(h)
%计算所设计的2型滤波器的振幅响应
%Hr=振幅响应
%b=2型滤波器的系数
%L=Hr的阶次
%h=2型滤波器的单位冲击响应
M=length(h);
L=M/2;
b= 2*h(L:-1:1);
n=[1:1:L];
n=n-0.5;
w=[0:1:500]'*2*pi/500;
Hr=cos(w*n)*b';
设计II型线性相位滤波器:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%2型线性相位滤波器设计:
clear;
close all;
clc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
h=[-3 2 -1 -2 5 6 5 -2 -1 1 -3]
M=length(h);
n=0:M-1;
[Hr,w,b,L]=hr_type2(h);
subplot(2,2,1);
stem(n,h);
xlabel('n');
ylabel('h(n)');
title('脉冲响应')
grid on
subplot(2,2,3);
stem(1:L,b);
xlabel('n');
ylabel('a(n)');
title('a(n)系数')
grid on
subplot(2,2,2);
plot(w/pi,Hr);
xlabel('频率单位pi');ylabel('Hr');
title('II型幅度响应')
grid on
subplot(2,2,4);
pzplotz(h,1);
grid on
III型线性相位滤波器设计:
上述滤波器可以通过下面的matlab程序设计实现:
function [Hr,w,c,L]=hr_type3(h);
%计算所设计的3型滤波器的振幅响应
%Hr=振幅响应
%b=3型滤波器的系数
%L=Hr的阶次
%h=3型滤波器的单位冲击响应
M=length(h);
L=(M-1)/2;
c= [2*h(L+1:-1:1)];
n=[0:1:L];
w=[0:1:500]'*2*pi/500;
Hr=sin(w*n)*c';
设计III型线性相位滤波器:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%3型线性相位滤波器设计:
clear;
close all;
clc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
h=[-3 1 -1 -2 5 6 5 -2 -1 1 -3]
M=length(h);
n=0:M-1;
[Hr,w,c,L]=hr_type3(h);
subplot(2,2,1);
stem(n,h);
xlabel('n');
ylabel('h(n)');
title('脉冲响应')
grid on
subplot(2,2,3);
stem(0:L,c);
xlabel('n');
ylabel('c(n)');
title('c(n)系数')
grid on
subplot(2,2,2);
plot(w/pi,Hr);
xlabel('频率单位pi');ylabel('Hr');
title('Ⅲ 型幅度响应')
grid on
subplot(2,2,4);
pzplotz(h,1);
grid on
IV型线性相位滤波器设计:
上述滤波器可以通过下面的matlab程序设计实现:
function [Hr,w,d,L]=hr_type4(h);
%计算所设计的4型滤波器的振幅响应
%Hr=振幅响应
%b=4型滤波器的系数
%L=Hr的阶次
%h=4型滤波器的单位冲击响应
M=length(h);
L=M/2;
d= 2*[h(L:-1:1)];
n=[1:1:L];
n=n-0.5;
w=[0:1:500]'*2*pi/500;
Hr=sin(w*n)*d';
设计IV型线性相位滤波器:
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%4型线性相位滤波器设计:
clear;
close all;
clc;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
h=[-3 1 -1 -2 5 6 5 -2 -1 1 -3]
M=length(h);
n=0:M-1;
[Hr,w,d,L]=hr_type4(h);
subplot(2,2,1);
stem(n,h);
xlabel('n');
ylabel('h(n)');
title('脉冲响应')
grid on
subplot(2,2,3);
stem(1:L,d);
xlabel('n');
ylabel('d(n)');
title('d(n)系数')
grid on
subplot(2,2,2);
plot(w/pi,Hr);
xlabel('频率单位pi');ylabel('Hr');
title('Ⅳ型幅度响应')
grid on
subplot(2,2,4);
pzplotz(h,1);
grid on
线性相位滤波器的零点特性:
线性相位滤波器的零点有以下四种结构:
- 零点既不在实轴,也不在单位圆,四组零点是两种互为倒数的共轭对。
- 零点在单位圆,但不在实轴,零点的共轭值就是其倒数。
- 零点在实轴,但不在单位圆,此时零点是实数,它没有负共轭部分,只有倒数,倒数也在实轴上。
- 零点既在实轴,也在单位圆,此时零点就有两种情况,即 z = 1 , z = − 1 z=1,z=-1 z=1,z=−1,这时零点即是自己的负共轭,又是自己的倒数。