首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相同代码的两个版本返回不同的结果。

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

Stack Overflow用户
提问于 2019-03-21 10:18:33
回答 2查看 261关注 0票数 2

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

代码2行:

代码语言:javascript
复制
[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行:

代码语言:javascript
复制
[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表单
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-21 11:46:35

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

这两种状态空间表示不相同的可能原因是它们是按照不同的路线获得的:

  • 在代码的两步版本中,您可以获得传输函数表示,然后使用tf2ss将其转换为状态空间。
  • 在一步版本中,butter内部获得零极点表示,然后使用zp2ss转换为状态空间(至少在R2018b中是这样的)。

下面是一个check,它们确实是等价的。

代码语言:javascript
复制
[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

定义输入信号:

代码语言:javascript
复制
x = rand(1,100);

从它们的状态空间表示创建两个过滤对象

代码语言:javascript
复制
Hd2 = dfilt.statespace(A2,B2,C2,D2);
Hd1 = dfilt.statespace(A1,B1,C1,D1);

获得以下两项产出:

代码语言:javascript
复制
y2 = Hd2.filter(x);
y1 = Hd1.filter(x);

比较输出。区别在于eps的顺序,即否定的顺序:

代码语言:javascript
复制
max(abs(y1))
max(abs(y2))
max(abs(y1-y2))

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

您还可以检查是否两种状态空间表示形式都具有相同的传递函数表示:

代码语言:javascript
复制
[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
EN

Stack Overflow用户

发布于 2019-03-21 11:55:56

实际上,第1行代码应该改为下面的代码。

代码语言:javascript
复制
[A,B,C,D]= tf2ss(butter(2,[0.4 0.6]));

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55278180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档