Два представления пространства состояний, которые вы получаете, действительны.Представление фильтра в пространстве состояний не уникально .Они дают одинаковые результаты при применении к входному сигналу.
Вероятная причина, по которой два представления в пространстве состояний не совпадают, заключается в том, что они получены по разным маршрутам:
В двухшаговой версии вашего кода вы получаете представление передаточной функции и затем преобразуете в пространство состояний , используя tf2ss
.
В одношаговой версии butter
внутренне получает представление нулевого полюса и затем преобразуется в пространство состояний , используя 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);
Создайте два объекта фильтра из их представлений в пространстве состояний:
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