''' Digital rate limiter filter implementation ''' class RateLimiter: ''' Implementation of a digital rate limiter filter. ''' def __init__(self, rateDown, rateUp, dt): ''' Builds a biquad filter from the given parameters. ''' self.InitFilter(0) self.rateUp = rateUp self.rateDown = rateDown self.dt = dt if self.rateDown > self.rateUp: print('Warning : rate limiter with id ' + str(id(self)) + ' : lower limit is higher than upper limit !') def InitFilter(self, v): ''' Initializes the filter with the value v. ''' self.xn_0 = v self.yn_1 = v def Filter(self, xn_0): ''' Computes the next value of the filter. ''' self.xn_0 = xn_0 if ((self.xn_0 - self.yn_1)/self.dt) > self.rateUp: self.yn_1 = self.yn_1 + self.rateUp * self.dt # next output value is set at max up rate elif ((self.xn_0 - self.yn_1)/self.dt) < self.rateDown: self.yn_1 = self.yn_1 + self.rateDown * self.dt # next output value is set at max down rate else: self.yn_1 = self.xn_0 return self.yn_1