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

用取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在使用中,没有零点则应设置参数为空。

你可能感兴趣的:(DSP,matlab仿真)