Функция, которую вы реализуете,
y(t) = Integrate_{x=0->t} u(x) dx - Integrate_{y=0->t-T} u(y) dy (1)
где T
— транспортная задержка. Это можно изменить, заменив z = y + T
и из-за линейности интеграла к
y(t) = Integrate_{x=0->t} u(x) dx - Integrate_{z=T->t} u(z - T) dz
= Integrate_{x=0->t} [ u(x) - u(x - T) ] dx + C (2)
где
C = Integrate_{z=0->T} u(z) dz
является конечной константой, которая зависит от начальных условий и может быть принята равной 0, если ваш сигнал u
равен нулю в начальный момент времени t = 0 ... T
.
Если мы посмотрим на входной сигнал со смещением постоянного тока, например
u(t) = DC + sin(w*t)
тогда реализация (1)
сначала будет интегрировать, а затем вычитать, что приведет к насыщению или потере точности, как вы заметили. Но (2)
сначала вычтет и таким образом удалит любой DC
u(x) - u(x - T) = DC - DC + sin(w*t) - sin(w*t - w*T)
= 0 sin(w*t) - sin(w*t - w*T)
а затем интегрировать, не рискуя насыщением. Таким образом, я рекомендую изменить реализацию следующим образом:
![дизайн Simulink](https://i.stack.imgur.com/Dzpq7.png)
В качестве альтернативы вы можете изменить идеальный интегратор 1/s
на фильтр нижних частот с конечным усилением на постоянном токе, например. 1/(1+s)
хотя это (а также антизаключительный контроллер, предложенный @thewaywewalk) будет искажать ваш сигнал по сравнению с идеальным поведением.
PS: спасибо stackoverflow за то, что он не поддерживает правильную математическую запись... :-/
person
mbschenkel
schedule
25.01.2015