I’ve started working on adaptive filtering a long time ago, but could never figure out why my simple implementation of the RLS algorithm failed. Well, there was a typo in the reference book!
Now that this is fixed, let’s see what this guy does.
The RLS algorithm learns an input signal based on its past and predicts new values from it. As such, it can be used to learn periodic signals, but also noise. The basis is to predict a new value based on the past, compare it to the actual value and update the set of coefficients. The update itself is based on a memory time constraint, and the higher the value, the slower the update.
Once the filter has learned enough, the learning stage can be shut off, and the filter can be used to select frequencies.
Let’s start with a simple sinusoidal signal, and see if an order 10 can be used to learn it:
As it can be seen, at the beginning, the filter is learning, as it doesn’t match the input. After a short time, it does match (zooming on the signal shows that there is a latency and also the amplitude do not exactly match).
Let’s see how it does for more complex signals. Let’s add two additional slightly out of tunes sinusoids:
Once again, after a short time, the learning phase is stable, and we can switch it off and the signal is estimated properly.
Let’s try now something a little bit more complex, and try to denoise an input signal.
The original noise in blue is estimated in green, and the remainder noise is in red. Obviously, we don’t do a great job here, but let’s see what is actually attenuated:
So the middle of the bandwidth is better attenuated that the sides, which is expected in a way.
Now, what does that do to a signal we try to denoise?
Obviously, the signal is denoised, but also increased! And the same happens in the spectral domain.
When looking at the estimated function, the picture is a little bit clearer:
Our noise is actually between 0.6 and 1.2 rad/s (from sampling frequency/10 to sampling frequency/5), and the RLS filter underestimates these a little bit but doesn’t cut the high frequencies, which can lead to ringing…
Also the cost of learning the noise is quite costly:
Learning was only activated during half the total processing time…
RLS filters are interesting to follow a signal. Obviously this filter is just the start of this new module, and I hope I’ll have real denoising filters at some point.
This filter will be available in ATK 2.0.0 and is already in the develop branch with the Python example scripts.