你正在实现的功能是
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
是一个有限常数,取决于初始条件,如果您的信号 u 在初始时间 t = 0 ... T 为零,则可以假定为 0。
如果我们查看具有直流偏移的输入信号,例如
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)
然后整合,而不会冒险饱和。因此,我建议将实现更改如下:
或者,您可以将理想的积分器 1/s 更改为在 DC 处具有有限增益的低通滤波器,例如1/(1+s) 尽管与理想行为相比,这(以及@thewaywewalk 建议的抗饱和控制器)会使您的信号失真。
PS:感谢 stackoverflow 不支持正确的数学符号... :-/