Normalized Sign-sign Least-mean-square (NSSLMS)¶
New in version 1.1.0.
Changed in version 1.2.0.
The normalized sign-sign least-mean-square (NSSLMS) adaptive filter is an extension of the popular SSLMS adaptive filter (Sign-sign Least-mean-square (SSLMS)).
The NSSLMS filter can be created as follows
>>> import padasip as pa
>>> pa.filters.FilterNSSLMS(n)
where n is the size (number of taps) of the filter.
Content of this page:
See also
Algorithm Explanation¶
The NSSLMS is extension of LMS filter. See Least-mean-square (LMS) for explanation of the algorithm behind.
The extension is based on normalization of learning rate. The learning rage \(\mu\) is replaced by learning rate \(\eta(k)\) normalized with every new sample according to input power as follows
\(\eta (k) = \frac{\mu}{\epsilon + || \textbf{x}(k) ||^2}\),
where \(|| \textbf{x}(k) ||^2\) is norm of input vector and \(\epsilon\) is a small positive constant (regularization term). This constant is introduced to preserve the stability in cases where the input is close to zero.
Minimal Working Examples¶
If you have measured data you may filter it as follows
import numpy as np
import matplotlib.pylab as plt
import padasip as pa
# creation of data
N = 500
x = np.random.normal(0, 1, (N, 4)) # input matrix
v = np.random.normal(0, 0.1, N) # noise
d = 2*x[:,0] + 0.1*x[:,1] - 0.3*x[:,2] + 0.5*x[:,3] + v # target
# identification
f = pa.filters.FilterNSSLMS(n=4, mu=0.1, w="random")
y, e, w = f.run(d, x)
# show results
plt.figure(figsize=(15,9))
plt.subplot(211);plt.title("Adaptation");plt.xlabel("samples - k")
plt.plot(d,"b", label="d - target")
plt.plot(y,"g", label="y - output");plt.legend()
plt.subplot(212);plt.title("Filter error");plt.xlabel("samples - k")
plt.plot(10*np.log10(e**2),"r", label="e - error [dB]");plt.legend()
plt.tight_layout()
plt.show()