Две версии одного и того же кода возвращают разные результаты - PullRequest
2 голосов
/ 21 марта 2019

Я ожидаю получить те же результаты при сжатии этих двух строк кода MATLAB в одну, но я не получаю!

Код в 2 строки:

[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 ]

2 голосов
/ 21 марта 2019

Два представления пространства состояний, которые вы получаете, действительны.Представление фильтра в пространстве состояний не уникально .Они дают одинаковые результаты при применении к входному сигналу.

Вероятная причина, по которой два представления в пространстве состояний не совпадают, заключается в том, что они получены по разным маршрутам:

  • В двухшаговой версии вашего кода вы получаете представление передаточной функции и затем преобразуете в пространство состояний , используя 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
0 голосов
/ 21 марта 2019

На самом деле, код строки 1 должен быть изменен на ниже.

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

Но это также не даст желаемого ответа, поскольку trf2ss требует два входа в качестве входных параметров.Приведенный выше код дает только один вход, который представляет собой вектор с двумя значениями.В Matlab векторы являются отдельным типом переменных, поэтому не будут работать так, как мы ожидаем несколько раз.

...