【问题标题】:Two versions of the same code return different results相同代码的两个版本返回不同的结果
【发布时间】:2019-03-21 10:18:33
【问题描述】:

我希望在将这两行 MATLAB 代码压缩为一个时得到相同的结果,但我没有!

两行代码:

[b,a]= butter(2,[0.4 0.6]) % Transfer function coefficients of the filter  
[A,B,C,D] = tf2ss(b,a)  % State-space representation of the filter

1 行代码:

[A,B,C,D]= butter(2,[0.4 0.6]) % State-space representation of the filter

黄油:

  • b,a 是输出时返回transfer function coefficients

  • A,B,C,D 是输出时返回state-space matrices

tf2ss:

  • transfer function filter parameters转换为state-space形式

【问题讨论】:

  • 当你运行[A,B,C,D] = tf2ss(butter(2,[0.4 0.6]))时会发生什么?
  • 对于B,第一个代码我得到[1;0;0;0],第二个代码是[0.58;0.19;-0.58;-0.19]
  • @famansour 你的 MATLAB 版本是多少?我可以在 2018 年重现您的结果b
  • @Karls 是无效代码。
  • @AnderBiguri 我的版本是 R2018b !

标签: matlab signal-processing state-space transfer-function


【解决方案1】:

您获得的两个状态空间表示是有效的。过滤器的状态空间表示不是唯一的。当应用于输入信号时,两者给出相同的结果。

两个状态空间表示不同的可能原因是它们是通过不同的路径获得的:

  • 在您的代码的两步版本中,您获得 transfer-function 表示,然后使用 tf2ss 转换为 state-space

  • 在一步法版本中,butter 内部获取 zero-pole 表示,然后转换为 state-space,使用 zp2ss (至少这是它在 R2018b 中所做的)。

这里检查它们确实是等价的。

[b,a]= butter(2,[0.4 0.6]);
[A2,B2,C2,D2] = tf2ss(b,a); % 2 steps

[A1,B1,C1,D1]= butter(2,[0.4 0.6]); % 1 step

定义一个输入信号:

x = rand(1,100);

从它们的状态空间表示中创建两个filter objects

Hd2 = dfilt.statespace(A2,B2,C2,D2);
Hd1 = dfilt.statespace(A1,B1,C1,D1);

获得两个输出:

y2 = Hd2.filter(x);
y1 = Hd1.filter(x);

比较输出。差别在eps的量级,即可以忽略不计:

max(abs(y1))
max(abs(y2))
max(abs(y1-y2))

ans =
   0.348561524872161
ans =
   0.348561524872160
ans =
     8.153200337090993e-16

您还可以检查两种状态空间表示给出相同的传递函数表示:

[b1,a1] = ss2tf(A1,B1,C1,D1)
[b2,a2] = ss2tf(A2,B2,C2,D2)

b1 =
0.067455273889072   0.000000000000000  -0.134910547778144   0.000000000000000   0.067455273889072
a1 =
1.000000000000000  -0.000000000000001   1.142980502539900  -0.000000000000001   0.412801598096187
b2 =
0.067455273889072   0.000000000000000  -0.134910547778144  -0.000000000000000   0.067455273889072
a2 =
1.000000000000000  -0.000000000000001   1.142980502539899  -0.000000000000002   0.412801598096187

【讨论】:

    【解决方案2】:

    其实第1行代码应该改成下面这样。

    [A,B,C,D]= tf2ss(butter(2,[0.4 0.6]));
    

    但是,这也不会给出想要的答案,因为 trf2ss 需要两个输入作为输入参数。上面的代码只给出了一个输入,它是一个有两个值的向量。在 Matlab 中,向量是一种单独的变量类型,因此有时不会像我们预期的那样工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-02
      相关资源
      最近更新 更多