DSP

通过放置零极点设计滤波器

2019-07-13 18:58发布

用取Z变换在单位圆上界面就是傅里叶变换的思想,通过放置零极点位置设计滤波器。传输函数0Hz位置的放大倍数通过zp2tf的第三个参数k设置,对应增益20*log10(k)。 我在验证的过程中发现bode指令绘制波特图时候是针对的H(jw)频率特性方程的,通常用来计算由微分方程变换而来的的传输函数的幅频特性,如电路传输方程的写法Ls、 1/Cs 、R等,其中s = δ + jw,δ = 0时即傅里叶变换,对应拉普拉斯变换的虚轴截面。 但是我们通过pz2tf指令得到的系统方程是H(s)形式的z变换,也就是说公式中的s=r*exp(jw)就是z变换中的z,这里的s与拉普拉斯变换exp(s)中的s=δ+jw不是一个东西,所以如果我们将得到的tf系统方程直接传给bode指令,画出来的波特图是错误的,包括帮助文档里给的范例应该都是不正确的,对于通过tf得到的系统方程,正确的方法应该还是对tf求abs然后使用plot绘制,傅里叶变换对应z变换单位圆上的截面。 %% 本程序DSP 243页图5.4.2中通过放置零极点设计低通、高通滤波器 % 用z变化在单位圆上界面即傅里叶变换的思想,设计滤波器 % 沿着单位圆,(1,0)点对应频率特性中的低频,(1,0)对应着频率特性中的高频 % 极点放置的位置意味着此处增益较高,可是为通 % 零点位置意味着此处增益较低,可是为阻 clc clear close all %% 高通滤波器 % 滤波器1 zero1 = [-1]'; % 设置零点 pole1 = [-0.5]; % 设置极点 [b1,a1] = zp2tf(zero1,pole1,1); % 将零极点信息&增益信息转换为系统函数的系数向量 sys1 = tf(b1,a1) % 生成系统传输函数 figure(1) subplot(2,1,1) pzplot(sys1) % 绘制零极点图 subplot(2,1,2) bode(b1,a1) % 绘制波特图 % 滤波器2 zero2 = []'; pole2 = [0.95+0.5j 0.95-0.5j ]'; [b2,a2] = zp2tf(zero2,pole2,1); sys2 = tf(b2,a2) figure(2) subplot(2,1,1) pzplot(sys2) subplot(2,1,2) bode(b2,a2) % 滤波器5 zero5 = [-1]'; pole5 = [0.8 0.95+0.5j 0.95-0.5j ]'; [b5,a5] = zp2tf(zero5,pole5,1); sys5 = tf(b5,a5) figure(5) subplot(2,1,1) pzplot(sys5) subplot(2,1,2) bode(b5,a5) %% 低通滤波器 % 滤波器3 zero3 = [1 0]'; % 设置零点 pole3 = [-0.95]; % 设置极点 [b3,a3] = zp2tf(zero3,pole3,1); % 将零极点信息&增益信息转换为系统函数的系数向量 sys3 = tf(b3,a3) % 生成系统传输函数 figure(3) subplot(2,1,1) pzplot(sys3) % 绘制零极点图 subplot(2,1,2) bode(b3,a3) % 绘制波特图 % 滤波器4(实际上是高通) zero4 = [0 0]'; pole4 = [0.95+0.5j 0.95-0.5j]'; [b4,a4] = zp2tf(zero4,pole4,1); sys4 = tf(b4,a4) figure(4) subplot(2,1,1) pzplot(sys4) subplot(2,1,2) bode(b4,a4) % 滤波器6(实际上是高通) zero6 = [1 0 ]'; pole6 = [-0.9+0.5j -0.9-0.5j -0.96]'; [b6,a6] = zp2tf(zero6,pole6,1); sys6 = tf(b6,a6) figure(6) subplot(2,1,1) pzplot(sys6) subplot(2,1,2) bode(b6,a6) 程序中对书上的内容有所改动,第一行的三个图中中心位置都是没有零点的,第二行中中心位置都是有零点的,且第二行的第二个和第三个图中都有两个零点,只有这样才能对应的起来书上的内容。 运行结果 sys1 = 1 ------- s - 0.5 Continuous-time transfer function. sys2 = 1 ------------------- s^2 - 1.9 s + 1.152 Continuous-time transfer function. sys5 = s + 1 ------------------------------- s^3 - 2.7 s^2 + 2.672 s - 0.922 Continuous-time transfer function. sys3 = s^2 - s -------- s + 0.95 Continuous-time transfer function. sys4 = s^2 ------------------- s^2 + 1.9 s + 1.152 Continuous-time transfer function. sys6 = s^3 - s^2 -------------------------------- s^3 + 2.76 s^2 + 2.788 s + 1.018 Continuous-time transfer function. 在程序中,如果没有零点存在则将零点向量设置为空向量,zero = []'。 同时检验zp2tf函数的使用如下 clc clear close all % 滤波器1 zero1 = [0]; % 设置零点 pole1 = [-1]; % 设置极点 [b1,a1] = zp2tf(zero1,pole1,1) % 将零极点信息&增益信息转换为系统函数的系数向量 sys1 = tf(b1,a1) % 生成系统传输函数 sys2 = tf(1,[1 1]) % 生成系统传输函数 figure(1) subplot(3,1,1) pzplot(sys1) % 绘制零极点图 subplot(3,1,2) bodeplot(sys1) % 绘制波特图 subplot(3,1,3) bodeplot(sys2) % 绘制波特图 检验结果如下 sys1 = s ----- s + 1 Continuous-time transfer function. sys2 = 1 ----- s + 1 可见zp2tf在使用中,没有零点则应设置参数为空。