-
Notifications
You must be signed in to change notification settings - Fork 0
tutorial dsp
Whenever you read in data, it will inevitably come with some amount of random noise.
As a matter of fact, if you use dirt-cheap sensors like these (10 for $14.99!), you might have a lot of random noise.
The simplest, and easiest way to filter data is to take the average over a range.
Procedure AverageFilter(newValue, queue previousValues):
previousValues.pop()
previousValues.push(newValue)
return mean(previousValues)
However, while simple, this approach is not robust to extreme outliers. For example, with a queue length of 4, if the correct value is 4, but an erroneous value of 100 is read in, a value of 28 will be returned, which, while closer to 4 than 100, will probably crash your robot.
A more robust (an my personal recommendation for this application) filter is a simple median filter. Here, we collect a number of values, and, instead of computing the mean, take the median:
Procedure MedianFilter(newValue, queue previousValues):
previousValues.pop()
previousValues.push(newValue)
return median(previousValues)
This method, while requiring at least a partial sort of the data, is much more robust for outliers.
A PID controller (Proportional-Integral-Derivative Controller is a control scheme with three terms:
- Proportional: the proportion of error from the desired position
- Integral: integral of the error; a measure of historical deviation
- Derivative: derivative of the error; how much the error is changing over time
The PID control function f
for a device with error e
is then
<img src="https://latex.codecogs.com/gif.latex?"f(t) = K_p e(t) + K_i \int_0^t e(t)dt + K_d \frac{de(t)}{dt}"/>