【问题标题】:Matlab 3D Plot of transfer function magnitude传递函数幅度的Matlab 3D图
【发布时间】:2014-01-22 16:02:28
【问题描述】:

如何绘制三维传递函数的幅度(例如检查图上的极点和零点)? 假设这是我的传递函数:

我的代码:

b = [6 -10 2];
a = [1 -3 2];

[x, y] = meshgrid(-3:0.1:3);
z = x+y*j;

res = (polyval(b, z))./(polyval(a,z));
surf(x,y, abs(res));

正确吗?我也想知道是否可以在绘图上标记单位圆?

【问题讨论】:

    标签: matlab signal-processing


    【解决方案1】:

    我认为这是正确的。但是,您计算的是 H(z^-1),而不是 H(z)。这是你想做的吗?对于 H(z),只需将 a 中的条目从左向右反转(使用 fliplr),并对 b 执行相同操作:

    res = (polyval(fliplr(b), z))./(polyval(fliplr(a),z));
    

    要绘制单位圆,您可以使用rectangle。说真的:-) 它有一个'Curvature' 属性,可以设置为生成一个圆圈。

    最好使用imagesc 而不是surf 以使圆圈清晰可见。您将从上方看到一个视图,其中颜色代表高度(abs(H) 的值):

    imagesc(-3:0.1:3,-3:0.1:3, abs(res));
    hold on
    rectangle('curvature', [1 1], 'position', [-1 -1 2 2], 'edgecolor', 'w');
    axis equal
    

    【讨论】:

      【解决方案2】:

      我这辈子从来没有听说过 3D 传递函数,它没有意义。我认为您完全错误:z 不代表复数,而是您的传递函数是离散函数而不是连续函数这一事实(有关详细信息,请参阅Z transform)。

      在 MATLAB 中执行此操作的正确方法是使用 tf 函数,该函数需要控制系统工具箱(注意我假设您的离散采样时间为 0.1 秒,根据需要进行调整):

      >> b = [6 -10 2];
      a = [1 -3 2];
      >> sys = tf(b,a,0.1,'variable','z^-1')
      
      sys =
      
        6 - 10 z^-1 + 2 z^-2
        --------------------
        1 - 3 z^-1 + 2 z^-2
      
      Sample time: 0.1 seconds
      Discrete-time transfer function.
      

      要绘制传递函数,请使用bodebodeplot 函数:

      bode(sys)
      

      对于极点和零点,只需使用 polezero 函数。

      【讨论】:

      • 我不同意。 z 确实代表一个复数。在复平面上将 abs(H) 绘制为 z 的函数是有意义的,例如,按照 OP 的说明来识别极点和零点
      • @LuisMendo 在谈到传递函数和控制系统设计时,z 总是指频域中的 Z 变换。
      • 但是z变换中的变量z其实是一个复变量
      • @LuisMendo 是的,但您通常不会使用数字的复数表示来绘制传递函数。这似乎是一个非常复杂的方式。
      • 除非您想查看极点和零点的位置(通常不在单位圆上)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-17
      • 1970-01-01
      • 2017-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多