matlab 双线性法预畸变,双线性变换法1 - 光子的日志 - 网易博客

冲击响应不变法是使数字滤波器在时域上模仿模拟滤波器的冲击响应,但是它的缺点是产生频响的混叠失真,这是因为从s平面到z平面不是一一映射关系。为了克服这个缺点,可以采用双线性变换法。既然冲击响应不变法是将一条横带变换到整个z平面上去,可以将s平面压缩变换到某一中介s1平面的一条横带里,再通过标准变换关系z=exp(s1*T)将此带变换到整个z平面上去,这样就使s平面与z平面之间建立一一对应的单值关系,消除了多值变换性。为了将s平面的jΩ轴压缩到s1平面的jΩ1轴上的-pi/T到pi/T一段上,可以通过以下的正切变换来实现:

Ω=c*tan(Ω1*T/2)

这里c是任意常数。这样当Ω1由-pi/T经0变化到pi/T时,Ω由-∞经过0变化到+∞,也映射到了整个jΩ轴。将这个关系延拓到整个s平面和s1平面,则可以得到

s=c*tanh(s1*T/2)=c*[1-exp(-s1*T)] / [1+exp(-s1*T)]

再将s1平面通过标准变换关系映射到z平面,即令z=exp(s1*T),并且,通常取c=2/T,得到

s=(2/T) * [1-z^(-1)] / [1+z^(-1)]

同样对z求解,得到

z=[1+((2/T)*s] / [1-((2/T)*s]

这样的变换叫做双线性变换。为了验证这种映射具有s平面的虚轴映射到z平面单位圆上的特性,考虑z=exp(j*ω),得

s=(2/T) * [1-exp(-j*ω)] / [1+exp(-j*ω)]

=(2/T) * j*[sin(ω/2)]/ cos(ω/2)]

=(2/T) * j * tan(ω/2)=jΩ

除了使s平面的虚轴映射到单位圆上之外,s平面的左半部分映射到单位圆的内部,s平面的右半部分映射到单位圆的外部。观察式子  z=[1+((2/T)*s] / [1-((2/T)*s],发现s的实部为负时,因子[1+((2/T)*s] / [1-((2/T)*s]的幅度小于1,相当于单位圆的内部。反之,当s的实部为负时,该比值的幅度大于1,相当于单位圆的外部。这样就可以看出使用双线性变换可从稳定的模拟滤波器得到稳定的数字滤波器。双线性变换法还避免了使用脉冲响应不变法所遇到的混叠问题,因为它把s平面的这个虚轴映射到z平面的单位圆上。然而,付出的代价是在频率轴上引入了失真。因此,只有当能容忍或补偿这种失真时,使用双线性变换法设计数字滤波器的方法才是实用的。仅在零频率附近时Ω与ω之间的频率变换关系接近于线性关系,所产生的数字滤波器的幅频响应相对于原模拟滤波器的幅频响应有畸变。例如:一个模拟微分器,它的幅度与频率是直线关系,但是通过双线性变换后,就不可能得到数字微分器。

对于分段常数的滤波器,双线性变换后,仍得到幅频特性为分段常数的滤波器,但是各分段边缘的临界频率点产生了畸变,这种频率的畸变,可以通过频率的预畸变来加以校正,也就是将临界频率事先加以畸变,然后经变换后正好映射到所需要的频率上。通过Ω=(2/T) * tan(ω/2)的关系变换成一组模拟频率。

为了克服冲击响应不变法产生的频率混叠现象,我们需要使s平面与z平面建立一一对应的单值关系,即求出s=f(z),然后将其代入G(s)就可以求得H(z),即

H(z)=G(s) | s=f(z)

冲击响应不变法是使数字滤波器在时域上模仿模拟滤波器的冲击响应,但是它的缺点是产生频响的混叠失真,这是因为从s平面到z平面不是一一映射关系。为了克服这个缺点,可以采用双线性变换法。既然冲击响应不变法是将一条横带变换到整个z平面上去,可以将s平面压缩变换到某一中介s1平面的一条横带里,再通过标准变换关系z=exp(s1*T)将此带变换到整个z平面上去,这样就使s平面与z平面之间建立一一对应的单值关系,消除了多值变换性。为了将s平面的jΩ轴压缩到s1平面的jΩ1轴上的-pi/T到pi/T一段上,可以通过以下的正切变换来实现:

Ω=c*tan(Ω1*T/2)

这里c是任意常数。这样当Ω1由-pi/T经0变化到pi/T时,Ω由-∞经过0变化到+∞,也映射到了整个jΩ轴。将这个关系延拓到整个s平面和s1平面,则可以得到

s=c*tanh(s1*T/2)=c*[1-exp(-s1*T)] / [1+exp(-s1*T)]

再将s1平面通过标准变换关系映射到z平面,即令z=exp(s1*T),并且,通常取c=2/T,得到

s=(2/T) * [1-z^(-1)] / [1+z^(-1)]

同样对z求解,得到

z=[1+((2/T)*s] / [1-((2/T)*s]

这样的变换叫做双线性变换。为了验证这种映射具有s平面的虚轴映射到z平面单位圆上的特性,考虑z=exp(j*ω),得

s=(2/T) * [1-exp(-j*ω)] / [1+exp(-j*ω)]

=(2/T) * j*[sin(ω/2)]/ cos(ω/2)]

=(2/T) * j * tan(ω/2)=jΩ

除了使s平面的虚轴映射到单位圆上之外,s平面的左半部分映射到单位圆的内部,s平面的右半部分映射到单位圆的外部。观察式子  z=[1+((2/T)*s] / [1-((2/T)*s],发现s的实部为负时,因子[1+((2/T)*s] / [1-((2/T)*s]的幅度小于1,相当于单位圆的内部。反之,当s的实部为负时,该比值的幅度大于1,相当于单位圆的外部。这样就可以看出使用双线性变换可从稳定的模拟滤波器得到稳定的数字滤波器。双线性变换法还避免了使用脉冲响应不变法所遇到的混叠问题,因为它把s平面的这个虚轴映射到z平面的单位圆上。然而,付出的代价是在频率轴上引入了失真。因此,只有当能容忍或补偿这种失真时,使用双线性变换法设计数字滤波器的方法才是实用的。仅在零频率附近时Ω与ω之间的频率变换关系接近于线性关系,所产生的数字滤波器的幅频响应相对于原模拟滤波器的幅频响应有畸变。例如:一个模拟微分器,它的幅度与频率是直线关系,但是通过双线性变换后,就不可能得到数字微分器。

对于分段常数的滤波器,双线性变换后,仍得到幅频特性为分段常数的滤波器,但是各分段边缘的临界频率点产生了畸变,这种频率的畸变,可以通过频率的预畸变来加以校正,也就是将临界频率事先加以畸变,然后经变换后正好映射到所需要的频率上。通过Ω=(2/T) * tan(ω/2)的关系变换成一组模拟频率。

为了克服冲击响应不变法产生的频率混叠现象,我们需要使s平面与z平面建立一一对应的单值关系,即求出s=f(z),然后将其代入G(s)就可以求得H(z),即

H(z)=G(s) | s=f(z)

MATLAB信号处理工具箱中为实现双线性变换提供了函数bilinear()

[Zd, Pd, Kd]=bilinear(Z, P, K, Fs)         把模拟滤波器的零极点模型转换成数字滤波器的零极点模型,其中的Fs为采样频率。

[NUMd, DENd]=bilinear(NUM, DEN,  Fs)         把模拟滤波器的传递函数模型转换成数字滤波器的传递函数模型,其中的Fs为采样频率。

[Ad, Bd, Cd, Dd]=bilinear(A, B, C, D, Fs)         把模拟滤波器的状态方程模型转换成数字滤波器的状态方程模型,其中的Fs为采样频率。

以上三种滤波器可以另外限定预畸变频率Fp,在进行双线性变换之前,对采样频率进行畸变,以保证频率冲击响应在双线性变换前后具有良好的单值映射关系。具体的预畸变过程如下:

Fp=2*pi*Fp;

Fs=Fp/tan(Fp/Fs/2);

例如: [Zd, Pd, Kd]=bilinear(Z, P, K, Fs, Fp)在双线性变换之前应用了预畸变。

例1:设计一个数字信号处理系统,它的采样频率Fs=100Hz,希望在该系统中设计一个Butterworth型高通数字滤波器,使其通带中允许的最大衰减为0.5dB,阻带内的最小衰减为40dB,通带上限临界频率为30Hz,阻带下限临界频率为40Hz。

程序设计如下:

clc;

clear all;

%把数字滤波器的频率特征转换成模拟滤波器的频率特征

wp=30*2*pi; ws=40*2*pi; rp=0.5; rs=40; Fs=100;

%选择滤波器的最小阶数。

[N,Wn]=buttord(wp,ws,rp,rs,'s');

%创建Butterworth低通滤波器的原型

[Z,P,K]=buttap(N);

[A,B,C,D]=zp2ss(Z,P,K);

%实现低通向低通的转换

[AT,BT,CT,DT]=lp2hp(A,B,C,D,Wn);

[num1,den1]=ss2tf(AT,BT,CT,DT);

%运用双线性变换法把模拟滤波器转换成数字滤波器

[num2,den2]=bilinear(num1,den1,Fs);

%绘出频率响应曲线

[H,W]=freqz(num2,den2);

plot(W*Fs/(2*pi),abs(H)); grid

xlabel('幅值');

ylabel('频率');

例2:试用双线性变换法设计一个Chebyshev2型高通滤波器,使其幅频特性逼近一个具有如下技术指标的模拟高通Chebyshev2滤波器:ws=2*pi*1000,wp=2*pi*1400,在ws处的最小衰减为15dB,在wp处的最大衰减不超过0.3dB,采样频率为20kHz。

程序设计如下:

clc;

clear all;

%把数字滤波器的频率特征转换成模拟滤波器的频率特征

wp=2*pi*1400; wp1=wp*2*pi;

ws=2*pi*1000; ws1=ws*2*pi;

rp=0.3; rs=15; Fs=20000;

%选择滤波器的最小阶数。

[N,Wn]=cheb2ord(wp1,ws1,rp,rs,'s');

%创建Chebyshev2低通滤波器的原型

[Z,P,K]=cheb2ap(N, rs);

[A,B,C,D]=zp2ss(Z,P,K);

%实现低通向低通的转换

[AT,BT,CT,DT]=lp2hp(A,B,C,D,Wn);

[AT1,BT1,CT1,DT1]=bilinear(AT,BT,CT,DT,Fs);

[num,den]=ss2tf(AT1,BT1,CT1,DT1);

%绘出频率响应曲线

[H,W]=freqz(num,den);

plot(W*Fs/(2*pi),abs(H)); grid

xlabel('幅值');

ylabel('频率');

例3:试用双线性变换法设计一个带通椭圆滤波器使其幅频特性逼近于一个具有如下技术指标的模拟带通椭圆滤波器:wp1=10Hz,wp2=20Hz,ws1=5Hz,ws2=25Hz,在通带内的最大衰减为0.5dB,在阻带内的最小衰减为50dB,采样频率为100Hz。

程序设计如下:

clc;

clear all;

%把数字滤波器的频率特征转换成模拟滤波器的频率特征

wp1=2*pi*10; wp2=2*pi*20;  ws1=2*pi*5; ws2=2*pi*25; rp=0.5; rs=50;   Fs=100;

wp1=2*pi*wp1; wp2=2*pi*wp2; ws1=2*pi*ws1; ws2=2*pi*ws2;

WP=[wp1,wp2];   WS=[ws1,ws2];

%选择滤波器的最小阶数。

[N,Wn]=ellipord(WP/(Fs/2),WS/(Fs/2),rp,rs,'s');

Bw=Wn(2)-Wn(1);

Wo=sqrt(Wn(1)*Wn(2));

%创建ellipse低通滤波器的原型

[Z,P,K]=ellipap(N, rp,rs);

[A,B,C,D]=zp2ss(Z,P,K);

%实现低通向低通的转换

[AT,BT,CT,DT]=lp2bp(A,B,C,D,Wo,Bw);

[AT1,BT1,CT1,DT1]=bilinear(AT,BT,CT,DT,Fs);

[num,den]=ss2tf(AT1,BT1,CT1,DT1);

%绘出频率响应曲线

[H,W]=freqz(num,den);

plot(W*Fs/(2*pi),abs(H)); grid

xlabel('幅值');

ylabel('频率');

你可能感兴趣的:(matlab,双线性法预畸变)