相同代码的两个版本返回不同的结果

时间:2019-03-21 10:18:33

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

我希望将这两个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

黄油:

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

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

tf2ss:

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

2 个答案:

答案 0 :(得分:2)

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

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

  • 在代码的两步版本中,您获得了传递函数表示形式,然后使用{{3}转换为状态空间 }。

  • 在单步版本中,tf2ss在内部获得零极点表示形式,然后使用{{ 3}}(至少这是它在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);

从它们的状态空间表示形式创建两个butter

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

答案 1 :(得分:-1)

实际上,第1行代码应更改为以下代码。

document.getElementsByClassName('content')[0].innerHTML = variable;

但是,这也不会给出期望的答案,因为trf2ss需要两个输入作为输入参数。上面的代码仅给出一个输入,它是一个具有两个值的向量。在Matlab中,向量是一种单独的变量类型,因此无法正常运行。

相关问题