29 lines
1.2 KiB
Python
29 lines
1.2 KiB
Python
''' 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
|