Функцията, която прилагате, е
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
.
Ако разгледаме входен сигнал с DC-офсет като напр
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
на нискочестотен филтър с ограничено усилване при DC, напр. 1/(1+s)
въпреки че това (както и контролерът против навиване, предложен от @thewaywewalk) ще изкриви сигнала ви в сравнение с идеалното поведение.
PS: Благодарение на stackoverflow за това, че не поддържа правилна математическа нотация... :-/
person
mbschenkel
schedule
25.01.2015